@curless/hotel-storefront 0.55.8 → 0.56.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.
Files changed (42) hide show
  1. package/dist/account/fake-mall.d.ts +42 -0
  2. package/dist/account/fake-mall.d.ts.map +1 -0
  3. package/dist/account/fake-mall.js +168 -0
  4. package/dist/account/fake-mall.js.map +1 -0
  5. package/dist/account/index.d.ts +109 -0
  6. package/dist/account/index.d.ts.map +1 -0
  7. package/dist/account/index.js +871 -0
  8. package/dist/account/index.js.map +1 -0
  9. package/dist/account/mall.d.ts +83 -0
  10. package/dist/account/mall.d.ts.map +1 -0
  11. package/dist/account/mall.js +224 -0
  12. package/dist/account/mall.js.map +1 -0
  13. package/dist/account/pages.d.ts +118 -0
  14. package/dist/account/pages.d.ts.map +1 -0
  15. package/dist/account/pages.js +295 -0
  16. package/dist/account/pages.js.map +1 -0
  17. package/dist/account/requests.d.ts +68 -0
  18. package/dist/account/requests.d.ts.map +1 -0
  19. package/dist/account/requests.js +178 -0
  20. package/dist/account/requests.js.map +1 -0
  21. package/dist/account/store.d.ts +67 -0
  22. package/dist/account/store.d.ts.map +1 -0
  23. package/dist/account/store.js +151 -0
  24. package/dist/account/store.js.map +1 -0
  25. package/dist/card.generated.d.ts +1 -1
  26. package/dist/card.generated.js +2 -2
  27. package/dist/card.generated.js.map +1 -1
  28. package/dist/config.d.ts +9 -0
  29. package/dist/config.d.ts.map +1 -1
  30. package/dist/config.js.map +1 -1
  31. package/dist/legal.d.ts.map +1 -1
  32. package/dist/legal.js +15 -3
  33. package/dist/legal.js.map +1 -1
  34. package/dist/server.d.ts +2 -2
  35. package/dist/server.d.ts.map +1 -1
  36. package/dist/server.js +249 -51
  37. package/dist/server.js.map +1 -1
  38. package/dist/tools.d.ts +231 -2
  39. package/dist/tools.d.ts.map +1 -1
  40. package/dist/tools.js +6 -0
  41. package/dist/tools.js.map +1 -1
  42. package/package.json +1 -1
@@ -0,0 +1,42 @@
1
+ export type FakeMember = {
2
+ id: number;
3
+ userName: string;
4
+ password: string;
5
+ nickname?: string;
6
+ name?: string;
7
+ email: string;
8
+ mobile?: string;
9
+ };
10
+ /** Who is there from the start: `lin` / `Lin-demo-1`. */
11
+ export declare const FAKE_MEMBER: Omit<FakeMember, 'id'>;
12
+ /** What each call was - its path, and the NAMES of the fields it carried (never a value). */
13
+ export type FakeMallCall = {
14
+ path: string;
15
+ method: string;
16
+ tenant?: string;
17
+ token: boolean;
18
+ fields: string[];
19
+ };
20
+ export type FakeMall = {
21
+ fetch: typeof fetch;
22
+ calls: FakeMallCall[];
23
+ /** Every request the mall saw, whole - for a test that holds what was sent. */
24
+ bodies: {
25
+ path: string;
26
+ body: Record<string, unknown>;
27
+ }[];
28
+ members: Map<string, FakeMember>;
29
+ /** Signs a member out at the mall, as another device would: their tokens stop working. */
30
+ revoke: (userName: string) => void;
31
+ /** The mall stops answering (`true`), or answers again. */
32
+ down: (on: boolean) => void;
33
+ /** member/info answers a fault of its own (`code` 500 in an HTTP 200), or answers again. */
34
+ fault: (on: boolean) => void;
35
+ /** The next request to this path waits until the function handed back is called - a mall keeping one caller waiting. */
36
+ holdNext: (path: string) => () => void;
37
+ };
38
+ export declare const createFakeMall: (opts?: {
39
+ tenant?: string;
40
+ expireIn?: number;
41
+ }) => FakeMall;
42
+ //# sourceMappingURL=fake-mall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-mall.d.ts","sourceRoot":"","sources":["../../src/account/fake-mall.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAO9C,CAAC;AAEF,6FAA6F;AAC7F,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,+EAA+E;IAC/E,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE,CAAC;IAC1D,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACjC,0FAA0F;IAC1F,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,2DAA2D;IAC3D,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5B,4FAA4F;IAC5F,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7B,wHAAwH;IACxH,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,IAAI,CAAC;CACxC,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,OAAM;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,KAAG,QA4IlF,CAAC"}
@@ -0,0 +1,168 @@
1
+ // A stand-in for the Curless mall's member API, for tests and the card
2
+ // preview - never a deployment, and never the dev backend (robin, 2026-11-06:
3
+ // he makes his own account there). Its answers are the shapes Nexva One reads
4
+ // from the same API (marketplace evals/mall.mjs): an envelope with its own
5
+ // `code`, `data.access_token` and `data.user_info` from a sign-in, and
6
+ // member/info answering HTTP 200 with nothing at all to a token that is not a
7
+ // member's - as apidev did on 2026-11-06.
8
+ //
9
+ // One member is there from the start - a made-up person (example.com, a 555
10
+ // number) - and any account made on it is kept in this process only.
11
+ /** Who is there from the start: `lin` / `Lin-demo-1`. */
12
+ export const FAKE_MEMBER = {
13
+ userName: 'lin',
14
+ password: 'Lin-demo-1',
15
+ nickname: 'Lin',
16
+ name: 'Lin Wei',
17
+ email: 'lin.wei@example.com',
18
+ mobile: '+1 555 0134 2288',
19
+ };
20
+ export const createFakeMall = (opts = {}) => {
21
+ const members = new Map([['lin', { id: 30001, ...FAKE_MEMBER }]]);
22
+ const tokens = new Map(); // access token → user name
23
+ const refreshes = new Map(); // refresh token → user name
24
+ const calls = [];
25
+ const bodies = [];
26
+ let seq = 0;
27
+ let isDown = false;
28
+ let isFault = false;
29
+ const holds = new Map();
30
+ const json = (body, status = 200) => new Response(JSON.stringify(body), { status, headers: { 'content-type': 'application/json' } });
31
+ const ok = (data) => json({ code: 200, msg: '操作成功', data });
32
+ const bad = (code, msg) => json({ code, msg, data: null });
33
+ const info = (m) => ({
34
+ id: m.id,
35
+ userName: m.userName,
36
+ nickname: m.nickname ?? m.userName,
37
+ name: m.name ?? '',
38
+ point: 0,
39
+ email: m.email,
40
+ mobile: m.mobile ?? '',
41
+ status: '0',
42
+ });
43
+ const issue = (userName) => {
44
+ seq += 1;
45
+ const access = `fake-access-${seq}-${Math.random().toString(36).slice(2)}`;
46
+ const refresh = `fake-refresh-${seq}-${Math.random().toString(36).slice(2)}`;
47
+ tokens.set(access, userName);
48
+ refreshes.set(refresh, userName);
49
+ return {
50
+ access_token: access,
51
+ refresh_token: refresh,
52
+ expire_in: opts.expireIn ?? 7200,
53
+ refresh_expire_in: 604800,
54
+ token_type: 'Bearer',
55
+ };
56
+ };
57
+ const fetchFn = async (input, init) => {
58
+ const url = new URL(typeof input === 'string' ? input : input instanceof URL ? input.href : input.url);
59
+ const method = (init?.method ?? 'GET').toUpperCase();
60
+ const headers = new Headers(init?.headers);
61
+ const tenant = headers.get('x-tenant-id') ?? undefined;
62
+ const token = headers.get('member-token') ?? '';
63
+ let body = {};
64
+ if (typeof init?.body === 'string') {
65
+ try {
66
+ body = JSON.parse(init.body);
67
+ }
68
+ catch { }
69
+ }
70
+ const path = url.pathname;
71
+ const held = holds.get(path);
72
+ if (held) {
73
+ holds.delete(path);
74
+ await held;
75
+ }
76
+ calls.push({
77
+ path,
78
+ method,
79
+ ...(tenant ? { tenant } : {}),
80
+ token: !!token,
81
+ fields: Object.keys(body).sort(),
82
+ });
83
+ bodies.push({ path, body });
84
+ if (isDown)
85
+ throw new TypeError('fetch failed');
86
+ if (opts.tenant && tenant !== opts.tenant)
87
+ return bad(500, 'Tenant not found');
88
+ if (path === '/api/v1/member/login' && method === 'POST') {
89
+ if (!body.password)
90
+ return bad(500, 'Password cannot be empty');
91
+ const m = members.get(String(body.username ?? ''));
92
+ if (!m || m.password !== body.password)
93
+ return bad(500, '账号或密码错误');
94
+ return ok({
95
+ ...issue(m.userName),
96
+ user_info: { id: m.id, userName: m.userName, nickname: m.nickname ?? m.userName, point: 0 },
97
+ });
98
+ }
99
+ if (path === '/api/v1/member/register' && method === 'POST') {
100
+ if (!body.password)
101
+ return bad(500, 'Password cannot be empty');
102
+ const u = String(body.username ?? '').trim();
103
+ if (!u || !body.email)
104
+ return bad(500, '参数不完整');
105
+ if (members.has(u))
106
+ return bad(500, '用户名已存在');
107
+ const m = {
108
+ id: 40000 + members.size + 1,
109
+ userName: u,
110
+ password: String(body.password),
111
+ email: String(body.email),
112
+ ...(typeof body.mobile === 'string' ? { mobile: body.mobile } : {}),
113
+ ...(typeof body.nickname === 'string' ? { nickname: body.nickname } : {}),
114
+ };
115
+ members.set(u, m);
116
+ return ok(info(m));
117
+ }
118
+ if (path === '/api/v1/member/info' && isFault)
119
+ return bad(500, '系统异常');
120
+ if (path === '/api/v1/member/info') {
121
+ const m = members.get(tokens.get(token) ?? '');
122
+ // Not a member's token: nothing at all, as apidev answers.
123
+ if (!m)
124
+ return new Response('', { status: 200 });
125
+ return ok(info(m));
126
+ }
127
+ if (path === '/api/v1/member/refresh' && method === 'POST') {
128
+ const u = refreshes.get(String(body.refresh_token ?? ''));
129
+ if (!u)
130
+ return bad(401, '登录已过期');
131
+ refreshes.delete(String(body.refresh_token));
132
+ return ok(issue(u));
133
+ }
134
+ if (path === '/api/v1/member/logout' && method === 'POST') {
135
+ tokens.delete(token);
136
+ return ok(null);
137
+ }
138
+ return bad(404, 'not found');
139
+ };
140
+ return {
141
+ fetch: fetchFn,
142
+ calls,
143
+ bodies,
144
+ members,
145
+ revoke: (userName) => {
146
+ for (const [t, u] of [...tokens])
147
+ if (u === userName)
148
+ tokens.delete(t);
149
+ for (const [t, u] of [...refreshes])
150
+ if (u === userName)
151
+ refreshes.delete(t);
152
+ },
153
+ down: (on) => {
154
+ isDown = on;
155
+ },
156
+ fault: (on) => {
157
+ isFault = on;
158
+ },
159
+ holdNext: (path) => {
160
+ let release = () => { };
161
+ holds.set(path, new Promise((ok) => {
162
+ release = ok;
163
+ }));
164
+ return () => release();
165
+ },
166
+ };
167
+ };
168
+ //# sourceMappingURL=fake-mall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-mall.js","sourceRoot":"","sources":["../../src/account/fake-mall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ import type { Hono } from 'hono';
2
+ export type AccountConfig = {
3
+ /** The Curless mall's member API - the only kind there is. */
4
+ source: 'mall';
5
+ baseUrl?: string;
6
+ tenant?: string;
7
+ /** `<envPrefix>_API_URL` / `<envPrefix>_TENANT_ID` win over the two above. Default `ACCOUNT`. */
8
+ envPrefix?: string;
9
+ };
10
+ /**
11
+ * The tools, by the deployment's prefix: three the assistant calls -
12
+ * `sign_in_otaless_account` - and one the card calls (`card`, app-only).
13
+ *
14
+ * ⚠️ THE ASSISTANT'S THREE NAME NO CONVERSATION (security review of 0.56.0,
15
+ * P2-1): they act on the conversation they are called in and no other - a
16
+ * trip id handed to them by a page or a shop is refused (server.ts). Only the
17
+ * card names the conversation it was drawn for (its trip), through `card`, a
18
+ * tool the host keeps from the assistant; a client that draws no card is
19
+ * refused it.
20
+ */
21
+ export declare const accountToolNames: (prefix: string) => {
22
+ readonly signIn: `sign_in_${string}account`;
23
+ readonly view: `view_${string}account`;
24
+ readonly signOut: `sign_out_${string}account`;
25
+ readonly card: `card_${string}account`;
26
+ };
27
+ export type AccountToolNames = ReturnType<typeof accountToolNames>;
28
+ /** Beside every answer of a deployment with an account, for the card's header. */
29
+ export declare const ACCOUNT_META_KEY = "curless/account";
30
+ /** Beside a sign-in's answer where a card is drawn: the link and its short code, the card's alone. */
31
+ export declare const SIGN_IN_META_KEY = "curless/account-sign-in";
32
+ /** The mall is asked at most this often whether a sign-in is still theirs. */
33
+ export declare const CHECK_EVERY_MS: number;
34
+ export declare const COOKIE = "__Host-hotel_account";
35
+ /** How many of what, and over how long - each refusal said as "too many requests". */
36
+ export declare const ACCOUNT_LIMITS: {
37
+ /** Sign-in links one conversation may ask for in ten minutes. */
38
+ readonly linksPerConversation: 10;
39
+ /**
40
+ * …one address in a minute, and everyone (review P3-2: one address with two
41
+ * hundred sessions filled the table). Wide per address: every Claude user
42
+ * arrives from a handful of Anthropic's.
43
+ */
44
+ readonly linksPerIp: 120;
45
+ readonly linksPerMinute: 600;
46
+ /** Page views from one address in a minute. */
47
+ readonly pagesPerIp: 120;
48
+ /** Form posts from one address in ten minutes. */
49
+ readonly postsPerIp: 30;
50
+ /** Sign-ins (or accounts made) by one user name in ten minutes. */
51
+ readonly perName: 8;
52
+ /** Everyone's sign-ins in a minute, and accounts made. */
53
+ readonly signInsPerMinute: 180;
54
+ readonly registersPerMinute: 90;
55
+ };
56
+ /** The largest form our pages post (Caddy is told 16KB). */
57
+ export declare const FORM_MAX_BYTES: number;
58
+ export type AccountCall = {
59
+ key: string;
60
+ noCards?: boolean;
61
+ ip?: string;
62
+ /** The card's own tool asked (`names.card`), not the assistant. */
63
+ fromCard?: boolean;
64
+ };
65
+ export type AccountAnswer = {
66
+ text: string;
67
+ structured: Record<string, unknown>;
68
+ /** The card's alone - never the model's. */
69
+ meta?: Record<string, unknown>;
70
+ isError?: boolean;
71
+ };
72
+ export type Account = {
73
+ names: AccountToolNames;
74
+ tools: () => {
75
+ name: string;
76
+ inputSchema: unknown;
77
+ [k: string]: unknown;
78
+ }[];
79
+ outputSchemas: () => Record<string, unknown>;
80
+ has: (name: string) => boolean;
81
+ handle: (name: string, args: Record<string, unknown>, call: AccountCall) => Promise<AccountAnswer>;
82
+ /**
83
+ * What every answer carries for the card's header. `cards`: the session draws
84
+ * cards - only there does the name include the user name (0.56.1).
85
+ */
86
+ meta: (key: string, cards: boolean) => Record<string, unknown>;
87
+ instructions: (noCards: boolean) => string;
88
+ mount: (app: Hono) => void;
89
+ health: () => Record<string, number>;
90
+ };
91
+ export type AccountOptions = {
92
+ account: AccountConfig;
93
+ brand: string;
94
+ /** The deployment's own name (`server.name`): a card takes only its own account. */
95
+ from: string;
96
+ prefix: string;
97
+ publicUrl: string;
98
+ env?: Record<string, string | undefined>;
99
+ fetch?: typeof fetch;
100
+ now?: () => number;
101
+ logoUrl?: string;
102
+ logoDarkUrl?: string;
103
+ operator?: string;
104
+ log?: (line: string) => void;
105
+ };
106
+ /** An IPv6 address by its /64 (review P3-1, as Nexva counts it): one machine has a whole /64. */
107
+ export declare const addressKey: (ip: string) => string;
108
+ export declare const makeAccount: (opts: AccountOptions) => Account;
109
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/account/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AA0E1C,MAAM,MAAM,aAAa,GAAG;IAC1B,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iGAAiG;IACjG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM;;;;;CAMlC,CAAC;AACd,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEnE,kFAAkF;AAClF,eAAO,MAAM,gBAAgB,oBAAoB,CAAC;AAClD,sGAAsG;AACtG,eAAO,MAAM,gBAAgB,4BAA4B,CAAC;AAE1D,8EAA8E;AAC9E,eAAO,MAAM,cAAc,QAAa,CAAC;AACzC,eAAO,MAAM,MAAM,yBAAyB,CAAC;AAE7C,sFAAsF;AACtF,eAAO,MAAM,cAAc;IACzB,iEAAiE;;IAEjE;;;;OAIG;;;IAGH,+CAA+C;;IAE/C,kDAAkD;;IAElD,mEAAmE;;IAEnE,0DAA0D;;;CAGlD,CAAC;AAEX,4DAA4D;AAC5D,eAAO,MAAM,cAAc,QAAW,CAAC;AAEvC,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,mEAAmE;IACnE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AACF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,EAAE,CAAC;IAC5E,aAAa,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/B,MAAM,EAAE,CACN,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,EAAE,WAAW,KACd,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5B;;;OAGG;IACH,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/D,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC;IAC3C,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,aAAa,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B,CAAC;AAQF,iGAAiG;AACjG,eAAO,MAAM,UAAU,GAAI,IAAI,MAAM,KAAG,MAuBvC,CAAC;AA4BF,eAAO,MAAM,WAAW,GAAI,MAAM,cAAc,KAAG,OA0zBlD,CAAC"}