@qwik.dev/core 2.0.0-alpha.0 → 2.0.0-alpha.10

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 (105) hide show
  1. package/bindings/qwik.darwin-arm64.node +0 -0
  2. package/bindings/qwik.darwin-x64.node +0 -0
  3. package/bindings/qwik.linux-x64-gnu.node +0 -0
  4. package/bindings/qwik.wasm.cjs +259 -272
  5. package/bindings/qwik.wasm.mjs +259 -272
  6. package/bindings/qwik.win32-x64-msvc.node +0 -0
  7. package/bindings/qwik_wasm_bg.wasm +0 -0
  8. package/dist/build/index.cjs +3 -3
  9. package/dist/build/index.d.ts +22 -22
  10. package/dist/build/package.json +1 -1
  11. package/dist/cli.cjs +1453 -798
  12. package/dist/core-internal.d.ts +4368 -3895
  13. package/dist/core.cjs +6792 -6121
  14. package/dist/core.cjs.map +1 -1
  15. package/dist/core.min.mjs +1 -1
  16. package/dist/core.mjs +6765 -6117
  17. package/dist/core.mjs.map +1 -1
  18. package/dist/core.prod.cjs +3571 -3206
  19. package/dist/core.prod.mjs +3919 -3586
  20. package/dist/insights/index.qwik.cjs +1 -751
  21. package/dist/insights/index.qwik.mjs +62 -741
  22. package/dist/insights/vite/index.cjs +1 -82
  23. package/dist/insights/vite/index.mjs +65 -37
  24. package/dist/insights/vite.d.ts +22 -0
  25. package/dist/{insights/insights.d.ts → insights.d.ts} +33 -22
  26. package/dist/loader/index.cjs +2 -2
  27. package/dist/loader/index.mjs +2 -2
  28. package/dist/loader/package.json +1 -1
  29. package/dist/optimizer.cjs +693 -5851
  30. package/dist/optimizer.d.ts +741 -707
  31. package/dist/optimizer.mjs +679 -6276
  32. package/dist/preloader.cjs +243 -0
  33. package/dist/preloader.mjs +183 -0
  34. package/dist/qwikloader.debug.js +211 -220
  35. package/dist/qwikloader.js +1 -3
  36. package/dist/server.cjs +1371 -7273
  37. package/dist/server.d.ts +467 -402
  38. package/dist/server.mjs +1339 -7224
  39. package/dist/starters/adapters/aws-lambda/serverless.yml +15 -0
  40. package/dist/starters/adapters/aws-lambda/src/entry_aws-lambda.tsx +0 -2
  41. package/dist/starters/adapters/azure-swa/public/staticwebapp.config.json +7 -0
  42. package/dist/starters/adapters/azure-swa/src/entry.azure-swa.tsx +1 -2
  43. package/dist/starters/adapters/bun/src/entry.bun.ts +3 -2
  44. package/dist/starters/adapters/cloud-run/src/entry.cloud-run.tsx +1 -3
  45. package/dist/starters/adapters/cloudflare-pages/public/_headers +2 -0
  46. package/dist/starters/adapters/cloudflare-pages/src/entry.cloudflare-pages.tsx +1 -2
  47. package/dist/starters/adapters/deno/src/entry.deno.ts +3 -2
  48. package/dist/starters/adapters/express/src/entry.express.tsx +5 -2
  49. package/dist/starters/adapters/fastify/src/entry.fastify.tsx +2 -1
  50. package/dist/starters/adapters/fastify/src/plugins/fastify-qwik.ts +11 -1
  51. package/dist/starters/adapters/firebase/firebase.json +12 -1
  52. package/dist/starters/adapters/firebase/functions/index.js +2 -3
  53. package/dist/starters/adapters/firebase/src/entry-firebase.tsx +1 -2
  54. package/dist/starters/adapters/netlify-edge/public/_headers +2 -0
  55. package/dist/starters/adapters/netlify-edge/src/entry.netlify-edge.tsx +1 -2
  56. package/dist/starters/adapters/node-server/src/entry.node-server.tsx +3 -2
  57. package/dist/starters/adapters/static/README.md +4 -0
  58. package/dist/starters/adapters/vercel-edge/src/entry.vercel-edge.tsx +1 -2
  59. package/dist/starters/adapters/vercel-edge/vercel.json +1 -1
  60. package/dist/starters/features/auth/package.json +3 -1
  61. package/dist/starters/features/bootstrap/src/routes/bootstrap/layout.tsx +0 -11
  62. package/dist/starters/features/cypress/package.json +1 -1
  63. package/dist/starters/features/drizzle/drizzle/schema.ts +6 -18
  64. package/dist/starters/features/drizzle/drizzle.config.ts +5 -4
  65. package/dist/starters/features/drizzle/package.json +16 -12
  66. package/dist/starters/features/localize/src/entry.ssr.tsx +0 -2
  67. package/dist/starters/features/localize/src/routes/[locale]/i18n-utils.ts +1 -1
  68. package/dist/starters/features/pandacss/package.json +1 -1
  69. package/dist/starters/features/partytown/package.json +1 -1
  70. package/dist/starters/features/postcss/package.json +4 -1
  71. package/dist/starters/features/postcss/postcss.config.js +1 -1
  72. package/dist/starters/features/prisma/package.json +3 -2
  73. package/dist/starters/features/react/package.json +1 -1
  74. package/dist/starters/features/service-worker/package.json +13 -0
  75. package/dist/starters/features/service-worker/src/routes/service-worker.ts +14 -0
  76. package/dist/starters/features/storybook/package.json +1 -1
  77. package/dist/starters/features/styled-vanilla-extract/package.json +4 -2
  78. package/dist/starters/features/tailwind/package.json +19 -9
  79. package/dist/starters/features/tailwind/src/global.css +1 -7
  80. package/dist/starters/features/tailwind-v3/package.json +21 -0
  81. package/dist/starters/features/{tailwind → tailwind-v3}/postcss.config.cjs +1 -1
  82. package/dist/starters/features/tailwind-v3/src/global.css +7 -0
  83. package/dist/starters/features/{tailwind → tailwind-v3}/tailwind.config.js +1 -1
  84. package/dist/starters/features/turso/package.json +5 -2
  85. package/dist/starters/features/turso/src/utils/turso.ts +1 -1
  86. package/dist/starters/features/vitest/package.json +1 -1
  87. package/dist/testing/index.cjs +7568 -6858
  88. package/dist/testing/index.d.ts +141 -140
  89. package/dist/testing/index.mjs +7501 -6790
  90. package/dist/testing/package.json +1 -1
  91. package/handlers.mjs +9 -0
  92. package/package.json +32 -20
  93. package/public.d.ts +15 -0
  94. package/server.d.ts +1 -0
  95. package/dist/index.d.ts +0 -2
  96. package/dist/insights/index.d.ts +0 -1
  97. package/dist/insights/vite/index.d.ts +0 -1
  98. package/dist/insights/vite/insights-plugin.d.ts +0 -10
  99. package/dist/prefetch/index.cjs +0 -4
  100. package/dist/prefetch/index.d.ts +0 -2
  101. package/dist/prefetch/index.mjs +0 -3
  102. package/dist/prefetch/package.json +0 -8
  103. package/dist/qwik-prefetch.debug.js +0 -244
  104. package/dist/qwik-prefetch.js +0 -1
  105. /package/dist/starters/features/{tailwind → tailwind-v3}/.vscode/settings.json +0 -0
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const build = require("@qwik.dev/core/build");
4
+ const doc = build.isBrowser ? document : void 0;
5
+ const config = {
6
+ $DEBUG$: false,
7
+ $maxIdlePreloads$: 25,
8
+ $invPreloadProbability$: 0.65
9
+ };
10
+ const rel = build.isBrowser && doc.createElement("link").relList.supports("modulepreload") ? "modulePreload" : "preload";
11
+ const loadStart = Date.now();
12
+ const BundleImportState_None = 0;
13
+ const BundleImportState_Queued = 1;
14
+ const BundleImportState_Preload = 2;
15
+ const BundleImportState_Alias = 3;
16
+ const BundleImportState_Loaded = 4;
17
+ const bundles = /* @__PURE__ */ new Map();
18
+ let queueDirty;
19
+ let preloadCount = 0;
20
+ const queue = [];
21
+ const log = (...args) => {
22
+ console.log(
23
+ `Preloader ${Date.now() - loadStart}ms ${preloadCount}/${queue.length} queued>`,
24
+ ...args
25
+ );
26
+ };
27
+ const sortQueue = () => {
28
+ if (queueDirty) {
29
+ queue.sort((a, b) => a.$inverseProbability$ - b.$inverseProbability$);
30
+ queueDirty = false;
31
+ }
32
+ };
33
+ const trigger = () => {
34
+ if (!queue.length) {
35
+ return;
36
+ }
37
+ sortQueue();
38
+ while (queue.length) {
39
+ const bundle = queue[0];
40
+ const inverseProbability = bundle.$inverseProbability$;
41
+ const probability = 1 - inverseProbability;
42
+ const allowedPreloads = graph ? (
43
+ // The more likely the bundle, the more simultaneous preloads we want to allow
44
+ Math.max(1, config.$maxIdlePreloads$ * probability)
45
+ ) : (
46
+ // While the graph is not available, we limit to 2 preloads
47
+ 2
48
+ );
49
+ if (probability === 1 || preloadCount < allowedPreloads) {
50
+ queue.shift();
51
+ preloadOne(bundle);
52
+ } else {
53
+ break;
54
+ }
55
+ }
56
+ if (config.$DEBUG$ && !queue.length) {
57
+ const loaded = [...bundles.values()].filter((b) => b.$state$ > BundleImportState_None);
58
+ const waitTime = loaded.reduce((acc, b) => acc + b.$waitedMs$, 0);
59
+ const loadTime = loaded.reduce((acc, b) => acc + b.$loadedMs$, 0);
60
+ log(
61
+ `>>>> done ${loaded.length}/${bundles.size} total: ${waitTime}ms waited, ${loadTime}ms loaded`
62
+ );
63
+ }
64
+ };
65
+ const preloadOne = (bundle) => {
66
+ if (bundle.$state$ >= BundleImportState_Preload) {
67
+ return;
68
+ }
69
+ preloadCount++;
70
+ const start = Date.now();
71
+ bundle.$waitedMs$ = start - bundle.$createdTs$;
72
+ bundle.$state$ = BundleImportState_Preload;
73
+ config.$DEBUG$ && log(
74
+ `<< load ${Math.round((1 - bundle.$inverseProbability$) * 100)}% after ${`${bundle.$waitedMs$}ms`}`,
75
+ bundle.$name$
76
+ );
77
+ const link = doc.createElement("link");
78
+ link.href = bundle.$url$;
79
+ link.rel = rel;
80
+ link.as = "script";
81
+ link.onload = link.onerror = () => {
82
+ preloadCount--;
83
+ const end = Date.now();
84
+ bundle.$loadedMs$ = end - start;
85
+ bundle.$state$ = BundleImportState_Loaded;
86
+ config.$DEBUG$ && log(`>> done after ${bundle.$loadedMs$}ms`, bundle.$name$);
87
+ link.remove();
88
+ trigger();
89
+ };
90
+ doc.head.appendChild(link);
91
+ };
92
+ const adjustProbabilities = (bundle, adjustFactor, seen) => {
93
+ if (seen == null ? void 0 : seen.has(bundle)) {
94
+ return;
95
+ }
96
+ const previousInverseProbability = bundle.$inverseProbability$;
97
+ bundle.$inverseProbability$ *= adjustFactor;
98
+ if (previousInverseProbability - bundle.$inverseProbability$ < 0.01) {
99
+ return;
100
+ }
101
+ if (bundle.$state$ < BundleImportState_Preload && bundle.$inverseProbability$ < config.$invPreloadProbability$) {
102
+ if (bundle.$state$ === BundleImportState_None) {
103
+ bundle.$state$ = BundleImportState_Queued;
104
+ queue.push(bundle);
105
+ config.$DEBUG$ && log(`queued ${Math.round((1 - bundle.$inverseProbability$) * 100)}%`, bundle.$name$);
106
+ }
107
+ queueDirty = true;
108
+ }
109
+ if (bundle.$deps$) {
110
+ seen || (seen = /* @__PURE__ */ new Set());
111
+ seen.add(bundle);
112
+ const probability = 1 - bundle.$inverseProbability$;
113
+ for (const dep of bundle.$deps$) {
114
+ const depBundle = getBundle(dep.$name$);
115
+ const prevAdjust = dep.$factor$;
116
+ const newInverseProbability = 1 - dep.$probability$ * probability;
117
+ const factor = newInverseProbability / prevAdjust;
118
+ dep.$factor$ = factor;
119
+ adjustProbabilities(depBundle, factor, seen);
120
+ }
121
+ }
122
+ };
123
+ const handleBundle = (name, inverseProbability) => {
124
+ const bundle = getBundle(name);
125
+ if (bundle && bundle.$inverseProbability$ > inverseProbability) {
126
+ adjustProbabilities(bundle, inverseProbability / bundle.$inverseProbability$);
127
+ }
128
+ };
129
+ const preload = (name, probability) => {
130
+ if (base == null || !name.length) {
131
+ return;
132
+ }
133
+ let inverseProbability = probability ? 1 - probability : 0.4;
134
+ if (Array.isArray(name)) {
135
+ for (let i = name.length - 1; i >= 0; i--) {
136
+ const item = name[i];
137
+ if (typeof item === "number") {
138
+ inverseProbability = 1 - item / 10;
139
+ } else {
140
+ handleBundle(item, inverseProbability);
141
+ inverseProbability *= 1.005;
142
+ }
143
+ }
144
+ } else {
145
+ handleBundle(name, inverseProbability);
146
+ }
147
+ if (build.isBrowser) {
148
+ trigger();
149
+ }
150
+ };
151
+ let base;
152
+ let graph;
153
+ const makeBundle = (name, deps) => {
154
+ const url = name.endsWith(".js") ? doc ? new URL(`${base}${name}`, doc.baseURI).toString() : name : null;
155
+ return {
156
+ $name$: name,
157
+ $url$: url,
158
+ $state$: url ? BundleImportState_None : BundleImportState_Alias,
159
+ $deps$: deps,
160
+ $inverseProbability$: 1,
161
+ $createdTs$: Date.now(),
162
+ $waitedMs$: 0,
163
+ $loadedMs$: 0
164
+ };
165
+ };
166
+ const parseBundleGraph = (serialized) => {
167
+ const graph2 = /* @__PURE__ */ new Map();
168
+ let i = 0;
169
+ while (i < serialized.length) {
170
+ const name = serialized[i++];
171
+ const deps = [];
172
+ let idx;
173
+ let probability = 1;
174
+ while (idx = serialized[i], typeof idx === "number") {
175
+ if (idx < 0) {
176
+ probability = -idx / 10;
177
+ } else {
178
+ deps.push({ $name$: serialized[idx], $probability$: probability, $factor$: 1 });
179
+ }
180
+ i++;
181
+ }
182
+ graph2.set(name, deps);
183
+ }
184
+ return graph2;
185
+ };
186
+ const getBundle = (name) => {
187
+ let bundle = bundles.get(name);
188
+ if (!bundle) {
189
+ let deps;
190
+ if (graph) {
191
+ deps = graph.get(name);
192
+ if (!deps) {
193
+ return;
194
+ }
195
+ if (!deps.length) {
196
+ deps = void 0;
197
+ }
198
+ }
199
+ bundle = makeBundle(name, deps);
200
+ bundles.set(name, bundle);
201
+ }
202
+ return bundle;
203
+ };
204
+ const loadBundleGraph = (basePath, serializedResponse, opts) => {
205
+ if (opts) {
206
+ if ("d" in opts) {
207
+ config.$DEBUG$ = !!opts.d;
208
+ }
209
+ if ("P" in opts) {
210
+ config.$maxIdlePreloads$ = opts["P"];
211
+ }
212
+ if ("Q" in opts) {
213
+ config.$invPreloadProbability$ = 1 - opts["Q"];
214
+ }
215
+ }
216
+ if (!build.isBrowser || basePath == null) {
217
+ return;
218
+ }
219
+ base = basePath;
220
+ if (serializedResponse) {
221
+ serializedResponse.then((r) => r.text()).then((text) => {
222
+ graph = parseBundleGraph(JSON.parse(text));
223
+ const toAdjust = [];
224
+ for (const [name, deps] of graph.entries()) {
225
+ const bundle = getBundle(name);
226
+ bundle.$deps$ = deps;
227
+ if (bundle.$inverseProbability$ < 1) {
228
+ toAdjust.push([bundle, bundle.$inverseProbability$]);
229
+ bundle.$inverseProbability$ = 1;
230
+ }
231
+ }
232
+ config.$DEBUG$ && log(`parseBundleGraph got ${graph.size} bundles, adjusting ${toAdjust.length}`);
233
+ for (const [bundle, inverseProbability] of toAdjust) {
234
+ adjustProbabilities(bundle, inverseProbability);
235
+ }
236
+ trigger();
237
+ }).catch(console.warn);
238
+ }
239
+ };
240
+ exports.g = parseBundleGraph;
241
+ exports.h = handleBundle;
242
+ exports.l = loadBundleGraph;
243
+ exports.p = preload;
@@ -0,0 +1,183 @@
1
+ import { isBrowser } from "@qwik.dev/core/build";
2
+ const doc = isBrowser ? document : void 0;
3
+ const config = { t: 0, o: 25, l: 0.65 };
4
+ const rel = isBrowser && doc.createElement("link").relList.supports("modulepreload") ? "modulePreload" : "preload";
5
+ const loadStart = Date.now();
6
+ const BundleImportState_None = 0;
7
+ const BundleImportState_Queued = 1;
8
+ const BundleImportState_Preload = 2;
9
+ const BundleImportState_Alias = 3;
10
+ const BundleImportState_Loaded = 4;
11
+ const bundles = /* @__PURE__ */ new Map();
12
+ let queueDirty;
13
+ let preloadCount = 0;
14
+ const queue = [];
15
+ const log = (...e) => {
16
+ console.log(`Preloader ${Date.now() - loadStart}ms ${preloadCount}/${queue.length} queued>`, ...e);
17
+ };
18
+ const sortQueue = () => {
19
+ if (queueDirty) {
20
+ queue.sort((e, t) => e.u - t.u);
21
+ queueDirty = 0;
22
+ }
23
+ };
24
+ const trigger = () => {
25
+ if (!queue.length) return;
26
+ sortQueue();
27
+ while (queue.length) {
28
+ const e = queue[0];
29
+ const t = e.u;
30
+ const o = 1 - t;
31
+ const n = graph ? (
32
+ // The more likely the bundle, the more simultaneous preloads we want to allow
33
+ Math.max(1, config.o * o)
34
+ ) : (
35
+ // While the graph is not available, we limit to 2 preloads
36
+ 2
37
+ );
38
+ if (o === 1 || preloadCount < n) {
39
+ queue.shift();
40
+ preloadOne(e);
41
+ } else break;
42
+ }
43
+ if (config.t && !queue.length) {
44
+ const e = [...bundles.values()].filter((e2) => e2.i > BundleImportState_None);
45
+ const t = e.reduce((e2, t2) => e2 + t2.p, 0);
46
+ const o = e.reduce((e2, t2) => e2 + t2.$, 0);
47
+ log(`>>>> done ${e.length}/${bundles.size} total: ${t}ms waited, ${o}ms loaded`);
48
+ }
49
+ };
50
+ const preloadOne = (e) => {
51
+ if (e.i >= BundleImportState_Preload) return;
52
+ preloadCount++;
53
+ const t = Date.now();
54
+ e.p = t - e.B;
55
+ e.i = BundleImportState_Preload;
56
+ config.t && log(`<< load ${Math.round((1 - e.u) * 100)}% after ${`${e.p}ms`}`, e.m);
57
+ const o = doc.createElement("link");
58
+ o.href = e.h;
59
+ o.rel = rel;
60
+ o.as = "script";
61
+ o.onload = o.onerror = () => {
62
+ preloadCount--;
63
+ const n = Date.now();
64
+ e.$ = n - t;
65
+ e.i = BundleImportState_Loaded;
66
+ config.t && log(`>> done after ${e.$}ms`, e.m);
67
+ o.remove();
68
+ trigger();
69
+ };
70
+ doc.head.appendChild(o);
71
+ };
72
+ const adjustProbabilities = (e, t, o) => {
73
+ if (o == null ? void 0 : o.has(e)) return;
74
+ const n = e.u;
75
+ e.u *= t;
76
+ if (n - e.u < 0.01) return;
77
+ if (e.i < BundleImportState_Preload && e.u < config.l) {
78
+ if (e.i === BundleImportState_None) {
79
+ e.i = BundleImportState_Queued;
80
+ queue.push(e);
81
+ config.t && log(`queued ${Math.round((1 - e.u) * 100)}%`, e.m);
82
+ }
83
+ queueDirty = 1;
84
+ }
85
+ if (e.S) {
86
+ o || (o = /* @__PURE__ */ new Set());
87
+ o.add(e);
88
+ const t2 = 1 - e.u;
89
+ for (const n2 of e.S) {
90
+ const e2 = getBundle(n2.m);
91
+ const r = n2.q;
92
+ const l = 1 - n2.I * t2;
93
+ const a = l / r;
94
+ n2.q = a;
95
+ adjustProbabilities(e2, a, o);
96
+ }
97
+ }
98
+ };
99
+ const handleBundle = (e, t) => {
100
+ const o = getBundle(e);
101
+ if (o && o.u > t) adjustProbabilities(o, t / o.u);
102
+ };
103
+ const preload = (e, t) => {
104
+ if (base == null || !e.length) return;
105
+ let o = t ? 1 - t : 0.4;
106
+ if (Array.isArray(e)) for (let t2 = e.length - 1; t2 >= 0; t2--) {
107
+ const n = e[t2];
108
+ if (typeof n === "number") o = 1 - n / 10;
109
+ else {
110
+ handleBundle(n, o);
111
+ o *= 1.005;
112
+ }
113
+ }
114
+ else handleBundle(e, o);
115
+ if (isBrowser) trigger();
116
+ };
117
+ let base;
118
+ let graph;
119
+ const makeBundle = (e, t) => {
120
+ const o = e.endsWith(".js") ? doc ? new URL(`${base}${e}`, doc.baseURI).toString() : e : null;
121
+ return { m: e, h: o, i: o ? BundleImportState_None : BundleImportState_Alias, S: t, u: 1, B: Date.now(), p: 0, $: 0 };
122
+ };
123
+ const parseBundleGraph = (e) => {
124
+ const t = /* @__PURE__ */ new Map();
125
+ let o = 0;
126
+ while (o < e.length) {
127
+ const n = e[o++];
128
+ const r = [];
129
+ let l;
130
+ let a = 1;
131
+ while (l = e[o], typeof l === "number") {
132
+ if (l < 0) a = -l / 10;
133
+ else r.push({ m: e[l], I: a, q: 1 });
134
+ o++;
135
+ }
136
+ t.set(n, r);
137
+ }
138
+ return t;
139
+ };
140
+ const getBundle = (e) => {
141
+ let t = bundles.get(e);
142
+ if (!t) {
143
+ let o;
144
+ if (graph) {
145
+ o = graph.get(e);
146
+ if (!o) return;
147
+ if (!o.length) o = void 0;
148
+ }
149
+ t = makeBundle(e, o);
150
+ bundles.set(e, t);
151
+ }
152
+ return t;
153
+ };
154
+ const loadBundleGraph = (e, t, o) => {
155
+ if (o) {
156
+ if ("d" in o) config.t = !!o.d;
157
+ if ("P" in o) config.o = o["P"];
158
+ if ("Q" in o) config.l = 1 - o["Q"];
159
+ }
160
+ if (!isBrowser || e == null) return;
161
+ base = e;
162
+ if (t) t.then((e2) => e2.text()).then((e2) => {
163
+ graph = parseBundleGraph(JSON.parse(e2));
164
+ const t2 = [];
165
+ for (const [e3, o2] of graph.entries()) {
166
+ const n = getBundle(e3);
167
+ n.S = o2;
168
+ if (n.u < 1) {
169
+ t2.push([n, n.u]);
170
+ n.u = 1;
171
+ }
172
+ }
173
+ config.t && log(`parseBundleGraph got ${graph.size} bundles, adjusting ${t2.length}`);
174
+ for (const [e3, o2] of t2) adjustProbabilities(e3, o2);
175
+ trigger();
176
+ }).catch(console.warn);
177
+ };
178
+ export {
179
+ parseBundleGraph as g,
180
+ handleBundle as h,
181
+ loadBundleGraph as l,
182
+ preload as p
183
+ };