integrate-sdk 0.6.5 → 0.6.6

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.
@@ -0,0 +1,27 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, {
5
+ get: all[name],
6
+ enumerable: true,
7
+ configurable: true,
8
+ set: (newValue) => all[name] = () => newValue
9
+ });
10
+ };
11
+
12
+ // src/adapters/solid-start.ts
13
+ function toSolidStartHandler(baseHandler) {
14
+ const handler = async (event) => {
15
+ return baseHandler(event.request);
16
+ };
17
+ return {
18
+ GET: handler,
19
+ POST: handler,
20
+ PATCH: handler,
21
+ PUT: handler,
22
+ DELETE: handler
23
+ };
24
+ }
25
+ export {
26
+ toSolidStartHandler
27
+ };
@@ -0,0 +1,34 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, {
5
+ get: all[name],
6
+ enumerable: true,
7
+ configurable: true,
8
+ set: (newValue) => all[name] = () => newValue
9
+ });
10
+ };
11
+
12
+ // src/adapters/svelte-kit.ts
13
+ async function svelteKitHandler({
14
+ authConfig,
15
+ event,
16
+ resolve,
17
+ basePath = "/api/auth"
18
+ }) {
19
+ const { url } = event;
20
+ const baseUrl = new URL(basePath, url.origin);
21
+ if (!url.pathname.startsWith(baseUrl.pathname)) {
22
+ return resolve(event);
23
+ }
24
+ return authConfig(event.request);
25
+ }
26
+ function toSvelteKitHandler(baseHandler) {
27
+ return async (event) => {
28
+ return baseHandler(event.request);
29
+ };
30
+ }
31
+ export {
32
+ toSvelteKitHandler,
33
+ svelteKitHandler
34
+ };
@@ -0,0 +1,26 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, {
5
+ get: all[name],
6
+ enumerable: true,
7
+ configurable: true,
8
+ set: (newValue) => all[name] = () => newValue
9
+ });
10
+ };
11
+
12
+ // src/adapters/tanstack-start.ts
13
+ function toTanStackStartHandler(handler) {
14
+ const baseHandler = async ({ request }) => {
15
+ return handler(request);
16
+ };
17
+ return {
18
+ GET: baseHandler,
19
+ POST: baseHandler
20
+ };
21
+ }
22
+ var createTanStackOAuthHandler = toTanStackStartHandler;
23
+ export {
24
+ toTanStackStartHandler,
25
+ createTanStackOAuthHandler
26
+ };
package/dist/index.js CHANGED
@@ -1891,90 +1891,183 @@ function createOAuthRedirectHandler(config) {
1891
1891
  return Response.redirect(targetUrl);
1892
1892
  };
1893
1893
  }
1894
- // src/adapters/tanstack-start.ts
1895
- function createTanStackOAuthHandler(config) {
1896
- const handler = new OAuthHandler(config);
1897
- return {
1898
- async authorize({ request }) {
1899
- try {
1900
- const body = await request.json();
1901
- const result = await handler.handleAuthorize(body);
1902
- return new Response(JSON.stringify(result), {
1903
- status: 200,
1904
- headers: {
1905
- "Content-Type": "application/json"
1906
- }
1907
- });
1908
- } catch (error) {
1909
- console.error("[OAuth Authorize] Error:", error);
1910
- return new Response(JSON.stringify({ error: error.message || "Failed to get authorization URL" }), {
1911
- status: 500,
1912
- headers: {
1913
- "Content-Type": "application/json"
1914
- }
1915
- });
1894
+ // src/adapters/node.ts
1895
+ function fromNodeHeaders(nodeHeaders) {
1896
+ const webHeaders = new Headers;
1897
+ for (const [key, value] of Object.entries(nodeHeaders)) {
1898
+ if (value !== undefined) {
1899
+ if (Array.isArray(value)) {
1900
+ value.forEach((v) => webHeaders.append(key, v));
1901
+ } else {
1902
+ webHeaders.set(key, value);
1916
1903
  }
1917
- },
1918
- async callback({ request }) {
1919
- try {
1920
- const body = await request.json();
1921
- const result = await handler.handleCallback(body);
1922
- return new Response(JSON.stringify(result), {
1923
- status: 200,
1924
- headers: {
1925
- "Content-Type": "application/json"
1926
- }
1927
- });
1928
- } catch (error) {
1929
- console.error("[OAuth Callback] Error:", error);
1930
- return new Response(JSON.stringify({ error: error.message || "Failed to exchange authorization code" }), {
1931
- status: 500,
1932
- headers: {
1933
- "Content-Type": "application/json"
1904
+ }
1905
+ }
1906
+ return webHeaders;
1907
+ }
1908
+ async function toWebRequest(req) {
1909
+ const protocol = req.socket.encrypted ? "https" : "http";
1910
+ const host = req.headers.host || "localhost";
1911
+ const url = `${protocol}://${host}${req.url}`;
1912
+ const headers = fromNodeHeaders(req.headers);
1913
+ let body;
1914
+ if (req.method && ["POST", "PUT", "PATCH"].includes(req.method)) {
1915
+ body = await new Promise((resolve, reject) => {
1916
+ let data = "";
1917
+ req.on("data", (chunk) => data += chunk);
1918
+ req.on("end", () => resolve(data));
1919
+ req.on("error", reject);
1920
+ });
1921
+ }
1922
+ return new Request(url, {
1923
+ method: req.method,
1924
+ headers,
1925
+ body: body || undefined
1926
+ });
1927
+ }
1928
+ async function sendWebResponse(webRes, nodeRes) {
1929
+ nodeRes.statusCode = webRes.status;
1930
+ webRes.headers.forEach((value, key) => {
1931
+ nodeRes.setHeader(key, value);
1932
+ });
1933
+ const body = await webRes.text();
1934
+ nodeRes.end(body);
1935
+ }
1936
+ function toNodeHandler(config) {
1937
+ const oauthHandler = new OAuthHandler(config);
1938
+ return async (req, res) => {
1939
+ try {
1940
+ const webReq = await toWebRequest(req);
1941
+ const url = new URL(webReq.url);
1942
+ const segments = url.pathname.split("/").filter(Boolean);
1943
+ const action = segments[segments.length - 1];
1944
+ let webRes;
1945
+ if (req.method === "POST") {
1946
+ if (action === "authorize") {
1947
+ const body = await webReq.json();
1948
+ const result = await oauthHandler.handleAuthorize(body);
1949
+ webRes = new Response(JSON.stringify(result), {
1950
+ status: 200,
1951
+ headers: { "Content-Type": "application/json" }
1952
+ });
1953
+ } else if (action === "callback") {
1954
+ const body = await webReq.json();
1955
+ const result = await oauthHandler.handleCallback(body);
1956
+ webRes = new Response(JSON.stringify(result), {
1957
+ status: 200,
1958
+ headers: { "Content-Type": "application/json" }
1959
+ });
1960
+ } else if (action === "disconnect") {
1961
+ const authHeader = webReq.headers.get("authorization");
1962
+ if (!authHeader || !authHeader.startsWith("Bearer ")) {
1963
+ webRes = new Response(JSON.stringify({ error: "Missing or invalid Authorization header" }), {
1964
+ status: 400,
1965
+ headers: { "Content-Type": "application/json" }
1966
+ });
1967
+ } else {
1968
+ const accessToken = authHeader.substring(7);
1969
+ const body = await webReq.json();
1970
+ const { provider } = body;
1971
+ if (!provider) {
1972
+ webRes = new Response(JSON.stringify({ error: "Missing provider in request body" }), {
1973
+ status: 400,
1974
+ headers: { "Content-Type": "application/json" }
1975
+ });
1976
+ } else {
1977
+ const result = await oauthHandler.handleDisconnect({ provider }, accessToken);
1978
+ webRes = new Response(JSON.stringify(result), {
1979
+ status: 200,
1980
+ headers: { "Content-Type": "application/json" }
1981
+ });
1982
+ }
1934
1983
  }
1935
- });
1936
- }
1937
- },
1938
- async status({ request }) {
1939
- try {
1940
- const url = new URL(request.url);
1984
+ } else {
1985
+ webRes = new Response(JSON.stringify({ error: `Unknown action: ${action}` }), {
1986
+ status: 404,
1987
+ headers: { "Content-Type": "application/json" }
1988
+ });
1989
+ }
1990
+ } else if (req.method === "GET" && action === "status") {
1941
1991
  const provider = url.searchParams.get("provider");
1942
- const sessionToken = request.headers.get("x-session-token");
1992
+ const authHeader = webReq.headers.get("authorization");
1943
1993
  if (!provider) {
1944
- return new Response(JSON.stringify({ error: "Missing provider query parameter" }), {
1994
+ webRes = new Response(JSON.stringify({ error: "Missing provider query parameter" }), {
1945
1995
  status: 400,
1946
- headers: {
1947
- "Content-Type": "application/json"
1948
- }
1996
+ headers: { "Content-Type": "application/json" }
1949
1997
  });
1950
- }
1951
- if (!sessionToken) {
1952
- return new Response(JSON.stringify({ error: "Missing X-Session-Token header" }), {
1998
+ } else if (!authHeader || !authHeader.startsWith("Bearer ")) {
1999
+ webRes = new Response(JSON.stringify({ error: "Missing or invalid Authorization header" }), {
1953
2000
  status: 400,
1954
- headers: {
1955
- "Content-Type": "application/json"
1956
- }
2001
+ headers: { "Content-Type": "application/json" }
2002
+ });
2003
+ } else {
2004
+ const accessToken = authHeader.substring(7);
2005
+ const result = await oauthHandler.handleStatus(provider, accessToken);
2006
+ webRes = new Response(JSON.stringify(result), {
2007
+ status: 200,
2008
+ headers: { "Content-Type": "application/json" }
1957
2009
  });
1958
2010
  }
1959
- const result = await handler.handleStatus(provider, sessionToken);
1960
- return new Response(JSON.stringify(result), {
1961
- status: 200,
1962
- headers: {
1963
- "Content-Type": "application/json"
1964
- }
1965
- });
1966
- } catch (error) {
1967
- console.error("[OAuth Status] Error:", error);
1968
- return new Response(JSON.stringify({ error: error.message || "Failed to check authorization status" }), {
1969
- status: 500,
1970
- headers: {
1971
- "Content-Type": "application/json"
1972
- }
2011
+ } else {
2012
+ webRes = new Response(JSON.stringify({ error: `Unknown action: ${action}` }), {
2013
+ status: 404,
2014
+ headers: { "Content-Type": "application/json" }
1973
2015
  });
1974
2016
  }
2017
+ await sendWebResponse(webRes, res);
2018
+ } catch (error) {
2019
+ console.error("[OAuth Handler] Error:", error);
2020
+ const errorRes = new Response(JSON.stringify({ error: error.message || "Internal server error" }), {
2021
+ status: 500,
2022
+ headers: { "Content-Type": "application/json" }
2023
+ });
2024
+ await sendWebResponse(errorRes, res);
1975
2025
  }
1976
2026
  };
1977
2027
  }
2028
+ // src/adapters/solid-start.ts
2029
+ function toSolidStartHandler(baseHandler) {
2030
+ const handler = async (event) => {
2031
+ return baseHandler(event.request);
2032
+ };
2033
+ return {
2034
+ GET: handler,
2035
+ POST: handler,
2036
+ PATCH: handler,
2037
+ PUT: handler,
2038
+ DELETE: handler
2039
+ };
2040
+ }
2041
+ // src/adapters/svelte-kit.ts
2042
+ async function svelteKitHandler({
2043
+ authConfig,
2044
+ event,
2045
+ resolve,
2046
+ basePath = "/api/auth"
2047
+ }) {
2048
+ const { url } = event;
2049
+ const baseUrl = new URL(basePath, url.origin);
2050
+ if (!url.pathname.startsWith(baseUrl.pathname)) {
2051
+ return resolve(event);
2052
+ }
2053
+ return authConfig(event.request);
2054
+ }
2055
+ function toSvelteKitHandler(baseHandler) {
2056
+ return async (event) => {
2057
+ return baseHandler(event.request);
2058
+ };
2059
+ }
2060
+ // src/adapters/tanstack-start.ts
2061
+ function toTanStackStartHandler(handler) {
2062
+ const baseHandler = async ({ request }) => {
2063
+ return handler(request);
2064
+ };
2065
+ return {
2066
+ GET: baseHandler,
2067
+ POST: baseHandler
2068
+ };
2069
+ }
2070
+ var createTanStackOAuthHandler = toTanStackStartHandler;
1978
2071
 
1979
2072
  // src/index.ts
1980
2073
  init_errors();
@@ -6218,6 +6311,11 @@ async function getVercelAITools(client, options) {
6218
6311
  return convertMCPToolsToVercelAI(client, options);
6219
6312
  }
6220
6313
  export {
6314
+ toTanStackStartHandler,
6315
+ toSvelteKitHandler,
6316
+ toSolidStartHandler,
6317
+ toNodeHandler,
6318
+ svelteKitHandler,
6221
6319
  sendCallbackToOpener,
6222
6320
  parseState,
6223
6321
  parseServerError,
@@ -6232,6 +6330,7 @@ export {
6232
6330
  generateState,
6233
6331
  generateCodeVerifier,
6234
6332
  generateCodeChallenge,
6333
+ fromNodeHeaders,
6235
6334
  createTanStackOAuthHandler,
6236
6335
  createSimplePlugin,
6237
6336
  createOAuthRedirectHandler,
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Node.js OAuth Route Adapter
3
+ * Provides OAuth route handlers for Node.js HTTP servers
4
+ */
5
+ import { type OAuthHandlerConfig } from './base-handler.js';
6
+ import type { IncomingHttpHeaders, IncomingMessage, ServerResponse } from 'http';
7
+ /**
8
+ * Convert Node.js IncomingHttpHeaders to Web Headers
9
+ *
10
+ * @param nodeHeaders - Node.js request headers
11
+ * @returns Web API Headers object
12
+ */
13
+ export declare function fromNodeHeaders(nodeHeaders: IncomingHttpHeaders): Headers;
14
+ /**
15
+ * Create Node.js OAuth route handler
16
+ *
17
+ * Use this to create secure OAuth API routes in your Node.js HTTP server
18
+ * that handle authorization with server-side secrets.
19
+ *
20
+ * @param config - OAuth handler configuration with provider credentials
21
+ * @returns Request handler function for Node.js
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * import { createServer } from 'http';
26
+ * import { toNodeHandler } from 'integrate-sdk/adapters/node';
27
+ *
28
+ * const handler = toNodeHandler({
29
+ * providers: {
30
+ * github: {
31
+ * clientId: process.env.GITHUB_CLIENT_ID!,
32
+ * clientSecret: process.env.GITHUB_CLIENT_SECRET!,
33
+ * },
34
+ * },
35
+ * });
36
+ *
37
+ * createServer(async (req, res) => {
38
+ * if (req.url?.startsWith('/api/auth/')) {
39
+ * await handler(req, res);
40
+ * } else {
41
+ * res.statusCode = 404;
42
+ * res.end('Not Found');
43
+ * }
44
+ * }).listen(3000);
45
+ * ```
46
+ */
47
+ export declare function toNodeHandler(config: OAuthHandlerConfig): (req: IncomingMessage, res: ServerResponse) => Promise<void>;
48
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/adapters/node.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAEjF;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,mBAAmB,GAAG,OAAO,CAYzE;AAkDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,kBAAkB,IAGxC,KAAK,eAAe,EAAE,KAAK,cAAc,KAAG,OAAO,CAAC,IAAI,CAAC,CAsHxE"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * SolidStart OAuth Route Adapter
3
+ * Provides OAuth route handlers for SolidStart
4
+ */
5
+ /**
6
+ * Create SolidStart OAuth route handlers
7
+ *
8
+ * Use this to create secure OAuth API routes in your SolidStart application
9
+ * that handle authorization with server-side secrets.
10
+ *
11
+ * @param baseHandler - Handler function from createMCPServer
12
+ * @returns Object with GET, POST, PATCH, PUT, DELETE handlers
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * // lib/integrate-server.ts
17
+ * import { createMCPServer, githubPlugin } from 'integrate-sdk/server';
18
+ *
19
+ * export const { client: serverClient, handler } = createMCPServer({
20
+ * plugins: [
21
+ * githubPlugin({
22
+ * clientId: process.env.GITHUB_CLIENT_ID!,
23
+ * clientSecret: process.env.GITHUB_CLIENT_SECRET!,
24
+ * }),
25
+ * ],
26
+ * });
27
+ *
28
+ * // src/routes/api/auth/[...all].ts
29
+ * import { toSolidStartHandler } from 'integrate-sdk/adapters/solid-start';
30
+ * import { handler } from '@/lib/integrate-server';
31
+ *
32
+ * const handlers = toSolidStartHandler(handler);
33
+ *
34
+ * export const { GET, POST, PATCH, PUT, DELETE } = handlers;
35
+ * ```
36
+ */
37
+ export declare function toSolidStartHandler(baseHandler: (request: Request) => Promise<Response>): {
38
+ GET: (event: {
39
+ request: Request;
40
+ }) => Promise<Response>;
41
+ POST: (event: {
42
+ request: Request;
43
+ }) => Promise<Response>;
44
+ PATCH: (event: {
45
+ request: Request;
46
+ }) => Promise<Response>;
47
+ PUT: (event: {
48
+ request: Request;
49
+ }) => Promise<Response>;
50
+ DELETE: (event: {
51
+ request: Request;
52
+ }) => Promise<Response>;
53
+ };
54
+ //# sourceMappingURL=solid-start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solid-start.d.ts","sourceRoot":"","sources":["../../../src/adapters/solid-start.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC;iBACxD;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,KAAG,OAAO,CAAC,QAAQ,CAAC;kBAAxC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,KAAG,OAAO,CAAC,QAAQ,CAAC;mBAAxC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,KAAG,OAAO,CAAC,QAAQ,CAAC;iBAAxC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,KAAG,OAAO,CAAC,QAAQ,CAAC;oBAAxC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,KAAG,OAAO,CAAC,QAAQ,CAAC;EAWvE"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * SvelteKit OAuth Route Adapter
3
+ * Provides OAuth route handlers for SvelteKit
4
+ */
5
+ type RequestEvent = any;
6
+ type ResolveFunction = any;
7
+ /**
8
+ * Create SvelteKit OAuth route handler for hooks
9
+ *
10
+ * Use this to integrate OAuth handling into your SvelteKit hooks.server.ts
11
+ *
12
+ * @param authConfig - Handler function from createMCPServer
13
+ * @param event - SvelteKit RequestEvent
14
+ * @param resolve - SvelteKit resolve function
15
+ * @param basePath - Base path for OAuth routes (default: '/api/auth')
16
+ * @returns Response from OAuth handler or resolved request
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * // lib/integrate-server.ts
21
+ * import { createMCPServer, githubPlugin } from 'integrate-sdk/server';
22
+ *
23
+ * export const { client: serverClient, handler } = createMCPServer({
24
+ * plugins: [
25
+ * githubPlugin({
26
+ * clientId: process.env.GITHUB_CLIENT_ID!,
27
+ * clientSecret: process.env.GITHUB_CLIENT_SECRET!,
28
+ * }),
29
+ * ],
30
+ * });
31
+ *
32
+ * // hooks.server.ts
33
+ * import { svelteKitHandler } from 'integrate-sdk/adapters/svelte-kit';
34
+ * import { handler } from '$lib/integrate-server';
35
+ *
36
+ * export async function handle({ event, resolve }) {
37
+ * return svelteKitHandler({ authConfig: handler, event, resolve });
38
+ * }
39
+ * ```
40
+ */
41
+ export declare function svelteKitHandler({ authConfig, event, resolve, basePath, }: {
42
+ authConfig: (request: Request) => Promise<Response>;
43
+ event: RequestEvent;
44
+ resolve: ResolveFunction;
45
+ basePath?: string;
46
+ }): Promise<Response>;
47
+ /**
48
+ * Create SvelteKit OAuth route handler
49
+ *
50
+ * Use this to create secure OAuth API routes in your SvelteKit application
51
+ * that handle authorization with server-side secrets.
52
+ *
53
+ * @param baseHandler - Handler function from createMCPServer
54
+ * @returns Handler function for SvelteKit routes
55
+ *
56
+ * @example
57
+ * ```typescript
58
+ * // lib/integrate-server.ts
59
+ * import { createMCPServer, githubPlugin } from 'integrate-sdk/server';
60
+ *
61
+ * export const { client: serverClient, handler } = createMCPServer({
62
+ * plugins: [
63
+ * githubPlugin({
64
+ * clientId: process.env.GITHUB_CLIENT_ID!,
65
+ * clientSecret: process.env.GITHUB_CLIENT_SECRET!,
66
+ * }),
67
+ * ],
68
+ * });
69
+ *
70
+ * // routes/api/auth/[...all]/+server.ts
71
+ * import { toSvelteKitHandler } from 'integrate-sdk/adapters/svelte-kit';
72
+ * import { handler } from '$lib/integrate-server';
73
+ *
74
+ * const svelteKitRoute = toSvelteKitHandler(handler);
75
+ *
76
+ * export const POST = svelteKitRoute;
77
+ * export const GET = svelteKitRoute;
78
+ * ```
79
+ */
80
+ export declare function toSvelteKitHandler(baseHandler: (request: Request) => Promise<Response>): (event: RequestEvent) => Promise<Response>;
81
+ export {};
82
+ //# sourceMappingURL=svelte-kit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svelte-kit.d.ts","sourceRoot":"","sources":["../../../src/adapters/svelte-kit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,KAAK,YAAY,GAAG,GAAG,CAAC;AACxB,KAAK,eAAe,GAAG,GAAG,CAAC;AAE3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAsB,gBAAgB,CAAC,EACnC,UAAU,EACV,KAAK,EACL,OAAO,EACP,QAAsB,GACzB,EAAE;IACC,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpD,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAWpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,IACrE,OAAO,YAAY,KAAG,OAAO,CAAC,QAAQ,CAAC,CAGxD"}