@visiblebase/core 0.2.0 → 0.2.3
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.
- package/README.md +12 -11
- package/bin/core/auth/authenticator.d.ts +17 -6
- package/bin/core/auth/authenticator.d.ts.map +1 -1
- package/bin/core/auth/authenticator.js +49 -30
- package/bin/core/auth/authenticator.js.map +1 -1
- package/bin/core/base/base.d.ts +11 -40
- package/bin/core/base/base.d.ts.map +1 -1
- package/bin/core/base/base.js +146 -102
- package/bin/core/base/base.js.map +1 -1
- package/bin/core/runtime.d.ts +10 -0
- package/bin/core/runtime.d.ts.map +1 -1
- package/bin/index.d.ts +5 -14
- package/bin/index.d.ts.map +1 -1
- package/bin/index.js +5 -14
- package/bin/index.js.map +1 -1
- package/bin/service/action.d.ts +44 -0
- package/bin/service/action.d.ts.map +1 -0
- package/bin/service/action.js +48 -0
- package/bin/service/action.js.map +1 -0
- package/bin/service/ai/ai-service.d.ts +36 -60
- package/bin/service/ai/ai-service.d.ts.map +1 -1
- package/bin/service/ai/ai-service.js +194 -120
- package/bin/service/ai/ai-service.js.map +1 -1
- package/bin/service/ai/provider.d.ts +24 -58
- package/bin/service/ai/provider.d.ts.map +1 -1
- package/bin/service/ai/provider.js +20 -41
- package/bin/service/ai/provider.js.map +1 -1
- package/bin/service/ai/types.d.ts +57 -35
- package/bin/service/ai/types.d.ts.map +1 -1
- package/bin/service/ai/types.js +1 -1
- package/bin/service/env/env-service.d.ts +0 -4
- package/bin/service/env/env-service.d.ts.map +1 -1
- package/bin/service/env/env-service.js +15 -25
- package/bin/service/env/env-service.js.map +1 -1
- package/bin/service/hook.d.ts +8 -5
- package/bin/service/hook.d.ts.map +1 -1
- package/bin/service/hook.js +11 -14
- package/bin/service/hook.js.map +1 -1
- package/bin/service/plugin.d.ts +20 -96
- package/bin/service/plugin.d.ts.map +1 -1
- package/bin/service/plugin.js +24 -61
- package/bin/service/plugin.js.map +1 -1
- package/bin/service/products/products-service.d.ts +0 -5
- package/bin/service/products/products-service.d.ts.map +1 -1
- package/bin/service/products/products-service.js +19 -25
- package/bin/service/products/products-service.js.map +1 -1
- package/bin/service/service.d.ts +76 -65
- package/bin/service/service.d.ts.map +1 -1
- package/bin/service/service.js +47 -80
- package/bin/service/service.js.map +1 -1
- package/bin/service/types.d.ts +2 -8
- package/bin/service/types.d.ts.map +1 -1
- package/bin/store/db.d.ts +5 -4
- package/bin/store/db.d.ts.map +1 -1
- package/bin/store/db.js +3 -2
- package/bin/store/db.js.map +1 -1
- package/package.json +8 -9
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# @visiblebase/
|
|
1
|
+
# @visiblebase/core
|
|
2
2
|
|
|
3
|
-
`@visiblebase/
|
|
3
|
+
`@visiblebase/core` 是 VisibleBase 的服务端 Runtime。
|
|
4
4
|
|
|
5
5
|
它负责这些共用能力:
|
|
6
6
|
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
## 安装
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
|
-
pnpm add @visiblebase/
|
|
16
|
+
pnpm add @visiblebase/core
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
需要 Node `>=22.13.0`。
|
|
@@ -21,7 +21,7 @@ pnpm add @visiblebase/base
|
|
|
21
21
|
## 最小示例
|
|
22
22
|
|
|
23
23
|
```ts
|
|
24
|
-
import { Base } from "@visiblebase/
|
|
24
|
+
import { Base } from "@visiblebase/core";
|
|
25
25
|
|
|
26
26
|
const base = new Base();
|
|
27
27
|
|
|
@@ -70,7 +70,7 @@ console.log(`VisibleBase listening on http://${server.host}:${server.port}`);
|
|
|
70
70
|
|
|
71
71
|
```ts
|
|
72
72
|
import { sqliteTable, text } from "drizzle-orm/sqlite-core";
|
|
73
|
-
import { Base } from "@visiblebase/
|
|
73
|
+
import { Base } from "@visiblebase/core";
|
|
74
74
|
|
|
75
75
|
const notes = sqliteTable("notes", {
|
|
76
76
|
id: text("id").primaryKey(),
|
|
@@ -96,14 +96,14 @@ const rows = await base.table("notes").select();
|
|
|
96
96
|
插件用于把多个 client 产品会复用的 Base 能力封装起来,例如用户注册登录、支付、订阅权益、usage 扣费或通知。
|
|
97
97
|
|
|
98
98
|
```ts
|
|
99
|
-
import { Base } from "@visiblebase/
|
|
100
|
-
import {
|
|
99
|
+
import { Base } from "@visiblebase/core";
|
|
100
|
+
import { accountsPlugin } from "@visiblebase/plugin-accounts";
|
|
101
101
|
import { usagePlugin } from "@visiblebase/plugin-usage";
|
|
102
102
|
import { stripePaymentPlugin } from "@visiblebase/plugin-payment-stripe";
|
|
103
103
|
|
|
104
104
|
const base = new Base({
|
|
105
105
|
plugins: [
|
|
106
|
-
|
|
106
|
+
accountsPlugin(),
|
|
107
107
|
usagePlugin(),
|
|
108
108
|
stripePaymentPlugin(),
|
|
109
109
|
],
|
|
@@ -114,10 +114,11 @@ Base 使用者不需要为官方插件定义数据库表。插件包内部会声
|
|
|
114
114
|
|
|
115
115
|
`models` 和 `products` 也是默认内置插件。你不传 `plugins` 时,Base 会自动启用它们;你传入其他插件时,它们仍然保留;如果你传入同 ID 的 `models` 或 `products` 插件,则会替换默认实现。
|
|
116
116
|
|
|
117
|
-
|
|
117
|
+
插件路由统一挂到同一个 `/v1/{pluginId}/{path}` 空间。
|
|
118
118
|
|
|
119
|
-
- `auth
|
|
120
|
-
- `auth: "admin"
|
|
119
|
+
- `auth` 不传:默认要求 `user`
|
|
120
|
+
- `auth: ["admin"]`:只允许 admin
|
|
121
|
+
- `auth: []`:免登录
|
|
121
122
|
|
|
122
123
|
如果你在开发插件,插件可以声明自己的 `schema`,并通过 `ctx.table(name)` 读写插件表;也可以通过 `ctx.hook.before()`、`ctx.hook.after()` 和 `ctx.hook.onError()` 介入 service 调用。
|
|
123
124
|
|
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
*
|
|
7
7
|
* TokenSigner 实例通过 getSigner() 缓存,避免重复 new TokenSigner(key)。
|
|
8
8
|
*/
|
|
9
|
-
import type
|
|
9
|
+
import { type RouteAuth, type RouteIdentity } from "../../service/service.js";
|
|
10
10
|
import type { EnvProvider } from "../runtime.js";
|
|
11
11
|
import type { CreateUserTokenInput, UserTokenPayload, UserTokenIssueResult, RuntimeUser } from "./types.js";
|
|
12
12
|
/** 鉴权级别 */
|
|
13
13
|
/** 鉴权结果 */
|
|
14
14
|
export interface AuthResult {
|
|
15
15
|
/** 鉴权后的实际级别 */
|
|
16
|
-
level:
|
|
16
|
+
level: RouteIdentity;
|
|
17
17
|
/** 解析出的用户信息(user 级别时可用) */
|
|
18
18
|
user?: RuntimeUser;
|
|
19
19
|
/** 解析出的 Product 信息(user 级别时可用) */
|
|
@@ -43,13 +43,24 @@ export declare class Authenticator {
|
|
|
43
43
|
*/
|
|
44
44
|
private getSigner;
|
|
45
45
|
/**
|
|
46
|
-
*
|
|
46
|
+
* 解析请求身份。
|
|
47
47
|
*
|
|
48
48
|
* @param request - 原始 HTTP Request
|
|
49
|
-
* @
|
|
50
|
-
* @returns 鉴权结果(含 user/product 信息)
|
|
49
|
+
* @returns 当前请求身份;无 token 或 token 无效时返回 guest
|
|
51
50
|
*/
|
|
52
|
-
|
|
51
|
+
resolve(request: Request): Promise<AuthResult>;
|
|
52
|
+
/**
|
|
53
|
+
* 根据 action 的 auth 配置判断当前身份是否允许继续。
|
|
54
|
+
*
|
|
55
|
+
* @param result - 当前已解析身份
|
|
56
|
+
* @param required - action 声明的允许身份集合
|
|
57
|
+
* @returns 通过授权后的身份结果
|
|
58
|
+
*/
|
|
59
|
+
authorize(result: AuthResult, required?: RouteAuth): AuthResult;
|
|
60
|
+
/**
|
|
61
|
+
* 对请求执行鉴权并强制满足 action 的 auth 配置。
|
|
62
|
+
*/
|
|
63
|
+
authenticate(request: Request, required?: RouteAuth): Promise<AuthResult>;
|
|
53
64
|
/**
|
|
54
65
|
* 签发 user_token(验证 product 状态后签发)。
|
|
55
66
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authenticator.d.ts","sourceRoot":"","sources":["../../../src/core/auth/authenticator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"authenticator.d.ts","sourceRoot":"","sources":["../../../src/core/auth/authenticator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAsB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5G,WAAW;AACX,WAAW;AACX,MAAM,WAAW,UAAU;IACzB,eAAe;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,kCAAkC;IAClC,OAAO,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAClD;AAED,YAAY;AACZ,qBAAa,aAAa;IAKtB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,KAAK;IALf,yBAAyB;IACzB,OAAO,CAAC,WAAW,CAAC,CAAc;gBAGxB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,MAAM,OAAO,CAAC;QAAE,OAAO,EAAE;YAAE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;gBAAE,UAAU,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAE,GAAG,SAAS,CAAC,CAAA;SAAE,CAAA;KAAE,CAAC;IAG7H;;;;OAIG;IACH,OAAO,CAAC,SAAS;IASjB;;;;;OAKG;IACG,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IA0BpD;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,UAAU;IAY/D;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAI/E;;;;;OAKG;IACG,WAAW,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAiB7E;;;;;OAKG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAG5D"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { bearerToken, httpError } from "../../utils/helpers.js";
|
|
10
10
|
import { TokenSigner } from "./token-signer.js";
|
|
11
|
+
import { normalizeRouteAuth } from "../../service/service.js";
|
|
11
12
|
/** 统一鉴权器 */
|
|
12
13
|
export class Authenticator {
|
|
13
14
|
env;
|
|
@@ -33,42 +34,60 @@ export class Authenticator {
|
|
|
33
34
|
return this.tokenSigner;
|
|
34
35
|
}
|
|
35
36
|
/**
|
|
36
|
-
*
|
|
37
|
+
* 解析请求身份。
|
|
37
38
|
*
|
|
38
39
|
* @param request - 原始 HTTP Request
|
|
39
|
-
* @
|
|
40
|
-
* @returns 鉴权结果(含 user/product 信息)
|
|
40
|
+
* @returns 当前请求身份;无 token 或 token 无效时返回 guest
|
|
41
41
|
*/
|
|
42
|
-
async
|
|
43
|
-
if (required === "public") {
|
|
44
|
-
return { level: "public" };
|
|
45
|
-
}
|
|
42
|
+
async resolve(request) {
|
|
46
43
|
const token = bearerToken(request);
|
|
47
|
-
if (!token)
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
if (required === "admin") {
|
|
52
|
-
const adminKey = this.env.get("VISIBLEBASE_ADMIN_SECRET_KEY");
|
|
53
|
-
if (!adminKey)
|
|
54
|
-
throw httpError(500, "VISIBLEBASE_ADMIN_SECRET_KEY is required");
|
|
55
|
-
if (token !== adminKey)
|
|
56
|
-
throw httpError(401, "Invalid admin_secret_key");
|
|
44
|
+
if (!token)
|
|
45
|
+
return { level: "guest" };
|
|
46
|
+
const adminKey = this.env.get("VISIBLEBASE_ADMIN_SECRET_KEY");
|
|
47
|
+
if (adminKey && token === adminKey) {
|
|
57
48
|
return { level: "admin" };
|
|
58
49
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
50
|
+
try {
|
|
51
|
+
const payload = await this.getSigner().verify(token);
|
|
52
|
+
const store = await this.store();
|
|
53
|
+
const product = await store.product.get(payload.product_id);
|
|
54
|
+
if (!product)
|
|
55
|
+
return { level: "guest" };
|
|
56
|
+
if (product.status !== "active")
|
|
57
|
+
return { level: "guest" };
|
|
58
|
+
return {
|
|
59
|
+
level: "user",
|
|
60
|
+
user: { user_id: payload.user_id, metadata: payload.metadata ?? {} },
|
|
61
|
+
product,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return { level: "guest" };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 根据 action 的 auth 配置判断当前身份是否允许继续。
|
|
70
|
+
*
|
|
71
|
+
* @param result - 当前已解析身份
|
|
72
|
+
* @param required - action 声明的允许身份集合
|
|
73
|
+
* @returns 通过授权后的身份结果
|
|
74
|
+
*/
|
|
75
|
+
authorize(result, required) {
|
|
76
|
+
const allowed = normalizeRouteAuth(required);
|
|
77
|
+
if (allowed.length === 0)
|
|
78
|
+
return result;
|
|
79
|
+
if (result.level !== "guest" && allowed.includes(result.level))
|
|
80
|
+
return result;
|
|
81
|
+
if (result.level === "guest") {
|
|
82
|
+
throw httpError(401, "Authentication required");
|
|
83
|
+
}
|
|
84
|
+
throw httpError(403, `Forbidden for identity: ${result.level}`);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 对请求执行鉴权并强制满足 action 的 auth 配置。
|
|
88
|
+
*/
|
|
89
|
+
async authenticate(request, required) {
|
|
90
|
+
return this.authorize(await this.resolve(request), required);
|
|
72
91
|
}
|
|
73
92
|
/**
|
|
74
93
|
* 签发 user_token(验证 product 状态后签发)。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authenticator.js","sourceRoot":"","sources":["../../../src/core/auth/authenticator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"authenticator.js","sourceRoot":"","sources":["../../../src/core/auth/authenticator.ts"],"names":[],"mappings":"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"}
|
package/bin/core/base/base.d.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Base Runtime 主模块。
|
|
3
3
|
*
|
|
4
|
-
* Base
|
|
4
|
+
* Base 是运行时容器,负责:Service 生命周期、鉴权、HTTP 桥接。
|
|
5
5
|
* 不知道任何具体 Service 的实现,所有 Service 通过 _onInit() 自初始化。
|
|
6
6
|
*
|
|
7
|
-
* 数据库连接、环境变量存储等运行时特定逻辑由 Runtime 适配器注入。
|
|
8
|
-
*
|
|
9
7
|
* 使用方式:
|
|
10
8
|
* ```ts
|
|
11
9
|
* import { Base } from "@visiblebase/core";
|
|
@@ -13,7 +11,6 @@
|
|
|
13
11
|
*
|
|
14
12
|
* const base = new Base({ runtime: node({ database: "sqlite:./data.sqlite" }) });
|
|
15
13
|
* base.use(new AIService());
|
|
16
|
-
* // 路由始终是标准 Hono app
|
|
17
14
|
* serve({ fetch: base.router().fetch, port: 3000 });
|
|
18
15
|
* ```
|
|
19
16
|
*/
|
|
@@ -26,6 +23,9 @@ import type { BaseOptions, BaseHealthStatus } from "../types.js";
|
|
|
26
23
|
import type { RuntimeUser } from "../auth/types.js";
|
|
27
24
|
declare module "hono" {
|
|
28
25
|
interface ContextVariableMap {
|
|
26
|
+
identity?: {
|
|
27
|
+
kind: "guest" | "user" | "admin";
|
|
28
|
+
};
|
|
29
29
|
user?: RuntimeUser;
|
|
30
30
|
product?: {
|
|
31
31
|
product_id: string;
|
|
@@ -33,12 +33,6 @@ declare module "hono" {
|
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
|
-
/**
|
|
37
|
-
* VisibleBase 运行时容器。
|
|
38
|
-
*
|
|
39
|
-
* 接收 Service 注册、构建 Hono 路由、管理初始化生命周期。
|
|
40
|
-
* 数据库和 env 通过 Runtime 适配器注入,不依赖任何特定运行时。
|
|
41
|
-
*/
|
|
42
36
|
export declare class Base {
|
|
43
37
|
private readonly runtime;
|
|
44
38
|
private readonly services;
|
|
@@ -49,43 +43,13 @@ export declare class Base {
|
|
|
49
43
|
private hono?;
|
|
50
44
|
private authenticator?;
|
|
51
45
|
constructor(options: BaseOptions);
|
|
52
|
-
/**
|
|
53
|
-
* 注册一个 Service。
|
|
54
|
-
*
|
|
55
|
-
* Service 在 Base 初始化时自动获得数据库、鉴权器、env 等基础设施。
|
|
56
|
-
*/
|
|
57
46
|
use(svc: Service | BasePlugin): this;
|
|
58
|
-
/** 获取指定 ID 的 Service */
|
|
59
47
|
getService(id: string): Service | undefined;
|
|
60
|
-
/** 获取所有已注册的 Service */
|
|
61
48
|
getServices(): Service[];
|
|
62
49
|
getAuthenticator(): Promise<Authenticator>;
|
|
63
|
-
/**
|
|
64
|
-
* 获取指定名称的数据库表 API。
|
|
65
|
-
*
|
|
66
|
-
* @param name - 表名(格式为 "service_id.table_name" 或内置表名)
|
|
67
|
-
*/
|
|
68
50
|
table<TRow extends Record<string, unknown> = Record<string, unknown>>(name: string): Promise<BaseTableApi<TRow>>;
|
|
69
|
-
/**
|
|
70
|
-
* 获取 Hono 路由实例(需先完成初始化)。
|
|
71
|
-
*
|
|
72
|
-
* 路由可以直接挂载到任何支持 fetch 的 HTTP 服务器:
|
|
73
|
-
* ```ts
|
|
74
|
-
* // Node.js
|
|
75
|
-
* serve({ fetch: base.router().fetch, port: 3000 });
|
|
76
|
-
*
|
|
77
|
-
* // Cloudflare Workers
|
|
78
|
-
* export default { fetch: base.router().fetch };
|
|
79
|
-
* ```
|
|
80
|
-
*/
|
|
81
51
|
router(): Hono;
|
|
82
|
-
/**
|
|
83
|
-
* 直接处理一个 Request(用于 Serverless 场景)。
|
|
84
|
-
*/
|
|
85
52
|
handleRequest(request: Request): Promise<Response>;
|
|
86
|
-
/**
|
|
87
|
-
* 健康检查。
|
|
88
|
-
*/
|
|
89
53
|
health(): Promise<BaseHealthStatus>;
|
|
90
54
|
private initialize;
|
|
91
55
|
private collectServiceSchemas;
|
|
@@ -93,6 +57,13 @@ export declare class Base {
|
|
|
93
57
|
private ensureReady;
|
|
94
58
|
private requireReadySync;
|
|
95
59
|
private requireReady;
|
|
60
|
+
/**
|
|
61
|
+
* 收集插件注册的全局 hook。
|
|
62
|
+
*
|
|
63
|
+
* Service.hook 只作用于当前 Service;Plugin.globalHook 用于 usage、
|
|
64
|
+
* billing 等需要观察所有用户侧调用的横切能力。
|
|
65
|
+
*/
|
|
66
|
+
private globalPluginHooks;
|
|
96
67
|
}
|
|
97
68
|
export { Base as VisibleBase };
|
|
98
69
|
//# sourceMappingURL=base.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/core/base/base.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/core/base/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAqC,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,OAAO,EAAgB,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,QAAQ,MAAM,CAAC;IACpB,UAAU,kBAAkB;QAC1B,QAAQ,CAAC,EAAE;YAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC;QAChD,IAAI,CAAC,EAAE,WAAW,CAAC;QACnB,OAAO,CAAC,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KAClD;CACF;AAED,qBAAa,IAAI;IACf,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IAEvD,OAAO,CAAC,QAAQ,CAAC,CAAuC;IACxD,OAAO,CAAC,MAAM,CAAC,CAAoD;IACnE,OAAO,CAAC,QAAQ,CAAC,CAA4B;IAC7C,OAAO,CAAC,WAAW,CAAC,CAAgB;IACpC,OAAO,CAAC,IAAI,CAAC,CAAO;IACpB,OAAO,CAAC,aAAa,CAAC,CAAgB;gBAE1B,OAAO,EAAE,WAAW;IAWhC,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI;IAMpC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C,WAAW,IAAI,OAAO,EAAE;IAQlB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC;IAS1C,KAAK,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxE,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAW9B,MAAM,IAAI,IAAI;IAKR,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAKlD,MAAM,IAAI,OAAO,CAAC,gBAAgB,CAAC;YAgB3B,UAAU;IA8CxB,OAAO,CAAC,qBAAqB;IAoB7B,OAAO,CAAC,SAAS;YAkHH,WAAW;IAKzB,OAAO,CAAC,gBAAgB;YAIV,YAAY;IAM1B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;CAK1B;AAED,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,CAAC"}
|