@sveltejs/kit 2.34.1 → 2.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sveltejs/kit",
3
- "version": "2.34.1",
3
+ "version": "2.36.0",
4
4
  "description": "SvelteKit is the fastest way to build Svelte apps",
5
5
  "keywords": [
6
6
  "framework",
@@ -108,7 +108,8 @@ const options = object(
108
108
  }),
109
109
 
110
110
  csrf: object({
111
- checkOrigin: boolean(true)
111
+ checkOrigin: boolean(true),
112
+ trustedOrigins: string_array([])
112
113
  }),
113
114
 
114
115
  embedded: boolean(false),
@@ -66,10 +66,21 @@ function generate_app_types(manifest_data) {
66
66
  dynamic_routes.push(route_type);
67
67
 
68
68
  const pathname = remove_group_segments(route.id);
69
- pathnames.add(`\`${replace_required_params(replace_optional_params(pathname))}\` & {}`);
69
+ const replaced_pathname = replace_required_params(replace_optional_params(pathname));
70
+ pathnames.add(`\`${replaced_pathname}\` & {}`);
71
+
72
+ if (pathname !== '/') {
73
+ // Support trailing slash
74
+ pathnames.add(`\`${replaced_pathname + '/'}\` & {}`);
75
+ }
70
76
  } else {
71
77
  const pathname = remove_group_segments(route.id);
72
78
  pathnames.add(s(pathname));
79
+
80
+ if (pathname !== '/') {
81
+ // Support trailing slash
82
+ pathnames.add(s(pathname + '/'));
83
+ }
73
84
  }
74
85
 
75
86
  /** @type {Map<string, boolean>} */
@@ -38,6 +38,7 @@ export const options = {
38
38
  app_template_contains_nonce: ${template.includes('%sveltekit.nonce%')},
39
39
  csp: ${s(config.kit.csp)},
40
40
  csrf_check_origin: ${s(config.kit.csrf.checkOrigin)},
41
+ csrf_trusted_origins: ${s(config.kit.csrf.trustedOrigins)},
41
42
  embedded: ${config.kit.embedded},
42
43
  env_public_prefix: '${config.kit.env.publicPrefix}',
43
44
  env_private_prefix: '${config.kit.env.privatePrefix}',
@@ -428,6 +428,17 @@ export interface KitConfig {
428
428
  * @default true
429
429
  */
430
430
  checkOrigin?: boolean;
431
+ /**
432
+ * An array of origins that are allowed to make cross-origin form submissions to your app, even when `checkOrigin` is `true`.
433
+ *
434
+ * Each origin should be a complete origin including protocol (e.g., `https://payment-gateway.com`).
435
+ * This is useful for allowing trusted third-party services like payment gateways or authentication providers to submit forms to your app.
436
+ *
437
+ * **Warning**: Only add origins you completely trust, as this bypasses CSRF protection for those origins.
438
+ * @default []
439
+ * @example ['https://checkout.stripe.com', 'https://accounts.google.com']
440
+ */
441
+ trustedOrigins?: string[];
431
442
  };
432
443
  /**
433
444
  * Whether or not the app is embedded inside a larger app. If `true`, SvelteKit will add its event listeners related to navigation etc on the parent of `%sveltekit.body%` instead of `window`, and will pass `params` from the server rather than inferring them from `location.pathname`.
@@ -33,7 +33,7 @@ export function deserialize(result) {
33
33
 
34
34
  if (parsed.data) {
35
35
  // the decoders should never be initialised at the top-level because `app`
36
- // will not initialised yet if `kit.output.bundleStrategy` is 'single' or 'inline'
36
+ // will not be initialised yet if `kit.output.bundleStrategy` is 'single' or 'inline'
37
37
  parsed.data = devalue.parse(parsed.data, BROWSER ? client_app.decoders : server_app.decoders);
38
38
  }
39
39
 
@@ -13,3 +13,5 @@ import * as app from '__sveltekit/manifest';
13
13
  export function start(element, options) {
14
14
  void kit.start(app, element, options);
15
15
  }
16
+
17
+ export { app };
@@ -3,6 +3,7 @@ import { set_private_env, set_public_env } from '../shared-server.js';
3
3
  import { options, get_hooks } from '__SERVER__/internal.js';
4
4
  import { DEV } from 'esm-env';
5
5
  import { filter_env } from '../../utils/env.js';
6
+ import { format_server_error } from './utils.js';
6
7
  import { set_read_implementation, set_manifest } from '__sveltekit/server';
7
8
  import { set_app } from './app.js';
8
9
 
@@ -87,8 +88,14 @@ export class Server {
87
88
  handle: module.handle || (({ event, resolve }) => resolve(event)),
88
89
  handleError:
89
90
  module.handleError ||
90
- (({ status, error }) =>
91
- console.error((status === 404 && /** @type {Error} */ (error)?.message) || error)),
91
+ (({ status, error, event }) => {
92
+ const error_message = format_server_error(
93
+ status,
94
+ /** @type {Error} */ (error),
95
+ event
96
+ );
97
+ console.error(error_message);
98
+ }),
92
99
  handleFetch: module.handleFetch || (({ request, fetch }) => fetch(request)),
93
100
  handleValidationError:
94
101
  module.handleValidationError ||
@@ -379,9 +379,28 @@ export async function render_response({
379
379
  deferred.set(id, { fulfil, reject });
380
380
  })`);
381
381
 
382
+ let app_declaration = '';
383
+
384
+ if (Object.keys(options.hooks.transport).length > 0) {
385
+ if (client.inline) {
386
+ app_declaration = `const app = __sveltekit_${options.version_hash}.app.app;`;
387
+ } else if (client.app) {
388
+ app_declaration = `const app = await import(${s(prefixed(client.app))});`;
389
+ } else {
390
+ app_declaration = `const { app } = await import(${s(prefixed(client.start))});`;
391
+ }
392
+ }
393
+
394
+ const prelude = app_declaration
395
+ ? `${app_declaration}
396
+ const [data, error] = fn(app);`
397
+ : `const [data, error] = fn();`;
398
+
382
399
  // When resolving, the id might not yet be available due to the data
383
400
  // be evaluated upon init of kit, so we use a timeout to retry
384
- properties.push(`resolve: ({ id, data, error }) => {
401
+ properties.push(`resolve: async (id, fn) => {
402
+ ${prelude}
403
+
385
404
  const try_to_resolve = () => {
386
405
  if (!deferred.has(id)) {
387
406
  setTimeout(try_to_resolve, 0);
@@ -665,7 +684,7 @@ function get_data(event, event_state, options, nodes, csp, global) {
665
684
 
666
685
  let str;
667
686
  try {
668
- str = devalue.uneval({ id, data, error }, replacer);
687
+ str = devalue.uneval(error ? [, error] : [data], replacer);
669
688
  } catch {
670
689
  error = await handle_error_and_jsonify(
671
690
  event,
@@ -674,11 +693,13 @@ function get_data(event, event_state, options, nodes, csp, global) {
674
693
  new Error(`Failed to serialize promise while rendering ${event.route.id}`)
675
694
  );
676
695
  data = undefined;
677
- str = devalue.uneval({ id, data, error }, replacer);
696
+ str = devalue.uneval([, error], replacer);
678
697
  }
679
698
 
680
699
  const nonce = csp.script_needs_nonce ? ` nonce="${csp.nonce}"` : '';
681
- push(`<script${nonce}>${global}.resolve(${str})</script>\n`);
700
+ push(
701
+ `<script${nonce}>${global}.resolve(${id}, ${str.includes('app.decode') ? `(app) => ${str}` : `() => ${str}`})</script>\n`
702
+ );
682
703
  if (count === 0) done();
683
704
  }
684
705
  );
@@ -74,30 +74,31 @@ export async function internal_respond(request, options, manifest, state) {
74
74
  const is_data_request = has_data_suffix(url.pathname);
75
75
  const remote_id = get_remote_id(url);
76
76
 
77
- if (options.csrf_check_origin && request.headers.get('origin') !== url.origin) {
78
- const opts = { status: 403 };
79
-
80
- if (remote_id && request.method !== 'GET') {
81
- return json(
82
- {
83
- message: 'Cross-site remote requests are forbidden'
84
- },
85
- opts
86
- );
87
- }
77
+ const request_origin = request.headers.get('origin');
88
78
 
79
+ if (remote_id) {
80
+ if (request.method !== 'GET' && request_origin !== url.origin) {
81
+ const message = 'Cross-site remote requests are forbidden';
82
+ return json({ message }, { status: 403 });
83
+ }
84
+ } else if (options.csrf_check_origin) {
89
85
  const forbidden =
90
86
  is_form_content_type(request) &&
91
87
  (request.method === 'POST' ||
92
88
  request.method === 'PUT' ||
93
89
  request.method === 'PATCH' ||
94
- request.method === 'DELETE');
90
+ request.method === 'DELETE') &&
91
+ request_origin !== url.origin &&
92
+ (!request_origin || !options.csrf_trusted_origins.includes(request_origin));
95
93
 
96
94
  if (forbidden) {
97
95
  const message = `Cross-site ${request.method} form submissions are forbidden`;
96
+ const opts = { status: 403 };
97
+
98
98
  if (request.headers.get('accept') === 'application/json') {
99
99
  return json({ message }, opts);
100
100
  }
101
+
101
102
  return text(message, opts);
102
103
  }
103
104
  }
@@ -100,7 +100,8 @@ export async function handle_fatal_error(event, state, options, error) {
100
100
  */
101
101
  export async function handle_error_and_jsonify(event, state, options, error) {
102
102
  if (error instanceof HttpError) {
103
- return error.body;
103
+ // @ts-expect-error custom user errors may not have a message field if App.Error is overwritten
104
+ return { message: 'Unknown Error', ...error.body };
104
105
  }
105
106
 
106
107
  if (__SVELTEKIT_DEV__ && typeof error == 'object') {
@@ -186,6 +187,59 @@ export function has_prerendered_path(manifest, pathname) {
186
187
  );
187
188
  }
188
189
 
190
+ /**
191
+ * Formats the error into a nice message with sanitized stack trace
192
+ * @param {number} status
193
+ * @param {Error} error
194
+ * @param {import('@sveltejs/kit').RequestEvent} event
195
+ */
196
+ export function format_server_error(status, error, event) {
197
+ const formatted_text = `\n\x1b[1;31m[${status}] ${event.request.method} ${event.url.pathname}\x1b[0m\n`;
198
+
199
+ if (status === 404) {
200
+ return formatted_text + error.message;
201
+ }
202
+
203
+ return formatted_text + (DEV ? clean_up_stack_trace(error) : error.stack);
204
+ }
205
+
206
+ /**
207
+ * In dev, tidy up stack traces by making paths relative to the current project directory
208
+ * @param {string} file
209
+ */
210
+ let relative = (file) => file;
211
+
212
+ if (DEV) {
213
+ try {
214
+ const path = await import('node:path');
215
+ const process = await import('node:process');
216
+
217
+ relative = (file) => path.relative(process.cwd(), file);
218
+ } catch {
219
+ // do nothing
220
+ }
221
+ }
222
+
223
+ /**
224
+ * Provides a refined stack trace by excluding lines following the last occurrence of a line containing +page. +layout. or +server.
225
+ * @param {Error} error
226
+ */
227
+ export function clean_up_stack_trace(error) {
228
+ const stack_trace = (error.stack?.split('\n') ?? []).map((line) => {
229
+ return line.replace(/\((.+)(:\d+:\d+)\)$/, (_, file, loc) => `(${relative(file)}${loc})`);
230
+ });
231
+
232
+ // progressive enhancement for people who haven't configured kit.files.src to something else
233
+ const last_line_from_src_code = stack_trace.findLastIndex((line) => /\(src[\\/]/.test(line));
234
+
235
+ if (last_line_from_src_code === -1) {
236
+ // default to the whole stack trace
237
+ return error.stack;
238
+ }
239
+
240
+ return stack_trace.slice(0, last_line_from_src_code + 1).join('\n');
241
+ }
242
+
189
243
  /**
190
244
  * Returns the filename without the extension. e.g., `+page.server`, `+page`, etc.
191
245
  * @param {string | undefined} node_id
@@ -442,6 +442,7 @@ export interface SSROptions {
442
442
  app_template_contains_nonce: boolean;
443
443
  csp: ValidatedConfig['kit']['csp'];
444
444
  csrf_check_origin: boolean;
445
+ csrf_trusted_origins: string[];
445
446
  embedded: boolean;
446
447
  env_public_prefix: string;
447
448
  env_private_prefix: string;
package/src/version.js CHANGED
@@ -1,4 +1,4 @@
1
1
  // generated during release, do not modify
2
2
 
3
3
  /** @type {string} */
4
- export const VERSION = '2.34.1';
4
+ export const VERSION = '2.36.0';
package/types/index.d.ts CHANGED
@@ -404,6 +404,17 @@ declare module '@sveltejs/kit' {
404
404
  * @default true
405
405
  */
406
406
  checkOrigin?: boolean;
407
+ /**
408
+ * An array of origins that are allowed to make cross-origin form submissions to your app, even when `checkOrigin` is `true`.
409
+ *
410
+ * Each origin should be a complete origin including protocol (e.g., `https://payment-gateway.com`).
411
+ * This is useful for allowing trusted third-party services like payment gateways or authentication providers to submit forms to your app.
412
+ *
413
+ * **Warning**: Only add origins you completely trust, as this bypasses CSRF protection for those origins.
414
+ * @default []
415
+ * @example ['https://checkout.stripe.com', 'https://accounts.google.com']
416
+ */
417
+ trustedOrigins?: string[];
407
418
  };
408
419
  /**
409
420
  * Whether or not the app is embedded inside a larger app. If `true`, SvelteKit will add its event listeners related to navigation etc on the parent of `%sveltekit.body%` instead of `window`, and will pass `params` from the server rather than inferring them from `location.pathname`.
@@ -187,6 +187,6 @@
187
187
  null,
188
188
  null
189
189
  ],
190
- "mappings": ";;;;;;;;;;;kBAkCiBA,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAiCZC,cAAcA;;;;;;aAMdC,cAAcA;;;;;;;;MAQrBC,aAAaA;;;;;OAKJC,YAAYA;;kBAETC,aAAaA;;;;;;MAMzBC,qBAAqBA;;;;;;;;;;;kBAWTC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA8IPC,MAAMA;;;;;;;;;;;kBAWNC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA4DPC,QAAQA;;;;;;;;kBAQRC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAqjBdC,MAAMA;;;;;;;;;;;aAWNC,iBAAiBA;;;;;;;;;;;;aAYjBC,qBAAqBA;;;;;;;;;aASrBC,iBAAiBA;;;;;;;;;;aAUjBC,WAAWA;;;;;;;;;;aAUXC,UAAUA;;;;;;aAMVC,UAAUA;;;;;;aAMVC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;aA0BPC,SAASA;;;;;kBAKJC,WAAWA;;;;;;;;;;;;aAYhBC,IAAIA;;;;;;;;;;;;kBAYCC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAyHTC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;kBA0BfC,gBAAgBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAgCrBC,cAAcA;;kBAETC,UAAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAoCVC,cAAcA;;;;;;;;;;kBAUdC,UAAUA;;;;;;;;;;;;;;;;;;kBAkBVC,aAAaA;;;;;;;;;;;;;;;;;;;kBAmBbC,IAAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA8CTC,YAAYA;;kBAEPC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA+GjBC,cAAcA;;;;;kBAKTC,cAAcA;;;;;;;;;;;;;;;;;;;;;;;kBAuBdC,eAAeA;;;;;;;;;;;;;;;cAenBC,MAAMA;;;;;;kBAMFC,iBAAiBA;;;;;;;kBAOjBC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;aAyBhBC,UAAUA;;;;;;;kBAOLC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAkFpBC,MAAMA;;;;;;;;;;aAUNC,OAAOA;;;;;;;;;;;;;;;;aAgBPC,YAAYA;;;;;;;;;;;;kBC7lDXC,SAASA;;;;;;;;;;kBAqBTC,QAAQA;;;;;;;aDqmDTC,cAAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA6BTC,QAAQA;;;;;;;;aAQbC,UAAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAoEVC,aAAaA;;;;;;;;aAQbC,cAAcA;;;;;;;;;;;;;;;;;;aAkBdC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA8BNC,mBAAmBA;;;;;;;;aAQxBC,uBAAuBA;;;;;aAKvBC,mBAAmBA;WElyDdC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAkDZC,GAAGA;;;;;;;;;;;;;;;;;;;;;WAqBHC,aAAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAmElBC,UAAUA;;WAELC,MAAMA;;;;;;;;;MASXC,YAAYA;;WAEPC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAmCXC,yBAAyBA;;;;;;;;;;WAUzBC,yBAAyBA;;;;WAIzBC,sCAAsCA;;;;WAItCC,4BAA4BA;;;;MAIjCC,8BAA8BA;MAC9BC,8BAA8BA;MAC9BC,iCAAiCA;;;;;MAKjCC,2CAA2CA;;;;;;aAM3CC,eAAeA;;WAIVC,cAAcA;;;;;WAKdC,YAAYA;;;;;;MAMjBC,aAAaA;WC/LRC,KAAKA;;;;;;WAeLC,SAASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAuHTC,YAAYA;;;;;;;;;;;;;;;;;WAiBZC,QAAQA;;;;;;;;;;;;;;MAgCbC,iBAAiBA;;;;;;;;;WAWZC,UAAUA;;;;;;;;;;;;;WAaVC,SAASA;;;;;;;;;;;;;;;;;;;;;;;WAsHTC,YAAYA;;;;;;;;;;;;;;;;MAgBjBC,kBAAkBA;;WAEbC,aAAaA;;;;;;;;;;WAUbC,UAAUA;;;;;;;;;;;WAWVC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;MAuBZC,aAAaA;;WA4BRC,eAAeA;;;;;;MAMpBC,uBAAuBA;;MAGvBC,WAAWA;;;;;;;;WAQNC,QAAQA;;;;;;;;;WASRC,cAAcA;;;;;;;;;MA+CnBC,eAAeA;;;;;MAKfC,kBAAkBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBCzcdC,WAAWA;;;;;;;;;;;;;;;;;;;iBAsBXC,QAAQA;;;;;iBAiBRC,UAAUA;;;;;;iBASVC,IAAIA;;;;;;iBA4BJC,IAAIA;;;;;;;;;;;;;;;;iBAkDJC,eAAeA;;;;;;;;;;;;;;iBAmBfC,YAAYA;;;;;;;cCrOfC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBC4EJC,QAAQA;;;;;;iBC4BFC,UAAUA;;;;;;iBAkCVC,WAAWA;;;;;iBAgFjBC,oBAAoBA;;;;;;;;;;;iBC3MpBC,gBAAgBA;;;;;;;;;iBCuHVC,SAASA;;;;;;;;;cCtIlBC,OAAOA;;;;;cAKPC,GAAGA;;;;;cAKHC,QAAQA;;;;;cAKRC,OAAOA;;;;;;;;;;;;;;;;;;;;;;;;iBCYJC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;iBAgDXC,OAAOA;;;;;;;iBCmmEDC,WAAWA;;;;;;;;;;;iBA9UjBC,aAAaA;;;;;;;;;;;;iBAiBbC,cAAcA;;;;;;;;;;iBAedC,UAAUA;;;;;iBASVC,qBAAqBA;;;;;;;;;;iBA8BrBC,IAAIA;;;;;;;;;;;;;;;;;;;;;;;;;iBAsCJC,UAAUA;;;;iBA0BVC,aAAaA;;;;;iBAebC,UAAUA;;;;;;;;;;;;;;iBAqBJC,WAAWA;;;;;;;;;;;;;;;;;;iBAoCXC,WAAWA;;;;;iBAsCjBC,SAASA;;;;;iBA+CTC,YAAYA;MV5+DhBlE,YAAYA;;;;;;;;;;;;;;YWlJbmE,IAAIA;;;;;;;;;YASJC,MAAMA;;MAEZC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;iBAyBAC,OAAOA;;;;;;;;;;;;;;;;;iBAiBPC,KAAKA;;;;;iBAKLC,YAAYA;;;;;;;;;;;;;;;;;;;;;;iBChDZC,IAAIA;;;;;;;;iBCOJC,eAAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBCTfC,IAAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MbwcRC,8BAA8BA;MD9T9B5E,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ce1GX6E,IAAIA;;;;;cAQJC,UAAUA;;;;;;;;;;;cAMVC,OAAOA;;;;;;;;;iBCrDPC,SAASA;;;;;;;;;;;;;;;cAyBTH,IAAIA;;;;;;;;;;cAiBJC,UAAUA;;;;;;;;cAeVC,OAAOA",
190
+ "mappings": "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",
191
191
  "ignoreList": []
192
192
  }