reroute-js 0.42.1 → 0.43.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/cli/bin.d.ts +1 -1
- package/cli/bin.js +111 -10
- package/cli/bin.js.map +6 -6
- package/cli/index.d.ts +1 -1
- package/cli/index.js +4 -4
- package/cli/index.js.map +1 -1
- package/cli/src/cli.d.ts +1 -1
- package/cli/src/commands/analyze.d.ts +1 -1
- package/cli/src/commands/build.d.ts +1 -1
- package/cli/src/commands/dev.d.ts +1 -1
- package/cli/src/commands/gen.d.ts +1 -1
- package/cli/src/commands/index.d.ts +1 -1
- package/cli/src/commands/init.d.ts +1 -1
- package/cli/src/commands/lib/assets.d.ts +1 -1
- package/cli/src/commands/lib/bundler.d.ts +1 -1
- package/cli/src/commands/lib/command.d.ts +1 -1
- package/cli/src/commands/lib/env.d.ts +1 -1
- package/cli/src/commands/lib/index.d.ts +1 -1
- package/cli/src/commands/lib/log.d.ts +1 -1
- package/cli/src/commands/lib/markdown/availability.d.ts +1 -1
- package/cli/src/commands/lib/markdown/index.d.ts +1 -1
- package/cli/src/commands/lib/markdown/processor.d.ts +1 -1
- package/cli/src/commands/lib/production.d.ts +1 -1
- package/cli/src/commands/lib/server.d.ts +1 -1
- package/cli/src/commands/lib/streaming/analyzer.d.ts +1 -1
- package/cli/src/commands/lib/streaming/suspense.d.ts +1 -1
- package/cli/src/commands/lib/tailwind.d.ts +1 -1
- package/cli/src/commands/lib/terminal-ui.d.ts +1 -1
- package/cli/src/commands/lib/version.d.ts +1 -1
- package/cli/src/commands/og.d.ts +1 -1
- package/cli/src/commands/start.d.ts +1 -1
- package/cli/src/index.d.ts +1 -1
- package/core/index.d.ts +1 -1
- package/core/index.js +107 -6
- package/core/index.js.map +6 -6
- package/core/src/bundler/hash.d.ts +1 -1
- package/core/src/bundler/index.d.ts +1 -1
- package/core/src/config.d.ts +81 -5
- package/core/src/config.d.ts.map +1 -1
- package/core/src/content/discovery.d.ts +1 -1
- package/core/src/content/index.d.ts +1 -1
- package/core/src/content/metadata.d.ts +1 -1
- package/core/src/index.d.ts +1 -1
- package/core/src/llms/extractor.d.ts +1 -1
- package/core/src/llms/formatter.d.ts +1 -1
- package/core/src/llms/full-generator.d.ts +1 -1
- package/core/src/llms/index-generator.d.ts +1 -1
- package/core/src/llms/index.d.ts +1 -1
- package/core/src/og/discovery.d.ts +1 -1
- package/core/src/og/index.d.ts +1 -1
- package/core/src/og/meta.d.ts +1 -1
- package/core/src/og/render.d.ts +1 -1
- package/core/src/og/types.d.ts +1 -1
- package/core/src/robots/discovery.d.ts +1 -1
- package/core/src/robots/generator.d.ts +1 -1
- package/core/src/robots/index.d.ts +1 -1
- package/core/src/robots/policies.d.ts +1 -1
- package/core/src/rss/discovery.d.ts +1 -1
- package/core/src/rss/generator.d.ts +1 -1
- package/core/src/rss/index.d.ts +1 -1
- package/core/src/sitemap/discovery.d.ts +1 -1
- package/core/src/sitemap/generator.d.ts +1 -1
- package/core/src/sitemap/index.d.ts +1 -1
- package/core/src/ssr/index.d.ts +1 -1
- package/core/src/ssr/lib/cache.d.ts +1 -1
- package/core/src/ssr/lib/collections.d.ts +1 -1
- package/core/src/ssr/lib/compression.d.ts +1 -1
- package/core/src/ssr/lib/compute/content.d.ts +1 -1
- package/core/src/ssr/lib/compute/index.d.ts +1 -1
- package/core/src/ssr/lib/compute/layouts.d.ts +1 -1
- package/core/src/ssr/lib/compute/routes.d.ts +1 -1
- package/core/src/ssr/lib/data.d.ts +1 -1
- package/core/src/ssr/lib/html.d.ts +1 -1
- package/core/src/ssr/lib/imports.d.ts +1 -1
- package/core/src/ssr/lib/index.d.ts +1 -1
- package/core/src/ssr/lib/layouts.d.ts +1 -1
- package/core/src/ssr/lib/metadata.d.ts +1 -1
- package/core/src/ssr/lib/metadata.d.ts.map +1 -1
- package/core/src/ssr/lib/mime.d.ts +1 -1
- package/core/src/ssr/lib/modules.d.ts +1 -1
- package/core/src/ssr/lib/path.d.ts +1 -1
- package/core/src/ssr/lib/preload.d.ts +1 -1
- package/core/src/ssr/lib/scripts/collections.d.ts +1 -1
- package/core/src/ssr/lib/scripts/data.d.ts +1 -1
- package/core/src/ssr/lib/scripts/escape.d.ts +1 -1
- package/core/src/ssr/lib/scripts/feeds.d.ts +1 -1
- package/core/src/ssr/lib/scripts/index.d.ts +1 -1
- package/core/src/ssr/lib/seed.d.ts +1 -1
- package/core/src/ssr/lib/serialize.d.ts +1 -1
- package/core/src/ssr/lib/setup.d.ts +4 -1
- package/core/src/ssr/lib/setup.d.ts.map +1 -1
- package/core/src/ssr/lib/styles.d.ts +1 -1
- package/core/src/ssr/lib/template.d.ts +1 -1
- package/core/src/ssr/lib/types.d.ts +3 -1
- package/core/src/ssr/lib/types.d.ts.map +1 -1
- package/core/src/ssr/render.d.ts +1 -1
- package/core/src/ssr/stream.d.ts +1 -1
- package/core/src/ssr/stream.d.ts.map +1 -1
- package/elysia/index.d.ts +1 -1
- package/elysia/index.js +163 -43
- package/elysia/index.js.map +8 -8
- package/elysia/src/index.d.ts +1 -1
- package/elysia/src/libs/assets.d.ts +1 -1
- package/elysia/src/libs/cache.d.ts +1 -1
- package/elysia/src/libs/caching.d.ts +1 -1
- package/elysia/src/libs/http.d.ts +1 -1
- package/elysia/src/libs/image.d.ts +1 -1
- package/elysia/src/libs/index.d.ts +1 -1
- package/elysia/src/libs/llms.d.ts +1 -1
- package/elysia/src/libs/response.d.ts +1 -1
- package/elysia/src/libs/serving.d.ts +1 -1
- package/elysia/src/plugin.d.ts +1 -1
- package/elysia/src/plugin.d.ts.map +1 -1
- package/elysia/src/routes/artifacts.d.ts +1 -1
- package/elysia/src/routes/content.d.ts +1 -1
- package/elysia/src/routes/image.d.ts +1 -1
- package/elysia/src/routes/index.d.ts +1 -1
- package/elysia/src/routes/internal.d.ts +1 -1
- package/elysia/src/routes/llms.d.ts +1 -1
- package/elysia/src/routes/og.d.ts +1 -1
- package/elysia/src/routes/redirects.d.ts +1 -1
- package/elysia/src/routes/robots.d.ts +1 -1
- package/elysia/src/routes/rss.d.ts +1 -1
- package/elysia/src/routes/search.d.ts +1 -1
- package/elysia/src/routes/sitemap.d.ts +1 -1
- package/elysia/src/routes/ssr.d.ts +6 -3
- package/elysia/src/routes/ssr.d.ts.map +1 -1
- package/elysia/src/routes/static.d.ts +1 -1
- package/elysia/src/types.d.ts +1 -1
- package/package.json +1 -1
- package/react/index.d.ts +1 -1
- package/react/index.js +17 -5
- package/react/index.js.map +3 -3
- package/react/src/components/ClientOnly.d.ts +1 -1
- package/react/src/components/ContentRoute.d.ts +1 -1
- package/react/src/components/Image.d.ts +1 -1
- package/react/src/components/LazyRoute.d.ts +1 -1
- package/react/src/components/Link.d.ts +1 -1
- package/react/src/components/Markdown.d.ts +1 -1
- package/react/src/components/Outlet.d.ts +1 -1
- package/react/src/components/index.d.ts +1 -1
- package/react/src/hooks/index.d.ts +1 -1
- package/react/src/hooks/useContent.d.ts +1 -1
- package/react/src/hooks/useData.d.ts +1 -1
- package/react/src/hooks/useFeed.d.ts +1 -1
- package/react/src/hooks/useLayoutData.d.ts +1 -1
- package/react/src/hooks/useLlms.d.ts +1 -1
- package/react/src/hooks/useNavigate.d.ts +1 -1
- package/react/src/hooks/useParams.d.ts +1 -1
- package/react/src/hooks/useRouter.d.ts +1 -1
- package/react/src/hooks/useSearch.d.ts +1 -1
- package/react/src/hooks/useSearchParams.d.ts +1 -1
- package/react/src/hooks/useToc.d.ts +1 -1
- package/react/src/index.d.ts +1 -1
- package/react/src/lib/collection.d.ts +1 -1
- package/react/src/lib/content.d.ts +1 -1
- package/react/src/lib/head.d.ts +1 -1
- package/react/src/lib/index.d.ts +1 -1
- package/react/src/lib/lazy-route.d.ts +1 -1
- package/react/src/lib/route-loader.d.ts +1 -1
- package/react/src/providers/ContentProvider.d.ts +1 -1
- package/react/src/providers/RerouteProvider.d.ts +1 -1
- package/react/src/providers/RouterProvider.d.ts +1 -1
- package/react/src/providers/RouterProvider.d.ts.map +1 -1
- package/react/src/providers/index.d.ts +1 -1
- package/react/src/types/any.d.ts +1 -1
- package/react/src/types/index.d.ts +1 -1
- package/react/src/types/router.d.ts +1 -1
- package/telemetry/react.d.ts +1 -1
- package/telemetry/react.js +2 -2
- package/telemetry/react.js.map +1 -1
- package/telemetry/server.d.ts +1 -1
- package/telemetry/server.js +2 -2
- package/telemetry/server.js.map +6 -6
- package/telemetry/src/react/api.d.ts +1 -1
- package/telemetry/src/react/context.d.ts +1 -1
- package/telemetry/src/react/index.d.ts +1 -1
- package/telemetry/src/react/telemetry.d.ts +1 -1
- package/telemetry/src/server/context.d.ts +1 -1
- package/telemetry/src/server/headers/extractor.d.ts +1 -1
- package/telemetry/src/server/headers/index.d.ts +1 -1
- package/telemetry/src/server/headers/presets.d.ts +1 -1
- package/telemetry/src/server/index.d.ts +1 -1
- package/telemetry/src/server/instrumentation.d.ts +1 -1
- package/telemetry/src/server/plugin.d.ts +1 -1
- package/telemetry/src/server/sourcemap.d.ts +1 -1
package/cli/bin.d.ts
CHANGED
package/cli/bin.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
3
|
/**
|
|
4
|
-
* reroute-js v0.
|
|
4
|
+
* reroute-js v0.43.0
|
|
5
5
|
*
|
|
6
6
|
* @license MIT
|
|
7
7
|
* @copyright 2026 stewones <hi@stewan.io>
|
|
@@ -48,7 +48,7 @@ async function getVersionString() {
|
|
|
48
48
|
}
|
|
49
49
|
async function getVersion() {
|
|
50
50
|
if (true) {
|
|
51
|
-
return "0.
|
|
51
|
+
return "0.43.0";
|
|
52
52
|
}
|
|
53
53
|
const possiblePaths = [
|
|
54
54
|
path.join(import.meta.dir, "../../../../package.json"),
|
|
@@ -66,7 +66,7 @@ async function getVersion() {
|
|
|
66
66
|
}
|
|
67
67
|
async function getCommit() {
|
|
68
68
|
if (true) {
|
|
69
|
-
return "
|
|
69
|
+
return "8a3c652";
|
|
70
70
|
}
|
|
71
71
|
return "dev";
|
|
72
72
|
}
|
|
@@ -2215,7 +2215,12 @@ ${ogMetaTags}`;
|
|
|
2215
2215
|
if (routeResult.lang)
|
|
2216
2216
|
pageLang = routeResult.lang;
|
|
2217
2217
|
statusOverride = routeResult.statusOverride;
|
|
2218
|
-
return {
|
|
2218
|
+
return {
|
|
2219
|
+
perPageHead,
|
|
2220
|
+
pageLang,
|
|
2221
|
+
statusOverride,
|
|
2222
|
+
ssrExport: routeResult.ssrExport
|
|
2223
|
+
};
|
|
2219
2224
|
}
|
|
2220
2225
|
async function processLayoutForMetadata(layout, clientDir, isWatchMode, addHead, setLang, ogConfig) {
|
|
2221
2226
|
if (typeof layout?.path !== "string")
|
|
@@ -2285,7 +2290,12 @@ async function extractMatchedRouteMetadata(pathname, clientDir, m, isWatchMode,
|
|
|
2285
2290
|
if (ssrHead)
|
|
2286
2291
|
head += `
|
|
2287
2292
|
${ssrHead}`;
|
|
2288
|
-
return {
|
|
2293
|
+
return {
|
|
2294
|
+
head,
|
|
2295
|
+
lang: extractSSRLang(ssr),
|
|
2296
|
+
statusOverride,
|
|
2297
|
+
ssrExport: ssr
|
|
2298
|
+
};
|
|
2289
2299
|
}
|
|
2290
2300
|
return { head, statusOverride };
|
|
2291
2301
|
} catch {}
|
|
@@ -2296,6 +2306,7 @@ async function extractRouteMetadata(pathname, clientDir, cwd, isWatchMode, curre
|
|
|
2296
2306
|
let head = "";
|
|
2297
2307
|
let lang;
|
|
2298
2308
|
let statusOverride = currentStatusOverride;
|
|
2309
|
+
let ssrExport;
|
|
2299
2310
|
try {
|
|
2300
2311
|
const m = await loadRoutesModule(cwd, isWatchMode);
|
|
2301
2312
|
if (!m) {
|
|
@@ -2312,13 +2323,14 @@ async function extractRouteMetadata(pathname, clientDir, cwd, isWatchMode, curre
|
|
|
2312
2323
|
head = result.head;
|
|
2313
2324
|
lang = result.lang;
|
|
2314
2325
|
statusOverride = result.statusOverride;
|
|
2326
|
+
ssrExport = result.ssrExport;
|
|
2315
2327
|
} else {
|
|
2316
2328
|
head += await extractNotFoundMetadata(pathname, clientDir, m, isWatchMode, (l) => {
|
|
2317
2329
|
lang = l;
|
|
2318
2330
|
}, ogConfig);
|
|
2319
2331
|
}
|
|
2320
2332
|
} catch {}
|
|
2321
|
-
return { head, lang, statusOverride };
|
|
2333
|
+
return { head, lang, statusOverride, ssrExport };
|
|
2322
2334
|
}
|
|
2323
2335
|
function findBestNotFoundRoute(list, pathname) {
|
|
2324
2336
|
let chosen;
|
|
@@ -5380,7 +5392,8 @@ async function renderSSRDocumentStream(options) {
|
|
|
5380
5392
|
browserTelemetryConfig,
|
|
5381
5393
|
traceContext,
|
|
5382
5394
|
parentSpan: options.parentSpan,
|
|
5383
|
-
timeout: options.timeout
|
|
5395
|
+
timeout: options.timeout,
|
|
5396
|
+
ssrExport: setup2.metadataResult.ssrExport
|
|
5384
5397
|
});
|
|
5385
5398
|
if (debug)
|
|
5386
5399
|
console.log(`[renderStream] ${pathname} - returning stream: ${(performance.now() - t0).toFixed(2)}ms`);
|
|
@@ -5488,12 +5501,100 @@ function buildStreamingScripts(ctx) {
|
|
|
5488
5501
|
const feedsScript = createFeedsScript();
|
|
5489
5502
|
const llmsScript = createLlmsScript();
|
|
5490
5503
|
let allScripts = dataScript + feedsScript + llmsScript + collectionScripts + ctx.preloadHydrationScript;
|
|
5504
|
+
const metaUpdateScript = generateMetaUpdateScript(ctx, ssrDataSnapshot);
|
|
5505
|
+
if (metaUpdateScript) {
|
|
5506
|
+
allScripts += metaUpdateScript;
|
|
5507
|
+
}
|
|
5491
5508
|
allScripts += `<script type="module" src="${ctx.bundleUrl}"></script>`;
|
|
5492
5509
|
if (ctx.isWatchMode) {
|
|
5493
5510
|
allScripts += `<script type="module" src="/__reroute_watch.js"></script>`;
|
|
5494
5511
|
}
|
|
5495
5512
|
return allScripts;
|
|
5496
5513
|
}
|
|
5514
|
+
function generateMetaUpdateScript(ctx, ssrDataSnapshot) {
|
|
5515
|
+
if (typeof ctx.ssrExport?.head !== "function") {
|
|
5516
|
+
return "";
|
|
5517
|
+
}
|
|
5518
|
+
const routeData = ssrDataSnapshot[ctx.pathname];
|
|
5519
|
+
if (!routeData) {
|
|
5520
|
+
return "";
|
|
5521
|
+
}
|
|
5522
|
+
let headResult;
|
|
5523
|
+
try {
|
|
5524
|
+
headResult = ctx.ssrExport.head({ data: routeData });
|
|
5525
|
+
} catch (err) {
|
|
5526
|
+
console.error("[reroute] Error calling ssr.head() at stream end:", err);
|
|
5527
|
+
return "";
|
|
5528
|
+
}
|
|
5529
|
+
if (!headResult) {
|
|
5530
|
+
return "";
|
|
5531
|
+
}
|
|
5532
|
+
const headHtml = Array.isArray(headResult) ? headResult.join(`
|
|
5533
|
+
`) : headResult;
|
|
5534
|
+
if (!headHtml) {
|
|
5535
|
+
return "";
|
|
5536
|
+
}
|
|
5537
|
+
const metaUpdates = parseHeadForMetaUpdates(headHtml);
|
|
5538
|
+
if (Object.keys(metaUpdates).length === 0) {
|
|
5539
|
+
return "";
|
|
5540
|
+
}
|
|
5541
|
+
const updatesJson = JSON.stringify(metaUpdates);
|
|
5542
|
+
return `<script>(function(){var u=${updatesJson};if(u.title){document.title=u.title}Object.keys(u).forEach(function(k){if(k==='title')return;var s=k.split(':');var isOg=s[0]==='og'||s[0]==='twitter';var el=isOg?document.querySelector('meta[property="'+k+'"]')||document.querySelector('meta[name="'+k+'"]'):document.querySelector('meta[name="'+k+'"]');if(el){el.setAttribute('content',u[k])}else{var m=document.createElement('meta');m.setAttribute(isOg?'property':'name',k);m.setAttribute('content',u[k]);document.head.appendChild(m)}})})()</script>`;
|
|
5543
|
+
}
|
|
5544
|
+
function parseHeadForMetaUpdates(headHtml) {
|
|
5545
|
+
const updates = {};
|
|
5546
|
+
const titleMatch = headHtml.match(/<title[^>]*>(.*?)<\/title>/is);
|
|
5547
|
+
if (titleMatch?.[1]) {
|
|
5548
|
+
updates.title = unescapeHtmlEntities(titleMatch[1].trim());
|
|
5549
|
+
}
|
|
5550
|
+
let descMatch = headHtml.match(/<meta\s+name=["']description["']\s+content=["'](.+?)["']/i);
|
|
5551
|
+
if (!descMatch) {
|
|
5552
|
+
descMatch = headHtml.match(/<meta\s+content=["'](.+?)["']\s+name=["']description["']/i);
|
|
5553
|
+
}
|
|
5554
|
+
if (descMatch?.[1]) {
|
|
5555
|
+
updates.description = unescapeHtmlEntities(descMatch[1].trim());
|
|
5556
|
+
}
|
|
5557
|
+
let ogTitleMatch = headHtml.match(/<meta\s+property=["']og:title["']\s+content=["'](.+?)["']/i);
|
|
5558
|
+
if (!ogTitleMatch) {
|
|
5559
|
+
ogTitleMatch = headHtml.match(/<meta\s+content=["'](.+?)["']\s+property=["']og:title["']/i);
|
|
5560
|
+
}
|
|
5561
|
+
if (ogTitleMatch?.[1]) {
|
|
5562
|
+
updates["og:title"] = unescapeHtmlEntities(ogTitleMatch[1].trim());
|
|
5563
|
+
} else if (updates.title) {
|
|
5564
|
+
updates["og:title"] = updates.title;
|
|
5565
|
+
}
|
|
5566
|
+
let ogDescMatch = headHtml.match(/<meta\s+property=["']og:description["']\s+content=["'](.+?)["']/i);
|
|
5567
|
+
if (!ogDescMatch) {
|
|
5568
|
+
ogDescMatch = headHtml.match(/<meta\s+content=["'](.+?)["']\s+property=["']og:description["']/i);
|
|
5569
|
+
}
|
|
5570
|
+
if (ogDescMatch?.[1]) {
|
|
5571
|
+
updates["og:description"] = unescapeHtmlEntities(ogDescMatch[1].trim());
|
|
5572
|
+
} else if (updates.description) {
|
|
5573
|
+
updates["og:description"] = updates.description;
|
|
5574
|
+
}
|
|
5575
|
+
let twitterTitleMatch = headHtml.match(/<meta\s+name=["']twitter:title["']\s+content=["'](.+?)["']/i);
|
|
5576
|
+
if (!twitterTitleMatch) {
|
|
5577
|
+
twitterTitleMatch = headHtml.match(/<meta\s+content=["'](.+?)["']\s+name=["']twitter:title["']/i);
|
|
5578
|
+
}
|
|
5579
|
+
if (twitterTitleMatch?.[1]) {
|
|
5580
|
+
updates["twitter:title"] = unescapeHtmlEntities(twitterTitleMatch[1].trim());
|
|
5581
|
+
} else if (updates.title) {
|
|
5582
|
+
updates["twitter:title"] = updates.title;
|
|
5583
|
+
}
|
|
5584
|
+
let twitterDescMatch = headHtml.match(/<meta\s+name=["']twitter:description["']\s+content=["'](.+?)["']/i);
|
|
5585
|
+
if (!twitterDescMatch) {
|
|
5586
|
+
twitterDescMatch = headHtml.match(/<meta\s+content=["'](.+?)["']\s+name=["']twitter:description["']/i);
|
|
5587
|
+
}
|
|
5588
|
+
if (twitterDescMatch?.[1]) {
|
|
5589
|
+
updates["twitter:description"] = unescapeHtmlEntities(twitterDescMatch[1].trim());
|
|
5590
|
+
} else if (updates.description) {
|
|
5591
|
+
updates["twitter:description"] = updates.description;
|
|
5592
|
+
}
|
|
5593
|
+
return updates;
|
|
5594
|
+
}
|
|
5595
|
+
function unescapeHtmlEntities(str) {
|
|
5596
|
+
return str.replace(/"/g, '"').replace(/'/g, "'").replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&");
|
|
5597
|
+
}
|
|
5497
5598
|
var init_stream = __esm(() => {
|
|
5498
5599
|
init_server2();
|
|
5499
5600
|
init_config();
|
|
@@ -105896,7 +105997,7 @@ async function getVersionString2() {
|
|
|
105896
105997
|
}
|
|
105897
105998
|
async function getVersion2() {
|
|
105898
105999
|
if (true) {
|
|
105899
|
-
return "0.
|
|
106000
|
+
return "0.43.0";
|
|
105900
106001
|
}
|
|
105901
106002
|
const possiblePaths = [
|
|
105902
106003
|
path3.join(import.meta.dir, "../../../package.json"),
|
|
@@ -105913,10 +106014,10 @@ async function getVersion2() {
|
|
|
105913
106014
|
}
|
|
105914
106015
|
async function getCommit2() {
|
|
105915
106016
|
if (true) {
|
|
105916
|
-
return "
|
|
106017
|
+
return "8a3c652";
|
|
105917
106018
|
}
|
|
105918
106019
|
return "dev";
|
|
105919
106020
|
}
|
|
105920
106021
|
main();
|
|
105921
106022
|
|
|
105922
|
-
//# debugId=
|
|
106023
|
+
//# debugId=F78EC5575219E60664756E2164756E21
|