binoauth 0.0.11 → 0.0.13
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 +359 -165
- package/dist/core/src/admin/client.d.ts +203 -0
- package/dist/core/src/admin/client.d.ts.map +1 -0
- package/dist/core/src/admin/client.js +391 -0
- package/dist/core/src/admin/client.js.map +1 -0
- package/dist/core/src/admin/index.d.ts +6 -0
- package/dist/core/src/admin/index.d.ts.map +1 -0
- package/dist/core/src/admin/index.js +5 -0
- package/dist/core/src/admin/index.js.map +1 -0
- package/dist/core/src/admin/types.d.ts +412 -0
- package/dist/core/src/admin/types.d.ts.map +1 -0
- package/dist/core/src/admin/types.js +5 -0
- package/dist/core/src/admin/types.js.map +1 -0
- package/dist/core/src/auth/client.d.ts +330 -0
- package/dist/core/src/auth/client.d.ts.map +1 -0
- package/dist/core/src/auth/client.js +408 -0
- package/dist/core/src/auth/client.js.map +1 -0
- package/dist/core/src/auth/error.d.ts +113 -0
- package/dist/core/src/auth/error.d.ts.map +1 -0
- package/dist/core/src/auth/error.js +257 -0
- package/dist/core/src/auth/error.js.map +1 -0
- package/dist/core/src/auth/flows/base-flow.d.ts +98 -0
- package/dist/core/src/auth/flows/base-flow.d.ts.map +1 -0
- package/dist/core/src/auth/flows/base-flow.js +182 -0
- package/dist/core/src/auth/flows/base-flow.js.map +1 -0
- package/dist/core/src/auth/flows/magic-link.d.ts +175 -0
- package/dist/core/src/auth/flows/magic-link.d.ts.map +1 -0
- package/dist/core/src/auth/flows/magic-link.js +228 -0
- package/dist/core/src/auth/flows/magic-link.js.map +1 -0
- package/dist/core/src/auth/flows/mfa.d.ts +81 -0
- package/dist/core/src/auth/flows/mfa.d.ts.map +1 -0
- package/dist/core/src/auth/flows/mfa.js +103 -0
- package/dist/core/src/auth/flows/mfa.js.map +1 -0
- package/dist/core/src/auth/flows/otp.d.ts +172 -0
- package/dist/core/src/auth/flows/otp.d.ts.map +1 -0
- package/dist/core/src/auth/flows/otp.js +222 -0
- package/dist/core/src/auth/flows/otp.js.map +1 -0
- package/dist/core/src/auth/flows/password.d.ts +242 -0
- package/dist/core/src/auth/flows/password.d.ts.map +1 -0
- package/dist/core/src/auth/flows/password.js +344 -0
- package/dist/core/src/auth/flows/password.js.map +1 -0
- package/dist/core/src/auth/flows/social.d.ts +209 -0
- package/dist/core/src/auth/flows/social.d.ts.map +1 -0
- package/dist/core/src/auth/flows/social.js +284 -0
- package/dist/core/src/auth/flows/social.js.map +1 -0
- package/dist/core/src/auth/index.d.ts +19 -0
- package/dist/core/src/auth/index.d.ts.map +1 -0
- package/dist/core/src/auth/index.js +32 -0
- package/dist/core/src/auth/index.js.map +1 -0
- package/dist/core/src/auth/types.d.ts +151 -0
- package/dist/core/src/auth/types.d.ts.map +1 -0
- package/dist/core/src/auth/types.js +7 -0
- package/dist/core/src/auth/types.js.map +1 -0
- package/dist/core/src/index.d.ts +53 -49
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/index.js +61 -343
- package/dist/core/src/index.js.map +1 -1
- package/dist/core/src/oauth/client.d.ts +322 -0
- package/dist/core/src/oauth/client.d.ts.map +1 -0
- package/dist/core/src/oauth/client.js +491 -0
- package/dist/core/src/oauth/client.js.map +1 -0
- package/dist/core/src/oauth/error.d.ts +18 -0
- package/dist/core/src/oauth/error.d.ts.map +1 -0
- package/dist/core/src/oauth/error.js +24 -0
- package/dist/core/src/oauth/error.js.map +1 -0
- package/dist/core/src/oauth/flows/authorization-code.d.ts +122 -0
- package/dist/core/src/oauth/flows/authorization-code.d.ts.map +1 -0
- package/dist/core/src/oauth/flows/authorization-code.js +278 -0
- package/dist/core/src/oauth/flows/authorization-code.js.map +1 -0
- package/dist/core/src/oauth/flows/base-flow.d.ts +17 -0
- package/dist/core/src/oauth/flows/base-flow.d.ts.map +1 -0
- package/dist/core/src/oauth/flows/base-flow.js +107 -0
- package/dist/core/src/oauth/flows/base-flow.js.map +1 -0
- package/dist/core/src/oauth/flows/client-credentials.d.ts +72 -0
- package/dist/core/src/oauth/flows/client-credentials.d.ts.map +1 -0
- package/dist/core/src/oauth/flows/client-credentials.js +100 -0
- package/dist/core/src/oauth/flows/client-credentials.js.map +1 -0
- package/dist/core/src/oauth/flows/device-code.d.ts +108 -0
- package/dist/core/src/oauth/flows/device-code.d.ts.map +1 -0
- package/dist/core/src/oauth/flows/device-code.js +193 -0
- package/dist/core/src/oauth/flows/device-code.js.map +1 -0
- package/dist/core/src/oauth/flows/refresh-token.d.ts +59 -0
- package/dist/core/src/oauth/flows/refresh-token.d.ts.map +1 -0
- package/dist/core/src/oauth/flows/refresh-token.js +105 -0
- package/dist/core/src/oauth/flows/refresh-token.js.map +1 -0
- package/dist/core/src/oauth/index.d.ts +12 -0
- package/dist/core/src/oauth/index.d.ts.map +1 -0
- package/dist/core/src/oauth/index.js +11 -0
- package/dist/core/src/oauth/index.js.map +1 -0
- package/dist/core/src/oauth/storage/encryption.d.ts +12 -0
- package/dist/core/src/oauth/storage/encryption.d.ts.map +1 -0
- package/dist/core/src/oauth/storage/encryption.js +76 -0
- package/dist/core/src/oauth/storage/encryption.js.map +1 -0
- package/dist/core/src/oauth/storage/index.d.ts +201 -0
- package/dist/core/src/oauth/storage/index.d.ts.map +1 -0
- package/dist/core/src/oauth/storage/index.js +322 -0
- package/dist/core/src/oauth/storage/index.js.map +1 -0
- package/dist/core/src/oauth/storage/strategies.d.ts +34 -0
- package/dist/core/src/oauth/storage/strategies.d.ts.map +1 -0
- package/dist/core/src/oauth/storage/strategies.js +100 -0
- package/dist/core/src/oauth/storage/strategies.js.map +1 -0
- package/dist/core/src/oauth/types.d.ts +261 -0
- package/dist/core/src/oauth/types.d.ts.map +1 -0
- package/dist/core/src/oauth/types.js +39 -0
- package/dist/core/src/oauth/types.js.map +1 -0
- package/dist/core/src/oauth/utils.d.ts +56 -0
- package/dist/core/src/oauth/utils.d.ts.map +1 -0
- package/dist/core/src/oauth/utils.js +140 -0
- package/dist/core/src/oauth/utils.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
@@ -0,0 +1,322 @@
|
|
1
|
+
import type { AuthConfig, BinoAuthConfig, StorageConfig, User, DeviceCodeResponse } from "./types";
|
2
|
+
import { TokenStorage } from "./storage";
|
3
|
+
/**
|
4
|
+
* BinoAuth OAuth 2.0 Client
|
5
|
+
*
|
6
|
+
* A comprehensive OAuth 2.0 client that supports multiple grant types
|
7
|
+
* including Authorization Code, Device Code, Client Credentials, and Refresh Token flows.
|
8
|
+
*
|
9
|
+
* Features:
|
10
|
+
* - Automatic token refresh and management
|
11
|
+
* - PKCE support for secure authentication
|
12
|
+
* - Device authorization for IoT and limited-input devices
|
13
|
+
* - Server-to-server authentication with client credentials
|
14
|
+
* - Secure token storage with encryption
|
15
|
+
* - Rate limiting and CSRF protection
|
16
|
+
*
|
17
|
+
* @example
|
18
|
+
* ```typescript
|
19
|
+
* import { BinoAuthOAuth, InMemoryTokenStorage } from 'binoauth';
|
20
|
+
*
|
21
|
+
* // Simple configuration using issuer
|
22
|
+
* const client = new BinoAuthOAuth({
|
23
|
+
* issuer: 'https://auth.binoauth.com',
|
24
|
+
* clientId: 'your_client_id',
|
25
|
+
* redirectUri: 'https://yourapp.com/callback',
|
26
|
+
* scope: 'openid profile email'
|
27
|
+
* }, {
|
28
|
+
* storage: new InMemoryTokenStorage(),
|
29
|
+
* clientId: 'your_client_id'
|
30
|
+
* });
|
31
|
+
*
|
32
|
+
* // Authorization Code Flow (for web/mobile apps)
|
33
|
+
* const loginUrl = await client.getLoginUrl();
|
34
|
+
* window.location.href = loginUrl;
|
35
|
+
*
|
36
|
+
* // Handle callback after user returns
|
37
|
+
* const urlParams = new URLSearchParams(window.location.search);
|
38
|
+
* await client.handleCallback(
|
39
|
+
* urlParams.get('code')!,
|
40
|
+
* urlParams.get('state')!
|
41
|
+
* );
|
42
|
+
*
|
43
|
+
* // Check authentication status
|
44
|
+
* const isLoggedIn = await client.isAuthenticated();
|
45
|
+
* if (isLoggedIn) {
|
46
|
+
* const userInfo = await client.getUserInfo();
|
47
|
+
* console.log('Logged in as:', userInfo.email);
|
48
|
+
* }
|
49
|
+
* ```
|
50
|
+
*
|
51
|
+
* @example
|
52
|
+
* ```typescript
|
53
|
+
* // Device Code Flow (for TVs, IoT devices, CLI tools)
|
54
|
+
* const deviceAuth = await client.requestDeviceCode();
|
55
|
+
* console.log(`Visit: ${deviceAuth.verification_uri}`);
|
56
|
+
* console.log(`Enter code: ${deviceAuth.user_code}`);
|
57
|
+
*
|
58
|
+
* // Poll for authorization
|
59
|
+
* const pollInterval = deviceAuth.interval * 1000;
|
60
|
+
* while (true) {
|
61
|
+
* try {
|
62
|
+
* await client.pollForToken(deviceAuth.device_code);
|
63
|
+
* console.log('Device authorized successfully!');
|
64
|
+
* break;
|
65
|
+
* } catch (error) {
|
66
|
+
* if (error.code === 'authorization_pending') {
|
67
|
+
* await new Promise(resolve => setTimeout(resolve, pollInterval));
|
68
|
+
* continue;
|
69
|
+
* }
|
70
|
+
* throw error;
|
71
|
+
* }
|
72
|
+
* }
|
73
|
+
* ```
|
74
|
+
*
|
75
|
+
* @example
|
76
|
+
* ```typescript
|
77
|
+
* // Client Credentials Flow (for server-to-server)
|
78
|
+
* client.initializeClientCredentials('your_client_secret');
|
79
|
+
* await client.getClientCredentialsTokens();
|
80
|
+
*
|
81
|
+
* // Use token for API calls
|
82
|
+
* const accessToken = await client.getAccessToken();
|
83
|
+
* const response = await fetch('/api/protected', {
|
84
|
+
* headers: { 'Authorization': `Bearer ${accessToken}` }
|
85
|
+
* });
|
86
|
+
* ```
|
87
|
+
*/
|
88
|
+
export declare class BinoAuthOAuth {
|
89
|
+
private config;
|
90
|
+
private storage;
|
91
|
+
private oauthApi?;
|
92
|
+
private authCodeFlow;
|
93
|
+
private refreshFlow;
|
94
|
+
private deviceFlow;
|
95
|
+
private clientCredentialsFlow?;
|
96
|
+
/**
|
97
|
+
* Creates a new BinoAuth OAuth client
|
98
|
+
*
|
99
|
+
* @param config - OAuth configuration (can use simplified BinoAuthConfig with issuer)
|
100
|
+
* @param storageConfig - Token storage configuration
|
101
|
+
*
|
102
|
+
* @example
|
103
|
+
* ```typescript
|
104
|
+
* // Simple configuration with issuer
|
105
|
+
* const client = new BinoAuthOAuth({
|
106
|
+
* issuer: 'https://auth.binoauth.com',
|
107
|
+
* clientId: 'your_client_id',
|
108
|
+
* redirectUri: 'https://yourapp.com/callback'
|
109
|
+
* }, {
|
110
|
+
* storage: new InMemoryTokenStorage(),
|
111
|
+
* clientId: 'your_client_id'
|
112
|
+
* });
|
113
|
+
*
|
114
|
+
* // Full configuration
|
115
|
+
* const client = new BinoAuthOAuth({
|
116
|
+
* clientId: 'your_client_id',
|
117
|
+
* redirectUri: 'https://yourapp.com/callback',
|
118
|
+
* authorizeEndpoint: 'https://auth.binoauth.com/api/v1/oauth/authorize',
|
119
|
+
* tokenEndpoint: 'https://auth.binoauth.com/api/v1/oauth/token',
|
120
|
+
* userInfoEndpoint: 'https://auth.binoauth.com/api/v1/oauth/userinfo'
|
121
|
+
* }, storageConfig);
|
122
|
+
* ```
|
123
|
+
*/
|
124
|
+
constructor(config: BinoAuthConfig | AuthConfig, storageConfig: StorageConfig);
|
125
|
+
/**
|
126
|
+
* Initializes client credentials flow for server-to-server authentication
|
127
|
+
*
|
128
|
+
* @param clientSecret - The client secret for authentication
|
129
|
+
*
|
130
|
+
* @example
|
131
|
+
* ```typescript
|
132
|
+
* client.initializeClientCredentials('your_client_secret');
|
133
|
+
* await client.getClientCredentialsTokens();
|
134
|
+
* ```
|
135
|
+
*/
|
136
|
+
initializeClientCredentials(clientSecret: string): void;
|
137
|
+
/**
|
138
|
+
* Updates the token storage instance
|
139
|
+
*
|
140
|
+
* @param tokenStorage - New token storage instance
|
141
|
+
*/
|
142
|
+
setTokenStorage(tokenStorage: TokenStorage): void;
|
143
|
+
/**
|
144
|
+
* Gets the current token storage instance
|
145
|
+
*
|
146
|
+
* @returns The current token storage
|
147
|
+
*/
|
148
|
+
getTokenStorage(): TokenStorage;
|
149
|
+
/**
|
150
|
+
* Generates the authorization URL for the OAuth flow
|
151
|
+
*
|
152
|
+
* @returns Promise resolving to the authorization URL
|
153
|
+
*
|
154
|
+
* @example
|
155
|
+
* ```typescript
|
156
|
+
* const loginUrl = await client.getLoginUrl();
|
157
|
+
* window.location.href = loginUrl; // Redirect user to BinoAuth
|
158
|
+
* ```
|
159
|
+
*/
|
160
|
+
getLoginUrl(): Promise<string>;
|
161
|
+
/**
|
162
|
+
* Handles the OAuth callback and exchanges code for tokens
|
163
|
+
*
|
164
|
+
* @param code - Authorization code from callback
|
165
|
+
* @param state - State parameter from callback
|
166
|
+
*
|
167
|
+
* @example
|
168
|
+
* ```typescript
|
169
|
+
* const urlParams = new URLSearchParams(window.location.search);
|
170
|
+
* await client.handleCallback(
|
171
|
+
* urlParams.get('code')!,
|
172
|
+
* urlParams.get('state')!
|
173
|
+
* );
|
174
|
+
* ```
|
175
|
+
*/
|
176
|
+
handleCallback(code: string, state: string): Promise<void>;
|
177
|
+
/**
|
178
|
+
* Generates the logout URL
|
179
|
+
*
|
180
|
+
* @returns Promise resolving to the logout URL
|
181
|
+
*/
|
182
|
+
getLogoutUrl(): Promise<string>;
|
183
|
+
/**
|
184
|
+
* Generates the logout page URL with optional return URL
|
185
|
+
*
|
186
|
+
* @param returnTo - Optional URL to redirect to after logout
|
187
|
+
* @returns Promise resolving to the logout page URL
|
188
|
+
*/
|
189
|
+
getLogoutPageUrl(returnTo?: string): Promise<string>;
|
190
|
+
/**
|
191
|
+
* Initiates device authorization flow
|
192
|
+
*
|
193
|
+
* @returns Promise resolving to device authorization response
|
194
|
+
*
|
195
|
+
* @example
|
196
|
+
* ```typescript
|
197
|
+
* const deviceAuth = await client.requestDeviceCode();
|
198
|
+
* console.log(`Visit: ${deviceAuth.verification_uri}`);
|
199
|
+
* console.log(`Enter code: ${deviceAuth.user_code}`);
|
200
|
+
* ```
|
201
|
+
*/
|
202
|
+
requestDeviceCode(): Promise<DeviceCodeResponse>;
|
203
|
+
/**
|
204
|
+
* Polls for token using device code
|
205
|
+
*
|
206
|
+
* @param deviceCode - Device code from requestDeviceCode()
|
207
|
+
*
|
208
|
+
* @example
|
209
|
+
* ```typescript
|
210
|
+
* try {
|
211
|
+
* await client.pollForToken(deviceAuth.device_code);
|
212
|
+
* console.log('Device authorized!');
|
213
|
+
* } catch (error) {
|
214
|
+
* if (error.code === 'authorization_pending') {
|
215
|
+
* // User hasn't entered code yet, continue polling
|
216
|
+
* }
|
217
|
+
* }
|
218
|
+
* ```
|
219
|
+
*/
|
220
|
+
pollForToken(deviceCode: string): Promise<void>;
|
221
|
+
/**
|
222
|
+
* Requests tokens using client credentials flow
|
223
|
+
*
|
224
|
+
* @example
|
225
|
+
* ```typescript
|
226
|
+
* client.initializeClientCredentials('your_client_secret');
|
227
|
+
* await client.getClientCredentialsTokens();
|
228
|
+
*
|
229
|
+
* const accessToken = await client.getAccessToken();
|
230
|
+
* // Use token for server-to-server API calls
|
231
|
+
* ```
|
232
|
+
*
|
233
|
+
* @throws {AuthError} When client credentials flow is not initialized
|
234
|
+
*/
|
235
|
+
getClientCredentialsTokens(): Promise<void>;
|
236
|
+
/**
|
237
|
+
* Gets a valid access token, automatically refreshing if needed
|
238
|
+
*
|
239
|
+
* @returns Promise resolving to access token or null if not authenticated
|
240
|
+
*
|
241
|
+
* @example
|
242
|
+
* ```typescript
|
243
|
+
* const accessToken = await client.getAccessToken();
|
244
|
+
* if (accessToken) {
|
245
|
+
* const response = await fetch('/api/protected', {
|
246
|
+
* headers: { 'Authorization': `Bearer ${accessToken}` }
|
247
|
+
* });
|
248
|
+
* }
|
249
|
+
* ```
|
250
|
+
*/
|
251
|
+
getAccessToken(): Promise<string | null>;
|
252
|
+
/**
|
253
|
+
* Manually refreshes access tokens using refresh token
|
254
|
+
*
|
255
|
+
* @example
|
256
|
+
* ```typescript
|
257
|
+
* try {
|
258
|
+
* await client.refreshTokens();
|
259
|
+
* console.log('Tokens refreshed successfully');
|
260
|
+
* } catch (error) {
|
261
|
+
* console.log('Token refresh failed:', error.message);
|
262
|
+
* }
|
263
|
+
* ```
|
264
|
+
*/
|
265
|
+
refreshTokens(): Promise<void>;
|
266
|
+
/**
|
267
|
+
* Fetches authenticated user information
|
268
|
+
*
|
269
|
+
* @returns Promise resolving to user info or null if not authenticated
|
270
|
+
*
|
271
|
+
* @example
|
272
|
+
* ```typescript
|
273
|
+
* const userInfo = await client.getUserInfo();
|
274
|
+
* if (userInfo) {
|
275
|
+
* console.log(`Welcome, ${userInfo.name}!`);
|
276
|
+
* console.log(`Email: ${userInfo.email}`);
|
277
|
+
* }
|
278
|
+
* ```
|
279
|
+
*
|
280
|
+
* @throws {AuthError} When userInfoEndpoint is missing from config
|
281
|
+
*/
|
282
|
+
getUserInfo(): Promise<User | null>;
|
283
|
+
/**
|
284
|
+
* Checks if the user is currently authenticated
|
285
|
+
*
|
286
|
+
* Automatically attempts token refresh if access token is expired
|
287
|
+
* but refresh token is still valid.
|
288
|
+
*
|
289
|
+
* @returns Promise resolving to true if authenticated, false otherwise
|
290
|
+
*
|
291
|
+
* @example
|
292
|
+
* ```typescript
|
293
|
+
* if (await client.isAuthenticated()) {
|
294
|
+
* // User is logged in, show authenticated content
|
295
|
+
* const userInfo = await client.getUserInfo();
|
296
|
+
* } else {
|
297
|
+
* // User needs to log in
|
298
|
+
* const loginUrl = await client.getLoginUrl();
|
299
|
+
* window.location.href = loginUrl;
|
300
|
+
* }
|
301
|
+
* ```
|
302
|
+
*/
|
303
|
+
isAuthenticated(): Promise<boolean>;
|
304
|
+
/**
|
305
|
+
* Logs out the user and revokes tokens
|
306
|
+
*
|
307
|
+
* Attempts to revoke tokens on the server if revoke endpoint is configured,
|
308
|
+
* then clears local token storage.
|
309
|
+
*
|
310
|
+
* @example
|
311
|
+
* ```typescript
|
312
|
+
* await client.logout();
|
313
|
+
* console.log('User logged out successfully');
|
314
|
+
*
|
315
|
+
* // Redirect to login page
|
316
|
+
* const loginUrl = await client.getLoginUrl();
|
317
|
+
* window.location.href = loginUrl;
|
318
|
+
* ```
|
319
|
+
*/
|
320
|
+
logout(): Promise<void>;
|
321
|
+
}
|
322
|
+
//# sourceMappingURL=client.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/oauth/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAEnG,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AASzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoFG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,QAAQ,CAAC,CAAY;IAC7B,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,qBAAqB,CAAC,CAAwB;IAEtD;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;gBACS,MAAM,EAAE,cAAc,GAAG,UAAU,EAAE,aAAa,EAAE,aAAa;IA2B7E;;;;;;;;;;OAUG;IACH,2BAA2B,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAQvD;;;;OAIG;IACH,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAIjD;;;;OAIG;IACH,eAAe,IAAI,YAAY;IAM/B;;;;;;;;;;OAUG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAIpC;;;;;;;;;;;;;;OAcG;IACG,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE;;;;OAIG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAIrC;;;;;OAKG;IACG,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM1D;;;;;;;;;;;OAWG;IACG,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAItD;;;;;;;;;;;;;;;;OAgBG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrD;;;;;;;;;;;;;OAaG;IACG,0BAA0B,IAAI,OAAO,CAAC,IAAI,CAAC;IAYjD;;;;;;;;;;;;;;OAcG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAkB9C;;;;;;;;;;;;OAYG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAMpC;;;;;;;;;;;;;;;OAeG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IA4CzC;;;;;;;;;;;;;;;;;;;OAmBG;IACG,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAuBzC;;;;;;;;;;;;;;;OAeG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CA0C9B"}
|