@pengzi/kms 1.0.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 (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +325 -0
  3. package/dist/client.d.ts +130 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +266 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/config.d.ts +20 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +54 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/core/asymmetric-crypto.d.ts +81 -0
  12. package/dist/core/asymmetric-crypto.d.ts.map +1 -0
  13. package/dist/core/asymmetric-crypto.js +171 -0
  14. package/dist/core/asymmetric-crypto.js.map +1 -0
  15. package/dist/core/crypto.d.ts +37 -0
  16. package/dist/core/crypto.d.ts.map +1 -0
  17. package/dist/core/crypto.js +100 -0
  18. package/dist/core/crypto.js.map +1 -0
  19. package/dist/core/crypto.service.d.ts +35 -0
  20. package/dist/core/crypto.service.d.ts.map +1 -0
  21. package/dist/core/crypto.service.js +67 -0
  22. package/dist/core/crypto.service.js.map +1 -0
  23. package/dist/core/key-derivation.d.ts +25 -0
  24. package/dist/core/key-derivation.d.ts.map +1 -0
  25. package/dist/core/key-derivation.js +96 -0
  26. package/dist/core/key-derivation.js.map +1 -0
  27. package/dist/index.d.ts +10 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +51 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/models/audit.model.d.ts +40 -0
  32. package/dist/models/audit.model.d.ts.map +1 -0
  33. package/dist/models/audit.model.js +83 -0
  34. package/dist/models/audit.model.js.map +1 -0
  35. package/dist/models/key.model.d.ts +40 -0
  36. package/dist/models/key.model.d.ts.map +1 -0
  37. package/dist/models/key.model.js +120 -0
  38. package/dist/models/key.model.js.map +1 -0
  39. package/dist/models/project.model.d.ts +20 -0
  40. package/dist/models/project.model.d.ts.map +1 -0
  41. package/dist/models/project.model.js +54 -0
  42. package/dist/models/project.model.js.map +1 -0
  43. package/dist/models/user.model.d.ts +48 -0
  44. package/dist/models/user.model.d.ts.map +1 -0
  45. package/dist/models/user.model.js +141 -0
  46. package/dist/models/user.model.js.map +1 -0
  47. package/dist/repositories/audit.repository.d.ts +37 -0
  48. package/dist/repositories/audit.repository.d.ts.map +1 -0
  49. package/dist/repositories/audit.repository.js +116 -0
  50. package/dist/repositories/audit.repository.js.map +1 -0
  51. package/dist/repositories/base.repository.d.ts +54 -0
  52. package/dist/repositories/base.repository.d.ts.map +1 -0
  53. package/dist/repositories/base.repository.js +97 -0
  54. package/dist/repositories/base.repository.js.map +1 -0
  55. package/dist/repositories/key.repository.d.ts +60 -0
  56. package/dist/repositories/key.repository.d.ts.map +1 -0
  57. package/dist/repositories/key.repository.js +126 -0
  58. package/dist/repositories/key.repository.js.map +1 -0
  59. package/dist/repositories/project.repository.d.ts +42 -0
  60. package/dist/repositories/project.repository.d.ts.map +1 -0
  61. package/dist/repositories/project.repository.js +82 -0
  62. package/dist/repositories/project.repository.js.map +1 -0
  63. package/dist/repositories/user.repository.d.ts +58 -0
  64. package/dist/repositories/user.repository.d.ts.map +1 -0
  65. package/dist/repositories/user.repository.js +102 -0
  66. package/dist/repositories/user.repository.js.map +1 -0
  67. package/dist/services/audit.service.d.ts +63 -0
  68. package/dist/services/audit.service.d.ts.map +1 -0
  69. package/dist/services/audit.service.js +113 -0
  70. package/dist/services/audit.service.js.map +1 -0
  71. package/dist/services/auth.service.d.ts +39 -0
  72. package/dist/services/auth.service.d.ts.map +1 -0
  73. package/dist/services/auth.service.js +179 -0
  74. package/dist/services/auth.service.js.map +1 -0
  75. package/dist/services/key.service.d.ts +47 -0
  76. package/dist/services/key.service.d.ts.map +1 -0
  77. package/dist/services/key.service.js +135 -0
  78. package/dist/services/key.service.js.map +1 -0
  79. package/dist/services/permission.service.d.ts +37 -0
  80. package/dist/services/permission.service.d.ts.map +1 -0
  81. package/dist/services/permission.service.js +140 -0
  82. package/dist/services/permission.service.js.map +1 -0
  83. package/dist/services/project.service.d.ts +37 -0
  84. package/dist/services/project.service.d.ts.map +1 -0
  85. package/dist/services/project.service.js +96 -0
  86. package/dist/services/project.service.js.map +1 -0
  87. package/dist/types/audit.types.d.ts +122 -0
  88. package/dist/types/audit.types.d.ts.map +1 -0
  89. package/dist/types/audit.types.js +55 -0
  90. package/dist/types/audit.types.js.map +1 -0
  91. package/dist/types/client.types.d.ts +47 -0
  92. package/dist/types/client.types.d.ts.map +1 -0
  93. package/dist/types/client.types.js +6 -0
  94. package/dist/types/client.types.js.map +1 -0
  95. package/dist/types/crypto.types.d.ts +48 -0
  96. package/dist/types/crypto.types.d.ts.map +1 -0
  97. package/dist/types/crypto.types.js +6 -0
  98. package/dist/types/crypto.types.js.map +1 -0
  99. package/dist/types/index.d.ts +86 -0
  100. package/dist/types/index.d.ts.map +1 -0
  101. package/dist/types/index.js +92 -0
  102. package/dist/types/index.js.map +1 -0
  103. package/dist/types/key.types.d.ts +125 -0
  104. package/dist/types/key.types.d.ts.map +1 -0
  105. package/dist/types/key.types.js +28 -0
  106. package/dist/types/key.types.js.map +1 -0
  107. package/dist/types/project.types.d.ts +57 -0
  108. package/dist/types/project.types.d.ts.map +1 -0
  109. package/dist/types/project.types.js +16 -0
  110. package/dist/types/project.types.js.map +1 -0
  111. package/dist/types/user.types.d.ts +110 -0
  112. package/dist/types/user.types.d.ts.map +1 -0
  113. package/dist/types/user.types.js +49 -0
  114. package/dist/types/user.types.js.map +1 -0
  115. package/dist/utils/config-loader.d.ts +64 -0
  116. package/dist/utils/config-loader.d.ts.map +1 -0
  117. package/dist/utils/config-loader.js +126 -0
  118. package/dist/utils/config-loader.js.map +1 -0
  119. package/dist/utils/constants.d.ts +62 -0
  120. package/dist/utils/constants.d.ts.map +1 -0
  121. package/dist/utils/constants.js +119 -0
  122. package/dist/utils/constants.js.map +1 -0
  123. package/dist/utils/error-handler.d.ts +48 -0
  124. package/dist/utils/error-handler.d.ts.map +1 -0
  125. package/dist/utils/error-handler.js +109 -0
  126. package/dist/utils/error-handler.js.map +1 -0
  127. package/package.json +53 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 pzdemons
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,325 @@
1
+ # KMS - 密钥管理系统
2
+
3
+ 高安全性、易用的密钥管理系统npm包,专为管理数据库连接字符串而设计。
4
+
5
+ ## 特性
6
+
7
+ - **高安全性**:AES-256-GCM加密存储密钥
8
+ - **多租户支持**:项目级别隔离,每个项目独立的主密钥
9
+ - **访问控制**:基于角色的权限管理(RBAC)
10
+ - **审计日志**:完整记录所有密钥操作
11
+ - **TypeScript**:完整的类型定义
12
+ - **易用性**:简洁的API设计
13
+
14
+ ## 安全特性
15
+
16
+ - ✅ 密钥使用AES-256-GCM加密存储
17
+ - ✅ 项目主密钥通过PBKDF2从用户密码派生(100,000次迭代)
18
+ - ✅ 基于RBAC的细粒度访问控制
19
+ - ✅ 所有操作记录审计日志
20
+ - ✅ 密码使用bcrypt哈希存储
21
+ - ✅ API密钥哈希存储,不保留明文
22
+
23
+ ## 安装
24
+
25
+ ```bash
26
+ npm install @pzdemons/kms
27
+ ```
28
+
29
+ ## 前置要求
30
+
31
+ - Node.js >= 18.0.0
32
+ - MongoDB >= 4.4
33
+
34
+ ## 快速开始
35
+
36
+ ### 1. 初始化客户端
37
+
38
+ ```typescript
39
+ import { KMSClient, KeyType } from '@pzdemons/kms';
40
+
41
+ const kms = new KMSClient({
42
+ connectionString: 'mongodb://localhost:27017',
43
+ databaseName: 'kms'
44
+ });
45
+
46
+ // 连接到数据库
47
+ await kms.connect();
48
+ ```
49
+
50
+ ### 2. 创建项目
51
+
52
+ ```typescript
53
+ // 设置当前用户(首次使用可以设置为任意字符串)
54
+ kms.setCurrentUser('admin_user_id');
55
+
56
+ const project = await kms.createProject(
57
+ 'my-application', // 项目名称
58
+ 'very-strong-password-123!', // 主密码(请妥善保管)
59
+ {
60
+ environment: 'production',
61
+ department: 'engineering'
62
+ }
63
+ );
64
+
65
+ console.log('Project created:', project.projectId);
66
+ ```
67
+
68
+ ### 3. 创建数据库连接密钥
69
+
70
+ ```typescript
71
+ // 创建MongoDB连接密钥
72
+ const mongodbKey = await kms.createKey(
73
+ project.projectId,
74
+ 'very-strong-password-123!', // 主密码
75
+ {
76
+ keyName: 'mongodb-primary',
77
+ keyType: KeyType.MONGODB,
78
+ value: 'mongodb://user:password@localhost:27017/mydb',
79
+ tags: ['production', 'database'],
80
+ description: 'Primary MongoDB database'
81
+ }
82
+ );
83
+
84
+ // 创建Redis连接密钥
85
+ const redisKey = await kms.createKey(
86
+ project.projectId,
87
+ 'very-strong-password-123!',
88
+ {
89
+ keyName: 'redis-cache',
90
+ keyType: KeyType.REDIS,
91
+ value: 'redis://localhost:6379',
92
+ tags: ['production', 'cache']
93
+ }
94
+ );
95
+ ```
96
+
97
+ ### 4. 获取密钥(自动解密)
98
+
99
+ ```typescript
100
+ const keyValue = await kms.getKey(
101
+ project.projectId,
102
+ 'very-strong-password-123!',
103
+ mongodbKey.keyId
104
+ );
105
+
106
+ console.log('Connection string:', keyValue.value);
107
+ // 输出: mongodb://user:password@localhost:27017/mydb
108
+ ```
109
+
110
+ ### 5. 列出所有密钥
111
+
112
+ ```typescript
113
+ const { keys, total } = await kms.listKeys(project.projectId);
114
+
115
+ console.log(`Total keys: ${total}`);
116
+ keys.forEach(key => {
117
+ console.log(`- ${key.keyName} (${key.keyType})`);
118
+ });
119
+ ```
120
+
121
+ ### 6. 按标签过滤
122
+
123
+ ```typescript
124
+ const prodKeys = await kms.listKeys(project.projectId, {
125
+ tags: ['production'],
126
+ keyType: KeyType.MONGODB
127
+ });
128
+
129
+ console.log('Production MongoDB keys:', prodKeys.total);
130
+ ```
131
+
132
+ ### 7. 查看审计日志
133
+
134
+ ```typescript
135
+ const auditLogs = await kms.getAuditLogs(project.projectId, {
136
+ page: 1,
137
+ limit: 20
138
+ });
139
+
140
+ console.log('Recent activities:');
141
+ auditLogs.logs.forEach(log => {
142
+ console.log(`[${log.timestamp}] ${log.action} - ${log.details.success ? 'Success' : 'Failed'}`);
143
+ });
144
+ ```
145
+
146
+ ## 高级用法
147
+
148
+ ### Express集成示例
149
+
150
+ ```typescript
151
+ import express from 'express';
152
+ import { KMSClient, KeyType } from '@pzdemons/kms';
153
+
154
+ const app = express();
155
+ const kms = new KMSClient({
156
+ connectionString: 'mongodb://localhost:27017',
157
+ databaseName: 'kms'
158
+ });
159
+
160
+ await kms.connect();
161
+
162
+ // 创建密钥API
163
+ app.post('/api/keys', async (req, res) => {
164
+ const { projectId, masterPassword, keyName, keyType, value } = req.body;
165
+
166
+ const key = await kms.createKey(projectId, masterPassword, {
167
+ keyName,
168
+ keyType,
169
+ value,
170
+ tags: ['api-created']
171
+ });
172
+
173
+ res.json({ success: true, keyId: key.keyId });
174
+ });
175
+
176
+ // 获取密钥API
177
+ app.get('/api/keys/:keyId', async (req, res) => {
178
+ const { projectId, masterPassword } = req.headers;
179
+ const { keyId } = req.params;
180
+
181
+ const keyValue = await kms.getKey(
182
+ projectId,
183
+ masterPassword,
184
+ keyId
185
+ );
186
+
187
+ res.json({ value: keyValue.value });
188
+ });
189
+
190
+ app.listen(3000);
191
+ ```
192
+
193
+ 更多示例请查看:
194
+ - [基础使用示例](./examples/basic-usage.ts)
195
+ - [Express集成](./examples/with-express.ts)
196
+ - [数据库连接管理](./examples/database-connections.ts)
197
+
198
+ ## API文档
199
+
200
+ 完整的API文档请查看:[API.md](./docs/API.md)
201
+
202
+ ## 安全最佳实践
203
+
204
+ 为了确保系统的安全性,请遵循以下最佳实践:
205
+
206
+ 1. **主密码安全**
207
+ - 使用至少12个字符的强密码
208
+ - 包含大小写字母、数字和特殊字符
209
+ - 定期轮换主密码(建议每180天)
210
+
211
+ 2. **密钥轮换**
212
+ - 定期轮换数据库连接凭证(建议每90天)
213
+ - 设置密钥过期时间
214
+
215
+ 3. **访问控制**
216
+ - 使用最小权限原则
217
+ - 为不同环境使用不同的用户和项目
218
+ - 定期审查用户权限
219
+
220
+ 4. **网络安全**
221
+ - 生产环境使用TLS/SSL连接MongoDB
222
+ - 实施IP白名单
223
+ - 配置API速率限制
224
+
225
+ 5. **监控和审计**
226
+ - 定期检查审计日志
227
+ - 监控失败的登录尝试
228
+ - 设置安全告警
229
+
230
+ 完整的安全指南请查看:[SECURITY.md](./docs/SECURITY.md)
231
+
232
+ ## 支持的密钥类型
233
+
234
+ - `mongodb` - MongoDB连接字符串
235
+ - `mysql` - MySQL连接字符串
236
+ - `postgresql` - PostgreSQL连接字符串
237
+ - `redis` - Redis连接字符串
238
+ - `custom` - 自定义密钥
239
+
240
+ ## 角色和权限
241
+
242
+ | 角色 | 描述 | 权限 |
243
+ |------|------|------|
244
+ | `admin` | 项目管理员 | 所有权限 |
245
+ | `operator` | 运维人员 | 读取、更新密钥,查看审计日志 |
246
+ | `developer` | 开发人员 | 读取密钥 |
247
+ | `readonly` | 只读用户 | 列出密钥 |
248
+ | `auditor` | 审计员 | 查看审计日志 |
249
+
250
+ ## 错误处理
251
+
252
+ ```typescript
253
+ import {
254
+ KMSError,
255
+ ProjectNotFoundError,
256
+ KeyNotFoundError,
257
+ AuthenticationError,
258
+ ForbiddenError,
259
+ ValidationError
260
+ } from '@your-org/kms';
261
+
262
+ try {
263
+ const key = await kms.getKey(projectId, masterPassword, keyId);
264
+ } catch (error) {
265
+ if (error instanceof KeyNotFoundError) {
266
+ console.error('Key not found');
267
+ } else if (error instanceof AuthenticationError) {
268
+ console.error('Invalid master password');
269
+ } else if (error instanceof ForbiddenError) {
270
+ console.error('Permission denied');
271
+ } else {
272
+ console.error('Error:', error.message);
273
+ }
274
+ }
275
+ ```
276
+
277
+ ## 开发
278
+
279
+ ```bash
280
+ # 安装依赖
281
+ npm install
282
+
283
+ # 构建
284
+ npm run build
285
+
286
+ # 运行测试
287
+ npm test
288
+
289
+ # 代码检查
290
+ npm run lint
291
+
292
+ # 代码格式化
293
+ npm run format
294
+ ```
295
+
296
+ ## 项目结构
297
+
298
+ ```
299
+ kms/
300
+ ├── src/
301
+ │ ├── client.ts # KMSClient主类
302
+ │ ├── core/ # 加密核心模块
303
+ │ ├── models/ # 数据模型
304
+ │ ├── repositories/ # 数据访问层
305
+ │ ├── services/ # 业务逻辑层
306
+ │ ├── types/ # TypeScript类型定义
307
+ │ └── utils/ # 工具函数
308
+ ├── examples/ # 使用示例
309
+ ├── docs/ # 文档
310
+ └── tests/ # 测试
311
+ ```
312
+
313
+ ## 贡献
314
+
315
+ 欢迎提交Issue和Pull Request!
316
+
317
+ ## 许可证
318
+
319
+ MIT
320
+
321
+ ## 联系方式
322
+
323
+ - 作者:pzdemons
324
+ - 问题反馈:[GitHub Issues](https://github.com/pzdemons/kms/issues)
325
+ - 安全问题:security@pzdemons.com
@@ -0,0 +1,130 @@
1
+ /**
2
+ * KMS客户端主类
3
+ * 对外API接口
4
+ */
5
+ import { KMSClientOptions, EncryptedKMSClientOptions, Project, Key, KeyValue, CreateKeyData, UpdateKeyData, KeyFilters, CreateUserData, Role, User, AuditLog, AuditQuery } from './types';
6
+ /**
7
+ * KMS客户端类
8
+ */
9
+ export declare class KMSClient {
10
+ private options;
11
+ private mongoClient;
12
+ private db;
13
+ private cryptoService;
14
+ private projectRepo;
15
+ private keyRepo;
16
+ private userRepo;
17
+ private auditRepo;
18
+ private projectService;
19
+ private keyService;
20
+ private authService;
21
+ private permissionService;
22
+ private auditService;
23
+ private connected;
24
+ private currentUserId;
25
+ constructor(options: KMSClientOptions | EncryptedKMSClientOptions);
26
+ /**
27
+ * 解析连接字符串(支持加密配置)
28
+ */
29
+ private resolveConnectionString;
30
+ /**
31
+ * 连接到数据库
32
+ */
33
+ connect(): Promise<void>;
34
+ /**
35
+ * 断开数据库连接
36
+ */
37
+ disconnect(): Promise<void>;
38
+ /**
39
+ * 初始化服务
40
+ */
41
+ private initializeServices;
42
+ /**
43
+ * 初始化数据库索引
44
+ */
45
+ private initializeIndexes;
46
+ /**
47
+ * 设置当前用户(用于权限验证)
48
+ */
49
+ setCurrentUser(userId: string): void;
50
+ /**
51
+ * 获取当前用户ID
52
+ */
53
+ private getCurrentUserId;
54
+ /**
55
+ * 创建项目
56
+ */
57
+ createProject(projectName: string, masterPassword: string, metadata?: Record<string, any>): Promise<Project>;
58
+ /**
59
+ * 获取项目
60
+ */
61
+ getProject(projectId: string): Promise<Project>;
62
+ /**
63
+ * 列出所有项目
64
+ */
65
+ listProjects(): Promise<Project[]>;
66
+ /**
67
+ * 删除项目
68
+ */
69
+ deleteProject(projectId: string): Promise<void>;
70
+ /**
71
+ * 创建密钥
72
+ */
73
+ createKey(projectId: string, masterPassword: string, keyData: CreateKeyData): Promise<Key>;
74
+ /**
75
+ * 获取密钥(解密)
76
+ */
77
+ getKey(projectId: string, masterPassword: string, keyId: string): Promise<KeyValue>;
78
+ /**
79
+ * 列出密钥
80
+ */
81
+ listKeys(projectId: string, filters?: KeyFilters, options?: {
82
+ page?: number;
83
+ limit?: number;
84
+ }): Promise<{
85
+ keys: Key[];
86
+ total: number;
87
+ }>;
88
+ /**
89
+ * 更新密钥
90
+ */
91
+ updateKey(projectId: string, masterPassword: string, keyId: string, updates: UpdateKeyData): Promise<Key>;
92
+ /**
93
+ * 删除密钥
94
+ */
95
+ deleteKey(projectId: string, keyId: string): Promise<void>;
96
+ /**
97
+ * 创建用户
98
+ */
99
+ createUser(projectId: string, userData: CreateUserData): Promise<Omit<User, 'passwordHash' | 'apiKeyHash'>>;
100
+ /**
101
+ * 用户登录
102
+ */
103
+ login(projectId: string, username: string, password: string): Promise<boolean>;
104
+ /**
105
+ * 授予角色
106
+ */
107
+ grantRole(projectId: string, userId: string, role: Role): Promise<void>;
108
+ /**
109
+ * 撤销角色
110
+ */
111
+ revokeRole(projectId: string, userId: string, role: Role): Promise<void>;
112
+ /**
113
+ * 获取审计日志
114
+ */
115
+ getAuditLogs(projectId: string, query: AuditQuery): Promise<{
116
+ logs: AuditLog[];
117
+ total: number;
118
+ page: number;
119
+ limit: number;
120
+ }>;
121
+ /**
122
+ * 获取最近的审计日志
123
+ */
124
+ getRecentLogs(projectId: string, limit?: number): Promise<AuditLog[]>;
125
+ /**
126
+ * 确保已连接
127
+ */
128
+ private ensureConnected;
129
+ }
130
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,OAAO,EACP,GAAG,EACH,QAAQ,EACR,aAAa,EACb,aAAa,EACb,UAAU,EACV,cAAc,EACd,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,UAAU,EACX,MAAM,SAAS,CAAC;AAkBjB;;GAEG;AACH,qBAAa,SAAS;IAgBR,OAAO,CAAC,OAAO;IAf3B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,EAAE,CAAM;IAChB,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,aAAa,CAAuB;gBAExB,OAAO,EAAE,gBAAgB,GAAG,yBAAyB;IAYzE;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAsB/B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;OAEG;YACW,iBAAiB;IAI/B;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIpC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IASxB;;OAEG;IACG,aAAa,CACjB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,OAAO,CAAC,OAAO,CAAC;IAUnB;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKrD;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAKxC;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASrD;;OAEG;IACG,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,GAAG,CAAC;IAOf;;OAEG;IACG,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,QAAQ,CAAC;IAOpB;;OAEG;IACG,QAAQ,CACZ,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,UAAU,EACpB,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1C,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAO1C;;OAEG;IACG,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,GAAG,CAAC;IAOf;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAShE;;OAEG;IACG,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CAAC,CAAC;IAOrD;;OAEG;IACG,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYpF;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7E;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9E;;OAEG;IACG,YAAY,CAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC;QAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAK5E;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAKhF;;OAEG;YACW,eAAe;CAK9B"}