@warlock.js/web 5.0.2 → 5.2.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 (219) hide show
  1. package/CHANGELOG.md +250 -0
  2. package/README.md +126 -12
  3. package/esm/build/contribution.d.mts +11 -4
  4. package/esm/build/contribution.mjs +46 -22
  5. package/esm/build/contribution.mjs.map +1 -1
  6. package/esm/build/discover-pages.mjs +318 -44
  7. package/esm/build/discover-pages.mjs.map +1 -1
  8. package/esm/build/generate-client-registry.mjs +47 -13
  9. package/esm/build/generate-client-registry.mjs.map +1 -1
  10. package/esm/build/generate-pages-barrel.mjs +55 -13
  11. package/esm/build/generate-pages-barrel.mjs.map +1 -1
  12. package/esm/build/page-default-export.mjs +48 -0
  13. package/esm/build/page-default-export.mjs.map +1 -0
  14. package/esm/build/page-routes-manifest.mjs +21 -0
  15. package/esm/build/page-routes-manifest.mjs.map +1 -0
  16. package/esm/build/public-files.mjs +45 -0
  17. package/esm/build/public-files.mjs.map +1 -0
  18. package/esm/build/read-route-exports.mjs +1 -1
  19. package/esm/build/read-route-exports.mjs.map +1 -1
  20. package/esm/client/build-hydrated-tree.mjs +40 -9
  21. package/esm/client/build-hydrated-tree.mjs.map +1 -1
  22. package/esm/client/hydrate-page.mjs +1 -1
  23. package/esm/client/hydrate-page.mjs.map +1 -1
  24. package/esm/client/navigation/current-route.d.mts +1 -1
  25. package/esm/client/navigation/current-route.mjs +1 -1
  26. package/esm/client/navigation/current-route.mjs.map +1 -1
  27. package/esm/client/navigation/fetch-page-data.mjs +1 -1
  28. package/esm/client/navigation/fetch-page-data.mjs.map +1 -1
  29. package/esm/client/navigation/navigation-root.mjs +44 -7
  30. package/esm/client/navigation/navigation-root.mjs.map +1 -1
  31. package/esm/client/navigation/prefetch.mjs +1 -1
  32. package/esm/client/navigation/prefetch.mjs.map +1 -1
  33. package/esm/client/navigation/refresh.d.mts +1 -1
  34. package/esm/client/navigation/refresh.mjs +1 -1
  35. package/esm/client/navigation/refresh.mjs.map +1 -1
  36. package/esm/client/navigation/scroll-to-fragment.mjs +26 -0
  37. package/esm/client/navigation/scroll-to-fragment.mjs.map +1 -0
  38. package/esm/client/navigation/verbs.d.mts +1 -1
  39. package/esm/client/navigation/verbs.mjs +1 -1
  40. package/esm/client/navigation/verbs.mjs.map +1 -1
  41. package/esm/client/runtime/index.d.mts +2 -1
  42. package/esm/client/runtime/index.mjs +2 -1
  43. package/esm/client/runtime/manifest.d.mts +1 -1
  44. package/esm/client/runtime/manifest.mjs +3 -2
  45. package/esm/client/runtime/manifest.mjs.map +1 -1
  46. package/esm/client/runtime/matcher.d.mts +13 -1
  47. package/esm/client/runtime/matcher.mjs +13 -1
  48. package/esm/client/runtime/matcher.mjs.map +1 -1
  49. package/esm/client/runtime/types.d.mts +15 -2
  50. package/esm/components/default-app.mjs +1 -1
  51. package/esm/components/default-app.mjs.map +1 -1
  52. package/esm/components/document-context.d.mts +40 -2
  53. package/esm/components/document-context.mjs +1 -1
  54. package/esm/components/document-context.mjs.map +1 -1
  55. package/esm/components/head.d.mts +1 -1
  56. package/esm/components/head.mjs +1 -1
  57. package/esm/components/head.mjs.map +1 -1
  58. package/esm/components/link.d.mts +1 -1
  59. package/esm/components/link.mjs +1 -1
  60. package/esm/components/link.mjs.map +1 -1
  61. package/esm/components/scripts.d.mts +1 -1
  62. package/esm/components/scripts.mjs +4 -2
  63. package/esm/components/scripts.mjs.map +1 -1
  64. package/esm/context.d.mts +6 -102
  65. package/esm/hydration/index.mjs +1 -1
  66. package/esm/hydration/index.mjs.map +1 -1
  67. package/esm/hydration-payload.d.mts +1 -1
  68. package/esm/hydration-payload.mjs +37 -8
  69. package/esm/hydration-payload.mjs.map +1 -1
  70. package/esm/index.d.mts +4 -3
  71. package/esm/loaders.d.mts +7 -36
  72. package/esm/metadata.d.mts +15 -1
  73. package/esm/metadata.mjs +45 -0
  74. package/esm/metadata.mjs.map +1 -0
  75. package/esm/props.d.mts +16 -8
  76. package/esm/route.d.mts +2 -17
  77. package/esm/routing/compose-route-path.d.mts +1 -1
  78. package/esm/routing/compose-route-path.mjs +1 -1
  79. package/esm/routing/compose-route-path.mjs.map +1 -1
  80. package/esm/routing/data-request.mjs +1 -1
  81. package/esm/routing/data-request.mjs.map +1 -1
  82. package/esm/routing/filesystem-route.mjs +45 -0
  83. package/esm/routing/filesystem-route.mjs.map +1 -0
  84. package/esm/routing/layout-policy.mjs +1 -1
  85. package/esm/routing/layout-policy.mjs.map +1 -1
  86. package/esm/routing/navigator.mjs +1 -1
  87. package/esm/routing/navigator.mjs.map +1 -1
  88. package/esm/routing/query-string.d.mts +1 -1
  89. package/esm/routing/query-string.mjs +1 -1
  90. package/esm/routing/query-string.mjs.map +1 -1
  91. package/esm/routing/route-identity.mjs +1 -1
  92. package/esm/routing/route-identity.mjs.map +1 -1
  93. package/esm/routing/route-table.d.mts +1 -1
  94. package/esm/routing/route-table.mjs +1 -1
  95. package/esm/routing/route-table.mjs.map +1 -1
  96. package/esm/routing/router-events.d.mts +1 -1
  97. package/esm/routing/router-events.mjs +1 -1
  98. package/esm/routing/router-events.mjs.map +1 -1
  99. package/esm/routing/url-fragment.mjs +120 -0
  100. package/esm/routing/url-fragment.mjs.map +1 -0
  101. package/esm/runtime/register-modules.d.mts +19 -0
  102. package/esm/runtime/register-modules.mjs +22 -0
  103. package/esm/runtime/register-modules.mjs.map +1 -0
  104. package/esm/server/build-hydration-payload.mjs +2 -1
  105. package/esm/server/build-hydration-payload.mjs.map +1 -1
  106. package/esm/server/client-asset-url-prefix.d.mts +1 -1
  107. package/esm/server/client-asset-url-prefix.mjs +1 -1
  108. package/esm/server/client-asset-url-prefix.mjs.map +1 -1
  109. package/esm/server/create-page-module-loader.d.mts +1 -1
  110. package/esm/server/create-page-module-loader.mjs +2 -1
  111. package/esm/server/create-page-module-loader.mjs.map +1 -1
  112. package/esm/server/create-page-route-handler.d.mts +58 -6
  113. package/esm/server/create-page-route-handler.mjs +127 -40
  114. package/esm/server/create-page-route-handler.mjs.map +1 -1
  115. package/esm/server/dev-server.mjs +2 -13
  116. package/esm/server/dev-server.mjs.map +1 -1
  117. package/esm/server/error-page.d.mts +14 -0
  118. package/esm/server/error-page.mjs +39 -0
  119. package/esm/server/error-page.mjs.map +1 -0
  120. package/esm/server/execute-page-request.d.mts +7 -4
  121. package/esm/server/execute-page-request.mjs +79 -80
  122. package/esm/server/execute-page-request.mjs.map +1 -1
  123. package/esm/server/execute-page-request.types.d.mts +33 -92
  124. package/esm/server/hydration-client-url.d.mts +1 -1
  125. package/esm/server/hydration-client-url.mjs +2 -2
  126. package/esm/server/hydration-client-url.mjs.map +1 -1
  127. package/esm/server/index.d.mts +6 -5
  128. package/esm/server/index.mjs +4 -4
  129. package/esm/server/install-page-routes-from-manifest.d.mts +17 -7
  130. package/esm/server/install-page-routes-from-manifest.mjs +91 -8
  131. package/esm/server/install-page-routes-from-manifest.mjs.map +1 -1
  132. package/esm/server/install-page-routes.d.mts +32 -13
  133. package/esm/server/install-page-routes.mjs +112 -32
  134. package/esm/server/install-page-routes.mjs.map +1 -1
  135. package/esm/server/install-production-page-routes.mjs +3 -31
  136. package/esm/server/install-production-page-routes.mjs.map +1 -1
  137. package/esm/server/match-page-route.mjs +2 -2
  138. package/esm/server/match-page-route.mjs.map +1 -1
  139. package/esm/server/not-found-page.d.mts +126 -0
  140. package/esm/server/not-found-page.mjs +157 -0
  141. package/esm/server/not-found-page.mjs.map +1 -0
  142. package/esm/server/page-context.d.mts +3 -9
  143. package/esm/server/page-context.mjs +3 -16
  144. package/esm/server/page-context.mjs.map +1 -1
  145. package/esm/server/page-file-change.mjs +77 -0
  146. package/esm/server/page-file-change.mjs.map +1 -0
  147. package/esm/server/page-manifest.d.mts +25 -10
  148. package/esm/server/page-manifest.mjs +1 -1
  149. package/esm/server/page-manifest.mjs.map +1 -1
  150. package/esm/server/page-render-bundle.mjs +38 -0
  151. package/esm/server/page-render-bundle.mjs.map +1 -0
  152. package/esm/server/page-route-reload.mjs +54 -0
  153. package/esm/server/page-route-reload.mjs.map +1 -0
  154. package/esm/server/register-production-public-files.mjs +40 -0
  155. package/esm/server/register-production-public-files.mjs.map +1 -0
  156. package/esm/server/render-page.d.mts +11 -14
  157. package/esm/server/render-page.mjs +154 -28
  158. package/esm/server/render-page.mjs.map +1 -1
  159. package/esm/server/resolve-page-metadata.mjs +2 -2
  160. package/esm/server/resolve-page-metadata.mjs.map +1 -1
  161. package/esm/server/resolve-validation-data.mjs +1 -1
  162. package/esm/server/resolve-validation-data.mjs.map +1 -1
  163. package/esm/server/settle-page-response.d.mts +58 -1
  164. package/esm/server/settle-page-response.mjs +111 -46
  165. package/esm/server/settle-page-response.mjs.map +1 -1
  166. package/esm/server/stylesheet-urls.d.mts +41 -30
  167. package/esm/server/stylesheet-urls.mjs +137 -52
  168. package/esm/server/stylesheet-urls.mjs.map +1 -1
  169. package/esm/server/unregistered-pages.mjs +42 -0
  170. package/esm/server/unregistered-pages.mjs.map +1 -0
  171. package/esm/server/web-connector-factory.d.mts +2 -3
  172. package/esm/server/web-connector-factory.mjs +6 -4
  173. package/esm/server/web-connector-factory.mjs.map +1 -1
  174. package/esm/server/web-connector.d.mts +1 -1
  175. package/esm/server/web-connector.mjs +233 -18
  176. package/esm/server/web-connector.mjs.map +1 -1
  177. package/esm/shared.d.mts +18 -3
  178. package/esm/shared.mjs +3 -7
  179. package/esm/shared.mjs.map +1 -1
  180. package/esm/validation.d.mts +1 -1
  181. package/esm/vite/app-convention-aliases.mjs +1 -1
  182. package/esm/vite/app-convention-aliases.mjs.map +1 -1
  183. package/esm/vite/build-client.d.mts +1 -1
  184. package/esm/vite/build-client.mjs +2 -2
  185. package/esm/vite/build-client.mjs.map +1 -1
  186. package/esm/vite/gate-a-resolve.d.mts +1 -1
  187. package/esm/vite/gate-a-resolve.mjs +67 -13
  188. package/esm/vite/gate-a-resolve.mjs.map +1 -1
  189. package/esm/vite/gate-b-secrets.d.mts +1 -1
  190. package/esm/vite/gate-b-secrets.mjs +35 -17
  191. package/esm/vite/gate-b-secrets.mjs.map +1 -1
  192. package/esm/vite/gate-c-verify.d.mts +1 -1
  193. package/esm/vite/gate-c-verify.mjs +6 -6
  194. package/esm/vite/gate-c-verify.mjs.map +1 -1
  195. package/esm/vite/hydration-entries.d.mts +1 -1
  196. package/esm/vite/hydration-entries.mjs +10 -6
  197. package/esm/vite/hydration-entries.mjs.map +1 -1
  198. package/esm/vite/index.d.mts +9 -6
  199. package/esm/vite/index.mjs +124 -11
  200. package/esm/vite/index.mjs.map +1 -1
  201. package/esm/vite/page-registry-plugin.d.mts +22 -3
  202. package/esm/vite/page-registry-plugin.mjs +247 -2
  203. package/esm/vite/page-registry-plugin.mjs.map +1 -1
  204. package/esm/vite/projection.d.mts +2 -2
  205. package/esm/vite/projection.mjs +38 -15
  206. package/esm/vite/projection.mjs.map +1 -1
  207. package/llms-full.txt +241 -49
  208. package/llms.txt +6 -2
  209. package/package.json +3 -3
  210. package/skills/add-web-to-an-app/SKILL.md +3 -3
  211. package/skills/create-a-page/SKILL.md +130 -7
  212. package/skills/load-page-data/SKILL.md +92 -12
  213. package/skills/navigate-on-the-client/SKILL.md +3 -1
  214. package/skills/serve-styles/SKILL.md +13 -12
  215. package/skills/use-layouts/SKILL.md +20 -8
  216. package/skills/write-the-root/SKILL.md +5 -1
  217. package/esm/server/buffered-response.d.mts +0 -58
  218. package/esm/server/buffered-response.mjs +0 -115
  219. package/esm/server/buffered-response.mjs.map +0 -1
@@ -1,115 +0,0 @@
1
- //#region ../web/src/server/buffered-response.ts
2
- /**
3
- * Runtime brand behind `LoaderShortCircuit` (web/src/context.ts:13-17
4
- * declares the compile-time half). A loader RETURNS this from
5
- * `response.redirect()` / `response.notFound()`; the settle stage detects it
6
- * by the symbol, never by shape.
7
- */
8
- const LOADER_SHORT_CIRCUIT = Symbol("warlock.loader.shortCircuit");
9
- function isLoaderShortCircuit(value) {
10
- return typeof value === "object" && value !== null && value[LOADER_SHORT_CIRCUIT] === true;
11
- }
12
- function shortCircuitSignal(init) {
13
- return {
14
- ...init,
15
- [LOADER_SHORT_CIRCUIT]: true
16
- };
17
- }
18
- function createBufferedResponse() {
19
- const buffer = {
20
- headers: [],
21
- cookies: []
22
- };
23
- const response = {
24
- header(key, value) {
25
- buffer.headers.push({
26
- key,
27
- value
28
- });
29
- return response;
30
- },
31
- cookie(name, value, options) {
32
- buffer.cookies.push({
33
- name,
34
- value,
35
- options
36
- });
37
- return response;
38
- },
39
- setStatusCode(statusCode) {
40
- buffer.statusCode = statusCode;
41
- return response;
42
- },
43
- /**
44
- * A redirect is a status AND a `Location`; both belong in the buffer.
45
- *
46
- * Writing only `buffer.statusCode` here and carrying the URL out on the
47
- * branded return value split one answer across two channels, and the
48
- * emit only ever drained the first: the document path applied
49
- * `bundle.commit.headers` and never read `bundle.shortCircuit`, so the
50
- * browser got a bare `302` with an empty body and stayed put
51
- * (design/loader-endpoint-seam-2026-08-23.md §5).
52
- *
53
- * Putting `Location` in the buffer fixes it once, at the declaration,
54
- * for every consumer: the commit stage's live mirror
55
- * (`execute-page-request.ts` commitBuffers — which mirrors headers and
56
- * status only; its cookie half was removed so `Set-Cookie` is not
57
- * appended twice, and `Location` rides the header half),
58
- * `bundle.commit.headers`, `finishRender`'s header map, and the handler's
59
- * `response.headers()` all carry it without any of them learning what a
60
- * redirect is. The
61
- * alternative — special-casing `shortCircuit.kind` at the emit — would
62
- * have to be re-implemented by every emit path that ever exists, which
63
- * is precisely how this shipped unnoticed the first time.
64
- *
65
- * The signal is still returned and still branded: the buffer says what
66
- * the response should LOOK like, the signal says the pipeline must STOP.
67
- * Those are different facts and both are still needed.
68
- */
69
- redirect(url, statusCode = 302) {
70
- buffer.statusCode = statusCode;
71
- buffer.headers.push({
72
- key: "Location",
73
- value: url
74
- });
75
- return shortCircuitSignal({
76
- kind: "redirect",
77
- statusCode,
78
- url
79
- });
80
- },
81
- /** Same shape as `redirect`, at 301 — deliberately not special-cased. */
82
- permanentRedirect(url) {
83
- buffer.statusCode = 301;
84
- buffer.headers.push({
85
- key: "Location",
86
- value: url
87
- });
88
- return shortCircuitSignal({
89
- kind: "redirect",
90
- statusCode: 301,
91
- url
92
- });
93
- },
94
- /**
95
- * The other short-circuit kind. It shares the signal shape but has no
96
- * URL, so it writes no `Location` — a 404 that redirects is not a thing.
97
- */
98
- notFound(body) {
99
- buffer.statusCode = 404;
100
- return shortCircuitSignal({
101
- kind: "notFound",
102
- statusCode: 404,
103
- body
104
- });
105
- }
106
- };
107
- return {
108
- response,
109
- buffer
110
- };
111
- }
112
-
113
- //#endregion
114
- export { LOADER_SHORT_CIRCUIT, createBufferedResponse, isLoaderShortCircuit };
115
- //# sourceMappingURL=buffered-response.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"buffered-response.mjs","names":[],"sources":["../../../../../../../web/src/server/buffered-response.ts"],"sourcesContent":["import type { LoaderShortCircuit, WebResponse } from \"../context\";\n\n/**\n * The per-loader response facade for pipeline stage 6.\n *\n * Loaders run in PARALLEL and never see the real `Response`: core's\n * `Response.header`/`cookie` write straight through to the fastify reply\n * (core/src/http/response.ts:919-923, :955-967), so three concurrent loaders\n * writing directly would interleave nondeterministically and a discarded\n * layer's writes could never be taken back. Instead each loader gets one of\n * these facades; every write lands in a buffer, and the pipeline's\n * settle/commit stage applies the surviving buffers to\n * the real response root→leaf, per cookie name / header key.\n */\n\nexport type BufferedHeader = {\n key: string;\n value: string;\n};\n\nexport type BufferedCookie = {\n name: string;\n value: unknown;\n options?: Record<string, unknown>;\n};\n\nexport type ResponseBuffer = {\n headers: BufferedHeader[];\n cookies: BufferedCookie[];\n statusCode?: number;\n};\n\n/**\n * Runtime brand behind `LoaderShortCircuit` (web/src/context.ts:13-17\n * declares the compile-time half). A loader RETURNS this from\n * `response.redirect()` / `response.notFound()`; the settle stage detects it\n * by the symbol, never by shape.\n */\nexport const LOADER_SHORT_CIRCUIT = Symbol(\"warlock.loader.shortCircuit\");\n\nexport type LoaderShortCircuitSignal = LoaderShortCircuit & {\n kind: \"redirect\" | \"notFound\";\n statusCode: number;\n url?: string;\n body?: unknown;\n};\n\nexport function isLoaderShortCircuit(value: unknown): value is LoaderShortCircuitSignal {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as Record<PropertyKey, unknown>)[LOADER_SHORT_CIRCUIT] === true\n );\n}\n\nfunction shortCircuitSignal(\n init: Omit<LoaderShortCircuitSignal, keyof LoaderShortCircuit>,\n): LoaderShortCircuitSignal {\n return { ...init, [LOADER_SHORT_CIRCUIT]: true } as unknown as LoaderShortCircuitSignal;\n}\n\n/**\n * The loader-facing surface is `WebResponse` (web/src/context.ts:73-88) plus\n * `cookie()`, which the commit contract needs so buffers can be applied\n * per cookie name.\n */\nexport type BufferedWebResponse = WebResponse & {\n cookie(name: string, value: unknown, options?: Record<string, unknown>): BufferedWebResponse;\n};\n\nexport function createBufferedResponse(): {\n response: BufferedWebResponse;\n buffer: ResponseBuffer;\n} {\n const buffer: ResponseBuffer = { headers: [], cookies: [] };\n\n const response: BufferedWebResponse = {\n header(key: string, value: string) {\n buffer.headers.push({ key, value });\n return response;\n },\n\n cookie(name: string, value: unknown, options?: Record<string, unknown>) {\n buffer.cookies.push({ name, value, options });\n return response;\n },\n\n setStatusCode(statusCode: number) {\n buffer.statusCode = statusCode;\n return response;\n },\n\n /**\n * A redirect is a status AND a `Location`; both belong in the buffer.\n *\n * Writing only `buffer.statusCode` here and carrying the URL out on the\n * branded return value split one answer across two channels, and the\n * emit only ever drained the first: the document path applied\n * `bundle.commit.headers` and never read `bundle.shortCircuit`, so the\n * browser got a bare `302` with an empty body and stayed put\n * (design/loader-endpoint-seam-2026-08-23.md §5).\n *\n * Putting `Location` in the buffer fixes it once, at the declaration,\n * for every consumer: the commit stage's live mirror\n * (`execute-page-request.ts` commitBuffers — which mirrors headers and\n * status only; its cookie half was removed so `Set-Cookie` is not\n * appended twice, and `Location` rides the header half),\n * `bundle.commit.headers`, `finishRender`'s header map, and the handler's\n * `response.headers()` all carry it without any of them learning what a\n * redirect is. The\n * alternative — special-casing `shortCircuit.kind` at the emit — would\n * have to be re-implemented by every emit path that ever exists, which\n * is precisely how this shipped unnoticed the first time.\n *\n * The signal is still returned and still branded: the buffer says what\n * the response should LOOK like, the signal says the pipeline must STOP.\n * Those are different facts and both are still needed.\n */\n redirect(url: string, statusCode = 302) {\n buffer.statusCode = statusCode;\n buffer.headers.push({ key: \"Location\", value: url });\n return shortCircuitSignal({ kind: \"redirect\", statusCode, url });\n },\n\n /** Same shape as `redirect`, at 301 — deliberately not special-cased. */\n permanentRedirect(url: string) {\n buffer.statusCode = 301;\n buffer.headers.push({ key: \"Location\", value: url });\n return shortCircuitSignal({ kind: \"redirect\", statusCode: 301, url });\n },\n\n /**\n * The other short-circuit kind. It shares the signal shape but has no\n * URL, so it writes no `Location` — a 404 that redirects is not a thing.\n */\n notFound(body?: unknown) {\n buffer.statusCode = 404;\n return shortCircuitSignal({ kind: \"notFound\", statusCode: 404, body });\n },\n };\n\n return { response, buffer };\n}\n"],"mappings":";;;;;;;AAsCA,MAAa,uBAAuB,OAAO,6BAA6B;AASxE,SAAgB,qBAAqB,OAAmD;CACtF,OACE,OAAO,UAAU,YACjB,UAAU,QACT,MAAuC,0BAA0B;AAEtE;AAEA,SAAS,mBACP,MAC0B;CAC1B,OAAO;EAAE,GAAG;GAAO,uBAAuB;CAAK;AACjD;AAWA,SAAgB,yBAGd;CACA,MAAM,SAAyB;EAAE,SAAS,CAAC;EAAG,SAAS,CAAC;CAAE;CAE1D,MAAM,WAAgC;EACpC,OAAO,KAAa,OAAe;GACjC,OAAO,QAAQ,KAAK;IAAE;IAAK;GAAM,CAAC;GAClC,OAAO;EACT;EAEA,OAAO,MAAc,OAAgB,SAAmC;GACtE,OAAO,QAAQ,KAAK;IAAE;IAAM;IAAO;GAAQ,CAAC;GAC5C,OAAO;EACT;EAEA,cAAc,YAAoB;GAChC,OAAO,aAAa;GACpB,OAAO;EACT;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BA,SAAS,KAAa,aAAa,KAAK;GACtC,OAAO,aAAa;GACpB,OAAO,QAAQ,KAAK;IAAE,KAAK;IAAY,OAAO;GAAI,CAAC;GACnD,OAAO,mBAAmB;IAAE,MAAM;IAAY;IAAY;GAAI,CAAC;EACjE;;EAGA,kBAAkB,KAAa;GAC7B,OAAO,aAAa;GACpB,OAAO,QAAQ,KAAK;IAAE,KAAK;IAAY,OAAO;GAAI,CAAC;GACnD,OAAO,mBAAmB;IAAE,MAAM;IAAY,YAAY;IAAK;GAAI,CAAC;EACtE;;;;;EAMA,SAAS,MAAgB;GACvB,OAAO,aAAa;GACpB,OAAO,mBAAmB;IAAE,MAAM;IAAY,YAAY;IAAK;GAAK,CAAC;EACvE;CACF;CAEA,OAAO;EAAE;EAAU;CAAO;AAC5B"}