Skip to content

Commit

Permalink
Eliminate unnecessary decode operations in `node-web-streams-helpers.…
Browse files Browse the repository at this point in the history
…ts` (#63427)

This PR is strictly a performance improvement. It should not change
implementation behavior in anyway.

This PR replaces `decoder.decode()` operations by operating with the
encoded `Uint8Array` instances directly. I added some utility functions
to make things a bit easier to understand.

Ideally, this change also maintains a fair amount of code readability. 

Will measure estimate performance improvement shortly.

Closes NEXT-2848
  • Loading branch information
Ethan-Arrowood authored Mar 18, 2024
1 parent 1439503 commit 229cb14
Show file tree
Hide file tree
Showing 3 changed files with 141 additions and 52 deletions.
21 changes: 21 additions & 0 deletions packages/next/src/server/stream-utils/encodedTags.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
export const ENCODED_TAGS = {
// opening tags do not have the closing `>` since they can contain other attributes such as `<body className=''>`
OPENING: {
// <html
HTML: new Uint8Array([60, 104, 116, 109, 108]),
// <body
BODY: new Uint8Array([60, 98, 111, 100, 121]),
},
CLOSED: {
// </head>
HEAD: new Uint8Array([60, 47, 104, 101, 97, 100, 62]),
// </body>
BODY: new Uint8Array([60, 47, 98, 111, 100, 121, 62]),
// </html>
HTML: new Uint8Array([60, 47, 104, 116, 109, 108, 62]),
// </body></html>
BODY_AND_HTML: new Uint8Array([
60, 47, 98, 111, 100, 121, 62, 60, 47, 104, 116, 109, 108, 62,
]),
},
} as const
113 changes: 61 additions & 52 deletions packages/next/src/server/stream-utils/node-web-streams-helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@ import { getTracer } from '../lib/trace/tracer'
import { AppRenderSpan } from '../lib/trace/constants'
import { DetachedPromise } from '../../lib/detached-promise'
import { scheduleImmediate, atLeastOneTask } from '../../lib/scheduler'
import { ENCODED_TAGS } from './encodedTags'
import {
indexOfUint8Array,
isEquivalentUint8Arrays,
removeFromUint8Array,
} from './uint8array-helpers'

function voidCatch() {
// this catcher is designed to be used with pipeTo where we expect the underlying
Expand Down Expand Up @@ -175,8 +181,6 @@ function createHeadInsertionTransformStream(
let inserted = false
let freezing = false

const decoder = new TextDecoder()

// We need to track if this transform saw any bytes because if it didn't
// we won't want to insert any server HTML at all
let hasBytes = false
Expand All @@ -191,17 +195,25 @@ function createHeadInsertionTransformStream(
}

const insertion = await insert()
const encodedInsertion = encoder.encode(insertion)
if (inserted) {
controller.enqueue(encoder.encode(insertion))
controller.enqueue(encodedInsertion)
controller.enqueue(chunk)
freezing = true
} else {
const content = decoder.decode(chunk)
const index = content.indexOf('</head>')
// TODO (@Ethan-Arrowood): Replace the generic `indexOfUint8Array` method with something finely tuned for the subset of things actually being checked for.
const index = indexOfUint8Array(chunk, ENCODED_TAGS.CLOSED.HEAD)
if (index !== -1) {
const insertedHeadContent =
content.slice(0, index) + insertion + content.slice(index)
controller.enqueue(encoder.encode(insertedHeadContent))
const insertedHeadContent = new Uint8Array(
chunk.length + encodedInsertion.length
)
insertedHeadContent.set(chunk.slice(0, index))
insertedHeadContent.set(encodedInsertion, index)
insertedHeadContent.set(
chunk.slice(index),
index + encodedInsertion.length
)
controller.enqueue(insertedHeadContent)
freezing = true
inserted = true
}
Expand Down Expand Up @@ -344,37 +356,34 @@ function createMoveSuffixStream(
): TransformStream<Uint8Array, Uint8Array> {
let foundSuffix = false

const decoder = new TextDecoder()
const encodedSuffix = encoder.encode(suffix)

return new TransformStream({
transform(chunk, controller) {
if (foundSuffix) {
return controller.enqueue(chunk)
}

const buf = decoder.decode(chunk)
const index = buf.indexOf(suffix)
const index = indexOfUint8Array(chunk, encodedSuffix)
if (index > -1) {
foundSuffix = true

// If the whole chunk is the suffix, then don't write anything, it will
// be written in the flush.
if (buf.length === suffix.length) {
if (chunk.length === suffix.length) {
return
}

// Write out the part before the suffix.
const before = buf.slice(0, index)
chunk = encoder.encode(before)
controller.enqueue(chunk)
const before = chunk.slice(0, index)
controller.enqueue(before)

// In the case where the suffix is in the middle of the chunk, we need
// to split the chunk into two parts.
if (buf.length > suffix.length + index) {
if (chunk.length > suffix.length + index) {
// Write out the part after the suffix.
const after = buf.slice(index + suffix.length)
chunk = encoder.encode(after)
controller.enqueue(chunk)
const after = chunk.slice(index + suffix.length)
controller.enqueue(after)
}
} else {
controller.enqueue(chunk)
Expand All @@ -383,7 +392,7 @@ function createMoveSuffixStream(
flush(controller) {
// Even if we didn't find the suffix, the HTML is not valid if we don't
// add it, so insert it at the end.
controller.enqueue(encoder.encode(suffix))
controller.enqueue(encodedSuffix)
},
})
}
Expand All @@ -392,34 +401,28 @@ function createStripDocumentClosingTagsTransform(): TransformStream<
Uint8Array,
Uint8Array
> {
const decoder = new TextDecoder()
return new TransformStream({
transform(chunk, controller) {
// We rely on the assumption that chunks will never break across a code unit.
// This is reasonable because we currently concat all of React's output from a single
// flush into one chunk before streaming it forward which means the chunk will represent
// a single coherent utf-8 string. This is not safe to use if we change our streaming to no
// longer do this large buffered chunk
let originalContent = decoder.decode(chunk)
let content = originalContent

if (
content === '</body></html>' ||
content === '</body>' ||
content === '</html>'
isEquivalentUint8Arrays(chunk, ENCODED_TAGS.CLOSED.BODY_AND_HTML) ||
isEquivalentUint8Arrays(chunk, ENCODED_TAGS.CLOSED.BODY) ||
isEquivalentUint8Arrays(chunk, ENCODED_TAGS.CLOSED.HTML)
) {
// the entire chunk is the closing tags.
// the entire chunk is the closing tags; return without enqueueing anything.
return
} else {
// We assume these tags will go at together at the end of the document and that
// they won't appear anywhere else in the document. This is not really a safe assumption
// but until we revamp our streaming infra this is a performant way to string the tags
content = content.replace('</body>', '').replace('</html>', '')
if (content.length !== originalContent.length) {
return controller.enqueue(encoder.encode(content))
}
}

// We assume these tags will go at together at the end of the document and that
// they won't appear anywhere else in the document. This is not really a safe assumption
// but until we revamp our streaming infra this is a performant way to string the tags
chunk = removeFromUint8Array(chunk, ENCODED_TAGS.CLOSED.BODY)
chunk = removeFromUint8Array(chunk, ENCODED_TAGS.CLOSED.HTML)

controller.enqueue(chunk)
},
})
Expand All @@ -436,31 +439,37 @@ export function createRootLayoutValidatorStream(): TransformStream<
> {
let foundHtml = false
let foundBody = false

const decoder = new TextDecoder()

let content = ''
let chunks: Uint8Array[] = []
let size = 0
return new TransformStream({
async transform(chunk, controller) {
chunks.push(chunk)
size += chunk.length
controller.enqueue(chunk)
},
flush(controller) {
const content = new Uint8Array(size)
let offset = 0
for (const chunk of chunks) {
content.set(chunk, offset)
offset += chunk.length
}

// Peek into the streamed chunk to see if the tags are present.
if (!foundHtml || !foundBody) {
content += decoder.decode(chunk, { stream: true })
if (!foundHtml && content.includes('<html')) {
if (
!foundHtml &&
indexOfUint8Array(content, ENCODED_TAGS.OPENING.HTML) > -1
) {
foundHtml = true
}
if (!foundBody && content.includes('<body')) {
if (
!foundBody &&
indexOfUint8Array(content, ENCODED_TAGS.OPENING.BODY) > -1
) {
foundBody = true
}
}
controller.enqueue(chunk)
},
flush(controller) {
// Flush the decoder.
if (!foundHtml || !foundBody) {
content += decoder.decode()
if (!foundHtml && content.includes('<html')) foundHtml = true
if (!foundBody && content.includes('<body')) foundBody = true
}

const missingTags: typeof window.__next_root_layout_missing_tags = []
if (!foundHtml) missingTags.push('html')
Expand Down
59 changes: 59 additions & 0 deletions packages/next/src/server/stream-utils/uint8array-helpers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/**
* Find the starting index of Uint8Array `b` within Uint8Array `a`.
*/
export function indexOfUint8Array(a: Uint8Array, b: Uint8Array) {
if (b.length === 0) return 0
if (a.length === 0 || b.length > a.length) return -1

// start iterating through `a`
for (let i = 0; i <= a.length - b.length; i++) {
let completeMatch = true
// from index `i`, iterate through `b` and check for mismatch
for (let j = 0; j < b.length; j++) {
// if the values do not match, then this isn't a complete match, exit `b` iteration early and iterate to next index of `a`.
if (a[i + j] !== b[j]) {
completeMatch = false
break
}
}

if (completeMatch) {
return i
}
}

return -1
}

/**
* Check if two Uint8Arrays are strictly equivalent.
*/
export function isEquivalentUint8Arrays(a: Uint8Array, b: Uint8Array) {
if (a.length !== b.length) return false

for (let i = 0; i < a.length; i++) {
if (a[i] !== b[i]) return false
}

return true
}

/**
* Remove Uint8Array `b` from Uint8Array `a`.
*
* If `b` is not in `a`, `a` is returned unchanged.
*
* Otherwise, the function returns a new Uint8Array instance with size `a.length - b.length`
*/
export function removeFromUint8Array(a: Uint8Array, b: Uint8Array) {
const tagIndex = indexOfUint8Array(a, b)
if (tagIndex === 0) return a.subarray(b.length)
if (tagIndex > -1) {
const removed = new Uint8Array(a.length - b.length)
removed.set(a.slice(0, tagIndex))
removed.set(a.slice(tagIndex + b.length), tagIndex)
return removed
} else {
return a
}
}

1 comment on commit 229cb14

@ijjk
Copy link
Member

@ijjk ijjk commented on 229cb14 Mar 18, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stats from current release

Default Build (Increase detected ⚠️)
General
vercel/next.js canary v14.1.3 vercel/next.js canary Change
buildDuration 13.9s 25.3s ⚠️ +11.3s
buildDurationCached 7.9s 6.7s N/A
nodeModulesSize 200 MB 198 MB N/A
nextStartRea..uration (ms) 429ms 432ms N/A
Client Bundles (main, webpack) Overall increase ⚠️
vercel/next.js canary v14.1.3 vercel/next.js canary Change
3f784ff6-HASH.js gzip 53.4 kB 53.7 kB ⚠️ +277 B
6433-HASH.js gzip 29.1 kB 30.5 kB ⚠️ +1.4 kB
7193.HASH.js gzip 181 B 181 B
8201-HASH.js gzip 5.03 kB 5.04 kB N/A
framework-HASH.js gzip 45.2 kB 45.2 kB N/A
main-app-HASH.js gzip 241 B 242 B N/A
main-HASH.js gzip 31.9 kB 32.2 kB ⚠️ +253 B
webpack-HASH.js gzip 1.7 kB 1.68 kB N/A
Overall change 115 kB 117 kB ⚠️ +1.93 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary v14.1.3 vercel/next.js canary Change
polyfills-HASH.js gzip 31 kB 31 kB N/A
Overall change 0 B 0 B
Client Pages
vercel/next.js canary v14.1.3 vercel/next.js canary Change
_app-HASH.js gzip 196 B 197 B N/A
_error-HASH.js gzip 185 B 184 B N/A
amp-HASH.js gzip 506 B 505 B N/A
css-HASH.js gzip 323 B 325 B N/A
dynamic-HASH.js gzip 2.51 kB 2.5 kB N/A
edge-ssr-HASH.js gzip 258 B 258 B
head-HASH.js gzip 353 B 352 B N/A
hooks-HASH.js gzip 370 B 371 B N/A
image-HASH.js gzip 4.18 kB 4.21 kB N/A
index-HASH.js gzip 258 B 259 B N/A
link-HASH.js gzip 2.61 kB 2.67 kB N/A
routerDirect..HASH.js gzip 314 B 312 B N/A
script-HASH.js gzip 387 B 386 B N/A
withRouter-HASH.js gzip 309 B 309 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 673 B 673 B
Client Build Manifests
vercel/next.js canary v14.1.3 vercel/next.js canary Change
_buildManifest.js gzip 483 B 484 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary v14.1.3 vercel/next.js canary Change
index.html gzip 527 B 529 B N/A
link.html gzip 539 B 542 B N/A
withRouter.html gzip 523 B 524 B N/A
Overall change 0 B 0 B
Edge SSR bundle Size Overall increase ⚠️
vercel/next.js canary v14.1.3 vercel/next.js canary Change
edge-ssr.js gzip 94 kB 95.4 kB ⚠️ +1.4 kB
page.js gzip 2.95 kB 3.04 kB N/A
Overall change 94 kB 95.4 kB ⚠️ +1.4 kB
Middleware size Overall increase ⚠️
vercel/next.js canary v14.1.3 vercel/next.js canary Change
middleware-b..fest.js gzip 626 B 627 B N/A
middleware-r..fest.js gzip 150 B 151 B N/A
middleware.js gzip 25.2 kB 25.5 kB ⚠️ +311 B
edge-runtime..pack.js gzip 839 B 839 B
Overall change 26 kB 26.3 kB ⚠️ +311 B
Next Runtimes Overall increase ⚠️
vercel/next.js canary v14.1.3 vercel/next.js canary Change
app-page-exp...dev.js gzip 170 kB 171 kB ⚠️ +1.51 kB
app-page-exp..prod.js gzip 95.8 kB 96.9 kB ⚠️ +1.1 kB
app-page-tur..prod.js gzip 96.5 kB 98.6 kB ⚠️ +2.19 kB
app-page-tur..prod.js gzip 91 kB 93.1 kB ⚠️ +2.04 kB
app-page.run...dev.js gzip 142 kB 150 kB ⚠️ +7.25 kB
app-page.run..prod.js gzip 90.4 kB 91.6 kB ⚠️ +1.21 kB
app-route-ex...dev.js gzip 24.2 kB 21.3 kB N/A
app-route-ex..prod.js gzip 16.9 kB 15 kB N/A
app-route-tu..prod.js gzip 16.9 kB 15 kB N/A
app-route-tu..prod.js gzip 16.4 kB 14.8 kB N/A
app-route.ru...dev.js gzip 23.6 kB 21 kB N/A
app-route.ru..prod.js gzip 16.4 kB 14.8 kB N/A
pages-api-tu..prod.js gzip 9.43 kB 9.52 kB N/A
pages-api.ru...dev.js gzip 9.7 kB 9.8 kB ⚠️ +101 B
pages-api.ru..prod.js gzip 9.42 kB 9.52 kB N/A
pages-turbo...prod.js gzip 22 kB 22.5 kB ⚠️ +502 B
pages.runtim...dev.js gzip 22.6 kB 23.1 kB ⚠️ +498 B
pages.runtim..prod.js gzip 22 kB 22.5 kB ⚠️ +501 B
server.runti..prod.js gzip 49.8 kB 50.7 kB ⚠️ +917 B
Overall change 812 kB 829 kB ⚠️ +17.8 kB
build cache Overall increase ⚠️
vercel/next.js canary v14.1.3 vercel/next.js canary Change
0.pack gzip 1.52 MB 1.56 MB ⚠️ +42.7 kB
index.pack gzip 105 kB 105 kB N/A
Overall change 1.52 MB 1.56 MB ⚠️ +42.7 kB
Diff details
Diff for page.js

Diff too large to display

Diff for middleware.js

Diff too large to display

Diff for edge-ssr.js

Diff too large to display

Diff for dynamic-HASH.js
@@ -1,7 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [2739],
   {
-    /***/ 8484: /***/ function (
+    /***/ 9816: /***/ function (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -9,7 +9,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/dynamic",
         function () {
-          return __webpack_require__(4112);
+          return __webpack_require__(8761);
         },
       ]);
       if (false) {
@@ -18,7 +18,7 @@
       /***/
     },
 
-    /***/ 9993: /***/ function (module, exports, __webpack_require__) {
+    /***/ 5896: /***/ function (module, exports, __webpack_require__) {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -33,20 +33,25 @@
           });
       }
       _export(exports, {
+        /**
+         * This function lets you dynamically import a component.
+         * It uses [React.lazy()](https://react.dev/reference/react/lazy) with [Suspense](https://react.dev/reference/react/Suspense) under the hood.
+         *
+         * Read more: [Next.js Docs: `next/dynamic`](https://nextjs.org/docs/app/building-your-application/optimizing/lazy-loading#nextdynamic)
+         */ default: function () {
+          return dynamic;
+        },
         noSSR: function () {
           return noSSR;
         },
-        default: function () {
-          return dynamic;
-        },
       });
-      const _interop_require_default = __webpack_require__(1351);
+      const _interop_require_default = __webpack_require__(2430);
       const _jsxruntime = __webpack_require__(1527);
       const _react = /*#__PURE__*/ _interop_require_default._(
         __webpack_require__(959)
       );
       const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(7182)
+        __webpack_require__(8030)
       );
       const isServerSide = "object" === "undefined";
       // Normalize loader to return the module as form { default: Component } for `React.lazy`.
@@ -147,7 +152,7 @@
       /***/
     },
 
-    /***/ 1115: /***/ function (
+    /***/ 3638: /***/ function (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -163,7 +168,7 @@
           return LoadableContext;
         },
       });
-      const _interop_require_default = __webpack_require__(1351);
+      const _interop_require_default = __webpack_require__(2430);
       const _react = /*#__PURE__*/ _interop_require_default._(
         __webpack_require__(959)
       );
@@ -174,7 +179,7 @@
       /***/
     },
 
-    /***/ 7182: /***/ function (
+    /***/ 8030: /***/ function (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -212,11 +217,11 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
           return _default;
         },
       });
-      const _interop_require_default = __webpack_require__(1351);
+      const _interop_require_default = __webpack_require__(2430);
       const _react = /*#__PURE__*/ _interop_require_default._(
         __webpack_require__(959)
       );
-      const _loadablecontextsharedruntime = __webpack_require__(1115);
+      const _loadablecontextsharedruntime = __webpack_require__(3638);
       function resolve(obj) {
         return obj && obj.default ? obj.default : obj;
       }
@@ -451,7 +456,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       /***/
     },
 
-    /***/ 4112: /***/ function (
+    /***/ 8761: /***/ function (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -467,7 +472,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1527);
       /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(5620);
+        __webpack_require__(4438);
       /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_dynamic__WEBPACK_IMPORTED_MODULE_1__
@@ -476,11 +481,11 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
         () =>
           __webpack_require__
-            .e(/* import() */ 7193)
-            .then(__webpack_require__.bind(__webpack_require__, 7193)),
+            .e(/* import() */ 1682)
+            .then(__webpack_require__.bind(__webpack_require__, 1682)),
         {
           loadableGenerated: {
-            webpack: () => [/*require.resolve*/ 7193],
+            webpack: () => [/*require.resolve*/ 1682],
           },
         }
       );
@@ -507,12 +512,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       /***/
     },
 
-    /***/ 5620: /***/ function (
+    /***/ 4438: /***/ function (
       module,
       __unused_webpack_exports,
       __webpack_require__
     ) {
-      module.exports = __webpack_require__(9993);
+      module.exports = __webpack_require__(5896);
 
       /***/
     },
@@ -523,7 +528,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       return __webpack_require__((__webpack_require__.s = moduleId));
     };
     /******/ __webpack_require__.O(0, [2888, 9774, 179], function () {
-      return __webpack_exec__(8484);
+      return __webpack_exec__(9816);
     });
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for image-HASH.js
@@ -1,7 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [8358],
   {
-    /***/ 1552: /***/ function (
+    /***/ 4070: /***/ function (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -9,7 +9,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/image",
         function () {
-          return __webpack_require__(8769);
+          return __webpack_require__(396);
         },
       ]);
       if (false) {
@@ -18,7 +18,7 @@
       /***/
     },
 
-    /***/ 359: /***/ function (module, exports, __webpack_require__) {
+    /***/ 8490: /***/ function (module, exports, __webpack_require__) {
       "use strict";
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
@@ -30,8 +30,8 @@
           return Image;
         },
       });
-      const _interop_require_default = __webpack_require__(1351);
-      const _interop_require_wildcard = __webpack_require__(5815);
+      const _interop_require_default = __webpack_require__(2430);
+      const _interop_require_wildcard = __webpack_require__(1778);
       const _jsxruntime = __webpack_require__(1527);
       const _react = /*#__PURE__*/ _interop_require_wildcard._(
         __webpack_require__(959)
@@ -40,15 +40,15 @@
         __webpack_require__(422)
       );
       const _head = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(4489)
+        __webpack_require__(2457)
       );
-      const _getimgprops = __webpack_require__(9997);
-      const _imageconfig = __webpack_require__(9747);
-      const _imageconfigcontextsharedruntime = __webpack_require__(9429);
-      const _warnonce = __webpack_require__(5761);
-      const _routercontextsharedruntime = __webpack_require__(2991);
+      const _getimgprops = __webpack_require__(7932);
+      const _imageconfig = __webpack_require__(5706);
+      const _imageconfigcontextsharedruntime = __webpack_require__(9483);
+      const _warnonce = __webpack_require__(9035);
+      const _routercontextsharedruntime = __webpack_require__(4829);
       const _imageloader = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(5076)
+        __webpack_require__(7240)
       );
       // This is replaced by webpack define plugin
       const configEnv = {
@@ -69,7 +69,8 @@
         onLoadRef,
         onLoadingCompleteRef,
         setBlurComplete,
-        unoptimized
+        unoptimized,
+        sizesInput
       ) {
         const src = img == null ? void 0 : img.src;
         if (!img || img["data-loaded-src"] === src) {
@@ -165,6 +166,7 @@
             onLoadingCompleteRef,
             setBlurComplete,
             setShowAltText,
+            sizesInput,
             onLoad,
             onError,
             ...rest
@@ -219,7 +221,8 @@
                     onLoadRef,
                     onLoadingCompleteRef,
                     setBlurComplete,
-                    unoptimized
+                    unoptimized,
+                    sizesInput
                   );
                 }
               },
@@ -231,6 +234,7 @@
                 setBlurComplete,
                 onError,
                 unoptimized,
+                sizesInput,
                 forwardedRef,
               ]
             ),
@@ -242,7 +246,8 @@
                 onLoadRef,
                 onLoadingCompleteRef,
                 setBlurComplete,
-                unoptimized
+                unoptimized,
+                sizesInput
               );
             },
             onError: (event) => {
@@ -346,6 +351,7 @@
                 onLoadingCompleteRef: onLoadingCompleteRef,
                 setBlurComplete: setBlurComplete,
                 setShowAltText: setShowAltText,
+                sizesInput: props.sizes,
                 ref: forwardedRef,
               }),
               imgMeta.priority
@@ -373,7 +379,7 @@
       /***/
     },
 
-    /***/ 9997: /***/ function (
+    /***/ 7932: /***/ function (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -389,9 +395,9 @@
           return getImgProps;
         },
       });
-      const _warnonce = __webpack_require__(5761);
-      const _imageblursvg = __webpack_require__(8543);
-      const _imageconfig = __webpack_require__(9747);
+      const _warnonce = __webpack_require__(9035);
+      const _imageblursvg = __webpack_require__(2642);
+      const _imageconfig = __webpack_require__(5706);
       const VALID_LOADING_VALUES =
         /* unused pure expression or super */ null && [
           "lazy",
@@ -760,7 +766,7 @@
       /***/
     },
 
-    /***/ 8543: /***/ function (__unused_webpack_module, exports) {
+    /***/ 2642: /***/ function (__unused_webpack_module, exports) {
       "use strict";
       /**
        * A shared function, used on both client and server, to generate a SVG blur placeholder.
@@ -815,7 +821,7 @@
       /***/
     },
 
-    /***/ 3103: /***/ function (
+    /***/ 503: /***/ function (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -834,20 +840,20 @@
           });
       }
       _export(exports, {
-        getImageProps: function () {
-          return getImageProps;
-        },
         default: function () {
           return _default;
         },
+        getImageProps: function () {
+          return getImageProps;
+        },
       });
-      const _interop_require_default = __webpack_require__(1351);
-      const _getimgprops = __webpack_require__(9997);
-      const _imagecomponent = __webpack_require__(359);
+      const _interop_require_default = __webpack_require__(2430);
+      const _getimgprops = __webpack_require__(7932);
+      const _imagecomponent = __webpack_require__(8490);
       const _imageloader = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(5076)
+        __webpack_require__(7240)
       );
-      const getImageProps = (imgProps) => {
+      function getImageProps(imgProps) {
         const { props } = (0, _getimgprops.getImgProps)(imgProps, {
           defaultLoader: _imageloader.default,
           // This is replaced by webpack define plugin
@@ -871,13 +877,13 @@
         return {
           props,
         };
-      };
+      }
       const _default = _imagecomponent.Image; //# sourceMappingURL=image-external.js.map
 
       /***/
     },
 
-    /***/ 5076: /***/ function (__unused_webpack_module, exports) {
+    /***/ 7240: /***/ function (__unused_webpack_module, exports) {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -912,7 +918,7 @@
       /***/
     },
 
-    /***/ 8769: /***/ function (
+    /***/ 396: /***/ function (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -933,8 +939,8 @@
 
       // EXTERNAL MODULE: ./node_modules/.pnpm/react@18.2.0/node_modules/react/jsx-runtime.js
       var jsx_runtime = __webpack_require__(1527);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/file+..+main-repo+packages+next+next-packed.tgz_react-dom@18.2.0_react@18.2.0/node_modules/next/image.js
-      var next_image = __webpack_require__(1577);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/file+..+diff-repo+packages+next+next-packed.tgz_react-dom@18.2.0_react@18.2.0/node_modules/next/image.js
+      var next_image = __webpack_require__(73);
       var image_default = /*#__PURE__*/ __webpack_require__.n(next_image); // CONCATENATED MODULE: ./pages/nextjs.png
       /* harmony default export */ var nextjs = {
         src: "/_next/static/media/nextjs.cae0b805.png",
@@ -964,12 +970,12 @@
       /***/
     },
 
-    /***/ 1577: /***/ function (
+    /***/ 73: /***/ function (
       module,
       __unused_webpack_exports,
       __webpack_require__
     ) {
-      module.exports = __webpack_require__(3103);
+      module.exports = __webpack_require__(503);
 
       /***/
     },
@@ -980,7 +986,7 @@
       return __webpack_require__((__webpack_require__.s = moduleId));
     };
     /******/ __webpack_require__.O(0, [2888, 9774, 179], function () {
-      return __webpack_exec__(1552);
+      return __webpack_exec__(4070);
     });
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for link-HASH.js
@@ -1,7 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [4644],
   {
-    /***/ 1794: /***/ function (
+    /***/ 8959: /***/ function (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -9,7 +9,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/link",
         function () {
-          return __webpack_require__(7225);
+          return __webpack_require__(311);
         },
       ]);
       if (false) {
@@ -18,7 +18,7 @@
       /***/
     },
 
-    /***/ 2465: /***/ function (module, exports) {
+    /***/ 2145: /***/ function (module, exports) {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -33,29 +33,32 @@
           });
       }
       _export(exports, {
-        PrefetchKind: function () {
-          return PrefetchKind;
-        },
-        ACTION_REFRESH: function () {
-          return ACTION_REFRESH;
+        ACTION_FAST_REFRESH: function () {
+          return ACTION_FAST_REFRESH;
         },
         ACTION_NAVIGATE: function () {
           return ACTION_NAVIGATE;
         },
+        ACTION_PREFETCH: function () {
+          return ACTION_PREFETCH;
+        },
+        ACTION_REFRESH: function () {
+          return ACTION_REFRESH;
+        },
         ACTION_RESTORE: function () {
           return ACTION_RESTORE;
         },
+        ACTION_SERVER_ACTION: function () {
+          return ACTION_SERVER_ACTION;
+        },
         ACTION_SERVER_PATCH: function () {
           return ACTION_SERVER_PATCH;
         },
-        ACTION_PREFETCH: function () {
-          return ACTION_PREFETCH;
+        PrefetchCacheEntryStatus: function () {
+          return PrefetchCacheEntryStatus;
         },
-        ACTION_FAST_REFRESH: function () {
-          return ACTION_FAST_REFRESH;
-        },
-        ACTION_SERVER_ACTION: function () {
-          return ACTION_SERVER_ACTION;
+        PrefetchKind: function () {
+          return PrefetchKind;
         },
         isThenable: function () {
           return isThenable;
@@ -74,6 +77,13 @@
         PrefetchKind["FULL"] = "full";
         PrefetchKind["TEMPORARY"] = "temporary";
       })(PrefetchKind || (PrefetchKind = {}));
+      var PrefetchCacheEntryStatus;
+      (function (PrefetchCacheEntryStatus) {
+        PrefetchCacheEntryStatus["fresh"] = "fresh";
+        PrefetchCacheEntryStatus["reusable"] = "reusable";
+        PrefetchCacheEntryStatus["expired"] = "expired";
+        PrefetchCacheEntryStatus["stale"] = "stale";
+      })(PrefetchCacheEntryStatus || (PrefetchCacheEntryStatus = {}));
       function isThenable(value) {
         // TODO: We don't gain anything from this abstraction. It's unsound, and only
         // makes sense in the specific places where we use it. So it's better to keep
@@ -100,7 +110,7 @@
       /***/
     },
 
-    /***/ 8038: /***/ function (module, exports, __webpack_require__) {
+    /***/ 6923: /***/ function (module, exports, __webpack_require__) {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -112,7 +122,7 @@
           return getDomainLocale;
         },
       });
-      const _normalizetrailingslash = __webpack_require__(2093);
+      const _normalizetrailingslash = __webpack_require__(4251);
       const basePath =
         /* unused pure expression or super */ null && (false || "");
       function getDomainLocale(path, locale, locales, domainLocales) {
@@ -136,7 +146,7 @@
       /***/
     },
 
-    /***/ 7192: /***/ function (module, exports, __webpack_require__) {
+    /***/ 987: /***/ function (module, exports, __webpack_require__) {
       "use strict";
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
@@ -148,22 +158,22 @@
           return _default;
         },
       });
-      const _interop_require_default = __webpack_require__(1351);
+      const _interop_require_default = __webpack_require__(2430);
       const _jsxruntime = __webpack_require__(1527);
       const _react = /*#__PURE__*/ _interop_require_default._(
         __webpack_require__(959)
       );
-      const _resolvehref = __webpack_require__(9743);
-      const _islocalurl = __webpack_require__(7077);
-      const _formaturl = __webpack_require__(2206);
-      const _utils = __webpack_require__(766);
-      const _addlocale = __webpack_require__(9471);
-      const _routercontextsharedruntime = __webpack_require__(2991);
-      const _approutercontextsharedruntime = __webpack_require__(2231);
-      const _useintersection = __webpack_require__(8838);
-      const _getdomainlocale = __webpack_require__(8038);
-      const _addbasepath = __webpack_require__(480);
-      const _routerreducertypes = __webpack_require__(2465);
+      const _resolvehref = __webpack_require__(1419);
+      const _islocalurl = __webpack_require__(2623);
+      const _formaturl = __webpack_require__(7016);
+      const _utils = __webpack_require__(5943);
+      const _addlocale = __webpack_require__(2318);
+      const _routercontextsharedruntime = __webpack_require__(4829);
+      const _approutercontextsharedruntime = __webpack_require__(8676);
+      const _useintersection = __webpack_require__(8341);
+      const _getdomainlocale = __webpack_require__(6923);
+      const _addbasepath = __webpack_require__(639);
+      const _routerreducertypes = __webpack_require__(2145);
       const prefetched = new Set();
       function prefetch(router, href, as, options, appOptions, isAppRouter) {
         if (false) {
@@ -264,7 +274,12 @@
         return (0, _formaturl.formatUrl)(urlObjOrString);
       }
       /**
-       * React Component that enables client-side transitions between routes.
+       * A React component that extends the HTML `<a>` element to provide [prefetching](https://nextjs.org/docs/app/building-your-application/routing/linking-and-navigating#2-prefetching)
+       * and client-side navigation between routes.
+       *
+       * It is the primary way to navigate between routes in Next.js.
+       *
+       * Read more: [Next.js docs: `<Link>`](https://nextjs.org/docs/app/api-reference/components/link)
        */ const Link = /*#__PURE__*/ _react.default.forwardRef(
         function LinkComponent(props, forwardedRef) {
           let children;
@@ -479,39 +494,44 @@
                 isAppRouter
               );
             },
-            onTouchStart(e) {
-              if (!legacyBehavior && typeof onTouchStartProp === "function") {
-                onTouchStartProp(e);
-              }
-              if (
-                legacyBehavior &&
-                child.props &&
-                typeof child.props.onTouchStart === "function"
-              ) {
-                child.props.onTouchStart(e);
-              }
-              if (!router) {
-                return;
-              }
-              if (!prefetchEnabled && isAppRouter) {
-                return;
-              }
-              prefetch(
-                router,
-                href,
-                as,
-                {
-                  locale,
-                  priority: true,
-                  // @see {https://github.com/vercel/next.js/discussions/40268?sort=top#discussioncomment-3572642}
-                  bypassPrefetchedCheck: true,
+            onTouchStart: false
+              ? 0
+              : function onTouchStart(e) {
+                  if (
+                    !legacyBehavior &&
+                    typeof onTouchStartProp === "function"
+                  ) {
+                    onTouchStartProp(e);
+                  }
+                  if (
+                    legacyBehavior &&
+                    child.props &&
+                    typeof child.props.onTouchStart === "function"
+                  ) {
+                    child.props.onTouchStart(e);
+                  }
+                  if (!router) {
+                    return;
+                  }
+                  if (!prefetchEnabled && isAppRouter) {
+                    return;
+                  }
+                  prefetch(
+                    router,
+                    href,
+                    as,
+                    {
+                      locale,
+                      priority: true,
+                      // @see {https://github.com/vercel/next.js/discussions/40268?sort=top#discussioncomment-3572642}
+                      bypassPrefetchedCheck: true,
+                    },
+                    {
+                      kind: appPrefetchKind,
+                    },
+                    isAppRouter
+                  );
                 },
-                {
-                  kind: appPrefetchKind,
-                },
-                isAppRouter
-              );
-            },
           };
           // If child is an <a> tag and doesn't have a href attribute, or if the 'passHref' property is
           // defined, we specify the current 'href', so that repetition is not needed by the user.
@@ -574,7 +594,7 @@
       /***/
     },
 
-    /***/ 8838: /***/ function (module, exports, __webpack_require__) {
+    /***/ 8341: /***/ function (module, exports, __webpack_require__) {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -587,7 +607,7 @@
         },
       });
       const _react = __webpack_require__(959);
-      const _requestidlecallback = __webpack_require__(9511);
+      const _requestidlecallback = __webpack_require__(1611);
       const hasIntersectionObserver =
         typeof IntersectionObserver === "function";
       const observers = new Map();
@@ -700,7 +720,7 @@
       /***/
     },
 
-    /***/ 7225: /***/ function (
+    /***/ 311: /***/ function (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -716,7 +736,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1527);
       /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(3639);
+        __webpack_require__(2075);
       /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_link__WEBPACK_IMPORTED_MODULE_1__
@@ -747,12 +767,12 @@
       /***/
     },
 
-    /***/ 3639: /***/ function (
+    /***/ 2075: /***/ function (
       module,
       __unused_webpack_exports,
       __webpack_require__
     ) {
-      module.exports = __webpack_require__(7192);
+      module.exports = __webpack_require__(987);
 
       /***/
     },
@@ -763,7 +783,7 @@
       return __webpack_require__((__webpack_require__.s = moduleId));
     };
     /******/ __webpack_require__.O(0, [2888, 9774, 179], function () {
-      return __webpack_exec__(1794);
+      return __webpack_exec__(8959);
     });
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for 3f784ff6-HASH.js

Diff too large to display

Diff for 6433-HASH.js

Diff too large to display

Diff for 8201-HASH.js
@@ -1,8 +1,8 @@
 "use strict";
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
-  [8201],
+  [2764],
   {
-    /***/ 8201: /***/ function (module, exports, __webpack_require__) {
+    /***/ 2764: /***/ function (module, exports, __webpack_require__) {
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
         value: true,
@@ -13,25 +13,25 @@
           return Image;
         },
       });
-      const _interop_require_default = __webpack_require__(9726);
-      const _interop_require_wildcard = __webpack_require__(8329);
-      const _jsxruntime = __webpack_require__(6435);
+      const _interop_require_default = __webpack_require__(9380);
+      const _interop_require_wildcard = __webpack_require__(2077);
+      const _jsxruntime = __webpack_require__(2260);
       const _react = /*#__PURE__*/ _interop_require_wildcard._(
-        __webpack_require__(8288)
+        __webpack_require__(4978)
       );
       const _reactdom = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(4364)
+        __webpack_require__(7)
       );
       const _head = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(9710)
+        __webpack_require__(5175)
       );
-      const _getimgprops = __webpack_require__(7489);
-      const _imageconfig = __webpack_require__(3358);
-      const _imageconfigcontextsharedruntime = __webpack_require__(4712);
-      const _warnonce = __webpack_require__(5226);
-      const _routercontextsharedruntime = __webpack_require__(9787);
+      const _getimgprops = __webpack_require__(7253);
+      const _imageconfig = __webpack_require__(6491);
+      const _imageconfigcontextsharedruntime = __webpack_require__(9382);
+      const _warnonce = __webpack_require__(3848);
+      const _routercontextsharedruntime = __webpack_require__(7897);
       const _imageloader = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(520)
+        __webpack_require__(3366)
       );
       // This is replaced by webpack define plugin
       const configEnv = {
@@ -53,7 +53,8 @@
         onLoadRef,
         onLoadingCompleteRef,
         setBlurComplete,
-        unoptimized
+        unoptimized,
+        sizesInput
       ) {
         const src = img == null ? void 0 : img.src;
         if (!img || img["data-loaded-src"] === src) {
@@ -149,6 +150,7 @@
             onLoadingCompleteRef,
             setBlurComplete,
             setShowAltText,
+            sizesInput,
             onLoad,
             onError,
             ...rest
@@ -203,7 +205,8 @@
                     onLoadRef,
                     onLoadingCompleteRef,
                     setBlurComplete,
-                    unoptimized
+                    unoptimized,
+                    sizesInput
                   );
                 }
               },
@@ -215,6 +218,7 @@
                 setBlurComplete,
                 onError,
                 unoptimized,
+                sizesInput,
                 forwardedRef,
               ]
             ),
@@ -226,7 +230,8 @@
                 onLoadRef,
                 onLoadingCompleteRef,
                 setBlurComplete,
-                unoptimized
+                unoptimized,
+                sizesInput
               );
             },
             onError: (event) => {
@@ -330,6 +335,7 @@
                 onLoadingCompleteRef: onLoadingCompleteRef,
                 setBlurComplete: setBlurComplete,
                 setShowAltText: setShowAltText,
+                sizesInput: props.sizes,
                 ref: forwardedRef,
               }),
               imgMeta.priority
@@ -357,7 +363,7 @@
       /***/
     },
 
-    /***/ 447: /***/ function (
+    /***/ 7121: /***/ function (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -371,9 +377,9 @@
           return AmpStateContext;
         },
       });
-      const _interop_require_default = __webpack_require__(9726);
+      const _interop_require_default = __webpack_require__(9380);
       const _react = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(8288)
+        __webpack_require__(4978)
       );
       const AmpStateContext = _react.default.createContext({});
       if (false) {
@@ -382,7 +388,7 @@
       /***/
     },
 
-    /***/ 7021: /***/ function (__unused_webpack_module, exports) {
+    /***/ 7960: /***/ function (__unused_webpack_module, exports) {
       Object.defineProperty(exports, "__esModule", {
         value: true,
       });
@@ -404,7 +410,7 @@
       /***/
     },
 
-    /***/ 7489: /***/ function (
+    /***/ 7253: /***/ function (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -418,9 +424,9 @@
           return getImgProps;
         },
       });
-      const _warnonce = __webpack_require__(5226);
-      const _imageblursvg = __webpack_require__(1355);
-      const _imageconfig = __webpack_require__(3358);
+      const _warnonce = __webpack_require__(3848);
+      const _imageblursvg = __webpack_require__(558);
+      const _imageconfig = __webpack_require__(6491);
       const VALID_LOADING_VALUES =
         /* unused pure expression or super */ null && [
           "lazy",
@@ -789,7 +795,7 @@
       /***/
     },
 
-    /***/ 9710: /***/ function (module, exports, __webpack_require__) {
+    /***/ 5175: /***/ function (module, exports, __webpack_require__) {
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
         value: true,
@@ -803,26 +809,26 @@
           });
       }
       _export(exports, {
-        defaultHead: function () {
-          return defaultHead;
-        },
         default: function () {
           return _default;
         },
+        defaultHead: function () {
+          return defaultHead;
+        },
       });
-      const _interop_require_default = __webpack_require__(9726);
-      const _interop_require_wildcard = __webpack_require__(8329);
-      const _jsxruntime = __webpack_require__(6435);
+      const _interop_require_default = __webpack_require__(9380);
+      const _interop_require_wildcard = __webpack_require__(2077);
+      const _jsxruntime = __webpack_require__(2260);
       const _react = /*#__PURE__*/ _interop_require_wildcard._(
-        __webpack_require__(8288)
+        __webpack_require__(4978)
       );
       const _sideeffect = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(1444)
+        __webpack_require__(5894)
       );
-      const _ampcontextsharedruntime = __webpack_require__(447);
-      const _headmanagercontextsharedruntime = __webpack_require__(7332);
-      const _ampmode = __webpack_require__(7021);
-      const _warnonce = __webpack_require__(5226);
+      const _ampcontextsharedruntime = __webpack_require__(7121);
+      const _headmanagercontextsharedruntime = __webpack_require__(5237);
+      const _ampmode = __webpack_require__(7960);
+      const _warnonce = __webpack_require__(3848);
       function defaultHead(inAmpMode) {
         if (inAmpMode === void 0) inAmpMode = false;
         const head = [
@@ -998,7 +1004,7 @@
       /***/
     },
 
-    /***/ 1355: /***/ function (__unused_webpack_module, exports) {
+    /***/ 558: /***/ function (__unused_webpack_module, exports) {
       /**
        * A shared function, used on both client and server, to generate a SVG blur placeholder.
        */
@@ -1052,7 +1058,7 @@
       /***/
     },
 
-    /***/ 4712: /***/ function (
+    /***/ 9382: /***/ function (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -1066,11 +1072,11 @@
           return ImageConfigContext;
         },
       });
-      const _interop_require_default = __webpack_require__(9726);
+      const _interop_require_default = __webpack_require__(9380);
       const _react = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(8288)
+        __webpack_require__(4978)
       );
-      const _imageconfig = __webpack_require__(3358);
+      const _imageconfig = __webpack_require__(6491);
       const ImageConfigContext = _react.default.createContext(
         _imageconfig.imageConfigDefault
       );
@@ -1080,7 +1086,7 @@
       /***/
     },
 
-    /***/ 3358: /***/ function (__unused_webpack_module, exports) {
+    /***/ 6491: /***/ function (__unused_webpack_module, exports) {
       Object.defineProperty(exports, "__esModule", {
         value: true,
       });
@@ -1127,7 +1133,7 @@
       /***/
     },
 
-    /***/ 520: /***/ function (__unused_webpack_module, exports) {
+    /***/ 3366: /***/ function (__unused_webpack_module, exports) {
       Object.defineProperty(exports, "__esModule", {
         value: true,
       });
@@ -1160,7 +1166,7 @@
       /***/
     },
 
-    /***/ 9787: /***/ function (
+    /***/ 7897: /***/ function (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -1174,9 +1180,9 @@
           return RouterContext;
         },
       });
-      const _interop_require_default = __webpack_require__(9726);
+      const _interop_require_default = __webpack_require__(9380);
       const _react = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(8288)
+        __webpack_require__(4978)
       );
       const RouterContext = _react.default.createContext(null);
       if (false) {
@@ -1185,7 +1191,7 @@
       /***/
     },
 
-    /***/ 1444: /***/ function (
+    /***/ 5894: /***/ function (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -1199,7 +1205,7 @@
           return SideEffect;
         },
       });
-      const _react = __webpack_require__(8288);
+      const _react = __webpack_require__(4978);
       const isServer = typeof window === "undefined";
       const useClientOnlyLayoutEffect = isServer
         ? () => {}
Diff for main-HASH.js

Diff too large to display

Diff for polyfills-HASH.js

Diff too large to display

Diff for webpack-HASH.js
@@ -219,7 +219,7 @@
     /******/ __webpack_require__.u = function (chunkId) {
       /******/ // return url for filenames based on template
       /******/ return (
-        "static/chunks/" + chunkId + "." + "59b55e4cd1bb86ee" + ".js"
+        "static/chunks/" + chunkId + "." + "82f59716e81715f7" + ".js"
       );
       /******/
     };
@@ -228,10 +228,10 @@
   /******/
   /******/ /* webpack/runtime/get mini-css chunk filename */
   /******/ !(function () {
-    /******/ // This function allow to reference all chunks
+    /******/ // This function allow to reference async chunks
     /******/ __webpack_require__.miniCssF = function (chunkId) {
       /******/ // return url for filenames based on template
-      /******/ return "static/css/" + "ded6b86ab9cc0a1f" + ".css";
+      /******/ return undefined;
       /******/
     };
     /******/
@@ -282,6 +282,7 @@
           /******/
         }
         /******/ script.setAttribute("data-webpack", dataWebpackPrefix + key);
+        /******/
         /******/ script.src = __webpack_require__.tu(url);
         /******/
       }
Diff for app-page-exp..ntime.dev.js
failed to diff
Diff for app-page-exp..time.prod.js

Diff too large to display

Diff for app-page-tur..time.prod.js

Diff too large to display

Diff for app-page-tur..time.prod.js

Diff too large to display

Diff for app-page.runtime.dev.js
failed to diff
Diff for app-page.runtime.prod.js

Diff too large to display

Diff for app-route-ex..ntime.dev.js

Diff too large to display

Diff for app-route-ex..time.prod.js

Diff too large to display

Diff for app-route-tu..time.prod.js

Diff too large to display

Diff for app-route-tu..time.prod.js

Diff too large to display

Diff for app-route.runtime.dev.js

Diff too large to display

Diff for app-route.ru..time.prod.js

Diff too large to display

Diff for pages-api-tu..time.prod.js

Diff too large to display

Diff for pages-api.runtime.dev.js

Diff too large to display

Diff for pages-api.ru..time.prod.js

Diff too large to display

Diff for pages-turbo...time.prod.js

Diff too large to display

Diff for pages.runtime.dev.js

Diff too large to display

Diff for pages.runtime.prod.js

Diff too large to display

Diff for server.runtime.prod.js

Diff too large to display

Please sign in to comment.