@useknest/widget-core 0.1.0-beta.13 → 0.1.0-beta.15
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/auth.d.ts +2 -2
- package/dist/auth.d.ts.map +1 -1
- package/dist/constants.d.ts +4 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +266 -249
- package/dist/realtime.d.ts +11 -3
- package/dist/realtime.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/auth.d.ts
CHANGED
|
@@ -4,10 +4,10 @@ import { SupabaseClient } from '@supabase/supabase-js';
|
|
|
4
4
|
* This must be called before sending chat messages.
|
|
5
5
|
*
|
|
6
6
|
* @param supabaseUrl - The Supabase project URL
|
|
7
|
-
* @param
|
|
7
|
+
* @param supabasePublishableKey - The Supabase publishable key
|
|
8
8
|
* @returns Promise resolving to true if auth succeeded, false otherwise
|
|
9
9
|
*/
|
|
10
|
-
export declare function initWidgetAuth(supabaseUrl: string,
|
|
10
|
+
export declare function initWidgetAuth(supabaseUrl: string, supabasePublishableKey: string): Promise<boolean>;
|
|
11
11
|
/**
|
|
12
12
|
* Gets the current access token for API requests.
|
|
13
13
|
* Returns null if not authenticated.
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM1E;;;;;;;GAOG;AACH,wBAAsB,cAAc,CACnC,WAAW,EAAE,MAAM,EACnB,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM1E;;;;;;;GAOG;AACH,wBAAsB,cAAc,CACnC,WAAW,EAAE,MAAM,EACnB,sBAAsB,EAAE,MAAM,GAC5B,OAAO,CAAC,OAAO,CAAC,CAmDlB;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAU7D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,IAAI,CAEzD"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export declare const DEFAULT_BASE_URL = "https://useknest.com";
|
|
2
2
|
export declare const API_PATH = "/api/v1";
|
|
3
3
|
export declare const PUBLIC_SUPABASE_URL = "https://lghrsugmhzpccpriqhrx.supabase.co";
|
|
4
|
-
export declare const
|
|
4
|
+
export declare const PUBLIC_SUPABASE_PUBLISHABLE_KEY = "sb_publishable_-KUwilDA78QM849gk662FA_kEzMezNS";
|
|
5
5
|
/** Builds the chat messages API URL from a base URL. */
|
|
6
6
|
export declare function getChatApiUrl(baseUrl?: string): string;
|
|
7
7
|
/** Builds the widget config API URL from a base URL. */
|
|
@@ -26,4 +26,7 @@ export declare function getAttachmentUploadUrl(baseUrl?: string): string;
|
|
|
26
26
|
export declare function getAttachmentSignedUrlEndpoint(baseUrl?: string): string;
|
|
27
27
|
/** Returns true if the MIME type is a supported image type. */
|
|
28
28
|
export declare function isImageType(fileType: string): boolean;
|
|
29
|
+
export declare const HUMAN_TAKEOVER_CAPTION = "A human agent will get back to you shortly.";
|
|
30
|
+
export declare const PRESENCE_LABEL_WIDGET = "We are online";
|
|
31
|
+
export declare const PRESENCE_LABEL_DASHBOARD = "Customer online";
|
|
29
32
|
//# sourceMappingURL=constants.d.ts.map
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,yBAAyB,CAAC;AACvD,eAAO,MAAM,QAAQ,YAAY,CAAC;AAIlC,eAAO,MAAM,mBAAmB,6CAA6C,CAAC;AAC9E,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,yBAAyB,CAAC;AACvD,eAAO,MAAM,QAAQ,YAAY,CAAC;AAIlC,eAAO,MAAM,mBAAmB,6CAA6C,CAAC;AAC9E,eAAO,MAAM,+BAA+B,mDAAmD,CAAC;AAEhG,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,OAAO,GAAE,MAAyB,GAAG,MAAM,CAExE;AAED,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,OAAO,GAAE,MAAyB,GAAG,MAAM,CAE1E;AAED,eAAO,MAAM,sBAAsB,oCAAoC,CAAC;AACxE,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAC9D,eAAO,MAAM,kBAAkB,iGACgE,CAAC;AAChG,eAAO,MAAM,mBAAmB,mGACiE,CAAC;AAClG,eAAO,MAAM,kBAAkB,4CAA4C,CAAC;AAC5E,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAC7C,eAAO,MAAM,uBAAuB,mHAC6E,CAAC;AAClH,eAAO,MAAM,yBAAyB,UAIrC,CAAC;AAEF,eAAO,MAAM,mBAAmB,UAAyD,CAAC;AAC1F,eAAO,MAAM,sBAAsB,UAIlC,CAAC;AACF,eAAO,MAAM,wBAAwB,UAAsD,CAAC;AAC5F,eAAO,MAAM,0BAA0B,QAAqC,CAAC;AAC7E,eAAO,MAAM,yBAAyB,QAAmB,CAAC;AAC1D,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C,iEAAiE;AACjE,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,MAAyB,GAAG,MAAM,CAEjF;AAED,iEAAiE;AACjE,wBAAgB,8BAA8B,CAAC,OAAO,GAAE,MAAyB,GAAG,MAAM,CAEzF;AAED,+DAA+D;AAC/D,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,eAAO,MAAM,sBAAsB,gDAAgD,CAAC;AACpF,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AACrD,eAAO,MAAM,wBAAwB,oBAAoB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type { WidgetMode, MessageRole, Source, Attachment, Message, ChatMessageRequest, ChatMessageResponse, ChatApiError, WidgetConfig, SSEEvent, WidgetUser } from './types';
|
|
2
|
-
export { DEFAULT_BASE_URL, API_PATH, getChatApiUrl, getConfigApiUrl, FALLBACK_ERROR_MESSAGE, DEFAULT_ERROR_MESSAGE, AUTH_ERROR_MESSAGE, USAGE_LIMIT_MESSAGE, DEFAULT_AVATAR_URL, DEFAULT_BRAND_COLOR, DEFAULT_WELCOME_MESSAGE, DEFAULT_EXAMPLE_QUESTIONS, PUBLIC_SUPABASE_URL,
|
|
2
|
+
export { DEFAULT_BASE_URL, API_PATH, getChatApiUrl, getConfigApiUrl, FALLBACK_ERROR_MESSAGE, DEFAULT_ERROR_MESSAGE, AUTH_ERROR_MESSAGE, USAGE_LIMIT_MESSAGE, DEFAULT_AVATAR_URL, DEFAULT_BRAND_COLOR, DEFAULT_WELCOME_MESSAGE, DEFAULT_EXAMPLE_QUESTIONS, PUBLIC_SUPABASE_URL, PUBLIC_SUPABASE_PUBLISHABLE_KEY, ALLOWED_IMAGE_TYPES, ALLOWED_DOCUMENT_TYPES, ALLOWED_ATTACHMENT_TYPES, ACCEPTED_FILE_TYPES_STRING, MAX_ATTACHMENT_SIZE_BYTES, MAX_ATTACHMENTS_PER_MESSAGE, getAttachmentUploadUrl, getAttachmentSignedUrlEndpoint, isImageType, HUMAN_TAKEOVER_CAPTION, PRESENCE_LABEL_WIDGET, PRESENCE_LABEL_DASHBOARD } from './constants';
|
|
3
3
|
export { fetchWidgetConfig } from './config';
|
|
4
4
|
export type { ConfigResult, ConfigErrorType } from './config';
|
|
5
5
|
export { streamChatMessage } from './streaming';
|
|
@@ -9,7 +9,7 @@ export { validateAttachment, requestUploadUrl, uploadToStorage, uploadAttachment
|
|
|
9
9
|
export { initWidgetAuth, getAccessToken, isAuthenticated, getSupabaseClient } from './auth';
|
|
10
10
|
export { initWidgetSentry, captureWidgetException } from './sentry';
|
|
11
11
|
export { subscribeToThread } from './realtime';
|
|
12
|
-
export type { BroadcastMessage } from './realtime';
|
|
12
|
+
export type { BroadcastMessage, PresenceOptions } from './realtime';
|
|
13
13
|
export { loadChatState, saveChatState, saveChatStateDebounced, clearChatState } from './persistence';
|
|
14
14
|
export type { PersistedChatState } from './persistence';
|
|
15
15
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACX,UAAU,EACV,WAAW,EACX,MAAM,EACN,UAAU,EACV,OAAO,EACP,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,MAAM,SAAS,CAAC;AAGjB,OAAO,EACN,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,yBAAyB,EACzB,mBAAmB,EACnB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACX,UAAU,EACV,WAAW,EACX,MAAM,EACN,UAAU,EACV,OAAO,EACP,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,MAAM,SAAS,CAAC;AAGjB,OAAO,EACN,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,yBAAyB,EACzB,mBAAmB,EACnB,+BAA+B,EAC/B,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,yBAAyB,EACzB,2BAA2B,EAC3B,sBAAsB,EACtB,8BAA8B,EAC9B,WAAW,EACX,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGzE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGxD,OAAO,EACN,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAG5F,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAGpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGpE,OAAO,EACN,aAAa,EACb,aAAa,EACb,sBAAsB,EACtB,cAAc,EACd,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -26,7 +26,7 @@ function Fe(n = W) {
|
|
|
26
26
|
function ut(n) {
|
|
27
27
|
return fe.includes(n);
|
|
28
28
|
}
|
|
29
|
-
const Ce = "knest-widget-config-", ke = 1440 * 60 * 1e3;
|
|
29
|
+
const lt = "A human agent will get back to you shortly.", ct = "We are online", dt = "Customer online", Ce = "knest-widget-config-", ke = 1440 * 60 * 1e3;
|
|
30
30
|
function J(n) {
|
|
31
31
|
return Ce + n;
|
|
32
32
|
}
|
|
@@ -69,14 +69,14 @@ async function se(n, u) {
|
|
|
69
69
|
return console.error("Error fetching widget config:", e), { config: null, error: "network" };
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
|
-
async function
|
|
72
|
+
async function gt(n, u, e) {
|
|
73
73
|
const l = _e(n);
|
|
74
74
|
return l ? (e && se(n, u).then((c) => {
|
|
75
75
|
c.config && c.config.updatedAt !== l.updatedAt && e(c.config);
|
|
76
76
|
}), { config: l, error: null }) : se(n, u);
|
|
77
77
|
}
|
|
78
78
|
let _ = null, H = !1, x = null;
|
|
79
|
-
async function
|
|
79
|
+
async function pt(n, u) {
|
|
80
80
|
return x || (H && _ ? !0 : (x = (async () => {
|
|
81
81
|
try {
|
|
82
82
|
_ = be(n, u, {
|
|
@@ -115,35 +115,35 @@ function Pe() {
|
|
|
115
115
|
function xe() {
|
|
116
116
|
return _;
|
|
117
117
|
}
|
|
118
|
-
async function
|
|
119
|
-
const { publishableApiKey: u, content: e, threadId: l, callbacks: c, baseUrl:
|
|
118
|
+
async function ft(n) {
|
|
119
|
+
const { publishableApiKey: u, content: e, threadId: l, callbacks: c, baseUrl: p, metadata: h, user: i } = n;
|
|
120
120
|
try {
|
|
121
121
|
if (!Pe())
|
|
122
122
|
throw new Error("Widget not authenticated. Call initWidgetAuth() first.");
|
|
123
|
-
const
|
|
124
|
-
if (!
|
|
123
|
+
const m = await Q();
|
|
124
|
+
if (!m)
|
|
125
125
|
throw new Error("No access token available. Please refresh and try again.");
|
|
126
|
-
const
|
|
127
|
-
l && (
|
|
128
|
-
const R = await fetch(Ie(
|
|
126
|
+
const b = { content: e };
|
|
127
|
+
l && (b.threadId = l), h && (b.metadata = h), i && (!i.id && !i.email ? console.warn("[Knest] user prop ignored: at least id or email is required.") : (b.user = i, i.email && (b.email = i.email), i.fullName && (b.fullName = i.fullName)));
|
|
128
|
+
const R = await fetch(Ie(p), {
|
|
129
129
|
method: "POST",
|
|
130
130
|
headers: {
|
|
131
131
|
"Content-Type": "application/json",
|
|
132
132
|
"X-Api-Key": u,
|
|
133
|
-
Authorization: `Bearer ${
|
|
133
|
+
Authorization: `Bearer ${m}`
|
|
134
134
|
},
|
|
135
135
|
credentials: "include",
|
|
136
|
-
body: JSON.stringify(
|
|
136
|
+
body: JSON.stringify(b)
|
|
137
137
|
});
|
|
138
138
|
if (!R.ok) {
|
|
139
139
|
if (R.status === 401 || R.status === 403)
|
|
140
140
|
throw new Error(Oe);
|
|
141
141
|
if (R.status === 429) {
|
|
142
|
-
const
|
|
143
|
-
throw
|
|
142
|
+
const E = await R.json();
|
|
143
|
+
throw E.code === "USAGE_LIMIT_EXCEEDED" ? new Error(Ne) : new Error(E.error || "Rate limited");
|
|
144
144
|
}
|
|
145
|
-
const
|
|
146
|
-
throw new Error(
|
|
145
|
+
const A = await R.json();
|
|
146
|
+
throw new Error(A.error || "Failed to send message");
|
|
147
147
|
}
|
|
148
148
|
const v = R.body?.getReader();
|
|
149
149
|
if (!v)
|
|
@@ -151,9 +151,9 @@ async function dt(n) {
|
|
|
151
151
|
const w = new TextDecoder();
|
|
152
152
|
let k = "", L = !1;
|
|
153
153
|
for (; ; ) {
|
|
154
|
-
const { done:
|
|
155
|
-
if (
|
|
156
|
-
k += w.decode(
|
|
154
|
+
const { done: A, value: E } = await v.read();
|
|
155
|
+
if (A) break;
|
|
156
|
+
k += w.decode(E, { stream: !0 });
|
|
157
157
|
const T = k.split(`
|
|
158
158
|
`);
|
|
159
159
|
k = T.pop() || "";
|
|
@@ -176,9 +176,9 @@ async function dt(n) {
|
|
|
176
176
|
}
|
|
177
177
|
}
|
|
178
178
|
L || c.onError(Re);
|
|
179
|
-
} catch (
|
|
180
|
-
const
|
|
181
|
-
c.onError(
|
|
179
|
+
} catch (m) {
|
|
180
|
+
const b = m instanceof Error ? m.message : re;
|
|
181
|
+
c.onError(b);
|
|
182
182
|
}
|
|
183
183
|
}
|
|
184
184
|
var ie = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
|
|
@@ -198,7 +198,7 @@ function Me() {
|
|
|
198
198
|
* @public
|
|
199
199
|
*/
|
|
200
200
|
var e = (function(l) {
|
|
201
|
-
var c = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,
|
|
201
|
+
var c = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i, p = 0, h = {}, i = {
|
|
202
202
|
/**
|
|
203
203
|
* By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the
|
|
204
204
|
* current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load
|
|
@@ -254,7 +254,7 @@ function Me() {
|
|
|
254
254
|
*/
|
|
255
255
|
util: {
|
|
256
256
|
encode: function a(t) {
|
|
257
|
-
return t instanceof
|
|
257
|
+
return t instanceof m ? new m(t.type, a(t.content), t.alias) : Array.isArray(t) ? t.map(a) : t.replace(/&/g, "&").replace(/</g, "<").replace(/\u00a0/g, " ");
|
|
258
258
|
},
|
|
259
259
|
/**
|
|
260
260
|
* Returns the name of the type of the given value.
|
|
@@ -282,7 +282,7 @@ function Me() {
|
|
|
282
282
|
* @returns {number}
|
|
283
283
|
*/
|
|
284
284
|
objId: function(a) {
|
|
285
|
-
return a.__id || Object.defineProperty(a, "__id", { value: ++
|
|
285
|
+
return a.__id || Object.defineProperty(a, "__id", { value: ++p }), a.__id;
|
|
286
286
|
},
|
|
287
287
|
/**
|
|
288
288
|
* Creates a deep clone of the given object.
|
|
@@ -296,13 +296,13 @@ function Me() {
|
|
|
296
296
|
*/
|
|
297
297
|
clone: function a(t, r) {
|
|
298
298
|
r = r || {};
|
|
299
|
-
var s,
|
|
300
|
-
switch (
|
|
299
|
+
var s, o;
|
|
300
|
+
switch (i.util.type(t)) {
|
|
301
301
|
case "Object":
|
|
302
|
-
if (
|
|
303
|
-
return r[
|
|
302
|
+
if (o = i.util.objId(t), r[o])
|
|
303
|
+
return r[o];
|
|
304
304
|
s = /** @type {Record<string, any>} */
|
|
305
|
-
{}, r[
|
|
305
|
+
{}, r[o] = s;
|
|
306
306
|
for (var g in t)
|
|
307
307
|
t.hasOwnProperty(g) && (s[g] = a(t[g], r));
|
|
308
308
|
return (
|
|
@@ -310,10 +310,10 @@ function Me() {
|
|
|
310
310
|
s
|
|
311
311
|
);
|
|
312
312
|
case "Array":
|
|
313
|
-
return
|
|
313
|
+
return o = i.util.objId(t), r[o] ? r[o] : (s = [], r[o] = s, /** @type {Array} */
|
|
314
314
|
/** @type {any} */
|
|
315
|
-
t.forEach(function(
|
|
316
|
-
s[d] = a(
|
|
315
|
+
t.forEach(function(f, d) {
|
|
316
|
+
s[d] = a(f, r);
|
|
317
317
|
}), /** @type {any} */
|
|
318
318
|
s);
|
|
319
319
|
default:
|
|
@@ -396,10 +396,10 @@ function Me() {
|
|
|
396
396
|
*/
|
|
397
397
|
isActive: function(a, t, r) {
|
|
398
398
|
for (var s = "no-" + t; a; ) {
|
|
399
|
-
var
|
|
400
|
-
if (
|
|
399
|
+
var o = a.classList;
|
|
400
|
+
if (o.contains(t))
|
|
401
401
|
return !0;
|
|
402
|
-
if (
|
|
402
|
+
if (o.contains(s))
|
|
403
403
|
return !1;
|
|
404
404
|
a = a.parentElement;
|
|
405
405
|
}
|
|
@@ -417,10 +417,10 @@ function Me() {
|
|
|
417
417
|
/**
|
|
418
418
|
* The grammar for plain, unformatted text.
|
|
419
419
|
*/
|
|
420
|
-
plain:
|
|
421
|
-
plaintext:
|
|
422
|
-
text:
|
|
423
|
-
txt:
|
|
420
|
+
plain: h,
|
|
421
|
+
plaintext: h,
|
|
422
|
+
text: h,
|
|
423
|
+
txt: h,
|
|
424
424
|
/**
|
|
425
425
|
* Creates a deep copy of the language with the given id and appends the given tokens.
|
|
426
426
|
*
|
|
@@ -450,7 +450,7 @@ function Me() {
|
|
|
450
450
|
* });
|
|
451
451
|
*/
|
|
452
452
|
extend: function(a, t) {
|
|
453
|
-
var r =
|
|
453
|
+
var r = i.util.clone(i.languages[a]);
|
|
454
454
|
for (var s in t)
|
|
455
455
|
r[s] = t[s];
|
|
456
456
|
return r;
|
|
@@ -532,29 +532,29 @@ function Me() {
|
|
|
532
532
|
*/
|
|
533
533
|
insertBefore: function(a, t, r, s) {
|
|
534
534
|
s = s || /** @type {any} */
|
|
535
|
-
|
|
536
|
-
var
|
|
537
|
-
for (var
|
|
538
|
-
if (
|
|
539
|
-
if (
|
|
535
|
+
i.languages;
|
|
536
|
+
var o = s[a], g = {};
|
|
537
|
+
for (var f in o)
|
|
538
|
+
if (o.hasOwnProperty(f)) {
|
|
539
|
+
if (f == t)
|
|
540
540
|
for (var d in r)
|
|
541
541
|
r.hasOwnProperty(d) && (g[d] = r[d]);
|
|
542
|
-
r.hasOwnProperty(
|
|
542
|
+
r.hasOwnProperty(f) || (g[f] = o[f]);
|
|
543
543
|
}
|
|
544
|
-
var
|
|
545
|
-
return s[a] = g,
|
|
546
|
-
F ===
|
|
544
|
+
var S = s[a];
|
|
545
|
+
return s[a] = g, i.languages.DFS(i.languages, function(I, F) {
|
|
546
|
+
F === S && I != a && (this[I] = g);
|
|
547
547
|
}), g;
|
|
548
548
|
},
|
|
549
549
|
// Traverse a language definition with Depth First Search
|
|
550
|
-
DFS: function a(t, r, s,
|
|
551
|
-
|
|
552
|
-
var g =
|
|
553
|
-
for (var
|
|
554
|
-
if (t.hasOwnProperty(
|
|
555
|
-
r.call(t,
|
|
556
|
-
var d = t[
|
|
557
|
-
|
|
550
|
+
DFS: function a(t, r, s, o) {
|
|
551
|
+
o = o || {};
|
|
552
|
+
var g = i.util.objId;
|
|
553
|
+
for (var f in t)
|
|
554
|
+
if (t.hasOwnProperty(f)) {
|
|
555
|
+
r.call(t, f, t[f], s || f);
|
|
556
|
+
var d = t[f], S = i.util.type(d);
|
|
557
|
+
S === "Object" && !o[g(d)] ? (o[g(d)] = !0, a(d, r, null, o)) : S === "Array" && !o[g(d)] && (o[g(d)] = !0, a(d, r, f, o));
|
|
558
558
|
}
|
|
559
559
|
}
|
|
560
560
|
},
|
|
@@ -572,7 +572,7 @@ function Me() {
|
|
|
572
572
|
* @public
|
|
573
573
|
*/
|
|
574
574
|
highlightAll: function(a, t) {
|
|
575
|
-
|
|
575
|
+
i.highlightAllUnder(document, a, t);
|
|
576
576
|
},
|
|
577
577
|
/**
|
|
578
578
|
* Fetches all the descendants of `container` that have a `.language-xxxx` class and then calls
|
|
@@ -595,9 +595,9 @@ function Me() {
|
|
|
595
595
|
container: a,
|
|
596
596
|
selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
|
|
597
597
|
};
|
|
598
|
-
|
|
599
|
-
for (var
|
|
600
|
-
|
|
598
|
+
i.hooks.run("before-highlightall", s), s.elements = Array.prototype.slice.apply(s.container.querySelectorAll(s.selector)), i.hooks.run("before-all-elements-highlight", s);
|
|
599
|
+
for (var o = 0, g; g = s.elements[o++]; )
|
|
600
|
+
i.highlightElement(g, t === !0, s.callback);
|
|
601
601
|
},
|
|
602
602
|
/**
|
|
603
603
|
* Highlights the code inside a single element.
|
|
@@ -628,38 +628,38 @@ function Me() {
|
|
|
628
628
|
* @public
|
|
629
629
|
*/
|
|
630
630
|
highlightElement: function(a, t, r) {
|
|
631
|
-
var s =
|
|
632
|
-
|
|
631
|
+
var s = i.util.getLanguage(a), o = i.languages[s];
|
|
632
|
+
i.util.setLanguage(a, s);
|
|
633
633
|
var g = a.parentElement;
|
|
634
|
-
g && g.nodeName.toLowerCase() === "pre" &&
|
|
635
|
-
var
|
|
634
|
+
g && g.nodeName.toLowerCase() === "pre" && i.util.setLanguage(g, s);
|
|
635
|
+
var f = a.textContent, d = {
|
|
636
636
|
element: a,
|
|
637
637
|
language: s,
|
|
638
|
-
grammar:
|
|
639
|
-
code:
|
|
638
|
+
grammar: o,
|
|
639
|
+
code: f
|
|
640
640
|
};
|
|
641
|
-
function
|
|
642
|
-
d.highlightedCode = F,
|
|
641
|
+
function S(F) {
|
|
642
|
+
d.highlightedCode = F, i.hooks.run("before-insert", d), d.element.innerHTML = d.highlightedCode, i.hooks.run("after-highlight", d), i.hooks.run("complete", d), r && r.call(d.element);
|
|
643
643
|
}
|
|
644
|
-
if (
|
|
645
|
-
|
|
644
|
+
if (i.hooks.run("before-sanity-check", d), g = d.element.parentElement, g && g.nodeName.toLowerCase() === "pre" && !g.hasAttribute("tabindex") && g.setAttribute("tabindex", "0"), !d.code) {
|
|
645
|
+
i.hooks.run("complete", d), r && r.call(d.element);
|
|
646
646
|
return;
|
|
647
647
|
}
|
|
648
|
-
if (
|
|
649
|
-
|
|
648
|
+
if (i.hooks.run("before-highlight", d), !d.grammar) {
|
|
649
|
+
S(i.util.encode(d.code));
|
|
650
650
|
return;
|
|
651
651
|
}
|
|
652
652
|
if (t && l.Worker) {
|
|
653
|
-
var
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
},
|
|
653
|
+
var I = new Worker(i.filename);
|
|
654
|
+
I.onmessage = function(F) {
|
|
655
|
+
S(F.data);
|
|
656
|
+
}, I.postMessage(JSON.stringify({
|
|
657
657
|
language: d.language,
|
|
658
658
|
code: d.code,
|
|
659
659
|
immediateClose: !0
|
|
660
660
|
}));
|
|
661
661
|
} else
|
|
662
|
-
|
|
662
|
+
S(i.highlight(d.code, d.grammar, d.language));
|
|
663
663
|
},
|
|
664
664
|
/**
|
|
665
665
|
* Low-level function, only use if you know what you’re doing. It accepts a string of text as input
|
|
@@ -687,9 +687,9 @@ function Me() {
|
|
|
687
687
|
grammar: t,
|
|
688
688
|
language: r
|
|
689
689
|
};
|
|
690
|
-
if (
|
|
690
|
+
if (i.hooks.run("before-tokenize", s), !s.grammar)
|
|
691
691
|
throw new Error('The language "' + s.language + '" has no grammar.');
|
|
692
|
-
return s.tokens =
|
|
692
|
+
return s.tokens = i.tokenize(s.code, s.grammar), i.hooks.run("after-tokenize", s), m.stringify(i.util.encode(s.tokens), s.language);
|
|
693
693
|
},
|
|
694
694
|
/**
|
|
695
695
|
* This is the heart of Prism, and the most low-level function you can use. It accepts a string of text as input
|
|
@@ -722,8 +722,8 @@ function Me() {
|
|
|
722
722
|
t[s] = r[s];
|
|
723
723
|
delete t.rest;
|
|
724
724
|
}
|
|
725
|
-
var
|
|
726
|
-
return w(
|
|
725
|
+
var o = new v();
|
|
726
|
+
return w(o, o.head, a), R(a, o, t, o.head, 0), L(o);
|
|
727
727
|
},
|
|
728
728
|
/**
|
|
729
729
|
* @namespace
|
|
@@ -745,7 +745,7 @@ function Me() {
|
|
|
745
745
|
* @public
|
|
746
746
|
*/
|
|
747
747
|
add: function(a, t) {
|
|
748
|
-
var r =
|
|
748
|
+
var r = i.hooks.all;
|
|
749
749
|
r[a] = r[a] || [], r[a].push(t);
|
|
750
750
|
},
|
|
751
751
|
/**
|
|
@@ -758,28 +758,28 @@ function Me() {
|
|
|
758
758
|
* @public
|
|
759
759
|
*/
|
|
760
760
|
run: function(a, t) {
|
|
761
|
-
var r =
|
|
761
|
+
var r = i.hooks.all[a];
|
|
762
762
|
if (!(!r || !r.length))
|
|
763
|
-
for (var s = 0,
|
|
764
|
-
|
|
763
|
+
for (var s = 0, o; o = r[s++]; )
|
|
764
|
+
o(t);
|
|
765
765
|
}
|
|
766
766
|
},
|
|
767
|
-
Token:
|
|
767
|
+
Token: m
|
|
768
768
|
};
|
|
769
|
-
l.Prism =
|
|
770
|
-
function
|
|
769
|
+
l.Prism = i;
|
|
770
|
+
function m(a, t, r, s) {
|
|
771
771
|
this.type = a, this.content = t, this.alias = r, this.length = (s || "").length | 0;
|
|
772
772
|
}
|
|
773
|
-
|
|
773
|
+
m.stringify = function a(t, r) {
|
|
774
774
|
if (typeof t == "string")
|
|
775
775
|
return t;
|
|
776
776
|
if (Array.isArray(t)) {
|
|
777
777
|
var s = "";
|
|
778
|
-
return t.forEach(function(
|
|
779
|
-
s += a(
|
|
778
|
+
return t.forEach(function(S) {
|
|
779
|
+
s += a(S, r);
|
|
780
780
|
}), s;
|
|
781
781
|
}
|
|
782
|
-
var
|
|
782
|
+
var o = {
|
|
783
783
|
type: t.type,
|
|
784
784
|
content: a(t.content, r),
|
|
785
785
|
tag: "span",
|
|
@@ -787,64 +787,64 @@ function Me() {
|
|
|
787
787
|
attributes: {},
|
|
788
788
|
language: r
|
|
789
789
|
}, g = t.alias;
|
|
790
|
-
g && (Array.isArray(g) ? Array.prototype.push.apply(
|
|
791
|
-
var
|
|
792
|
-
for (var d in
|
|
793
|
-
|
|
794
|
-
return "<" +
|
|
790
|
+
g && (Array.isArray(g) ? Array.prototype.push.apply(o.classes, g) : o.classes.push(g)), i.hooks.run("wrap", o);
|
|
791
|
+
var f = "";
|
|
792
|
+
for (var d in o.attributes)
|
|
793
|
+
f += " " + d + '="' + (o.attributes[d] || "").replace(/"/g, """) + '"';
|
|
794
|
+
return "<" + o.tag + ' class="' + o.classes.join(" ") + '"' + f + ">" + o.content + "</" + o.tag + ">";
|
|
795
795
|
};
|
|
796
|
-
function
|
|
796
|
+
function b(a, t, r, s) {
|
|
797
797
|
a.lastIndex = t;
|
|
798
|
-
var
|
|
799
|
-
if (
|
|
800
|
-
var g =
|
|
801
|
-
|
|
798
|
+
var o = a.exec(r);
|
|
799
|
+
if (o && s && o[1]) {
|
|
800
|
+
var g = o[1].length;
|
|
801
|
+
o.index += g, o[0] = o[0].slice(g);
|
|
802
802
|
}
|
|
803
|
-
return
|
|
803
|
+
return o;
|
|
804
804
|
}
|
|
805
|
-
function R(a, t, r, s,
|
|
806
|
-
for (var
|
|
807
|
-
if (!(!r.hasOwnProperty(
|
|
808
|
-
var d = r[
|
|
805
|
+
function R(a, t, r, s, o, g) {
|
|
806
|
+
for (var f in r)
|
|
807
|
+
if (!(!r.hasOwnProperty(f) || !r[f])) {
|
|
808
|
+
var d = r[f];
|
|
809
809
|
d = Array.isArray(d) ? d : [d];
|
|
810
|
-
for (var
|
|
811
|
-
if (g && g.cause ==
|
|
810
|
+
for (var S = 0; S < d.length; ++S) {
|
|
811
|
+
if (g && g.cause == f + "," + S)
|
|
812
812
|
return;
|
|
813
|
-
var
|
|
814
|
-
if (te && !
|
|
815
|
-
var Ae =
|
|
816
|
-
|
|
813
|
+
var I = d[S], F = I.inside, ee = !!I.lookbehind, te = !!I.greedy, me = I.alias;
|
|
814
|
+
if (te && !I.pattern.global) {
|
|
815
|
+
var Ae = I.pattern.toString().match(/[imsuy]*$/)[0];
|
|
816
|
+
I.pattern = RegExp(I.pattern.source, Ae + "g");
|
|
817
817
|
}
|
|
818
|
-
for (var ne =
|
|
819
|
-
var D =
|
|
818
|
+
for (var ne = I.pattern || I, y = s.next, N = o; y !== t.tail && !(g && N >= g.reach); N += y.value.length, y = y.next) {
|
|
819
|
+
var D = y.value;
|
|
820
820
|
if (t.length > a.length)
|
|
821
821
|
return;
|
|
822
|
-
if (!(D instanceof
|
|
822
|
+
if (!(D instanceof m)) {
|
|
823
823
|
var M = 1, O;
|
|
824
824
|
if (te) {
|
|
825
|
-
if (O =
|
|
825
|
+
if (O = b(ne, N, a, ee), !O || O.index >= a.length)
|
|
826
826
|
break;
|
|
827
827
|
var $ = O.index, Se = O.index + O[0].length, C = N;
|
|
828
|
-
for (C +=
|
|
829
|
-
|
|
830
|
-
if (C -=
|
|
828
|
+
for (C += y.value.length; $ >= C; )
|
|
829
|
+
y = y.next, C += y.value.length;
|
|
830
|
+
if (C -= y.value.length, N = C, y.value instanceof m)
|
|
831
831
|
continue;
|
|
832
|
-
for (var P =
|
|
832
|
+
for (var P = y; P !== t.tail && (C < Se || typeof P.value == "string"); P = P.next)
|
|
833
833
|
M++, C += P.value.length;
|
|
834
834
|
M--, D = a.slice(N, C), O.index -= N;
|
|
835
|
-
} else if (O =
|
|
835
|
+
} else if (O = b(ne, 0, D, ee), !O)
|
|
836
836
|
continue;
|
|
837
|
-
var $ = O.index,
|
|
837
|
+
var $ = O.index, B = O[0], j = D.slice(0, $), ae = D.slice($ + B.length), K = N + D.length;
|
|
838
838
|
g && K > g.reach && (g.reach = K);
|
|
839
|
-
var
|
|
840
|
-
j && (
|
|
841
|
-
var Te = new
|
|
842
|
-
if (
|
|
839
|
+
var G = y.prev;
|
|
840
|
+
j && (G = w(t, G, j), N += j.length), k(t, G, M);
|
|
841
|
+
var Te = new m(f, F ? i.tokenize(B, F) : B, me, B);
|
|
842
|
+
if (y = w(t, G, Te), ae && w(t, y, ae), M > 1) {
|
|
843
843
|
var q = {
|
|
844
|
-
cause:
|
|
844
|
+
cause: f + "," + S,
|
|
845
845
|
reach: K
|
|
846
846
|
};
|
|
847
|
-
R(a, t, r,
|
|
847
|
+
R(a, t, r, y.prev, N, q), g && q.reach > g.reach && (g.reach = q.reach);
|
|
848
848
|
}
|
|
849
849
|
}
|
|
850
850
|
}
|
|
@@ -856,13 +856,13 @@ function Me() {
|
|
|
856
856
|
a.next = t, this.head = a, this.tail = t, this.length = 0;
|
|
857
857
|
}
|
|
858
858
|
function w(a, t, r) {
|
|
859
|
-
var s = t.next,
|
|
860
|
-
return t.next =
|
|
859
|
+
var s = t.next, o = { value: r, prev: t, next: s };
|
|
860
|
+
return t.next = o, s.prev = o, a.length++, o;
|
|
861
861
|
}
|
|
862
862
|
function k(a, t, r) {
|
|
863
|
-
for (var s = t.next,
|
|
863
|
+
for (var s = t.next, o = 0; o < r && s !== a.tail; o++)
|
|
864
864
|
s = s.next;
|
|
865
|
-
t.next = s, s.prev = t, a.length -=
|
|
865
|
+
t.next = s, s.prev = t, a.length -= o;
|
|
866
866
|
}
|
|
867
867
|
function L(a) {
|
|
868
868
|
for (var t = [], r = a.head.next; r !== a.tail; )
|
|
@@ -870,20 +870,20 @@ function Me() {
|
|
|
870
870
|
return t;
|
|
871
871
|
}
|
|
872
872
|
if (!l.document)
|
|
873
|
-
return l.addEventListener && (
|
|
874
|
-
var t = JSON.parse(a.data), r = t.language, s = t.code,
|
|
875
|
-
l.postMessage(
|
|
876
|
-
}, !1)),
|
|
877
|
-
var
|
|
878
|
-
|
|
879
|
-
function
|
|
880
|
-
|
|
873
|
+
return l.addEventListener && (i.disableWorkerMessageHandler || l.addEventListener("message", function(a) {
|
|
874
|
+
var t = JSON.parse(a.data), r = t.language, s = t.code, o = t.immediateClose;
|
|
875
|
+
l.postMessage(i.highlight(s, i.languages[r], r)), o && l.close();
|
|
876
|
+
}, !1)), i;
|
|
877
|
+
var A = i.util.currentScript();
|
|
878
|
+
A && (i.filename = A.src, A.hasAttribute("data-manual") && (i.manual = !0));
|
|
879
|
+
function E() {
|
|
880
|
+
i.manual || i.highlightAll();
|
|
881
881
|
}
|
|
882
|
-
if (!
|
|
882
|
+
if (!i.manual) {
|
|
883
883
|
var T = document.readyState;
|
|
884
|
-
T === "loading" || T === "interactive" &&
|
|
884
|
+
T === "loading" || T === "interactive" && A && A.defer ? document.addEventListener("DOMContentLoaded", E) : window.requestAnimationFrame ? window.requestAnimationFrame(E) : window.setTimeout(E, 16);
|
|
885
885
|
}
|
|
886
|
-
return
|
|
886
|
+
return i;
|
|
887
887
|
})(u);
|
|
888
888
|
n.exports && (n.exports = e), typeof ie < "u" && (ie.Prism = e), e.languages.markup = {
|
|
889
889
|
comment: {
|
|
@@ -976,32 +976,32 @@ function Me() {
|
|
|
976
976
|
* @example
|
|
977
977
|
* addInlined('style', 'css');
|
|
978
978
|
*/
|
|
979
|
-
value: function(c,
|
|
980
|
-
var
|
|
981
|
-
|
|
979
|
+
value: function(c, p) {
|
|
980
|
+
var h = {};
|
|
981
|
+
h["language-" + p] = {
|
|
982
982
|
pattern: /(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,
|
|
983
983
|
lookbehind: !0,
|
|
984
|
-
inside: e.languages[
|
|
985
|
-
},
|
|
986
|
-
var
|
|
984
|
+
inside: e.languages[p]
|
|
985
|
+
}, h.cdata = /^<!\[CDATA\[|\]\]>$/i;
|
|
986
|
+
var i = {
|
|
987
987
|
"included-cdata": {
|
|
988
988
|
pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
|
|
989
|
-
inside:
|
|
989
|
+
inside: h
|
|
990
990
|
}
|
|
991
991
|
};
|
|
992
|
-
|
|
992
|
+
i["language-" + p] = {
|
|
993
993
|
pattern: /[\s\S]+/,
|
|
994
|
-
inside: e.languages[
|
|
994
|
+
inside: e.languages[p]
|
|
995
995
|
};
|
|
996
|
-
var
|
|
997
|
-
|
|
996
|
+
var m = {};
|
|
997
|
+
m[c] = {
|
|
998
998
|
pattern: RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g, function() {
|
|
999
999
|
return c;
|
|
1000
1000
|
}), "i"),
|
|
1001
1001
|
lookbehind: !0,
|
|
1002
1002
|
greedy: !0,
|
|
1003
|
-
inside:
|
|
1004
|
-
}, e.languages.insertBefore("markup", "cdata",
|
|
1003
|
+
inside: i
|
|
1004
|
+
}, e.languages.insertBefore("markup", "cdata", m);
|
|
1005
1005
|
}
|
|
1006
1006
|
}), Object.defineProperty(e.languages.markup.tag, "addAttribute", {
|
|
1007
1007
|
/**
|
|
@@ -1097,8 +1097,8 @@ function Me() {
|
|
|
1097
1097
|
},
|
|
1098
1098
|
punctuation: /[(){};:,]/
|
|
1099
1099
|
}, l.languages.css.atrule.inside.rest = l.languages.css;
|
|
1100
|
-
var
|
|
1101
|
-
|
|
1100
|
+
var p = l.languages.markup;
|
|
1101
|
+
p && (p.tag.addInlined("style", "css"), p.tag.addAttribute("style", "css"));
|
|
1102
1102
|
})(e), e.languages.clike = {
|
|
1103
1103
|
comment: [
|
|
1104
1104
|
{
|
|
@@ -1263,9 +1263,9 @@ function Me() {
|
|
|
1263
1263
|
if (typeof e > "u" || typeof document > "u")
|
|
1264
1264
|
return;
|
|
1265
1265
|
Element.prototype.matches || (Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector);
|
|
1266
|
-
var l = "Loading…", c = function(
|
|
1267
|
-
return "✖ Error " +
|
|
1268
|
-
},
|
|
1266
|
+
var l = "Loading…", c = function(A, E) {
|
|
1267
|
+
return "✖ Error " + A + " while fetching file: " + E;
|
|
1268
|
+
}, p = "✖ Error: File does not exist or is empty", h = {
|
|
1269
1269
|
js: "javascript",
|
|
1270
1270
|
py: "python",
|
|
1271
1271
|
rb: "ruby",
|
|
@@ -1275,52 +1275,52 @@ function Me() {
|
|
|
1275
1275
|
bat: "batch",
|
|
1276
1276
|
h: "c",
|
|
1277
1277
|
tex: "latex"
|
|
1278
|
-
},
|
|
1279
|
-
function w(
|
|
1278
|
+
}, i = "data-src-status", m = "loading", b = "loaded", R = "failed", v = "pre[data-src]:not([" + i + '="' + b + '"]):not([' + i + '="' + m + '"])';
|
|
1279
|
+
function w(A, E, T) {
|
|
1280
1280
|
var a = new XMLHttpRequest();
|
|
1281
|
-
a.open("GET",
|
|
1282
|
-
a.readyState == 4 && (a.status < 400 && a.responseText ?
|
|
1281
|
+
a.open("GET", A, !0), a.onreadystatechange = function() {
|
|
1282
|
+
a.readyState == 4 && (a.status < 400 && a.responseText ? E(a.responseText) : a.status >= 400 ? T(c(a.status, a.statusText)) : T(p));
|
|
1283
1283
|
}, a.send(null);
|
|
1284
1284
|
}
|
|
1285
|
-
function k(
|
|
1286
|
-
var
|
|
1287
|
-
if (
|
|
1288
|
-
var T = Number(
|
|
1285
|
+
function k(A) {
|
|
1286
|
+
var E = /^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(A || "");
|
|
1287
|
+
if (E) {
|
|
1288
|
+
var T = Number(E[1]), a = E[2], t = E[3];
|
|
1289
1289
|
return a ? t ? [T, Number(t)] : [T, void 0] : [T, T];
|
|
1290
1290
|
}
|
|
1291
1291
|
}
|
|
1292
|
-
e.hooks.add("before-highlightall", function(
|
|
1293
|
-
|
|
1294
|
-
}), e.hooks.add("before-sanity-check", function(
|
|
1295
|
-
var
|
|
1292
|
+
e.hooks.add("before-highlightall", function(A) {
|
|
1293
|
+
A.selector += ", " + v;
|
|
1294
|
+
}), e.hooks.add("before-sanity-check", function(A) {
|
|
1295
|
+
var E = (
|
|
1296
1296
|
/** @type {HTMLPreElement} */
|
|
1297
|
-
|
|
1297
|
+
A.element
|
|
1298
1298
|
);
|
|
1299
|
-
if (
|
|
1300
|
-
|
|
1301
|
-
var T =
|
|
1299
|
+
if (E.matches(v)) {
|
|
1300
|
+
A.code = "", E.setAttribute(i, m);
|
|
1301
|
+
var T = E.appendChild(document.createElement("CODE"));
|
|
1302
1302
|
T.textContent = l;
|
|
1303
|
-
var a =
|
|
1303
|
+
var a = E.getAttribute("data-src"), t = A.language;
|
|
1304
1304
|
if (t === "none") {
|
|
1305
1305
|
var r = (/\.(\w+)$/.exec(a) || [, "none"])[1];
|
|
1306
|
-
t =
|
|
1306
|
+
t = h[r] || r;
|
|
1307
1307
|
}
|
|
1308
|
-
e.util.setLanguage(T, t), e.util.setLanguage(
|
|
1308
|
+
e.util.setLanguage(T, t), e.util.setLanguage(E, t);
|
|
1309
1309
|
var s = e.plugins.autoloader;
|
|
1310
1310
|
s && s.loadLanguages(t), w(
|
|
1311
1311
|
a,
|
|
1312
|
-
function(
|
|
1313
|
-
|
|
1314
|
-
var g = k(
|
|
1312
|
+
function(o) {
|
|
1313
|
+
E.setAttribute(i, b);
|
|
1314
|
+
var g = k(E.getAttribute("data-range"));
|
|
1315
1315
|
if (g) {
|
|
1316
|
-
var
|
|
1317
|
-
d < 0 && (d +=
|
|
1318
|
-
`),
|
|
1316
|
+
var f = o.split(/\r\n?|\n/g), d = g[0], S = g[1] == null ? f.length : g[1];
|
|
1317
|
+
d < 0 && (d += f.length), d = Math.max(0, Math.min(d - 1, f.length)), S < 0 && (S += f.length), S = Math.max(0, Math.min(S, f.length)), o = f.slice(d, S).join(`
|
|
1318
|
+
`), E.hasAttribute("data-start") || E.setAttribute("data-start", String(d + 1));
|
|
1319
1319
|
}
|
|
1320
|
-
T.textContent =
|
|
1320
|
+
T.textContent = o, e.highlightElement(T);
|
|
1321
1321
|
},
|
|
1322
|
-
function(
|
|
1323
|
-
|
|
1322
|
+
function(o) {
|
|
1323
|
+
E.setAttribute(i, R), T.textContent = o;
|
|
1324
1324
|
}
|
|
1325
1325
|
);
|
|
1326
1326
|
}
|
|
@@ -1332,8 +1332,8 @@ function Me() {
|
|
|
1332
1332
|
*
|
|
1333
1333
|
* @param {ParentNode} [container=document]
|
|
1334
1334
|
*/
|
|
1335
|
-
highlight: function(
|
|
1336
|
-
for (var T = (
|
|
1335
|
+
highlight: function(E) {
|
|
1336
|
+
for (var T = (E || document).querySelectorAll(v), a = 0, t; t = T[a++]; )
|
|
1337
1337
|
e.highlightElement(t);
|
|
1338
1338
|
}
|
|
1339
1339
|
};
|
|
@@ -1347,7 +1347,7 @@ function Me() {
|
|
|
1347
1347
|
var $e = Me();
|
|
1348
1348
|
const ue = /* @__PURE__ */ Ue($e);
|
|
1349
1349
|
var le = {}, ce;
|
|
1350
|
-
function
|
|
1350
|
+
function Be() {
|
|
1351
1351
|
return ce || (ce = 1, Prism.languages.python = {
|
|
1352
1352
|
comment: {
|
|
1353
1353
|
pattern: /(^|[^\\])#.*/,
|
|
@@ -1410,9 +1410,9 @@ function Ge() {
|
|
|
1410
1410
|
punctuation: /[{}[\];(),.:]/
|
|
1411
1411
|
}, Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest = Prism.languages.python, Prism.languages.py = Prism.languages.python), le;
|
|
1412
1412
|
}
|
|
1413
|
-
|
|
1413
|
+
Be();
|
|
1414
1414
|
var de = {}, ge;
|
|
1415
|
-
function
|
|
1415
|
+
function Ge() {
|
|
1416
1416
|
return ge || (ge = 1, (function(n) {
|
|
1417
1417
|
n.languages.typescript = n.languages.extend("javascript", {
|
|
1418
1418
|
"class-name": {
|
|
@@ -1459,7 +1459,7 @@ function Be() {
|
|
|
1459
1459
|
}), n.languages.ts = n.languages.typescript;
|
|
1460
1460
|
})(Prism)), de;
|
|
1461
1461
|
}
|
|
1462
|
-
|
|
1462
|
+
Ge();
|
|
1463
1463
|
(function(n) {
|
|
1464
1464
|
var u = "\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b", e = {
|
|
1465
1465
|
pattern: /(^(["']?)\w+\2)[ \t]+\S.*/,
|
|
@@ -1675,8 +1675,8 @@ Be();
|
|
|
1675
1675
|
"operator",
|
|
1676
1676
|
"punctuation",
|
|
1677
1677
|
"number"
|
|
1678
|
-
],
|
|
1679
|
-
|
|
1678
|
+
], p = l.variable[1].inside, h = 0; h < c.length; h++)
|
|
1679
|
+
p[c[h]] = n.languages.bash[c[h]];
|
|
1680
1680
|
n.languages.sh = n.languages.bash, n.languages.shell = n.languages.bash;
|
|
1681
1681
|
})(Prism);
|
|
1682
1682
|
Prism.languages.json = {
|
|
@@ -1871,15 +1871,15 @@ Object.defineProperty(Prism.languages.markup.tag, "addInlined", {
|
|
|
1871
1871
|
pattern: /[\s\S]+/,
|
|
1872
1872
|
inside: Prism.languages[e]
|
|
1873
1873
|
};
|
|
1874
|
-
var
|
|
1875
|
-
|
|
1874
|
+
var p = {};
|
|
1875
|
+
p[u] = {
|
|
1876
1876
|
pattern: RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g, function() {
|
|
1877
1877
|
return u;
|
|
1878
1878
|
}), "i"),
|
|
1879
1879
|
lookbehind: !0,
|
|
1880
1880
|
greedy: !0,
|
|
1881
1881
|
inside: c
|
|
1882
|
-
}, Prism.languages.insertBefore("markup", "cdata",
|
|
1882
|
+
}, Prism.languages.insertBefore("markup", "cdata", p);
|
|
1883
1883
|
}
|
|
1884
1884
|
});
|
|
1885
1885
|
Object.defineProperty(Prism.languages.markup.tag, "addAttribute", {
|
|
@@ -1981,19 +1981,19 @@ const he = new Y.Renderer();
|
|
|
1981
1981
|
he.code = ({ text: n, lang: u }) => {
|
|
1982
1982
|
const e = u ? He[u] || u : "plaintext", l = ue.languages[e];
|
|
1983
1983
|
if (l) {
|
|
1984
|
-
const
|
|
1985
|
-
return `<pre><code class="language-${e}">${
|
|
1984
|
+
const p = ue.highlight(n, l, e);
|
|
1985
|
+
return `<pre><code class="language-${e}">${p}</code></pre>`;
|
|
1986
1986
|
}
|
|
1987
1987
|
return `<pre><code>${n.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">")}</code></pre>`;
|
|
1988
1988
|
};
|
|
1989
1989
|
Y.use({ renderer: he });
|
|
1990
|
-
function
|
|
1990
|
+
function Et(n) {
|
|
1991
1991
|
return Y.parse(n);
|
|
1992
1992
|
}
|
|
1993
|
-
function
|
|
1993
|
+
function ht(n) {
|
|
1994
1994
|
return n < 1024 ? `${n} B` : n < 1024 * 1024 ? `${(n / 1024).toFixed(1)} KB` : `${(n / (1024 * 1024)).toFixed(1)} MB`;
|
|
1995
1995
|
}
|
|
1996
|
-
function
|
|
1996
|
+
function mt(n) {
|
|
1997
1997
|
return Ee.includes(n.type) ? n.size > we ? "File exceeds the 10MB size limit." : null : `File type "${n.type}" is not supported.`;
|
|
1998
1998
|
}
|
|
1999
1999
|
async function ze({
|
|
@@ -2002,24 +2002,24 @@ async function ze({
|
|
|
2002
2002
|
fileName: e,
|
|
2003
2003
|
fileType: l,
|
|
2004
2004
|
fileSize: c,
|
|
2005
|
-
baseUrl:
|
|
2005
|
+
baseUrl: p
|
|
2006
2006
|
}) {
|
|
2007
|
-
const
|
|
2007
|
+
const h = await Q(), i = await fetch(Le(p), {
|
|
2008
2008
|
method: "POST",
|
|
2009
2009
|
headers: {
|
|
2010
2010
|
"Content-Type": "application/json",
|
|
2011
2011
|
"X-Api-Key": n,
|
|
2012
|
-
...
|
|
2012
|
+
...h ? { Authorization: `Bearer ${h}` } : {}
|
|
2013
2013
|
},
|
|
2014
2014
|
body: JSON.stringify({ threadId: u, fileName: e, fileType: l, fileSize: c })
|
|
2015
2015
|
});
|
|
2016
|
-
if (!
|
|
2017
|
-
const
|
|
2016
|
+
if (!i.ok) {
|
|
2017
|
+
const m = await i.json().catch(() => ({}));
|
|
2018
2018
|
throw new Error(
|
|
2019
|
-
|
|
2019
|
+
m.error || `Upload URL request failed: ${i.status}`
|
|
2020
2020
|
);
|
|
2021
2021
|
}
|
|
2022
|
-
return
|
|
2022
|
+
return i.json();
|
|
2023
2023
|
}
|
|
2024
2024
|
async function Ye(n, u) {
|
|
2025
2025
|
const e = await fetch(n, {
|
|
@@ -2030,13 +2030,13 @@ async function Ye(n, u) {
|
|
|
2030
2030
|
if (!e.ok)
|
|
2031
2031
|
throw new Error(`Storage upload failed: ${e.status}`);
|
|
2032
2032
|
}
|
|
2033
|
-
async function
|
|
2033
|
+
async function At({
|
|
2034
2034
|
publishableApiKey: n,
|
|
2035
2035
|
threadId: u,
|
|
2036
2036
|
file: e,
|
|
2037
2037
|
baseUrl: l
|
|
2038
2038
|
}) {
|
|
2039
|
-
const { uploadUrl: c, storagePath:
|
|
2039
|
+
const { uploadUrl: c, storagePath: p } = await ze({
|
|
2040
2040
|
publishableApiKey: n,
|
|
2041
2041
|
threadId: u,
|
|
2042
2042
|
fileName: e.name,
|
|
@@ -2044,9 +2044,9 @@ async function Et({
|
|
|
2044
2044
|
fileSize: e.size,
|
|
2045
2045
|
baseUrl: l
|
|
2046
2046
|
});
|
|
2047
|
-
return await Ye(c, e), { fileName: e.name, fileType: e.type, fileSize: e.size, storagePath:
|
|
2047
|
+
return await Ye(c, e), { fileName: e.name, fileType: e.type, fileSize: e.size, storagePath: p };
|
|
2048
2048
|
}
|
|
2049
|
-
async function
|
|
2049
|
+
async function St({
|
|
2050
2050
|
publishableApiKey: n,
|
|
2051
2051
|
storagePath: u,
|
|
2052
2052
|
baseUrl: e
|
|
@@ -2086,7 +2086,7 @@ function je(n) {
|
|
|
2086
2086
|
});
|
|
2087
2087
|
}
|
|
2088
2088
|
let pe = !1;
|
|
2089
|
-
function
|
|
2089
|
+
function Tt() {
|
|
2090
2090
|
pe || (Z.init({
|
|
2091
2091
|
dsn: We,
|
|
2092
2092
|
// Only capture errors, not performance data.
|
|
@@ -2112,30 +2112,44 @@ function mt() {
|
|
|
2112
2112
|
}
|
|
2113
2113
|
}), pe = !0);
|
|
2114
2114
|
}
|
|
2115
|
-
function
|
|
2115
|
+
function bt(n, u) {
|
|
2116
2116
|
const e = typeof n == "string" ? new Error(n) : n;
|
|
2117
2117
|
Z.captureException(e, {
|
|
2118
2118
|
tags: { source: "knest-widget" },
|
|
2119
2119
|
extra: u
|
|
2120
2120
|
});
|
|
2121
2121
|
}
|
|
2122
|
-
function
|
|
2123
|
-
const
|
|
2124
|
-
if (!
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
|
|
2128
|
-
u(
|
|
2129
|
-
})
|
|
2130
|
-
|
|
2131
|
-
|
|
2122
|
+
function It(n, u, e) {
|
|
2123
|
+
const l = xe();
|
|
2124
|
+
if (!l) return () => {
|
|
2125
|
+
};
|
|
2126
|
+
const c = e?.role === "visitor" ? "agent" : "visitor";
|
|
2127
|
+
let p = l.channel(`thread:${n}`).on("broadcast", { event: "new-message" }, (h) => {
|
|
2128
|
+
u(h.payload);
|
|
2129
|
+
});
|
|
2130
|
+
if (e) {
|
|
2131
|
+
const { onPresenceChange: h } = e;
|
|
2132
|
+
p = p.on("presence", { event: "sync" }, () => {
|
|
2133
|
+
try {
|
|
2134
|
+
const i = p.presenceState(), m = Object.values(i).flat().some((b) => b.type === c);
|
|
2135
|
+
h(m);
|
|
2136
|
+
} catch {
|
|
2137
|
+
}
|
|
2138
|
+
});
|
|
2139
|
+
}
|
|
2140
|
+
return p.subscribe((h) => {
|
|
2141
|
+
h === "SUBSCRIBED" && e && p.track({ type: e.role }).catch(() => {
|
|
2142
|
+
});
|
|
2143
|
+
}), () => {
|
|
2144
|
+
e && p.untrack().catch(() => {
|
|
2145
|
+
}), p.unsubscribe();
|
|
2132
2146
|
};
|
|
2133
2147
|
}
|
|
2134
2148
|
const Ke = "knest-widget-chat-", qe = 14400 * 1e3, Ve = 300, U = /* @__PURE__ */ new Map();
|
|
2135
2149
|
function z(n) {
|
|
2136
2150
|
return Ke + n;
|
|
2137
2151
|
}
|
|
2138
|
-
function
|
|
2152
|
+
function yt(n) {
|
|
2139
2153
|
try {
|
|
2140
2154
|
const u = localStorage.getItem(z(n));
|
|
2141
2155
|
if (!u) return null;
|
|
@@ -2151,7 +2165,7 @@ function Ze(n, u) {
|
|
|
2151
2165
|
} catch {
|
|
2152
2166
|
}
|
|
2153
2167
|
}
|
|
2154
|
-
function
|
|
2168
|
+
function Rt(n, u) {
|
|
2155
2169
|
const e = U.get(n);
|
|
2156
2170
|
e !== void 0 && clearTimeout(e);
|
|
2157
2171
|
const l = setTimeout(() => {
|
|
@@ -2159,7 +2173,7 @@ function bt(n, u) {
|
|
|
2159
2173
|
}, Ve);
|
|
2160
2174
|
U.set(n, l);
|
|
2161
2175
|
}
|
|
2162
|
-
function
|
|
2176
|
+
function Ot(n) {
|
|
2163
2177
|
const u = U.get(n);
|
|
2164
2178
|
u !== void 0 && (clearTimeout(u), U.delete(n));
|
|
2165
2179
|
try {
|
|
@@ -2181,34 +2195,37 @@ export {
|
|
|
2181
2195
|
st as DEFAULT_EXAMPLE_QUESTIONS,
|
|
2182
2196
|
rt as DEFAULT_WELCOME_MESSAGE,
|
|
2183
2197
|
Re as FALLBACK_ERROR_MESSAGE,
|
|
2198
|
+
lt as HUMAN_TAKEOVER_CAPTION,
|
|
2184
2199
|
ot as MAX_ATTACHMENTS_PER_MESSAGE,
|
|
2185
2200
|
we as MAX_ATTACHMENT_SIZE_BYTES,
|
|
2186
|
-
|
|
2201
|
+
dt as PRESENCE_LABEL_DASHBOARD,
|
|
2202
|
+
ct as PRESENCE_LABEL_WIDGET,
|
|
2203
|
+
tt as PUBLIC_SUPABASE_PUBLISHABLE_KEY,
|
|
2187
2204
|
et as PUBLIC_SUPABASE_URL,
|
|
2188
2205
|
Ne as USAGE_LIMIT_MESSAGE,
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
|
|
2194
|
-
|
|
2206
|
+
bt as captureWidgetException,
|
|
2207
|
+
Ot as clearChatState,
|
|
2208
|
+
St as fetchSignedUrl,
|
|
2209
|
+
gt as fetchWidgetConfig,
|
|
2210
|
+
Et as formatContent,
|
|
2211
|
+
ht as formatFileSize,
|
|
2195
2212
|
Q as getAccessToken,
|
|
2196
2213
|
Fe as getAttachmentSignedUrlEndpoint,
|
|
2197
2214
|
Le as getAttachmentUploadUrl,
|
|
2198
2215
|
Ie as getChatApiUrl,
|
|
2199
2216
|
ye as getConfigApiUrl,
|
|
2200
2217
|
xe as getSupabaseClient,
|
|
2201
|
-
|
|
2202
|
-
|
|
2218
|
+
pt as initWidgetAuth,
|
|
2219
|
+
Tt as initWidgetSentry,
|
|
2203
2220
|
Pe as isAuthenticated,
|
|
2204
2221
|
ut as isImageType,
|
|
2205
|
-
|
|
2222
|
+
yt as loadChatState,
|
|
2206
2223
|
ze as requestUploadUrl,
|
|
2207
2224
|
Ze as saveChatState,
|
|
2208
|
-
|
|
2209
|
-
|
|
2210
|
-
|
|
2211
|
-
|
|
2225
|
+
Rt as saveChatStateDebounced,
|
|
2226
|
+
ft as streamChatMessage,
|
|
2227
|
+
It as subscribeToThread,
|
|
2228
|
+
At as uploadAttachment,
|
|
2212
2229
|
Ye as uploadToStorage,
|
|
2213
|
-
|
|
2230
|
+
mt as validateAttachment
|
|
2214
2231
|
};
|
package/dist/realtime.d.ts
CHANGED
|
@@ -6,11 +6,19 @@ export interface BroadcastMessage {
|
|
|
6
6
|
metadata: Record<string, unknown>;
|
|
7
7
|
created_at: string;
|
|
8
8
|
}
|
|
9
|
+
export interface PresenceOptions {
|
|
10
|
+
role: 'visitor' | 'agent';
|
|
11
|
+
onPresenceChange: (isOtherOnline: boolean) => void;
|
|
12
|
+
}
|
|
9
13
|
/**
|
|
10
14
|
* Subscribes to broadcast messages on a thread channel.
|
|
11
|
-
*
|
|
15
|
+
* Optionally co-tracks presence on the same channel to show online indicators.
|
|
16
|
+
*
|
|
17
|
+
* Presence is fully best-effort: `track()` is fire-and-forget, the sync handler is
|
|
18
|
+
* guarded with try/catch, and the subscribe callback is kept synchronous so that no
|
|
19
|
+
* presence error can ever disrupt broadcast delivery.
|
|
12
20
|
*
|
|
13
|
-
* @returns
|
|
21
|
+
* @returns Cleanup function — call on component destroy.
|
|
14
22
|
*/
|
|
15
|
-
export declare function subscribeToThread(threadId: string, onMessage: (message: BroadcastMessage) => void): () => void;
|
|
23
|
+
export declare function subscribeToThread(threadId: string, onMessage: (message: BroadcastMessage) => void, presence?: PresenceOptions): () => void;
|
|
16
24
|
//# sourceMappingURL=realtime.d.ts.map
|
package/dist/realtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;CACnB;AAED
|
|
1
|
+
{"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1B,gBAAgB,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;CACnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAChC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,EAC9C,QAAQ,CAAC,EAAE,eAAe,GACxB,MAAM,IAAI,CAwCZ"}
|