@juo/blocks 1.19.0 → 1.20.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.
- package/dist/core.js +47 -48
- package/dist/services/login/adapter.d.ts +10 -0
- package/dist/services/login/adapter.d.ts.map +1 -1
- package/dist/services/login/errors.d.ts +21 -0
- package/dist/services/login/errors.d.ts.map +1 -0
- package/dist/services/login/index.d.ts +3 -2
- package/dist/services/login/index.d.ts.map +1 -1
- package/dist/services/login/loginService.d.ts +1 -13
- package/dist/services/login/loginService.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/core.js
CHANGED
|
@@ -233,6 +233,45 @@ function uuid() {
|
|
|
233
233
|
(c2) => (c2 ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c2 / 4).toString(16)
|
|
234
234
|
);
|
|
235
235
|
}
|
|
236
|
+
var AuthenticationErrorReason = /* @__PURE__ */ ((AuthenticationErrorReason2) => {
|
|
237
|
+
AuthenticationErrorReason2["Expired"] = "expired";
|
|
238
|
+
AuthenticationErrorReason2["IncorrectCode"] = "wrong-code";
|
|
239
|
+
AuthenticationErrorReason2["TooManyTries"] = "too-many-tries";
|
|
240
|
+
AuthenticationErrorReason2["NoEmail"] = "no-email";
|
|
241
|
+
AuthenticationErrorReason2["Unknown"] = "unknown";
|
|
242
|
+
AuthenticationErrorReason2["Missing"] = "missing";
|
|
243
|
+
return AuthenticationErrorReason2;
|
|
244
|
+
})(AuthenticationErrorReason || {});
|
|
245
|
+
class AuthenticationError extends Error {
|
|
246
|
+
constructor(reason, data) {
|
|
247
|
+
super("Authentication error");
|
|
248
|
+
__publicField(this, "reason");
|
|
249
|
+
__publicField(this, "data");
|
|
250
|
+
this.reason = reason;
|
|
251
|
+
this.data = data ?? {};
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const OTP_ERROR_REASONS = {
|
|
255
|
+
INCORRECT_CODE: AuthenticationErrorReason.IncorrectCode,
|
|
256
|
+
TOO_MANY_TRIES: AuthenticationErrorReason.TooManyTries,
|
|
257
|
+
EXPIRED: AuthenticationErrorReason.Expired
|
|
258
|
+
};
|
|
259
|
+
function authenticationErrorFromBody(data) {
|
|
260
|
+
if (data == null || typeof data !== "object") {
|
|
261
|
+
return void 0;
|
|
262
|
+
}
|
|
263
|
+
const { code, connection } = data;
|
|
264
|
+
if (typeof code !== "string") {
|
|
265
|
+
return void 0;
|
|
266
|
+
}
|
|
267
|
+
if (code === "AUTH_ERROR") {
|
|
268
|
+
return new AuthenticationError(AuthenticationErrorReason.NoEmail, {
|
|
269
|
+
connection
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
const reason = OTP_ERROR_REASONS[code];
|
|
273
|
+
return reason == null ? void 0 : new AuthenticationError(reason);
|
|
274
|
+
}
|
|
236
275
|
function createMockLoginAdapter(opts = {}) {
|
|
237
276
|
const appUrl = opts.appUrl ?? "https://admin.juo.io";
|
|
238
277
|
return {
|
|
@@ -272,19 +311,9 @@ function createApiLoginAdapter(fetcher, opts) {
|
|
|
272
311
|
body: JSON.stringify(body)
|
|
273
312
|
});
|
|
274
313
|
if (res.status === 403) {
|
|
275
|
-
const
|
|
276
|
-
if (
|
|
277
|
-
|
|
278
|
-
throw new AuthenticationError(AuthenticationErrorReason.IncorrectCode);
|
|
279
|
-
} else if (data.error_description === "You've reached the maximum number of attempts. Please try to login again.") {
|
|
280
|
-
throw new AuthenticationError(AuthenticationErrorReason.TooManyTries);
|
|
281
|
-
} else if (data.error_description === "The verification code has expired. Please try to login again.") {
|
|
282
|
-
throw new AuthenticationError(AuthenticationErrorReason.Expired);
|
|
283
|
-
}
|
|
284
|
-
} else if ("code" in data && data.code === "AUTH_ERROR") {
|
|
285
|
-
throw new AuthenticationError(AuthenticationErrorReason.NoEmail, {
|
|
286
|
-
connection: data.connection
|
|
287
|
-
});
|
|
314
|
+
const error = authenticationErrorFromBody(await res.json());
|
|
315
|
+
if (error != null) {
|
|
316
|
+
throw error;
|
|
288
317
|
}
|
|
289
318
|
}
|
|
290
319
|
if (!res.ok) {
|
|
@@ -317,19 +346,9 @@ function createApiLoginAdapter(fetcher, opts) {
|
|
|
317
346
|
body: JSON.stringify(params)
|
|
318
347
|
});
|
|
319
348
|
if (res.status === 403) {
|
|
320
|
-
const
|
|
321
|
-
if (
|
|
322
|
-
|
|
323
|
-
throw new AuthenticationError(AuthenticationErrorReason.IncorrectCode);
|
|
324
|
-
} else if (data.error_description === "You've reached the maximum number of attempts. Please try to login again.") {
|
|
325
|
-
throw new AuthenticationError(AuthenticationErrorReason.TooManyTries);
|
|
326
|
-
} else if (data.error_description === "The verification code has expired. Please try to login again.") {
|
|
327
|
-
throw new AuthenticationError(AuthenticationErrorReason.Expired);
|
|
328
|
-
}
|
|
329
|
-
} else if ("code" in data && data.code === "AUTH_ERROR") {
|
|
330
|
-
throw new AuthenticationError(AuthenticationErrorReason.NoEmail, {
|
|
331
|
-
connection: data.connection
|
|
332
|
-
});
|
|
349
|
+
const error = authenticationErrorFromBody(await res.json());
|
|
350
|
+
if (error != null) {
|
|
351
|
+
throw error;
|
|
333
352
|
}
|
|
334
353
|
}
|
|
335
354
|
if (res.status === 401) {
|
|
@@ -356,24 +375,6 @@ function createApiLoginAdapter(fetcher, opts) {
|
|
|
356
375
|
};
|
|
357
376
|
}
|
|
358
377
|
const __vite_import_meta_env__ = {};
|
|
359
|
-
var AuthenticationErrorReason = /* @__PURE__ */ ((AuthenticationErrorReason2) => {
|
|
360
|
-
AuthenticationErrorReason2["Expired"] = "expired";
|
|
361
|
-
AuthenticationErrorReason2["IncorrectCode"] = "wrong-code";
|
|
362
|
-
AuthenticationErrorReason2["TooManyTries"] = "too-many-tries";
|
|
363
|
-
AuthenticationErrorReason2["NoEmail"] = "no-email";
|
|
364
|
-
AuthenticationErrorReason2["Unknown"] = "unknown";
|
|
365
|
-
AuthenticationErrorReason2["Missing"] = "missing";
|
|
366
|
-
return AuthenticationErrorReason2;
|
|
367
|
-
})(AuthenticationErrorReason || {});
|
|
368
|
-
class AuthenticationError extends Error {
|
|
369
|
-
constructor(reason, data) {
|
|
370
|
-
super("Authentication error");
|
|
371
|
-
__publicField(this, "reason");
|
|
372
|
-
__publicField(this, "data");
|
|
373
|
-
this.reason = reason;
|
|
374
|
-
this.data = data ?? {};
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
378
|
const STORAGE_DELEGATED_TOKEN = "delegated-token";
|
|
378
379
|
const STORAGE_REFRESH_TOKEN_KEY = "refresh-token";
|
|
379
380
|
const STORAGE_STATE_KEY = "state";
|
|
@@ -579,10 +580,7 @@ function createLoginService(init) {
|
|
|
579
580
|
return {
|
|
580
581
|
_tag: "Failure",
|
|
581
582
|
error: formatError(
|
|
582
|
-
new AuthenticationError(
|
|
583
|
-
"missing"
|
|
584
|
-
/* Missing */
|
|
585
|
-
)
|
|
583
|
+
new AuthenticationError(AuthenticationErrorReason.Missing)
|
|
586
584
|
)
|
|
587
585
|
};
|
|
588
586
|
}
|
|
@@ -4173,6 +4171,7 @@ export {
|
|
|
4173
4171
|
T as TranslationContext,
|
|
4174
4172
|
WorkflowServiceContext,
|
|
4175
4173
|
A as attachEmptyTracking,
|
|
4174
|
+
authenticationErrorFromBody,
|
|
4176
4175
|
d2 as backfillInstanceDefaults,
|
|
4177
4176
|
b as buildGridLayout,
|
|
4178
4177
|
F as buildLayoutCss,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ApiFetcher, Result } from '../../utils';
|
|
2
|
+
import { AuthenticationError } from './errors';
|
|
2
3
|
export type AuthTokens = {
|
|
3
4
|
access_token: string;
|
|
4
5
|
refresh_token: string;
|
|
@@ -23,6 +24,15 @@ export interface LoginAdapter {
|
|
|
23
24
|
shop: string;
|
|
24
25
|
}): string;
|
|
25
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Turn a `403` body from the auth endpoints into an `AuthenticationError`, or
|
|
29
|
+
* `undefined` when the body says nothing we recognise.
|
|
30
|
+
*
|
|
31
|
+
* Every failure is identified by the backend's `code`. Nothing here reads the
|
|
32
|
+
* auth provider's `error_description` prose: that sentence is a vendor detail,
|
|
33
|
+
* and translating it to a code is the backend's job.
|
|
34
|
+
*/
|
|
35
|
+
export declare function authenticationErrorFromBody(data: unknown): AuthenticationError | undefined;
|
|
26
36
|
export declare function createMockLoginAdapter(opts?: {
|
|
27
37
|
appUrl?: string;
|
|
28
38
|
}): LoginAdapter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/services/login/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/services/login/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAA6B,MAAM,UAAU,CAAC;AAE1E,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,iBAAiB,CAAC,MAAM,EAAE;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAE1B,YAAY,CACV,MAAM,EACF;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAC/B;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAChB;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,GAC3B,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IAE/B,eAAe,CAAC,MAAM,EAAE;QACtB,UAAU,EAAE,UAAU,GAAG,eAAe,CAAC;QACzC,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,MAAM,CAAC;CACZ;AAQD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,OAAO,GACZ,mBAAmB,GAAG,SAAS,CAoBjC;AAED,wBAAgB,sBAAsB,CACpC,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7B,YAAY,CAwBd;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3C,YAAY,CAoGd"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The login error taxonomy, kept in a module of its own with no imports.
|
|
3
|
+
*
|
|
4
|
+
* `loginService` and `adapter` import each other, so an enum declared in either
|
|
5
|
+
* one is not safely readable at the other's module scope. Living here, it is —
|
|
6
|
+
* which is what lets the adapter's code lookup be a plain table.
|
|
7
|
+
*/
|
|
8
|
+
export declare enum AuthenticationErrorReason {
|
|
9
|
+
Expired = "expired",
|
|
10
|
+
IncorrectCode = "wrong-code",
|
|
11
|
+
TooManyTries = "too-many-tries",
|
|
12
|
+
NoEmail = "no-email",
|
|
13
|
+
Unknown = "unknown",
|
|
14
|
+
Missing = "missing"
|
|
15
|
+
}
|
|
16
|
+
export declare class AuthenticationError extends Error {
|
|
17
|
+
reason: AuthenticationErrorReason;
|
|
18
|
+
data: Record<string, unknown>;
|
|
19
|
+
constructor(reason: AuthenticationErrorReason, data?: Record<string, unknown>);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/services/login/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,oBAAY,yBAAyB;IACnC,OAAO,YAAY;IACnB,aAAa,eAAe;IAC5B,YAAY,mBAAmB;IAC/B,OAAO,aAAa;IACpB,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,MAAM,EAAE,yBAAyB,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAG5B,MAAM,EAAE,yBAAyB,EACjC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAMjC"}
|
|
@@ -20,6 +20,7 @@ type LoginService = {
|
|
|
20
20
|
export declare const LoginServiceContext: {
|
|
21
21
|
__context__: LoginService;
|
|
22
22
|
};
|
|
23
|
-
export { loginService, createLoginService, type LoginServiceDependencies, type ErrorFormatter,
|
|
24
|
-
export {
|
|
23
|
+
export { loginService, createLoginService, type LoginServiceDependencies, type ErrorFormatter, } from './loginService';
|
|
24
|
+
export { AuthenticationError, AuthenticationErrorReason } from './errors';
|
|
25
|
+
export { type LoginAdapter, type AuthTokens, authenticationErrorFromBody, createApiLoginAdapter, createMockLoginAdapter, } from './adapter';
|
|
25
26
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/login/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAE,MAAM,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD,KAAK,YAAY,GAAG;IAClB,YAAY,EAAE;QACZ,KAAK,EAAE;YACL,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;SAC1E,CAAC;KACH,CAAC;IAEF,MAAM,EAAE;QACN,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;KAC3D,CAAC;IAEF,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAEjC,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEnC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAElD,iBAAiB,CACf,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;IAEvC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3B,CAAC;AAEF,eAAO,MAAM,mBAAmB;;CACe,CAAC;AAEhD,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/login/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAE,MAAM,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD,KAAK,YAAY,GAAG;IAClB,YAAY,EAAE;QACZ,KAAK,EAAE;YACL,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;SAC1E,CAAC;KACH,CAAC;IAEF,MAAM,EAAE;QACN,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;KAC3D,CAAC;IAEF,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAEjC,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEnC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAElD,iBAAiB,CACf,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;IAEvC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3B,CAAC;AAEF,eAAO,MAAM,mBAAmB;;CACe,CAAC;AAEhD,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,GACpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAE1E,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,2BAA2B,EAC3B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,WAAW,CAAC"}
|
|
@@ -1,18 +1,6 @@
|
|
|
1
1
|
import { Signal } from '@preact/signals-core';
|
|
2
2
|
import { LoginAdapter } from './adapter';
|
|
3
|
-
|
|
4
|
-
Expired = "expired",
|
|
5
|
-
IncorrectCode = "wrong-code",
|
|
6
|
-
TooManyTries = "too-many-tries",
|
|
7
|
-
NoEmail = "no-email",
|
|
8
|
-
Unknown = "unknown",
|
|
9
|
-
Missing = "missing"
|
|
10
|
-
}
|
|
11
|
-
export declare class AuthenticationError extends Error {
|
|
12
|
-
reason: AuthenticationErrorReason;
|
|
13
|
-
data: Record<string, unknown>;
|
|
14
|
-
constructor(reason: AuthenticationErrorReason, data?: Record<string, unknown>);
|
|
15
|
-
}
|
|
3
|
+
import { AuthenticationError, AuthenticationErrorReason } from './errors';
|
|
16
4
|
interface RouterService {
|
|
17
5
|
push(options: {
|
|
18
6
|
path: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loginService.d.ts","sourceRoot":"","sources":["../../../src/services/login/loginService.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4B,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAKxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"loginService.d.ts","sourceRoot":"","sources":["../../../src/services/login/loginService.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4B,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAKxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAE1E,UAAU,aAAa;IACrB,IAAI,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IACtE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB;AA0BD,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,KAAK;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,yBAAyB,CAAC;CACpC,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,EAAE,cAAc,CAAC;IAC5B,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,WAAW,EAAE,cAAc,CAAC;IAC5B,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;;;;;;;;;;;;;;;;EAmBA;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,wBAAwB;;;;;;;;;;;;;;;;EAsNhE"}
|