@morehao/ark-iam-react 0.0.0-stage → 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.

Potentially problematic release.


This version of @morehao/ark-iam-react might be problematic. Click here for more details.

Files changed (66) hide show
  1. package/README.md +83 -2
  2. package/dist/_types/api/index.d.ts +5 -0
  3. package/dist/_types/api/index.js +185 -0
  4. package/dist/_types/api/index.js.map +1 -0
  5. package/dist/_types/api/request.d.ts +34 -0
  6. package/dist/_types/api/resources/auth.d.ts +13 -0
  7. package/dist/_types/api/resources/platform.d.ts +80 -0
  8. package/dist/_types/api/sessionProbe.d.ts +13 -0
  9. package/dist/_types/auth/AuthProvider.d.ts +27 -0
  10. package/dist/_types/auth/config.d.ts +23 -0
  11. package/dist/_types/auth/guards.d.ts +1 -0
  12. package/dist/_types/auth/hooks.d.ts +11 -0
  13. package/dist/_types/auth/index.d.ts +8 -0
  14. package/dist/_types/auth/index.js +190 -0
  15. package/dist/_types/auth/index.js.map +1 -0
  16. package/dist/_types/auth/tenant.d.ts +3 -0
  17. package/dist/_types/types/auth.d.ts +62 -0
  18. package/dist/_types/types/department.d.ts +52 -0
  19. package/dist/_types/types/index.d.ts +5 -0
  20. package/dist/_types/types/index.js +14 -0
  21. package/dist/_types/types/index.js.map +1 -0
  22. package/dist/_types/types/platform.d.ts +347 -0
  23. package/dist/_types/types/response.d.ts +14 -0
  24. package/dist/_types/types/tenant.d.ts +243 -0
  25. package/dist/_types/ui/AppShell.d.ts +16 -0
  26. package/dist/_types/ui/EllipsisCell.d.ts +16 -0
  27. package/dist/_types/ui/IDCell.d.ts +14 -0
  28. package/dist/_types/ui/InitialPasswordModal.d.ts +18 -0
  29. package/dist/_types/ui/LoginPage.d.ts +6 -0
  30. package/dist/_types/ui/MainLayout.d.ts +14 -0
  31. package/dist/_types/ui/NameLink.d.ts +18 -0
  32. package/dist/_types/ui/PageContainer.d.ts +15 -0
  33. package/dist/_types/ui/ProfileCenter.d.ts +6 -0
  34. package/dist/_types/ui/RemoteSelect.d.ts +57 -0
  35. package/dist/_types/ui/RowActions.d.ts +36 -0
  36. package/dist/_types/ui/TenantSwitcher.d.ts +1 -0
  37. package/dist/_types/ui/TimeCell.d.ts +53 -0
  38. package/dist/_types/ui/columns.d.ts +116 -0
  39. package/dist/_types/ui/format.d.ts +20 -0
  40. package/dist/_types/ui/index.d.ts +25 -0
  41. package/dist/_types/ui/index.js +1233 -0
  42. package/dist/_types/ui/index.js.map +1 -0
  43. package/dist/_types/ui/status.d.ts +38 -0
  44. package/dist/_types/ui/theme.d.ts +49 -0
  45. package/dist/api.d.ts +1 -0
  46. package/dist/api.js +50 -0
  47. package/dist/api.js.map +1 -0
  48. package/dist/auth.d.ts +1 -0
  49. package/dist/auth.js +17 -0
  50. package/dist/auth.js.map +1 -0
  51. package/dist/index-BQuRl5A6.js +185 -0
  52. package/dist/index-BQuRl5A6.js.map +1 -0
  53. package/dist/index-D3uUqZ5c.js +190 -0
  54. package/dist/index-D3uUqZ5c.js.map +1 -0
  55. package/dist/index-DnhMUOxg.js +1233 -0
  56. package/dist/index-DnhMUOxg.js.map +1 -0
  57. package/dist/index.d.ts +4 -0
  58. package/dist/index.js +109 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/types.d.ts +1 -0
  61. package/dist/types.js +14 -0
  62. package/dist/types.js.map +1 -0
  63. package/dist/ui.d.ts +1 -0
  64. package/dist/ui.js +46 -0
  65. package/dist/ui.js.map +1 -0
  66. package/package.json +80 -3
@@ -0,0 +1,190 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { useState, useEffect, useCallback } from "react";
3
+ import { BrowserRouter } from "react-router-dom";
4
+ import { AuthProvider, useAuth } from "react-oidc-context";
5
+ import { WebStorageStateStore } from "oidc-client-ts";
6
+ import { Spin, message } from "antd";
7
+ import { T as useSSOSessionProbe, F as logoutAllAPI, v as getMyTenants, L as setUserProvider, K as setSessionExpiredHandler } from "./index-BQuRl5A6.js";
8
+ var _a;
9
+ const defaultIssuer = "/oidc";
10
+ const defaultRedirectPath = "/auth/callback";
11
+ const defaultPostLogoutRedirectPath = "/login";
12
+ const defaultScope = "openid profile email offline_access";
13
+ async function fetchRuntimeConfig(base) {
14
+ var _a2, _b;
15
+ const root = base ?? (((_b = (_a2 = import.meta) == null ? void 0 : _a2.env) == null ? void 0 : _b.BASE_URL) ?? "/");
16
+ try {
17
+ const res = await fetch(`${root}${root.endsWith("/") ? "" : "/"}config.json`, {
18
+ credentials: "same-origin",
19
+ headers: { Accept: "application/json" }
20
+ });
21
+ if (!res.ok) return null;
22
+ return await res.json();
23
+ } catch {
24
+ return null;
25
+ }
26
+ }
27
+ const oidcExtraQueryParams = {};
28
+ let currentTenantId = "";
29
+ function getCurrentTenantId() {
30
+ return currentTenantId;
31
+ }
32
+ function setCurrentTenantId(id) {
33
+ const next = id == null ? "" : String(id);
34
+ currentTenantId = next;
35
+ if (next) {
36
+ oidcExtraQueryParams.tenant = next;
37
+ } else {
38
+ delete oidcExtraQueryParams.tenant;
39
+ }
40
+ }
41
+ const ENV = ((_a = import.meta) == null ? void 0 : _a.env) ?? {};
42
+ function buildConfig(opts, runtime) {
43
+ const issuer = opts.issuer || (runtime == null ? void 0 : runtime.issuer) || ENV.VITE_OIDC_ISSUER || defaultIssuer;
44
+ const clientId = opts.clientID || (runtime == null ? void 0 : runtime.clientId) || ENV.VITE_OIDC_CLIENT_ID || "";
45
+ const redirectPath = opts.redirectPath || (runtime == null ? void 0 : runtime.callbackPath) || defaultRedirectPath;
46
+ const postLogoutRedirectPath = opts.postLogoutRedirectPath || defaultPostLogoutRedirectPath;
47
+ return { issuer, clientId, redirectPath, postLogoutRedirectPath };
48
+ }
49
+ function createAuthProvider(opts = {}) {
50
+ return function AuthProvider$1({ children }) {
51
+ const useRuntime = opts.useRuntimeConfig !== false;
52
+ const [runtime, setRuntime] = useState(
53
+ useRuntime ? void 0 : null
54
+ );
55
+ useEffect(() => {
56
+ if (!useRuntime) return;
57
+ let cancelled = false;
58
+ void fetchRuntimeConfig(opts.runtimeConfigBase).then((cfg) => {
59
+ if (!cancelled) setRuntime(cfg);
60
+ });
61
+ return () => {
62
+ cancelled = true;
63
+ };
64
+ }, []);
65
+ if (runtime === void 0) return null;
66
+ const { issuer, clientId, redirectPath, postLogoutRedirectPath } = buildConfig(opts, runtime);
67
+ const oidcConfig = {
68
+ authority: issuer,
69
+ client_id: clientId,
70
+ ...opts.clientSecret ? { client_secret: opts.clientSecret } : {},
71
+ redirect_uri: window.location.origin + redirectPath,
72
+ post_logout_redirect_uri: window.location.origin + postLogoutRedirectPath,
73
+ scope: defaultScope,
74
+ automaticSilentRenew: true,
75
+ // monitorSession 需要 OP 在 discovery 暴露 check_session_iframe(OIDC Session
76
+ // Management)。当前 OP(zitadel)未启用该端点,oidc-client-ts 会自动降级为不监控。
77
+ // "一处登出、处处登出"的即时性主要由后端请求粒度 SSO 活性校验保障
78
+ // (WithOIDCSSOValidation + HasActiveSession),此配置仅作跨标签页监控的尽力而为。
79
+ monitorSession: true,
80
+ loadUserInfo: true,
81
+ // 令牌存储:使用 sessionStorage(标签页级,关闭即清)而非 localStorage,
82
+ // 缩小 XSS 窃取令牌的持续暴露窗口。SSO 认证态本身在 OP 的 iam_sso_session
83
+ // cookie,不依赖前端存储;页面刷新/静默续期不受影响。
84
+ userStore: new WebStorageStateStore({ store: sessionStorage }),
85
+ extraQueryParams: {
86
+ ...oidcExtraQueryParams,
87
+ ...opts.getExtraQueryParams ? opts.getExtraQueryParams() : {}
88
+ }
89
+ };
90
+ return /* @__PURE__ */ jsx(BrowserRouter, { children: /* @__PURE__ */ jsx(AuthProvider, { ...oidcConfig, children }) });
91
+ };
92
+ }
93
+ function useTenantSwitching() {
94
+ const auth = useAuth();
95
+ const [tenants, setTenants] = useState([]);
96
+ const loadTenants = useCallback(async () => {
97
+ try {
98
+ const resp = await getMyTenants();
99
+ setTenants(resp.list || []);
100
+ } catch {
101
+ message.warning("获取可用租户失败");
102
+ }
103
+ }, []);
104
+ const handleSwitchTenant = useCallback(
105
+ async (tenantID) => {
106
+ if (String(tenantID) === getCurrentTenantId()) return;
107
+ setCurrentTenantId(tenantID);
108
+ try {
109
+ await auth.removeUser();
110
+ } catch {
111
+ }
112
+ await auth.signinRedirect({ extraQueryParams: { tenant: String(tenantID) }, redirectMethod: "replace" });
113
+ },
114
+ [auth]
115
+ );
116
+ return { tenants, loadTenants, handleSwitchTenant };
117
+ }
118
+ function useLogout() {
119
+ const auth = useAuth();
120
+ return useCallback(async () => {
121
+ var _a2;
122
+ try {
123
+ await logoutAllAPI(((_a2 = auth.user) == null ? void 0 : _a2.refresh_token) ?? "");
124
+ } catch {
125
+ }
126
+ try {
127
+ await auth.signoutRedirect();
128
+ } finally {
129
+ await auth.removeUser();
130
+ }
131
+ }, [auth]);
132
+ }
133
+ function useAuthGuard() {
134
+ const auth = useAuth();
135
+ useSSOSessionProbe(auth);
136
+ useEffect(() => {
137
+ setUserProvider(() => auth.user);
138
+ }, [auth.user]);
139
+ useEffect(() => {
140
+ setSessionExpiredHandler(() => {
141
+ void auth.removeUser();
142
+ });
143
+ }, [auth]);
144
+ useEffect(() => {
145
+ var _a2, _b;
146
+ const claim = (_b = (_a2 = auth.user) == null ? void 0 : _a2.profile) == null ? void 0 : _b.tenant_id;
147
+ if (claim != null && getCurrentTenantId() !== String(claim)) {
148
+ setCurrentTenantId(claim);
149
+ }
150
+ }, [auth.user]);
151
+ return auth;
152
+ }
153
+ const LOADING_BG = "#f6f7f9";
154
+ const LOADING_TEXT = "#94a3b8";
155
+ function FullPageSpinner() {
156
+ return /* @__PURE__ */ jsxs(
157
+ "div",
158
+ {
159
+ style: {
160
+ minHeight: "100vh",
161
+ display: "flex",
162
+ flexDirection: "column",
163
+ alignItems: "center",
164
+ justifyContent: "center",
165
+ gap: 16,
166
+ background: LOADING_BG
167
+ },
168
+ children: [
169
+ /* @__PURE__ */ jsx(Spin, { size: "large" }),
170
+ /* @__PURE__ */ jsx("span", { style: { color: LOADING_TEXT, fontSize: 13 }, children: "正在加载 IAM 平台…" })
171
+ ]
172
+ }
173
+ );
174
+ }
175
+ export {
176
+ FullPageSpinner as F,
177
+ defaultPostLogoutRedirectPath as a,
178
+ defaultRedirectPath as b,
179
+ createAuthProvider as c,
180
+ defaultIssuer as d,
181
+ defaultScope as e,
182
+ fetchRuntimeConfig as f,
183
+ getCurrentTenantId as g,
184
+ useLogout as h,
185
+ useTenantSwitching as i,
186
+ oidcExtraQueryParams as o,
187
+ setCurrentTenantId as s,
188
+ useAuthGuard as u
189
+ };
190
+ //# sourceMappingURL=index-D3uUqZ5c.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-D3uUqZ5c.js","sources":["../../auth/dist/index.js"],"sourcesContent":["var _a;\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nimport { useState, useEffect, useCallback } from \"react\";\nimport { BrowserRouter } from \"react-router-dom\";\nimport { AuthProvider, useAuth } from \"react-oidc-context\";\nimport { WebStorageStateStore } from \"oidc-client-ts\";\nimport { message, Spin } from \"antd\";\nimport { useSSOSessionProbe, setUserProvider, setSessionExpiredHandler, logoutAllAPI, getMyTenants } from \"@ark-iam/api\";\nconst defaultIssuer = \"/oidc\";\nconst defaultRedirectPath = \"/auth/callback\";\nconst defaultPostLogoutRedirectPath = \"/login\";\nconst defaultScope = \"openid profile email offline_access\";\nasync function fetchRuntimeConfig(base) {\n var _a2, _b;\n const root = base ?? (((_b = (_a2 = import.meta) == null ? void 0 : _a2.env) == null ? void 0 : _b.BASE_URL) ?? \"/\");\n try {\n const res = await fetch(`${root}${root.endsWith(\"/\") ? \"\" : \"/\"}config.json`, {\n credentials: \"same-origin\",\n headers: { Accept: \"application/json\" }\n });\n if (!res.ok) return null;\n return await res.json();\n } catch {\n return null;\n }\n}\nconst oidcExtraQueryParams = {};\nlet currentTenantId = \"\";\nfunction getCurrentTenantId() {\n return currentTenantId;\n}\nfunction setCurrentTenantId(id) {\n const next = id == null ? \"\" : String(id);\n currentTenantId = next;\n if (next) {\n oidcExtraQueryParams.tenant = next;\n } else {\n delete oidcExtraQueryParams.tenant;\n }\n}\nconst ENV = ((_a = import.meta) == null ? void 0 : _a.env) ?? {};\nfunction buildConfig(opts, runtime) {\n const issuer = opts.issuer || (runtime == null ? void 0 : runtime.issuer) || ENV.VITE_OIDC_ISSUER || defaultIssuer;\n const clientId = opts.clientID || (runtime == null ? void 0 : runtime.clientId) || ENV.VITE_OIDC_CLIENT_ID || \"\";\n const redirectPath = opts.redirectPath || (runtime == null ? void 0 : runtime.callbackPath) || defaultRedirectPath;\n const postLogoutRedirectPath = opts.postLogoutRedirectPath || defaultPostLogoutRedirectPath;\n return { issuer, clientId, redirectPath, postLogoutRedirectPath };\n}\nfunction createAuthProvider(opts = {}) {\n return function AuthProvider$1({ children }) {\n const useRuntime = opts.useRuntimeConfig !== false;\n const [runtime, setRuntime] = useState(\n useRuntime ? void 0 : null\n );\n useEffect(() => {\n if (!useRuntime) return;\n let cancelled = false;\n void fetchRuntimeConfig(opts.runtimeConfigBase).then((cfg) => {\n if (!cancelled) setRuntime(cfg);\n });\n return () => {\n cancelled = true;\n };\n }, []);\n if (runtime === void 0) return null;\n const { issuer, clientId, redirectPath, postLogoutRedirectPath } = buildConfig(opts, runtime);\n const oidcConfig = {\n authority: issuer,\n client_id: clientId,\n ...opts.clientSecret ? { client_secret: opts.clientSecret } : {},\n redirect_uri: window.location.origin + redirectPath,\n post_logout_redirect_uri: window.location.origin + postLogoutRedirectPath,\n scope: defaultScope,\n automaticSilentRenew: true,\n // monitorSession 需要 OP 在 discovery 暴露 check_session_iframe(OIDC Session\n // Management)。当前 OP(zitadel)未启用该端点,oidc-client-ts 会自动降级为不监控。\n // \"一处登出、处处登出\"的即时性主要由后端请求粒度 SSO 活性校验保障\n // (WithOIDCSSOValidation + HasActiveSession),此配置仅作跨标签页监控的尽力而为。\n monitorSession: true,\n loadUserInfo: true,\n // 令牌存储:使用 sessionStorage(标签页级,关闭即清)而非 localStorage,\n // 缩小 XSS 窃取令牌的持续暴露窗口。SSO 认证态本身在 OP 的 iam_sso_session\n // cookie,不依赖前端存储;页面刷新/静默续期不受影响。\n userStore: new WebStorageStateStore({ store: sessionStorage }),\n extraQueryParams: {\n ...oidcExtraQueryParams,\n ...opts.getExtraQueryParams ? opts.getExtraQueryParams() : {}\n }\n };\n return /* @__PURE__ */ jsx(BrowserRouter, { children: /* @__PURE__ */ jsx(AuthProvider, { ...oidcConfig, children }) });\n };\n}\nfunction useTenantSwitching() {\n const auth = useAuth();\n const [tenants, setTenants] = useState([]);\n const loadTenants = useCallback(async () => {\n try {\n const resp = await getMyTenants();\n setTenants(resp.list || []);\n } catch {\n message.warning(\"获取可用租户失败\");\n }\n }, []);\n const handleSwitchTenant = useCallback(\n async (tenantID) => {\n if (String(tenantID) === getCurrentTenantId()) return;\n setCurrentTenantId(tenantID);\n try {\n await auth.removeUser();\n } catch {\n }\n await auth.signinRedirect({ extraQueryParams: { tenant: String(tenantID) }, redirectMethod: \"replace\" });\n },\n [auth]\n );\n return { tenants, loadTenants, handleSwitchTenant };\n}\nfunction useLogout() {\n const auth = useAuth();\n return useCallback(async () => {\n var _a2;\n try {\n await logoutAllAPI(((_a2 = auth.user) == null ? void 0 : _a2.refresh_token) ?? \"\");\n } catch {\n }\n try {\n await auth.signoutRedirect();\n } finally {\n await auth.removeUser();\n }\n }, [auth]);\n}\nfunction useAuthGuard() {\n const auth = useAuth();\n useSSOSessionProbe(auth);\n useEffect(() => {\n setUserProvider(() => auth.user);\n }, [auth.user]);\n useEffect(() => {\n setSessionExpiredHandler(() => {\n void auth.removeUser();\n });\n }, [auth]);\n useEffect(() => {\n var _a2, _b;\n const claim = (_b = (_a2 = auth.user) == null ? void 0 : _a2.profile) == null ? void 0 : _b.tenant_id;\n if (claim != null && getCurrentTenantId() !== String(claim)) {\n setCurrentTenantId(claim);\n }\n }, [auth.user]);\n return auth;\n}\nconst LOADING_BG = \"#f6f7f9\";\nconst LOADING_TEXT = \"#94a3b8\";\nfunction FullPageSpinner() {\n return /* @__PURE__ */ jsxs(\n \"div\",\n {\n style: {\n minHeight: \"100vh\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 16,\n background: LOADING_BG\n },\n children: [\n /* @__PURE__ */ jsx(Spin, { size: \"large\" }),\n /* @__PURE__ */ jsx(\"span\", { style: { color: LOADING_TEXT, fontSize: 13 }, children: \"正在加载 IAM 平台…\" })\n ]\n }\n );\n}\nexport {\n FullPageSpinner,\n createAuthProvider,\n defaultIssuer,\n defaultPostLogoutRedirectPath,\n defaultRedirectPath,\n defaultScope,\n fetchRuntimeConfig,\n getCurrentTenantId,\n oidcExtraQueryParams,\n setCurrentTenantId,\n useAuthGuard,\n useLogout,\n useTenantSwitching\n};\n//# sourceMappingURL=index.js.map\n"],"names":[],"mappings":";;;;;;;AAAA,IAAI;AAQC,MAAC,gBAAgB;AACjB,MAAC,sBAAsB;AACvB,MAAC,gCAAgC;AACjC,MAAC,eAAe;AACrB,eAAe,mBAAmB,MAAM;AACtC,MAAI,KAAK;AACT,QAAM,OAAO,WAAW,MAAM,MAAM,gBAAgB,OAAO,SAAS,IAAI,QAAQ,OAAO,SAAS,GAAG,aAAa;AAChH,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,KAAK,SAAS,GAAG,IAAI,KAAK,GAAG,eAAe;AAAA,MAC5E,aAAa;AAAA,MACb,SAAS,EAAE,QAAQ,mBAAkB;AAAA,IAC3C,CAAK;AACD,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,WAAO,MAAM,IAAI,KAAI;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AACK,MAAC,uBAAuB,CAAA;AAC7B,IAAI,kBAAkB;AACtB,SAAS,qBAAqB;AAC5B,SAAO;AACT;AACA,SAAS,mBAAmB,IAAI;AAC9B,QAAM,OAAO,MAAM,OAAO,KAAK,OAAO,EAAE;AACxC,oBAAkB;AAClB,MAAI,MAAM;AACR,yBAAqB,SAAS;AAAA,EAChC,OAAO;AACL,WAAO,qBAAqB;AAAA,EAC9B;AACF;AACA,MAAM,QAAQ,KAAK,gBAAgB,OAAO,SAAS,GAAG,QAAQ,CAAA;AAC9D,SAAS,YAAY,MAAM,SAAS;AAClC,QAAM,SAAS,KAAK,WAAW,WAAW,OAAO,SAAS,QAAQ,WAAW,IAAI,oBAAoB;AACrG,QAAM,WAAW,KAAK,aAAa,WAAW,OAAO,SAAS,QAAQ,aAAa,IAAI,uBAAuB;AAC9G,QAAM,eAAe,KAAK,iBAAiB,WAAW,OAAO,SAAS,QAAQ,iBAAiB;AAC/F,QAAM,yBAAyB,KAAK,0BAA0B;AAC9D,SAAO,EAAE,QAAQ,UAAU,cAAc,uBAAsB;AACjE;AACA,SAAS,mBAAmB,OAAO,IAAI;AACrC,SAAO,SAAS,eAAe,EAAE,YAAY;AAC3C,UAAM,aAAa,KAAK,qBAAqB;AAC7C,UAAM,CAAC,SAAS,UAAU,IAAI;AAAA,MAC5B,aAAa,SAAS;AAAA,IAC5B;AACI,cAAU,MAAM;AACd,UAAI,CAAC,WAAY;AACjB,UAAI,YAAY;AAChB,WAAK,mBAAmB,KAAK,iBAAiB,EAAE,KAAK,CAAC,QAAQ;AAC5D,YAAI,CAAC,UAAW,YAAW,GAAG;AAAA,MAChC,CAAC;AACD,aAAO,MAAM;AACX,oBAAY;AAAA,MACd;AAAA,IACF,GAAG,CAAA,CAAE;AACL,QAAI,YAAY,OAAQ,QAAO;AAC/B,UAAM,EAAE,QAAQ,UAAU,cAAc,uBAAsB,IAAK,YAAY,MAAM,OAAO;AAC5F,UAAM,aAAa;AAAA,MACjB,WAAW;AAAA,MACX,WAAW;AAAA,MACX,GAAG,KAAK,eAAe,EAAE,eAAe,KAAK,aAAY,IAAK,CAAA;AAAA,MAC9D,cAAc,OAAO,SAAS,SAAS;AAAA,MACvC,0BAA0B,OAAO,SAAS,SAAS;AAAA,MACnD,OAAO;AAAA,MACP,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA,MAKtB,gBAAgB;AAAA,MAChB,cAAc;AAAA;AAAA;AAAA;AAAA,MAId,WAAW,IAAI,qBAAqB,EAAE,OAAO,eAAc,CAAE;AAAA,MAC7D,kBAAkB;AAAA,QAChB,GAAG;AAAA,QACH,GAAG,KAAK,sBAAsB,KAAK,oBAAmB,IAAK,CAAA;AAAA,MACnE;AAAA,IACA;AACI,WAAuB,oBAAI,eAAe,EAAE,UAA0B,oBAAI,cAAc,EAAE,GAAG,YAAY,SAAQ,CAAE,GAAG;AAAA,EACxH;AACF;AACA,SAAS,qBAAqB;AAC5B,QAAM,OAAO,QAAO;AACpB,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,CAAA,CAAE;AACzC,QAAM,cAAc,YAAY,YAAY;AAC1C,QAAI;AACF,YAAM,OAAO,MAAM,aAAY;AAC/B,iBAAW,KAAK,QAAQ,EAAE;AAAA,IAC5B,QAAQ;AACN,cAAQ,QAAQ,UAAU;AAAA,IAC5B;AAAA,EACF,GAAG,CAAA,CAAE;AACL,QAAM,qBAAqB;AAAA,IACzB,OAAO,aAAa;AAClB,UAAI,OAAO,QAAQ,MAAM,qBAAsB;AAC/C,yBAAmB,QAAQ;AAC3B,UAAI;AACF,cAAM,KAAK,WAAU;AAAA,MACvB,QAAQ;AAAA,MACR;AACA,YAAM,KAAK,eAAe,EAAE,kBAAkB,EAAE,QAAQ,OAAO,QAAQ,EAAC,GAAI,gBAAgB,UAAS,CAAE;AAAA,IACzG;AAAA,IACA,CAAC,IAAI;AAAA,EACT;AACE,SAAO,EAAE,SAAS,aAAa,mBAAkB;AACnD;AACA,SAAS,YAAY;AACnB,QAAM,OAAO,QAAO;AACpB,SAAO,YAAY,YAAY;AAC7B,QAAI;AACJ,QAAI;AACF,YAAM,eAAe,MAAM,KAAK,SAAS,OAAO,SAAS,IAAI,kBAAkB,EAAE;AAAA,IACnF,QAAQ;AAAA,IACR;AACA,QAAI;AACF,YAAM,KAAK,gBAAe;AAAA,IAC5B,UAAC;AACC,YAAM,KAAK,WAAU;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AACX;AACA,SAAS,eAAe;AACtB,QAAM,OAAO,QAAO;AACpB,qBAAmB,IAAI;AACvB,YAAU,MAAM;AACd,oBAAgB,MAAM,KAAK,IAAI;AAAA,EACjC,GAAG,CAAC,KAAK,IAAI,CAAC;AACd,YAAU,MAAM;AACd,6BAAyB,MAAM;AAC7B,WAAK,KAAK,WAAU;AAAA,IACtB,CAAC;AAAA,EACH,GAAG,CAAC,IAAI,CAAC;AACT,YAAU,MAAM;AACd,QAAI,KAAK;AACT,UAAM,SAAS,MAAM,MAAM,KAAK,SAAS,OAAO,SAAS,IAAI,YAAY,OAAO,SAAS,GAAG;AAC5F,QAAI,SAAS,QAAQ,mBAAkB,MAAO,OAAO,KAAK,GAAG;AAC3D,yBAAmB,KAAK;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,KAAK,IAAI,CAAC;AACd,SAAO;AACT;AACA,MAAM,aAAa;AACnB,MAAM,eAAe;AACrB,SAAS,kBAAkB;AACzB,SAAuB;AAAA,IACrB;AAAA,IACA;AAAA,MACE,OAAO;AAAA,QACL,WAAW;AAAA,QACX,SAAS;AAAA,QACT,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,KAAK;AAAA,QACL,YAAY;AAAA,MACpB;AAAA,MACM,UAAU;AAAA,QACQ,oBAAI,MAAM,EAAE,MAAM,QAAO,CAAE;AAAA,QAC3B,oBAAI,QAAQ,EAAE,OAAO,EAAE,OAAO,cAAc,UAAU,GAAE,GAAI,UAAU,eAAc,CAAE;AAAA,MAC9G;AAAA,IACA;AAAA,EACA;AACA;"}