@coralreefventures/site-tools 0.3.0 → 0.4.1

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.
@@ -0,0 +1,171 @@
1
+ import { createHash } from "node:crypto";
2
+ /** The page's own surfaces; a site's accent has to stand out from these. */
3
+ export const surfaces = {
4
+ light: { background: "#ffffff", text: "#1a1f24", muted: "#4b5560" },
5
+ dark: { background: "#11161b", text: "#e6e9ec", muted: "#a9b3bc" },
6
+ };
7
+ export const defaultAccent = "#1f2933";
8
+ export const defaultAccentDark = "#d5dbe1";
9
+ /** A mark larger than this is not a mark; the page is answered to every visitor without a session. */
10
+ export const maxMarkBytes = 64 * 1024;
11
+ const hexColor = /^#[0-9a-f]{6}$/i;
12
+ const base64 = /^[A-Za-z0-9+/]+={0,2}$/;
13
+ /** WCAG 2's relative luminance of `#rrggbb`. */
14
+ export const luminance = (hex) => {
15
+ const channel = (offset) => {
16
+ const value = Number.parseInt(hex.slice(offset, offset + 2), 16) / 255;
17
+ return value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;
18
+ };
19
+ return 0.2126 * channel(1) + 0.7152 * channel(3) + 0.0722 * channel(5);
20
+ };
21
+ /** WCAG 2's contrast ratio between two `#rrggbb` colors, 1 to 21. */
22
+ export const contrast = (a, b) => {
23
+ const [high, low] = [luminance(a), luminance(b)].sort((x, y) => y - x);
24
+ return (high + 0.05) / (low + 0.05);
25
+ };
26
+ /**
27
+ * The button's text on an accent: white or black, whichever reads better. One of the two always reaches 4.5:1 (the
28
+ * worst accent, where they tie, gives 4.58), so the label meets AA whatever color a site picks. Not a softer near-black:
29
+ * #111111 ties at 4.35, under the line.
30
+ */
31
+ export const textOn = (accent) => contrast(accent, "#ffffff") >= contrast(accent, "#000000") ? "#ffffff" : "#000000";
32
+ /** The site id as a display name: `driftline` becomes `Driftline`. */
33
+ export const defaultName = (site) => site.charAt(0).toUpperCase() + site.slice(1);
34
+ const checkImage = (value, label) => {
35
+ if (value === undefined)
36
+ return undefined;
37
+ const image = value;
38
+ if (image?.type !== "image/svg+xml" && image?.type !== "image/png") {
39
+ throw new Error(`the page's ${label} must be an SVG or a PNG`);
40
+ }
41
+ if (typeof image.data !== "string" || !base64.test(image.data)) {
42
+ throw new Error(`the page's ${label} is not base64`);
43
+ }
44
+ if (Buffer.byteLength(image.data, "base64") > maxMarkBytes) {
45
+ throw new Error(`the page's ${label} is over ${maxMarkBytes} bytes`);
46
+ }
47
+ return { type: image.type, data: image.data };
48
+ };
49
+ const checkColor = (value, fallback, label, surface) => {
50
+ if (value === undefined)
51
+ return fallback;
52
+ if (typeof value !== "string" || !hexColor.test(value))
53
+ throw new Error(`the page's ${label} is not #rrggbb: ${value}`);
54
+ // WCAG 1.4.11: the button's edge and the focus ring are drawn in the accent, so it must reach 3:1 on the page.
55
+ const ratio = contrast(value, surface);
56
+ if (ratio < 3) {
57
+ throw new Error(`the page's ${label} ${value} is ${ratio.toFixed(2)}:1 on ${surface}; it needs 3:1`);
58
+ }
59
+ return value.toLowerCase();
60
+ };
61
+ /**
62
+ * Checks gate.config.json's `page` and fills in the defaults, or throws naming what is wrong. With no `page` at all
63
+ * the result still renders a correct page: the site id as the name, no mark, and a neutral button.
64
+ */
65
+ export const parsePageConfig = (value, site) => {
66
+ if (value !== undefined && (typeof value !== "object" || value === null)) {
67
+ throw new Error("the page configuration is not an object");
68
+ }
69
+ const file = (value ?? {});
70
+ const name = file.name ?? defaultName(site);
71
+ if (typeof name !== "string" || name.trim() !== name || name.length === 0 || name.length > 60) {
72
+ throw new Error(`the page's name must be 1 to 60 characters with no space at either end: ${JSON.stringify(name)}`);
73
+ }
74
+ if ([...name].some((c) => c <= "\u001f" || c === "\u007f"))
75
+ throw new Error("the page's name has a control character");
76
+ const mark = checkImage(file.mark, "mark");
77
+ const markDark = checkImage(file.markDark, "dark mark");
78
+ if (markDark && !mark)
79
+ throw new Error("the page has a dark mark but no mark");
80
+ return {
81
+ name,
82
+ accent: checkColor(file.accent, defaultAccent, "accent", surfaces.light.background),
83
+ accentDark: checkColor(file.accentDark, defaultAccentDark, "dark accent", surfaces.dark.background),
84
+ ...(mark && { mark }),
85
+ ...(markDark && { markDark }),
86
+ };
87
+ };
88
+ const escapeHtml = (value) => value
89
+ .replace(/&/g, "&amp;")
90
+ .replace(/</g, "&lt;")
91
+ .replace(/>/g, "&gt;")
92
+ .replace(/"/g, "&quot;")
93
+ .replace(/'/g, "&#39;");
94
+ const dataUri = (image) => `data:${image.type};base64,${image.data}`;
95
+ /** The stylesheet, which depends only on the configuration, so its hash is fixed for the gate's life. */
96
+ const stylesheet = (page) => {
97
+ const { light, dark } = surfaces;
98
+ // The dark scheme shows the dark mark if there is one; otherwise the one mark, on a light tile so a dark-ink mark
99
+ // stays visible.
100
+ const darkMark = page.markDark
101
+ ? ".mark-light{display:none}.mark-dark{display:block}"
102
+ : `.mark-light{background:${light.background};border-radius:10px;padding:4px}`;
103
+ return [
104
+ ":root{color-scheme:light dark;",
105
+ `--bg:${light.background};--text:${light.text};--muted:${light.muted};`,
106
+ `--accent:${page.accent};--on-accent:${textOn(page.accent)}}`,
107
+ "@media (prefers-color-scheme:dark){:root{",
108
+ `--bg:${dark.background};--text:${dark.text};--muted:${dark.muted};`,
109
+ `--accent:${page.accentDark};--on-accent:${textOn(page.accentDark)}}${darkMark}}`,
110
+ "*{box-sizing:border-box}",
111
+ "html{-webkit-text-size-adjust:100%;text-size-adjust:100%}",
112
+ "body{margin:0;min-height:100vh;min-height:100dvh;display:flex;align-items:center;justify-content:center;",
113
+ "padding:48px 24px;background:var(--bg);color:var(--text);",
114
+ 'font:400 1.0625rem/1.55 system-ui,-apple-system,"Segoe UI",Roboto,"Noto Sans",sans-serif}',
115
+ "main{width:100%;max-width:34rem}",
116
+ ".lockup{display:flex;align-items:center;gap:12px;margin:0 0 40px;font-weight:700;font-size:1.25rem;",
117
+ "letter-spacing:-0.01em}",
118
+ ".lockup img{display:block;height:48px;width:auto;max-width:96px}",
119
+ ".mark-dark{display:none}",
120
+ "h1{margin:0 0 12px;font-size:clamp(1.75rem,6vw,2.5rem);line-height:1.15;letter-spacing:-0.02em;",
121
+ "font-weight:700;overflow-wrap:anywhere}",
122
+ ".lede{margin:0 0 32px;color:var(--muted)}",
123
+ ".actions{display:flex;flex-wrap:wrap;align-items:center;gap:16px 24px}",
124
+ ".button{display:inline-flex;align-items:center;min-height:48px;padding:12px 20px;border-radius:8px;",
125
+ "background:var(--accent);color:var(--on-accent);font-weight:600;text-decoration:none;",
126
+ "border:2px solid var(--accent)}",
127
+ ".button:hover{text-decoration:underline;text-underline-offset:3px}",
128
+ ".link{color:var(--text);font-weight:600;text-decoration:underline;text-decoration-color:var(--accent);",
129
+ "text-decoration-thickness:2px;text-underline-offset:4px;padding:12px 0}",
130
+ ".link:hover{text-decoration-thickness:3px}",
131
+ "a:focus-visible{outline:3px solid var(--accent);outline-offset:3px}",
132
+ "@media (max-width:480px){body{padding:32px 16px;align-items:flex-start}.lockup{margin-bottom:32px}}",
133
+ ].join("");
134
+ };
135
+ /**
136
+ * Builds the coming-soon page for a site once, as the gate starts. `door` is the door's origin, which the "Get
137
+ * involved" link points into; `site` is the id the door knows the site by.
138
+ */
139
+ export const comingSoon = (page, door, site) => {
140
+ const css = stylesheet(page);
141
+ const styleHash = createHash("sha256").update(css).digest("base64");
142
+ const name = escapeHtml(page.name);
143
+ const getInvolved = escapeHtml(`${door}/get-involved/?${new URLSearchParams({ site })}`);
144
+ const marks = page.mark
145
+ ? `<img class="mark-light" src="${dataUri(page.mark)}" alt="">` +
146
+ (page.markDark ? `<img class="mark-dark" src="${dataUri(page.markDark)}" alt="">` : "")
147
+ : "";
148
+ const csp = [
149
+ "default-src 'none'",
150
+ `style-src 'sha256-${styleHash}'`,
151
+ ...(page.mark ? ["img-src data:"] : []),
152
+ "base-uri 'none'",
153
+ "form-action 'none'",
154
+ "frame-ancestors 'none'",
155
+ ].join("; ");
156
+ const head = '<!doctype html><html lang="en"><head><meta charset="utf-8">' +
157
+ '<meta name="viewport" content="width=device-width, initial-scale=1">' +
158
+ '<meta name="color-scheme" content="light dark">' +
159
+ '<meta name="robots" content="noindex, nofollow">' +
160
+ '<meta name="referrer" content="strict-origin-when-cross-origin">' +
161
+ `<title>${name} is coming soon</title><style>${css}</style></head>`;
162
+ const before = `<body><main><p class="lockup">${marks}<span>${name}</span></p>` +
163
+ `<h1>${name} is coming soon.</h1><p class="lede">Open for now to invited guests.</p>` +
164
+ '<p class="actions"><a class="button" href="';
165
+ const after = `">Have an invitation? Sign in</a><a class="link" href="${getInvolved}">Get involved</a></p></main></body></html>`;
166
+ return {
167
+ html: (next) => `${head}${before}${escapeHtml(`/_door/signin?${new URLSearchParams({ next })}`)}${after}`,
168
+ csp,
169
+ };
170
+ };
171
+ //# sourceMappingURL=page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/door/page.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,13 @@ export declare const sessionCookie = "__Host-crv_door";
5
5
  /** The nonce the gate sets before it sends a visitor to the door, which the ticket must name as `st`. */
6
6
  export declare const stateCookie = "__Host-crv_door_state";
7
7
  export declare const stateLifetimeSeconds = 600;
8
+ /**
9
+ * A marker that this browser has held a session here, so that once the hour is up a page load bounces silently through
10
+ * the door (which issues a fresh ticket while its own sign-in lives) instead of meeting the coming-soon page. It holds
11
+ * no identity and opens nothing: without a valid session it changes only which way a page load is sent to sign in.
12
+ */
13
+ export declare const seenCookie = "__Host-crv_door_seen";
14
+ export declare const seenLifetimeSeconds: number;
8
15
  /** One value of a cookie, or undefined when it is absent or sent twice (which a `__Host-` cookie never is). */
9
16
  export declare const readCookie: (header: string | undefined, name: string) => string | undefined;
10
17
  /**
@@ -17,8 +24,20 @@ export declare const splitTarget: (target: string) => {
17
24
  rawPath: string;
18
25
  rawQuery: string;
19
26
  };
27
+ /**
28
+ * The challenge every 401 carries, as RFC 9110 requires of one. No registered scheme describes a session cookie from a
29
+ * sign-in page, so this is the shape of the Cookie scheme drafted for exactly that (draft-broyer-http-cookie-auth):
30
+ * where the sign-in starts, and the cookie it ends in. Browsers prompt only for the schemes they implement (Basic,
31
+ * Digest, Negotiate, NTLM), so for this one they render the body, which for a page load is the coming-soon page.
32
+ */
33
+ export declare const challenge: (site: string) => string;
20
34
  /** Whether a request is a page load, which gets the door, rather than a fetch, which gets a bare 401. */
21
35
  export declare const isDocumentRequest: (request: IncomingMessage) => boolean;
36
+ /**
37
+ * A page load in the window itself: a document request whose `Sec-Fetch-Dest`, when sent, is `document`. Only this
38
+ * may start a sign-in, so an image, a frame or a fetch from another site cannot overwrite a visitor's state cookie.
39
+ */
40
+ export declare const isTopLevelNavigation: (request: IncomingMessage) => boolean;
22
41
  export type GateOptions = {
23
42
  config: GateConfig;
24
43
  /** The static export the gate serves from. */
@@ -30,9 +49,11 @@ export type GateOptions = {
30
49
  * The gate: every request to a locked site, in this order. (1) A path with a backslash, a control character or a dot
31
50
  * segment, raw or encoded, is a 400; a method other than GET, HEAD or POST is a 405. (2) A host not on the list is a
32
51
  * 403. (3) robots.txt disallows everything, and /_door/health answers ok. (4) POST /_door verifies a ticket from the
33
- * door and sets the session. (5) /_door/signout clears both cookies and walks a fixed map. (6) A request with a valid
34
- * session is served from the export. (7) Without one, a page load is sent to the door with a fresh state cookie and
35
- * anything else gets 401. (8) An exception is a 500 with nothing in it: the gate fails closed.
52
+ * door and sets the session; /_door/signin starts a sign-in at the door. (5) /_door/signout clears the door's cookies and walks
53
+ * a fixed map. (6) A request with a valid session is served from the export. (7) Without one, a page load gets the
54
+ * coming-soon page, a 401 whose sign-in link carries the canonical next (or, from a browser that has had a session
55
+ * here, a silent bounce through the door), and anything else gets an empty 401. (8) An
56
+ * exception is a 500 with nothing in it: the gate fails closed.
36
57
  */
37
58
  export declare const createGate: ({ config, site, now, }: GateOptions) => RequestListener;
38
59
  export type StartGateOptions = {
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/door/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,KAAK,MAAM,EAAuB,MAAM,WAAW,CAAC;AAIvH,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,aAAa,CAAC;AAO9D,+DAA+D;AAC/D,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAC/C,yGAAyG;AACzG,eAAO,MAAM,WAAW,0BAA0B,CAAC;AACnD,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAmBxC,+GAA+G;AAC/G,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,MAAM,GAAG,SAO9E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,KAAG,MAAM,GAAG,IAaxD,CAAC;AAEF,wGAAwG;AACxG,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,KAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAG/E,CAAC;AAQF,yGAAyG;AACzG,eAAO,MAAM,iBAAiB,GAAI,SAAS,eAAe,KAAG,OAK5D,CAAC;AAgCF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,GAAI,wBAIxB,WAAW,KAAG,eAuJhB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,wBAAwB;IACxB,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;IACrB,yBAAyB;IACzB,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,gHAAgH;AAChH,eAAO,MAAM,SAAS,GAAU,wBAA+B,gBAAgB,KAAG,OAAO,CAAC,MAAM,CAU/F,CAAC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/door/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,KAAK,MAAM,EAAuB,MAAM,WAAW,CAAC;AAIvH,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,aAAa,CAAC;AAQ9D,+DAA+D;AAC/D,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAC/C,yGAAyG;AACzG,eAAO,MAAM,WAAW,0BAA0B,CAAC;AACnD,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC;;;;GAIG;AACH,eAAO,MAAM,UAAU,yBAAyB,CAAC;AACjD,eAAO,MAAM,mBAAmB,QAAoB,CAAC;AAqBrD,+GAA+G;AAC/G,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,MAAM,GAAG,SAO9E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,KAAG,MAAM,GAAG,IAaxD,CAAC;AAEF,wGAAwG;AACxG,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,KAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAG/E,CAAC;AAKF;;;;;GAKG;AACH,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,WACiD,CAAC;AAKxF,yGAAyG;AACzG,eAAO,MAAM,iBAAiB,GAAI,SAAS,eAAe,KAAG,OAK5D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,SAAS,eAAe,KAAG,OAI/D,CAAC;AAgCF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,GAAI,wBAIxB,WAAW,KAAG,eAwMhB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,wBAAwB;IACxB,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;IACrB,yBAAyB;IACzB,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,gHAAgH;AAChH,eAAO,MAAM,SAAS,GAAU,wBAA+B,gBAAgB,KAAG,OAAO,CAAC,MAAM,CAU/F,CAAC"}
@@ -4,6 +4,7 @@ import { fileURLToPath } from "node:url";
4
4
  import { sendFile, staticTarget } from "../serve.js";
5
5
  import { readGateConfig } from "./config.js";
6
6
  import { canonicalNext, unsafe } from "./next.js";
7
+ import { comingSoon } from "./page.js";
7
8
  import { verifyTicket } from "./verify.js";
8
9
  // The gate is the one thing in a locked site's compute bundle, and the bundle carries no node_modules, so this file
9
10
  // and everything it imports use Node's own modules only (a test holds it).
@@ -12,6 +13,13 @@ export const sessionCookie = "__Host-crv_door";
12
13
  /** The nonce the gate sets before it sends a visitor to the door, which the ticket must name as `st`. */
13
14
  export const stateCookie = "__Host-crv_door_state";
14
15
  export const stateLifetimeSeconds = 600;
16
+ /**
17
+ * A marker that this browser has held a session here, so that once the hour is up a page load bounces silently through
18
+ * the door (which issues a fresh ticket while its own sign-in lives) instead of meeting the coming-soon page. It holds
19
+ * no identity and opens nothing: without a valid session it changes only which way a page load is sent to sign in.
20
+ */
21
+ export const seenCookie = "__Host-crv_door_seen";
22
+ export const seenLifetimeSeconds = 30 * 24 * 60 * 60;
15
23
  const maxBodyBytes = 16 * 1024;
16
24
  const encodedUnsafe = /%(5c|[01][0-9a-f]|7f)/i;
17
25
  /** Every response, whatever its status: none of a locked site may be framed, sniffed or indexed. */
@@ -25,6 +33,8 @@ const securityHeaders = {
25
33
  const cookie = (name, value, maxAge, sameSite) => `${name}=${value}; Max-Age=${maxAge}; Path=/; Secure; HttpOnly; SameSite=${sameSite}`;
26
34
  const clearSession = cookie(sessionCookie, "", 0, "Lax");
27
35
  const clearState = cookie(stateCookie, "", 0, "None");
36
+ const markSeen = cookie(seenCookie, "1", seenLifetimeSeconds, "Lax");
37
+ const clearSeen = cookie(seenCookie, "", 0, "Lax");
28
38
  /** One value of a cookie, or undefined when it is absent or sent twice (which a `__Host-` cookie never is). */
29
39
  export const readCookie = (header, name) => {
30
40
  const values = (header ?? "")
@@ -62,6 +72,13 @@ export const splitTarget = (target) => {
62
72
  };
63
73
  /** GET, HEAD and POST; the gate answers anything else with 405. */
64
74
  const isGatedMethod = (method) => method === "GET" || method === "HEAD" || method === "POST";
75
+ /**
76
+ * The challenge every 401 carries, as RFC 9110 requires of one. No registered scheme describes a session cookie from a
77
+ * sign-in page, so this is the shape of the Cookie scheme drafted for exactly that (draft-broyer-http-cookie-auth):
78
+ * where the sign-in starts, and the cookie it ends in. Browsers prompt only for the schemes they implement (Basic,
79
+ * Digest, Negotiate, NTLM), so for this one they render the body, which for a page load is the coming-soon page.
80
+ */
81
+ export const challenge = (site) => `Cookie realm="${site}", form-action="/_door/signin", cookie-name="${sessionCookie}"`;
65
82
  /** The paths the gate answers itself, with or without a session: robots.txt and its own /_door/ endpoints. */
66
83
  const isOwnPath = (path) => path === "/robots.txt" || path.startsWith("/_door/");
67
84
  /** Whether a request is a page load, which gets the door, rather than a fetch, which gets a bare 401. */
@@ -73,6 +90,16 @@ export const isDocumentRequest = (request) => {
73
90
  return mode === "navigate";
74
91
  return String(request.headers.accept ?? "").includes("text/html");
75
92
  };
93
+ /**
94
+ * A page load in the window itself: a document request whose `Sec-Fetch-Dest`, when sent, is `document`. Only this
95
+ * may start a sign-in, so an image, a frame or a fetch from another site cannot overwrite a visitor's state cookie.
96
+ */
97
+ export const isTopLevelNavigation = (request) => {
98
+ if (!isDocumentRequest(request))
99
+ return false;
100
+ const dest = request.headers["sec-fetch-dest"];
101
+ return dest === undefined || dest === "document";
102
+ };
76
103
  /**
77
104
  * The form body, or null once it passes 16 KB. The rest of an oversized body is read and thrown away rather than the
78
105
  * socket destroyed, so the visitor still gets the redirect back to the door; that response closes the connection.
@@ -104,9 +131,11 @@ const field = (form, name) => {
104
131
  * The gate: every request to a locked site, in this order. (1) A path with a backslash, a control character or a dot
105
132
  * segment, raw or encoded, is a 400; a method other than GET, HEAD or POST is a 405. (2) A host not on the list is a
106
133
  * 403. (3) robots.txt disallows everything, and /_door/health answers ok. (4) POST /_door verifies a ticket from the
107
- * door and sets the session. (5) /_door/signout clears both cookies and walks a fixed map. (6) A request with a valid
108
- * session is served from the export. (7) Without one, a page load is sent to the door with a fresh state cookie and
109
- * anything else gets 401. (8) An exception is a 500 with nothing in it: the gate fails closed.
134
+ * door and sets the session; /_door/signin starts a sign-in at the door. (5) /_door/signout clears the door's cookies and walks
135
+ * a fixed map. (6) A request with a valid session is served from the export. (7) Without one, a page load gets the
136
+ * coming-soon page, a 401 whose sign-in link carries the canonical next (or, from a browser that has had a session
137
+ * here, a silent bounce through the door), and anything else gets an empty 401. (8) An
138
+ * exception is a 500 with nothing in it: the gate fails closed.
110
139
  */
111
140
  export const createGate = ({ config, site, now = () => Math.floor(Date.now() / 1000), }) => {
112
141
  const empty = (response, status, headers = {}) => {
@@ -124,6 +153,8 @@ export const createGate = ({ config, site, now = () => Math.floor(Date.now() / 1
124
153
  response.end(request.method === "HEAD" ? undefined : body);
125
154
  };
126
155
  const doorSignout = `${config.door}/signout/`;
156
+ const page = comingSoon(config.page, config.door, config.site);
157
+ const unauthorized = challenge(config.site);
127
158
  /** Where `then` leads: the next stop's gate, or the door's sign-out page. Never a URL from the query. */
128
159
  const signoutTarget = (then) => {
129
160
  const index = config.signout.findIndex((stop) => stop.id === then);
@@ -167,19 +198,58 @@ export const createGate = ({ config, site, now = () => Math.floor(Date.now() / 1
167
198
  if (formNext === null || claimNext === null || formNext !== claimNext)
168
199
  return toDoorWithError(response);
169
200
  const maxAge = verdict.claims.exp - now();
170
- return redirect(response, 303, claimNext, [cookie(sessionCookie, ticket ?? "", maxAge, "Lax"), clearState]);
201
+ return redirect(response, 303, claimNext, [
202
+ cookie(sessionCookie, ticket ?? "", maxAge, "Lax"),
203
+ clearState,
204
+ markSeen,
205
+ ]);
171
206
  };
172
- /** Step 7: no session. A page load goes to the door with a fresh state; anything else is a bare 401. */
173
- const refuse = (request, response, target, host) => {
174
- if (!isDocumentRequest(request))
175
- return empty(response, 401);
207
+ /**
208
+ * Step 4's sign-in start, which the coming-soon page's button links to: a fresh state cookie and a 302 to the door,
209
+ * naming this site, this host and where to come back to. `next` is taken from the query only after *Canonical next*;
210
+ * one that fails, or is missing or sent twice, becomes `/`. Only a top-level navigation starts one; anything else
211
+ * gets an empty 401 and no cookie.
212
+ */
213
+ const startSignin = (request, response, rawQuery, host) => {
214
+ if (!isTopLevelNavigation(request))
215
+ return empty(response, 401, { "WWW-Authenticate": unauthorized });
216
+ const asked = new URLSearchParams(rawQuery).getAll("next");
217
+ const next = (asked.length === 1 ? canonicalNext(asked[0], host) : null) ?? "/";
218
+ return toDoor(response, next, host);
219
+ };
220
+ /** A fresh state cookie and a 302 to the door, for an already canonical `next`. */
221
+ const toDoor = (response, next, host) => {
176
222
  const nonce = randomBytes(32).toString("base64url");
177
- const next = canonicalNext(target, host) ?? "/";
178
223
  const query = new URLSearchParams({ site: config.site, host, next, state: nonce });
179
224
  return redirect(response, 302, `${config.door}/?${query}`, [
180
225
  cookie(stateCookie, nonce, stateLifetimeSeconds, "None"),
181
226
  ]);
182
227
  };
228
+ /**
229
+ * Step 7: no session. A page load gets the coming-soon page, which is the gate's own and holds none of the site;
230
+ * its sign-in link carries the raw request target after *Canonical next*, or `/`. Anything else is a bare 401.
231
+ * Both are 401, so a request without a session never gets a 2xx with anything of the site's in it, and a probe can
232
+ * tell locked from open by the status alone. A page load from a browser that has held a session here (the seen
233
+ * cookie) is sent straight to the door instead, which renews the session silently while the door's sign-in lives.
234
+ */
235
+ const refuse = (request, response, target, host) => {
236
+ if (!isDocumentRequest(request))
237
+ return empty(response, 401, { "WWW-Authenticate": unauthorized });
238
+ const next = canonicalNext(target, host) ?? "/";
239
+ if (readCookie(request.headers.cookie, seenCookie) === "1" && isTopLevelNavigation(request)) {
240
+ return toDoor(response, next, host);
241
+ }
242
+ const body = page.html(next);
243
+ response.writeHead(401, {
244
+ ...securityHeaders,
245
+ "Cache-Control": "no-store",
246
+ "Content-Type": "text/html; charset=utf-8",
247
+ "Content-Length": String(Buffer.byteLength(body)),
248
+ "Content-Security-Policy": page.csp,
249
+ "WWW-Authenticate": unauthorized,
250
+ });
251
+ response.end(request.method === "HEAD" ? undefined : body);
252
+ };
183
253
  /** Step 6: the export, as Amplify maps it, private to the browser that holds the session. */
184
254
  const serveSite = async (request, response, path, location) => {
185
255
  const found = await staticTarget(site, path);
@@ -200,15 +270,17 @@ export const createGate = ({ config, site, now = () => Math.floor(Date.now() / 1
200
270
  : "private, no-store";
201
271
  return sendFile(request, response, found.file, 200, { ...securityHeaders, "Cache-Control": cacheControl });
202
272
  };
203
- /** Steps 3 and 5: what the gate answers itself, which holds nothing of the site. */
204
- const answerOwn = (request, response, path, rawQuery) => {
273
+ /** Steps 3, 4's sign-in start and 5: what the gate answers itself, which holds nothing of the site. */
274
+ const answerOwn = (request, response, path, rawQuery, host) => {
205
275
  if (path === "/robots.txt")
206
276
  return text(response, request, "User-agent: *\nDisallow: /\n");
207
277
  if (path === "/_door/health")
208
278
  return text(response, request, "ok");
279
+ if (path === "/_door/signin")
280
+ return startSignin(request, response, rawQuery, host);
209
281
  if (path === "/_door/signout") {
210
282
  const then = new URLSearchParams(rawQuery).get("then");
211
- return redirect(response, 303, signoutTarget(then), [clearSession, clearState]);
283
+ return redirect(response, 303, signoutTarget(then), [clearSession, clearState, clearSeen]);
212
284
  }
213
285
  return empty(response, 404);
214
286
  };
@@ -240,7 +312,7 @@ export const createGate = ({ config, site, now = () => Math.floor(Date.now() / 1
240
312
  if (request.method === "POST")
241
313
  return empty(response, 405, { Allow: "GET, HEAD" });
242
314
  if (isOwnPath(path))
243
- return answerOwn(request, response, path, rawQuery);
315
+ return answerOwn(request, response, path, rawQuery, host);
244
316
  if (!hasSession(request, host))
245
317
  return refuse(request, response, target, host);
246
318
  return serveSite(request, response, path, { rawPath, rawQuery, host });
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/door/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/door/server.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  export { doorOrigin, type GateConfig, type GateConfigFile, parseGateConfig, parseSignoutChain, readGateConfig, type SignoutStop, } from "./door/config.ts";
2
2
  export { canonicalNext } from "./door/next.ts";
3
- export { type BundleDoorOptions, bundleDoor, checkDeployment, type DeployManifest, fetchJwks, gateFiles, maxBundleBytes, } from "./door/package.ts";
4
- export { createGate, type GateOptions, type StartGateOptions, sessionCookie, startGate, stateCookie, } from "./door/server.ts";
3
+ export { type BundleDoorOptions, type BundlePageOptions, bundleDoor, checkDeployment, type DeployManifest, fetchJwks, gateFiles, maxBundleBytes, } from "./door/package.ts";
4
+ export { type ComingSoon, comingSoon, type PageConfig, type PageConfigFile, type PageImage, parsePageConfig, } from "./door/page.ts";
5
+ export { createGate, type GateOptions, type StartGateOptions, seenCookie, sessionCookie, startGate, stateCookie, } from "./door/server.ts";
5
6
  export { type DoorClaims, type Jwks, parseJwks, type Verdict, type VerifyOptions, verifyTicket, } from "./door/verify.ts";
6
7
  export { type Category, categories, type LighthouseOptions, type PageResult, pagesFromSitemap, reportBase, runLighthouse, } from "./lighthouse.ts";
7
8
  export { contentTypeOf, createStaticServer, encodingFor, type ServeOptions, type StaticTarget, sendFile, serve, staticTarget, } from "./serve.ts";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EACL,KAAK,iBAAiB,EACtB,UAAU,EACV,eAAe,EACf,KAAK,cAAc,EACnB,SAAS,EACT,SAAS,EACT,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,UAAU,EACV,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,aAAa,EACb,SAAS,EACT,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,UAAU,EACf,KAAK,IAAI,EACT,SAAS,EACT,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,QAAQ,EACb,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,gBAAgB,EAChB,UAAU,EACV,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,QAAQ,EACR,KAAK,EACL,YAAY,GACb,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,UAAU,EACV,eAAe,EACf,KAAK,cAAc,EACnB,SAAS,EACT,SAAS,EACT,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,UAAU,EACf,UAAU,EACV,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,UAAU,EACV,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,UAAU,EACV,aAAa,EACb,SAAS,EACT,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,UAAU,EACf,KAAK,IAAI,EACT,SAAS,EACT,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,QAAQ,EACb,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,gBAAgB,EAChB,UAAU,EACV,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,QAAQ,EACR,KAAK,EACL,YAAY,GACb,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,7 +1,8 @@
1
1
  export { doorOrigin, parseGateConfig, parseSignoutChain, readGateConfig, } from "./door/config.js";
2
2
  export { canonicalNext } from "./door/next.js";
3
3
  export { bundleDoor, checkDeployment, fetchJwks, gateFiles, maxBundleBytes, } from "./door/package.js";
4
- export { createGate, sessionCookie, startGate, stateCookie, } from "./door/server.js";
4
+ export { comingSoon, parsePageConfig, } from "./door/page.js";
5
+ export { createGate, seenCookie, sessionCookie, startGate, stateCookie, } from "./door/server.js";
5
6
  export { parseJwks, verifyTicket, } from "./door/verify.js";
6
7
  export { categories, pagesFromSitemap, reportBase, runLighthouse, } from "./lighthouse.js";
7
8
  export { contentTypeOf, createStaticServer, encodingFor, sendFile, serve, staticTarget, } from "./serve.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAGV,eAAe,EACf,iBAAiB,EACjB,cAAc,GAEf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAEL,UAAU,EACV,eAAe,EAEf,SAAS,EACT,SAAS,EACT,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,UAAU,EAGV,aAAa,EACb,SAAS,EACT,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAGL,SAAS,EAGT,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,UAAU,EAGV,gBAAgB,EAChB,UAAU,EACV,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,WAAW,EAGX,QAAQ,EACR,KAAK,EACL,YAAY,GACb,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAGV,eAAe,EACf,iBAAiB,EACjB,cAAc,GAEf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAGL,UAAU,EACV,eAAe,EAEf,SAAS,EACT,SAAS,EACT,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,UAAU,EAIV,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,UAAU,EAGV,UAAU,EACV,aAAa,EACb,SAAS,EACT,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAGL,SAAS,EAGT,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,UAAU,EAGV,gBAAgB,EAChB,UAAU,EACV,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,WAAW,EAGX,QAAQ,EACR,KAAK,EACL,YAAY,GACb,MAAM,YAAY,CAAC"}
@@ -11,6 +11,12 @@ export type LighthouseOptions = {
11
11
  threshold?: number;
12
12
  /** The pages to audit; every page in the export's sitemap when none are given. */
13
13
  paths?: readonly string[];
14
+ /**
15
+ * How many more times a page under the threshold is measured; 2 by default, so a page gets three runs and the
16
+ * median of each category's scores. Performance on a shared runner swings a few points between runs of the same
17
+ * page, and one low run fails a gate that three agree would pass; a page every run finds low still fails.
18
+ */
19
+ retries?: number;
14
20
  /** The Lighthouse release `pnpm dlx` runs. */
15
21
  lighthouseVersion?: string;
16
22
  /** The Chrome binary; Playwright's Chromium when it is installed and nothing is given. */
@@ -20,10 +26,19 @@ export type LighthouseOptions = {
20
26
  };
21
27
  export type PageResult = {
22
28
  path: string;
23
- /** Each category's score, 0 to 1. */
29
+ /** Each category's score, 0 to 1: the median over the page's runs. */
24
30
  scores: Record<Category, number>;
25
31
  /** The categories under the threshold. */
26
32
  low: Category[];
33
+ /** How many times the page was measured. */
34
+ runs: number;
35
+ };
36
+ /** The median of the scores, which three runs with one low outlier put at the typical run. */
37
+ export declare const median: (values: readonly number[]) => number;
38
+ /** The categories under the threshold, by the median of each one's scores over the runs so far. */
39
+ export declare const judge: (runs: readonly Record<Category, number>[], threshold: number) => {
40
+ scores: Record<Category, number>;
41
+ low: Category[];
27
42
  };
28
43
  /** Every page's path from the export's sitemap, whatever origin the sitemap names. */
29
44
  export declare const pagesFromSitemap: (root: string) => Promise<string[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"lighthouse.d.ts","sourceRoot":"","sources":["../src/lighthouse.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,UAAU,oEAAqE,CAAC;AAC7F,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kHAAkH;IAClH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wFAAwF;IACxF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,8CAA8C;IAC9C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0FAA0F;IAC1F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjC,0CAA0C;IAC1C,GAAG,EAAE,QAAQ,EAAE,CAAC;CACjB,CAAC;AAIF,sFAAsF;AACtF,eAAO,MAAM,gBAAgB,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,MAAM,EAAE,CAGrE,CAAC;AAEF,yGAAyG;AACzG,eAAO,MAAM,UAAU,GAAI,WAAW,MAAM,EAAE,UAAU,MAAM,WACyB,CAAC;AA0CxF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAU,UAAS,iBAAsB,KAAG,OAAO,CAAC,UAAU,EAAE,CAiCzF,CAAC"}
1
+ {"version":3,"file":"lighthouse.d.ts","sourceRoot":"","sources":["../src/lighthouse.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,UAAU,oEAAqE,CAAC;AAC7F,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kHAAkH;IAClH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wFAAwF;IACxF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0FAA0F;IAC1F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjC,0CAA0C;IAC1C,GAAG,EAAE,QAAQ,EAAE,CAAC;IAChB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,8FAA8F;AAC9F,eAAO,MAAM,MAAM,GAAI,QAAQ,SAAS,MAAM,EAAE,KAAG,MASlD,CAAC;AAEF,mGAAmG;AACnG,eAAO,MAAM,KAAK,GAChB,MAAM,SAAS,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EACzC,WAAW,MAAM,KAChB;IAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAAC,GAAG,EAAE,QAAQ,EAAE,CAAA;CAKrD,CAAC;AAIF,sFAAsF;AACtF,eAAO,MAAM,gBAAgB,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,MAAM,EAAE,CAGrE,CAAC;AAEF,yGAAyG;AACzG,eAAO,MAAM,UAAU,GAAI,WAAW,MAAM,EAAE,UAAU,MAAM,WACyB,CAAC;AA2ExF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAU,UAAS,iBAAsB,KAAG,OAAO,CAAC,UAAU,EAAE,CA2BzF,CAAC"}