llng-mcp 0.1.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 (114) hide show
  1. package/.github/workflows/ci.yml +77 -0
  2. package/.prettierrc +7 -0
  3. package/LICENSE +661 -0
  4. package/README.md +502 -0
  5. package/dist/__tests__/api-transport.test.d.ts +1 -0
  6. package/dist/__tests__/api-transport.test.js +577 -0
  7. package/dist/__tests__/api-transport.test.js.map +1 -0
  8. package/dist/__tests__/config.test.d.ts +1 -0
  9. package/dist/__tests__/config.test.js +472 -0
  10. package/dist/__tests__/config.test.js.map +1 -0
  11. package/dist/__tests__/integration/api-mode.test.d.ts +1 -0
  12. package/dist/__tests__/integration/api-mode.test.js +199 -0
  13. package/dist/__tests__/integration/api-mode.test.js.map +1 -0
  14. package/dist/__tests__/integration/oidc-rp.test.d.ts +1 -0
  15. package/dist/__tests__/integration/oidc-rp.test.js +120 -0
  16. package/dist/__tests__/integration/oidc-rp.test.js.map +1 -0
  17. package/dist/__tests__/integration/ssh-mode.test.d.ts +1 -0
  18. package/dist/__tests__/integration/ssh-mode.test.js +101 -0
  19. package/dist/__tests__/integration/ssh-mode.test.js.map +1 -0
  20. package/dist/__tests__/k8s-transport.test.d.ts +1 -0
  21. package/dist/__tests__/k8s-transport.test.js +254 -0
  22. package/dist/__tests__/k8s-transport.test.js.map +1 -0
  23. package/dist/__tests__/oidc-tools.test.d.ts +1 -0
  24. package/dist/__tests__/oidc-tools.test.js +457 -0
  25. package/dist/__tests__/oidc-tools.test.js.map +1 -0
  26. package/dist/__tests__/registry.test.d.ts +1 -0
  27. package/dist/__tests__/registry.test.js +96 -0
  28. package/dist/__tests__/registry.test.js.map +1 -0
  29. package/dist/__tests__/ssh-transport.test.d.ts +1 -0
  30. package/dist/__tests__/ssh-transport.test.js +618 -0
  31. package/dist/__tests__/ssh-transport.test.js.map +1 -0
  32. package/dist/__tests__/tools.test.d.ts +1 -0
  33. package/dist/__tests__/tools.test.js +525 -0
  34. package/dist/__tests__/tools.test.js.map +1 -0
  35. package/dist/config.d.ts +65 -0
  36. package/dist/config.js +506 -0
  37. package/dist/config.js.map +1 -0
  38. package/dist/index.d.ts +2 -0
  39. package/dist/index.js +42 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/resources/documentation.d.ts +5 -0
  42. package/dist/resources/documentation.js +56 -0
  43. package/dist/resources/documentation.js.map +1 -0
  44. package/dist/tools/cli-utilities.d.ts +3 -0
  45. package/dist/tools/cli-utilities.js +187 -0
  46. package/dist/tools/cli-utilities.js.map +1 -0
  47. package/dist/tools/config.d.ts +6 -0
  48. package/dist/tools/config.js +326 -0
  49. package/dist/tools/config.js.map +1 -0
  50. package/dist/tools/consents.d.ts +3 -0
  51. package/dist/tools/consents.js +39 -0
  52. package/dist/tools/consents.js.map +1 -0
  53. package/dist/tools/instances.d.ts +3 -0
  54. package/dist/tools/instances.js +14 -0
  55. package/dist/tools/instances.js.map +1 -0
  56. package/dist/tools/oidc-rp.d.ts +6 -0
  57. package/dist/tools/oidc-rp.js +246 -0
  58. package/dist/tools/oidc-rp.js.map +1 -0
  59. package/dist/tools/oidc.d.ts +3 -0
  60. package/dist/tools/oidc.js +343 -0
  61. package/dist/tools/oidc.js.map +1 -0
  62. package/dist/tools/secondfactors.d.ts +3 -0
  63. package/dist/tools/secondfactors.js +62 -0
  64. package/dist/tools/secondfactors.js.map +1 -0
  65. package/dist/tools/sessions.d.ts +6 -0
  66. package/dist/tools/sessions.js +300 -0
  67. package/dist/tools/sessions.js.map +1 -0
  68. package/dist/transport/api.d.ts +35 -0
  69. package/dist/transport/api.js +327 -0
  70. package/dist/transport/api.js.map +1 -0
  71. package/dist/transport/interface.d.ts +50 -0
  72. package/dist/transport/interface.js +2 -0
  73. package/dist/transport/interface.js.map +1 -0
  74. package/dist/transport/k8s.d.ts +41 -0
  75. package/dist/transport/k8s.js +303 -0
  76. package/dist/transport/k8s.js.map +1 -0
  77. package/dist/transport/registry.d.ts +20 -0
  78. package/dist/transport/registry.js +91 -0
  79. package/dist/transport/registry.js.map +1 -0
  80. package/dist/transport/ssh.d.ts +37 -0
  81. package/dist/transport/ssh.js +353 -0
  82. package/dist/transport/ssh.js.map +1 -0
  83. package/docker-compose.test.yml +16 -0
  84. package/eslint.config.js +21 -0
  85. package/package.json +38 -0
  86. package/src/__tests__/api-transport.test.ts +746 -0
  87. package/src/__tests__/config.test.ts +587 -0
  88. package/src/__tests__/integration/api-mode.test.ts +229 -0
  89. package/src/__tests__/integration/oidc-rp.test.ts +138 -0
  90. package/src/__tests__/integration/ssh-mode.test.ts +113 -0
  91. package/src/__tests__/k8s-transport.test.ts +342 -0
  92. package/src/__tests__/oidc-tools.test.ts +554 -0
  93. package/src/__tests__/registry.test.ts +110 -0
  94. package/src/__tests__/ssh-transport.test.ts +805 -0
  95. package/src/__tests__/tools.test.ts +735 -0
  96. package/src/config.ts +605 -0
  97. package/src/index.ts +48 -0
  98. package/src/resources/documentation.ts +65 -0
  99. package/src/tools/cli-utilities.ts +207 -0
  100. package/src/tools/config.ts +382 -0
  101. package/src/tools/consents.ts +50 -0
  102. package/src/tools/instances.ts +21 -0
  103. package/src/tools/oidc-rp.ts +299 -0
  104. package/src/tools/oidc.ts +434 -0
  105. package/src/tools/secondfactors.ts +78 -0
  106. package/src/tools/sessions.ts +342 -0
  107. package/src/transport/api.ts +429 -0
  108. package/src/transport/interface.ts +58 -0
  109. package/src/transport/k8s.ts +367 -0
  110. package/src/transport/registry.ts +105 -0
  111. package/src/transport/ssh.ts +430 -0
  112. package/tsconfig.json +16 -0
  113. package/vitest.config.ts +8 -0
  114. package/vitest.integration.config.ts +9 -0
@@ -0,0 +1,199 @@
1
+ import { describe, it, expect, beforeAll } from "vitest";
2
+ const BASE_URL = process.env.LLNG_TEST_URL || "http://localhost:19876";
3
+ describe("API Transport Integration", () => {
4
+ let available = false;
5
+ let sessionCookie = "";
6
+ async function authenticate() {
7
+ try {
8
+ // First, get the login form to extract CSRF token
9
+ const formResp = await fetch(`${BASE_URL}/`, {
10
+ headers: {
11
+ Host: "auth.example.com",
12
+ },
13
+ });
14
+ if (!formResp.ok) {
15
+ console.log("Failed to fetch login form:", formResp.status);
16
+ return null;
17
+ }
18
+ const html = await formResp.text();
19
+ // Extract CSRF token from the form
20
+ const tokenMatch = html.match(/name="token"\s+value="([^"]+)"/);
21
+ if (!tokenMatch) {
22
+ console.log("No CSRF token found in login form");
23
+ return null;
24
+ }
25
+ const token = tokenMatch[1];
26
+ if (!token) {
27
+ console.log("CSRF token is empty");
28
+ return null;
29
+ }
30
+ // Authenticate to portal as dwho/dwho (default demo user)
31
+ const resp = await fetch(`${BASE_URL}/`, {
32
+ method: "POST",
33
+ headers: {
34
+ Host: "auth.example.com",
35
+ "Content-Type": "application/x-www-form-urlencoded",
36
+ },
37
+ body: `user=dwho&password=dwho&token=${token}`,
38
+ redirect: "manual", // Don't follow redirects
39
+ });
40
+ // Should get 302 redirect with session cookie
41
+ if (resp.status !== 302 && resp.status !== 200) {
42
+ console.log("Auth failed with status:", resp.status);
43
+ return null;
44
+ }
45
+ // Extract lemonldap cookie
46
+ const setCookie = resp.headers.get("set-cookie");
47
+ if (!setCookie) {
48
+ console.log("No set-cookie header received");
49
+ return null;
50
+ }
51
+ const match = setCookie.match(/lemonldap=([^;]+)/);
52
+ if (!match) {
53
+ console.log("No lemonldap cookie found in:", setCookie);
54
+ return null;
55
+ }
56
+ return match[1];
57
+ }
58
+ catch (e) {
59
+ console.log("Authentication error:", e instanceof Error ? e.message : String(e));
60
+ return null;
61
+ }
62
+ }
63
+ beforeAll(async () => {
64
+ // Check if LLNG portal is available and authenticate
65
+ try {
66
+ const resp = await fetch(`${BASE_URL}/`, {
67
+ headers: {
68
+ Host: "auth.example.com",
69
+ },
70
+ });
71
+ if (!resp.ok && resp.status !== 302) {
72
+ available = false;
73
+ return;
74
+ }
75
+ // Try to authenticate
76
+ const cookie = await authenticate();
77
+ if (cookie) {
78
+ sessionCookie = cookie;
79
+ available = true;
80
+ }
81
+ else {
82
+ available = false;
83
+ }
84
+ }
85
+ catch {
86
+ available = false;
87
+ }
88
+ });
89
+ it("should detect LLNG portal availability", () => {
90
+ if (!available) {
91
+ console.log("LLNG portal not available or auth failed - skipping API tests");
92
+ }
93
+ // Don't fail - just report availability
94
+ });
95
+ it("should access portal login page", async () => {
96
+ if (!available)
97
+ return;
98
+ try {
99
+ const resp = await fetch(`${BASE_URL}/`, {
100
+ headers: {
101
+ Host: "auth.example.com",
102
+ },
103
+ });
104
+ expect(resp.ok).toBe(true);
105
+ const html = await resp.text();
106
+ // Should contain login form
107
+ expect(html).toContain("lemonldap-ng");
108
+ }
109
+ catch (e) {
110
+ console.log("Portal access failed:", e instanceof Error ? e.message : String(e));
111
+ throw e;
112
+ }
113
+ });
114
+ it("should authenticate as demo user", async () => {
115
+ if (!available)
116
+ return;
117
+ expect(sessionCookie).toBeTruthy();
118
+ expect(sessionCookie.length).toBeGreaterThan(0);
119
+ });
120
+ it("should access manager API with session cookie", async () => {
121
+ if (!available)
122
+ return;
123
+ try {
124
+ const resp = await fetch(`${BASE_URL}/confs/latest`, {
125
+ headers: {
126
+ Host: "manager.example.com",
127
+ Cookie: `lemonldap=${sessionCookie}`,
128
+ },
129
+ });
130
+ // Manager API requires specific group membership (e.g., "timelords" group)
131
+ // The demo user dwho might not have manager permissions by default
132
+ if (resp.status === 403) {
133
+ console.log("Manager API returned 403 - user lacks required permissions (expected for demo user)");
134
+ return; // Skip test gracefully
135
+ }
136
+ if (!resp.ok) {
137
+ const text = await resp.text();
138
+ console.log("Manager API response:", resp.status, text);
139
+ throw new Error(`Manager API returned ${resp.status}`);
140
+ }
141
+ const config = await resp.json();
142
+ // Should have cfgNum
143
+ expect(config.cfgNum).toBeDefined();
144
+ const cfgNum = typeof config.cfgNum === "string" ? parseInt(config.cfgNum) : config.cfgNum;
145
+ expect(cfgNum).toBeGreaterThan(0);
146
+ // Should have basic config keys
147
+ expect(config.portal).toBeDefined();
148
+ expect(config.domain).toBeDefined();
149
+ }
150
+ catch (e) {
151
+ console.log("Manager API access failed:", e instanceof Error ? e.message : String(e));
152
+ throw e;
153
+ }
154
+ });
155
+ it("should access manager REST API endpoints", async () => {
156
+ if (!available)
157
+ return;
158
+ try {
159
+ // Test accessing configuration list
160
+ const resp = await fetch(`${BASE_URL}/confs`, {
161
+ headers: {
162
+ Host: "manager.example.com",
163
+ Cookie: `lemonldap=${sessionCookie}`,
164
+ },
165
+ });
166
+ // Manager REST API also requires permissions
167
+ if (resp.status === 403) {
168
+ console.log("REST API returned 403 - user lacks required permissions (expected for demo user)");
169
+ return;
170
+ }
171
+ if (!resp.ok) {
172
+ const text = await resp.text();
173
+ console.log("REST API response:", resp.status, text);
174
+ // Don't fail - might not be available in all deployments
175
+ return;
176
+ }
177
+ const data = await resp.json();
178
+ expect(Array.isArray(data) || typeof data === "object").toBe(true);
179
+ }
180
+ catch (e) {
181
+ console.log("REST API access failed:", e instanceof Error ? e.message : String(e));
182
+ // Don't fail - REST API might not be enabled
183
+ }
184
+ });
185
+ it("should demonstrate that manager API requires authorization", async () => {
186
+ if (!available)
187
+ return;
188
+ // Document the authorization requirements for the manager API
189
+ // In a real deployment, you would need:
190
+ // 1. A user account with manager permissions (e.g., member of "timelords" group)
191
+ // 2. Proper session cookie after authentication
192
+ // 3. Correct Host header for the manager vhost
193
+ //
194
+ // For testing purposes, SSH transport via docker exec is more reliable
195
+ // since CLI commands bypass web-based authorization checks
196
+ console.log('Manager API requires group membership (e.g., inGroup("timelords")) or specific user access');
197
+ });
198
+ });
199
+ //# sourceMappingURL=api-mode.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-mode.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/api-mode.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,120 @@
1
+ import { describe, it, expect, beforeAll, afterAll } from "vitest";
2
+ import { execSync } from "child_process";
3
+ describe("OIDC RP Integration (via docker exec)", () => {
4
+ let available = false;
5
+ let containerName = "";
6
+ function dockerExec(cmd) {
7
+ return execSync(`docker exec ${containerName} ${cmd}`, {
8
+ encoding: "utf-8",
9
+ stdio: ["pipe", "pipe", "ignore"], // capture stdout, ignore stderr
10
+ }).trim();
11
+ }
12
+ function dockerBash(script) {
13
+ return dockerExec(`bash -c '${script.replace(/'/g, "'\\''")}'`);
14
+ }
15
+ beforeAll(async () => {
16
+ // Detect container name dynamically
17
+ try {
18
+ const output = execSync(`docker ps --filter ancestor=yadd/lemonldap-ng-full --format '{{.Names}}'`, { encoding: "utf-8" });
19
+ const name = output.trim().split("\n")[0];
20
+ if (name) {
21
+ containerName = name;
22
+ available = true;
23
+ }
24
+ }
25
+ catch {
26
+ available = false;
27
+ }
28
+ if (!available)
29
+ return;
30
+ // Set up OIDC RP configuration
31
+ try {
32
+ // Add hosts entry for auth.example.com
33
+ dockerBash("echo '127.0.0.1 auth.example.com' >> /etc/hosts");
34
+ // Enable OIDC issuer
35
+ dockerBash("lemonldap-ng-cli -yes 1 set issuerDBOpenIDConnectActivation 1 2>/dev/null");
36
+ // Generate signing keys
37
+ dockerBash("/usr/share/lemonldap-ng/bin/rotateOidcKeys 2>/dev/null");
38
+ // Create RP via CLI merge
39
+ const rpConfig = JSON.stringify({
40
+ oidcRPMetaDataOptions: {
41
+ "integ-test-rp": {
42
+ oidcRPMetaDataOptionsClientID: "integ-test-client",
43
+ oidcRPMetaDataOptionsRedirectUris: "http://localhost/callback",
44
+ oidcRPMetaDataOptionsPublic: 1,
45
+ oidcRPMetaDataOptionsBypassConsent: 1,
46
+ oidcRPMetaDataOptionsIDTokenSignAlg: "RS256",
47
+ },
48
+ },
49
+ oidcRPMetaDataExportedVars: {
50
+ "integ-test-rp": {
51
+ name: "cn",
52
+ preferred_username: "uid",
53
+ email: "mail",
54
+ },
55
+ },
56
+ });
57
+ dockerBash(`echo '${rpConfig.replace(/'/g, "'\\''")}' | lemonldap-ng-cli -yes 1 merge - 2>/dev/null`);
58
+ }
59
+ catch (e) {
60
+ console.log("OIDC setup failed:", e instanceof Error ? e.message : String(e));
61
+ available = false;
62
+ }
63
+ });
64
+ afterAll(async () => {
65
+ if (!available)
66
+ return;
67
+ // Cleanup: remove RP configuration
68
+ try {
69
+ dockerBash("lemonldap-ng-cli -yes 1 delKey oidcRPMetaDataOptions integ-test-rp 2>/dev/null");
70
+ dockerBash("lemonldap-ng-cli -yes 1 delKey oidcRPMetaDataExportedVars integ-test-rp 2>/dev/null");
71
+ }
72
+ catch (e) {
73
+ console.log("OIDC cleanup failed:", e instanceof Error ? e.message : String(e));
74
+ }
75
+ });
76
+ it("should detect Docker container availability", () => {
77
+ if (!available) {
78
+ console.log("LLNG container not available - skipping integration tests");
79
+ }
80
+ // Don't fail - just report availability
81
+ });
82
+ it("should add OIDC RP and verify config", async () => {
83
+ if (!available)
84
+ return;
85
+ try {
86
+ const output = dockerBash("lemonldap-ng-cli -yes 1 get oidcRPMetaDataOptions/integ-test-rp 2>/dev/null");
87
+ // Verify the RP contains required fields
88
+ expect(output).toContain("oidcRPMetaDataOptionsClientID");
89
+ expect(output).toContain("oidcRPMetaDataOptionsIDTokenSignAlg");
90
+ }
91
+ catch (e) {
92
+ console.log("OIDC RP verification failed:", e instanceof Error ? e.message : String(e));
93
+ throw e;
94
+ }
95
+ });
96
+ it("should complete full OIDC flow via llng CLI", async () => {
97
+ if (!available)
98
+ return;
99
+ try {
100
+ const flowScript = `
101
+ rm -f /root/.cache/llng-cookies && mkdir -p /root/.cache && \
102
+ llng --llng-url http://auth.example.com --login dwho --password dwho \
103
+ --client-id integ-test-client --pkce --redirect-uri "http://localhost/callback" \
104
+ user_info
105
+ `;
106
+ const output = dockerBash(flowScript);
107
+ // Parse JSON output and verify user info
108
+ const userInfo = JSON.parse(output);
109
+ expect(userInfo.sub).toBe("dwho");
110
+ expect(userInfo.email).toBe("dwho@badwolf.org");
111
+ expect(userInfo.name).toBe("Doctor Who");
112
+ expect(userInfo.preferred_username).toBe("dwho");
113
+ }
114
+ catch (e) {
115
+ console.log("OIDC flow failed:", e instanceof Error ? e.message : String(e));
116
+ throw e;
117
+ }
118
+ });
119
+ });
120
+ //# sourceMappingURL=oidc-rp.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oidc-rp.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/oidc-rp.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,101 @@
1
+ import { describe, it, expect, beforeAll } from "vitest";
2
+ import { execSync } from "child_process";
3
+ describe("SSH Transport Integration (via docker exec)", () => {
4
+ let available = false;
5
+ let containerName = "";
6
+ function dockerExec(cmd) {
7
+ return execSync(`docker exec ${containerName} ${cmd}`, {
8
+ encoding: "utf-8",
9
+ stdio: ["pipe", "pipe", "ignore"], // capture stdout, ignore stderr
10
+ }).trim();
11
+ }
12
+ beforeAll(async () => {
13
+ // Detect container name dynamically
14
+ try {
15
+ const output = execSync(`docker ps --filter ancestor=yadd/lemonldap-ng-full --format '{{.Names}}'`, { encoding: "utf-8" });
16
+ const name = output.trim().split("\n")[0];
17
+ if (name) {
18
+ containerName = name;
19
+ available = true;
20
+ }
21
+ }
22
+ catch {
23
+ available = false;
24
+ }
25
+ });
26
+ it("should detect Docker container availability", () => {
27
+ if (!available) {
28
+ console.log("LLNG container not available - skipping integration tests");
29
+ }
30
+ // Don't fail - just report availability
31
+ });
32
+ it("should get config info via info command", async () => {
33
+ if (!available)
34
+ return;
35
+ try {
36
+ const output = dockerExec("lemonldap-ng-cli info");
37
+ // Parse text output - expect lines like "Num : 1"
38
+ expect(output).toContain("Num");
39
+ expect(output).toContain("Author");
40
+ expect(output).toMatch(/Num\s+:\s+\d+/);
41
+ }
42
+ catch (e) {
43
+ console.log("CLI info failed:", e instanceof Error ? e.message : String(e));
44
+ throw e;
45
+ }
46
+ });
47
+ it("should get config values via get command", async () => {
48
+ if (!available)
49
+ return;
50
+ try {
51
+ const output = dockerExec("lemonldap-ng-cli get portal domain");
52
+ // Parse "key = value" lines
53
+ const lines = output.split("\n");
54
+ expect(lines.length).toBeGreaterThan(0);
55
+ // Should contain portal and domain values
56
+ expect(output).toMatch(/portal\s+=\s+\S+/);
57
+ expect(output).toMatch(/domain\s+=\s+\S+/);
58
+ }
59
+ catch (e) {
60
+ console.log("CLI get failed:", e instanceof Error ? e.message : String(e));
61
+ throw e;
62
+ }
63
+ });
64
+ it("should export config via save command", async () => {
65
+ if (!available)
66
+ return;
67
+ try {
68
+ const output = dockerExec("lemonldap-ng-cli save");
69
+ // save outputs JSON to stdout
70
+ const config = JSON.parse(output);
71
+ expect(config.cfgNum).toBeDefined();
72
+ // cfgNum might be a string or number
73
+ const cfgNum = typeof config.cfgNum === "string" ? parseInt(config.cfgNum) : config.cfgNum;
74
+ expect(cfgNum).toBeGreaterThan(0);
75
+ }
76
+ catch (e) {
77
+ console.log("CLI save failed:", e instanceof Error ? e.message : String(e));
78
+ throw e;
79
+ }
80
+ });
81
+ it.skip("should set config value via set command (requires interactive confirmation)", () => {
82
+ // The CLI 'set' command requires interactive confirmation
83
+ // and does not work non-interactively.
84
+ });
85
+ it("should search sessions via lemonldap-ng-sessions", async () => {
86
+ if (!available)
87
+ return;
88
+ try {
89
+ // lemonldap-ng-sessions search returns JSON array (might be empty)
90
+ const output = dockerExec("lemonldap-ng-sessions search");
91
+ // Parse JSON - should be an array
92
+ const sessions = JSON.parse(output);
93
+ expect(Array.isArray(sessions)).toBe(true);
94
+ }
95
+ catch (e) {
96
+ console.log("Sessions CLI failed:", e instanceof Error ? e.message : String(e));
97
+ throw e;
98
+ }
99
+ });
100
+ });
101
+ //# sourceMappingURL=ssh-mode.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-mode.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/ssh-mode.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,QAAQ,CAAC,6CAA6C,EAAE,GAAG,EAAE;IAC3D,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,aAAa,GAAG,EAAE,CAAC;IAEvB,SAAS,UAAU,CAAC,GAAW;QAC7B,OAAO,QAAQ,CAAC,eAAe,aAAa,IAAI,GAAG,EAAE,EAAE;YACrD,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,gCAAgC;SACpE,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAED,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,oCAAoC;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CACrB,0EAA0E,EAC1E,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtB,CAAC;YACF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,IAAI,IAAI,EAAE,CAAC;gBACT,aAAa,GAAG,IAAI,CAAC;gBACrB,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QAC3E,CAAC;QACD,wCAAwC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,CAAC,uBAAuB,CAAC,CAAC;YAEnD,uDAAuD;YACvD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5E,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,CAAC,oCAAoC,CAAC,CAAC;YAEhE,4BAA4B;YAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAExC,0CAA0C;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,CAAC,uBAAuB,CAAC,CAAC;YAEnD,8BAA8B;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YAEpC,qCAAqC;YACrC,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;YAC3F,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5E,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,6EAA6E,EAAE,GAAG,EAAE;QAC1F,0DAA0D;QAC1D,uCAAuC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,IAAI,CAAC;YACH,mEAAmE;YACnE,MAAM,MAAM,GAAG,UAAU,CAAC,8BAA8B,CAAC,CAAC;YAE1D,kCAAkC;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAChF,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};