Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[metadata] new metadata insertion API and support PPR #75366

Merged
merged 14 commits into from
Feb 8, 2025

Conversation

huozhi
Copy link
Member

@huozhi huozhi commented Jan 27, 2025

What

  • We're introducing a new non-public API hook useServerInsertedMetadata internally for only inserting the metadata to rendered page.
  • Add PPR test cases

Why

We currently use the public API useServerInsertedHTML to insert streamed metadata, however that API has few flaws with PPR and contains too much logic for handling CSS-in-JS inserted html. For PPR it's not easy to get it work with it since there're server situatios in PPR such as different phases like "prerender" and "resume", then the different modes such as "static" and "partial static rendering". Not all of these cases we need to insert the metadata in the <head> which useServerInsertedHTML can do and has a lot of rendering tricks for it. After discussing with @gnoff that we'll leverage this new API to insert the streamed metadata, and then append them in the stream.

Another discussion about a case we're concerning it could happen but seems not possible, which is the metadata is inserted in prerender and get re-inserted during resume. In reality the metadata is next to the page element and react will still render the sibling metadata while the page itself is suspended. So that we always see it's included in prerender when metadata is static. We came up with a solution of saving "wether it's inserted in prerender" into postpone state, but it seems not necessary now. We have test cases covered. We'll gonna land this and see what's going on later. If there's any missing case of double inserted metadata, then we can revisit the postpone solution.

Closes NDX-705

@ijjk ijjk added created-by: Next.js team PRs by the Next.js team. type: next labels Jan 27, 2025
Copy link
Member Author

huozhi commented Jan 27, 2025

@ijjk
Copy link
Member

ijjk commented Jan 27, 2025

Tests Passed

@ijjk
Copy link
Member

ijjk commented Jan 27, 2025

Stats from current PR

Default Build (Increase detected ⚠️)
General
vercel/next.js canary vercel/next.js huozhi/01-24-metadata_insertion_helper Change
buildDuration 21.6s 22.5s ⚠️ +971ms
buildDurationCached 18.4s 15.6s N/A
nodeModulesSize 392 MB 392 MB N/A
nextStartRea..uration (ms) 472ms 477ms N/A
Client Bundles (main, webpack)
vercel/next.js canary vercel/next.js huozhi/01-24-metadata_insertion_helper Change
5306-HASH.js gzip 54.2 kB 54.1 kB N/A
8276.HASH.js gzip 169 B 168 B N/A
8377-HASH.js gzip 5.46 kB 5.46 kB N/A
bccd1874-HASH.js gzip 53 kB 52.9 kB N/A
framework-HASH.js gzip 57.5 kB 57.5 kB N/A
main-app-HASH.js gzip 241 B 246 B N/A
main-HASH.js gzip 34.5 kB 34.5 kB N/A
webpack-HASH.js gzip 1.71 kB 1.71 kB N/A
Overall change 0 B 0 B
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js huozhi/01-24-metadata_insertion_helper Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Overall change 39.4 kB 39.4 kB
Client Pages
vercel/next.js canary vercel/next.js huozhi/01-24-metadata_insertion_helper Change
_app-HASH.js gzip 193 B 193 B
_error-HASH.js gzip 193 B 193 B
amp-HASH.js gzip 512 B 510 B N/A
css-HASH.js gzip 343 B 342 B N/A
dynamic-HASH.js gzip 1.84 kB 1.84 kB
edge-ssr-HASH.js gzip 265 B 265 B
head-HASH.js gzip 363 B 362 B N/A
hooks-HASH.js gzip 393 B 392 B N/A
image-HASH.js gzip 4.59 kB 4.58 kB N/A
index-HASH.js gzip 268 B 268 B
link-HASH.js gzip 2.35 kB 2.35 kB N/A
routerDirect..HASH.js gzip 328 B 328 B
script-HASH.js gzip 397 B 397 B
withRouter-HASH.js gzip 323 B 326 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 3.59 kB 3.59 kB
Client Build Manifests
vercel/next.js canary vercel/next.js huozhi/01-24-metadata_insertion_helper Change
_buildManifest.js gzip 748 B 747 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary vercel/next.js huozhi/01-24-metadata_insertion_helper Change
index.html gzip 524 B 524 B
link.html gzip 539 B 538 B N/A
withRouter.html gzip 520 B 519 B N/A
Overall change 524 B 524 B
Edge SSR bundle Size Overall increase ⚠️
vercel/next.js canary vercel/next.js huozhi/01-24-metadata_insertion_helper Change
edge-ssr.js gzip 130 kB 130 kB ⚠️ +119 B
page.js gzip 211 kB 211 kB N/A
Overall change 130 kB 130 kB ⚠️ +119 B
Middleware size
vercel/next.js canary vercel/next.js huozhi/01-24-metadata_insertion_helper Change
middleware-b..fest.js gzip 675 B 674 B N/A
middleware-r..fest.js gzip 155 B 156 B N/A
middleware.js gzip 31.3 kB 31.3 kB N/A
edge-runtime..pack.js gzip 844 B 844 B
Overall change 844 B 844 B
Next Runtimes
vercel/next.js canary vercel/next.js huozhi/01-24-metadata_insertion_helper Change
app-page-exp...dev.js gzip 393 kB 393 kB N/A
app-page-exp..prod.js gzip 132 kB 132 kB N/A
app-page-tur..prod.js gzip 145 kB 145 kB N/A
app-page-tur..prod.js gzip 141 kB 141 kB N/A
app-page.run...dev.js gzip 381 kB 380 kB N/A
app-page.run..prod.js gzip 128 kB 128 kB N/A
app-route-ex...dev.js gzip 39.3 kB 39.3 kB N/A
app-route-ex..prod.js gzip 25.6 kB 25.6 kB N/A
app-route-tu..prod.js gzip 25.6 kB 25.6 kB N/A
app-route-tu..prod.js gzip 25.4 kB 25.4 kB N/A
app-route.ru...dev.js gzip 40.9 kB 40.8 kB N/A
app-route.ru..prod.js gzip 25.4 kB 25.4 kB N/A
dist_client_...dev.js gzip 356 B 356 B
dist_client_...dev.js gzip 349 B 349 B
pages-api-tu..prod.js gzip 9.69 kB 9.69 kB
pages-api.ru...dev.js gzip 11.8 kB 11.8 kB
pages-api.ru..prod.js gzip 9.68 kB 9.68 kB
pages-turbo...prod.js gzip 21.9 kB 21.9 kB
pages.runtim...dev.js gzip 31.5 kB 31.5 kB
pages.runtim..prod.js gzip 21.9 kB 21.9 kB
server.runti..prod.js gzip 60.5 kB 60.6 kB N/A
Overall change 107 kB 107 kB
build cache Overall increase ⚠️
vercel/next.js canary vercel/next.js huozhi/01-24-metadata_insertion_helper Change
0.pack gzip 2.11 MB 2.11 MB ⚠️ +5.59 kB
index.pack gzip 74.5 kB 76.4 kB ⚠️ +1.9 kB
Overall change 2.18 MB 2.19 MB ⚠️ +7.49 kB
Diff details
Diff for page.js
@@ -15,7 +15,7 @@
       /***/
     },
 
-    /***/ 9476: /***/ (
+    /***/ 846: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -30,7 +30,7 @@
         default: () => /* binding */ nHandler,
       });
 
-      // NAMESPACE OBJECT: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapp-edge-ssr%2Fpage&page=%2Fapp-edge-ssr%2Fpage&pagePath=private-next-app-dir%2Fapp-edge-ssr%2Fpage.js&appDir=%2Ftmp%2Fnext-statsbhh2E0%2Fstats-app%2Fapp&appPaths=%2Fapp-edge-ssr%2Fpage&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!./app/app-edge-ssr/page.js?__next_edge_ssr_entry__
+      // NAMESPACE OBJECT: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapp-edge-ssr%2Fpage&page=%2Fapp-edge-ssr%2Fpage&pagePath=private-next-app-dir%2Fapp-edge-ssr%2Fpage.js&appDir=%2Ftmp%2Fnext-statsbhh2E0%2Fstats-app%2Fapp&appPaths=%2Fapp-edge-ssr%2Fpage&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!./app/app-edge-ssr/page.js?__next_edge_ssr_entry__
       var page_next_edge_ssr_entry_namespaceObject = {};
       __webpack_require__.r(page_next_edge_ssr_entry_namespaceObject);
       __webpack_require__.d(page_next_edge_ssr_entry_namespaceObject, {
@@ -84,45 +84,45 @@
         workUnitAsyncStorage: () => entry_base /* workUnitAsyncStorage */.FP,
       });
 
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/cache-handlers/default.js
-      var cache_handlers_default = __webpack_require__(8386);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/web/globals.js
-      var globals = __webpack_require__(7091);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/web/adapter.js + 3 modules
-      var adapter = __webpack_require__(3943);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/build/webpack/loaders/next-edge-ssr-loader/render.js + 86 modules
-      var render = __webpack_require__(7203);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/lib/incremental-cache/index.js + 4 modules
-      var incremental_cache = __webpack_require__(974);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/app-render/app-render.js + 66 modules
-      var app_render = __webpack_require__(5712);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/route-modules/app-page/module.compiled.js
-      var module_compiled = __webpack_require__(6381);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/route-kind.js
-      var route_kind = __webpack_require__(5066);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/client/components/error-boundary.js
-      var error_boundary = __webpack_require__(564);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/app-render/entry-base.js + 25 modules
-      var entry_base = __webpack_require__(547); // ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapp-edge-ssr%2Fpage&page=%2Fapp-edge-ssr%2Fpage&pagePath=private-next-app-dir%2Fapp-edge-ssr%2Fpage.js&appDir=%2Ftmp%2Fnext-statsbhh2E0%2Fstats-app%2Fapp&appPaths=%2Fapp-edge-ssr%2Fpage&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!./app/app-edge-ssr/page.js?__next_edge_ssr_entry__
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/cache-handlers/default.js
+      var cache_handlers_default = __webpack_require__(5912);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/web/globals.js
+      var globals = __webpack_require__(3149);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/web/adapter.js + 3 modules
+      var adapter = __webpack_require__(1937);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/build/webpack/loaders/next-edge-ssr-loader/render.js + 86 modules
+      var render = __webpack_require__(6269);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/lib/incremental-cache/index.js + 4 modules
+      var incremental_cache = __webpack_require__(9908);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/app-render/app-render.js + 67 modules
+      var app_render = __webpack_require__(8678);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/route-modules/app-page/module.compiled.js
+      var module_compiled = __webpack_require__(4075);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/route-kind.js
+      var route_kind = __webpack_require__(3716);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/client/components/error-boundary.js
+      var error_boundary = __webpack_require__(7238);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/app-render/entry-base.js + 26 modules
+      var entry_base = __webpack_require__(2929); // ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapp-edge-ssr%2Fpage&page=%2Fapp-edge-ssr%2Fpage&pagePath=private-next-app-dir%2Fapp-edge-ssr%2Fpage.js&appDir=%2Ftmp%2Fnext-statsbhh2E0%2Fstats-app%2Fapp&appPaths=%2Fapp-edge-ssr%2Fpage&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!./app/app-edge-ssr/page.js?__next_edge_ssr_entry__
       const module0 = () =>
         Promise.resolve(/* import() eager */).then(
-          __webpack_require__.bind(__webpack_require__, 985)
+          __webpack_require__.bind(__webpack_require__, 6377)
         );
       const module1 = () =>
         Promise.resolve(/* import() eager */).then(
-          __webpack_require__.bind(__webpack_require__, 3888)
+          __webpack_require__.bind(__webpack_require__, 3106)
         );
       const module2 = () =>
         Promise.resolve(/* import() eager */).then(
-          __webpack_require__.bind(__webpack_require__, 105)
+          __webpack_require__.bind(__webpack_require__, 5587)
         );
       const module3 = () =>
         Promise.resolve(/* import() eager */).then(
-          __webpack_require__.bind(__webpack_require__, 3606)
+          __webpack_require__.bind(__webpack_require__, 4088)
         );
       const page4 = () =>
         Promise.resolve(/* import() eager */).then(
-          __webpack_require__.bind(__webpack_require__, 5587)
+          __webpack_require__.bind(__webpack_require__, 4803)
         );
 
       // We inject the tree and pages here so that we can use them in the route
@@ -190,14 +190,14 @@
       });
 
       //# sourceMappingURL=app-page.js.map
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/lib/page-types.js
-      var page_types = __webpack_require__(4321);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/app-render/encryption-utils.js
-      var encryption_utils = __webpack_require__(7699);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/app-render/action-utils.js
-      var action_utils = __webpack_require__(2915);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/use-cache/constants.js
-      var constants = __webpack_require__(8412); // ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/webpack/loaders/next-edge-ssr-loader/index.js?{"absolute500Path":"","absoluteAppPath":"next/dist/pages/_app","absoluteDocumentPath":"next/dist/pages/_document","absoluteErrorPath":"next/dist/pages/_error","absolutePagePath":"private-next-app-dir/app-edge-ssr/page.js","dev":false,"isServerComponent":true,"page":"/app-edge-ssr/page","stringifiedConfig":"eyJlbnYiOnt9LCJlc2xpbnQiOnsiaWdub3JlRHVyaW5nQnVpbGRzIjpmYWxzZX0sInR5cGVzY3JpcHQiOnsiaWdub3JlQnVpbGRFcnJvcnMiOmZhbHNlLCJ0c2NvbmZpZ1BhdGgiOiJ0c2NvbmZpZy5qc29uIn0sImRpc3REaXIiOiIubmV4dCIsImNsZWFuRGlzdERpciI6dHJ1ZSwiYXNzZXRQcmVmaXgiOiIiLCJjYWNoZU1heE1lbW9yeVNpemUiOjUyNDI4ODAwLCJjb25maWdPcmlnaW4iOiJuZXh0LmNvbmZpZy5qcyIsInVzZUZpbGVTeXN0ZW1QdWJsaWNSb3V0ZXMiOnRydWUsImdlbmVyYXRlRXRhZ3MiOnRydWUsInBhZ2VFeHRlbnNpb25zIjpbInRzeCIsInRzIiwianN4IiwianMiXSwicG93ZXJlZEJ5SGVhZGVyIjp0cnVlLCJjb21wcmVzcyI6dHJ1ZSwiaW1hZ2VzIjp7ImRldmljZVNpemVzIjpbNjQwLDc1MCw4MjgsMTA4MCwxMjAwLDE5MjAsMjA0OCwzODQwXSwiaW1hZ2VTaXplcyI6WzE2LDMyLDQ4LDY0LDk2LDEyOCwyNTYsMzg0XSwicGF0aCI6Ii9fbmV4dC9pbWFnZSIsImxvYWRlciI6ImRlZmF1bHQiLCJsb2FkZXJGaWxlIjoiIiwiZG9tYWlucyI6W10sImRpc2FibGVTdGF0aWNJbWFnZXMiOmZhbHNlLCJtaW5pbXVtQ2FjaGVUVEwiOjYwLCJmb3JtYXRzIjpbImltYWdlL3dlYnAiXSwiZGFuZ2Vyb3VzbHlBbGxvd1NWRyI6ZmFsc2UsImNvbnRlbnRTZWN1cml0eVBvbGljeSI6InNjcmlwdC1zcmMgJ25vbmUnOyBmcmFtZS1zcmMgJ25vbmUnOyBzYW5kYm94OyIsImNvbnRlbnREaXNwb3NpdGlvblR5cGUiOiJhdHRhY2htZW50IiwicmVtb3RlUGF0dGVybnMiOltdLCJ1bm9wdGltaXplZCI6ZmFsc2V9LCJkZXZJbmRpY2F0b3JzIjp7ImFwcElzclN0YXR1cyI6dHJ1ZSwiYnVpbGRBY3Rpdml0eSI6dHJ1ZSwiYnVpbGRBY3Rpdml0eVBvc2l0aW9uIjoiYm90dG9tLXJpZ2h0In0sIm9uRGVtYW5kRW50cmllcyI6eyJtYXhJbmFjdGl2ZUFnZSI6NjAwMDAsInBhZ2VzQnVmZmVyTGVuZ3RoIjo1fSwiYW1wIjp7ImNhbm9uaWNhbEJhc2UiOiIifSwiYmFzZVBhdGgiOiIiLCJzYXNzT3B0aW9ucyI6e30sInRyYWlsaW5nU2xhc2giOmZhbHNlLCJpMThuIjpudWxsLCJwcm9kdWN0aW9uQnJvd3NlclNvdXJjZU1hcHMiOmZhbHNlLCJleGNsdWRlRGVmYXVsdE1vbWVudExvY2FsZXMiOnRydWUsInNlcnZlclJ1bnRpbWVDb25maWciOnt9LCJwdWJsaWNSdW50aW1lQ29uZmlnIjp7fSwicmVhY3RQcm9kdWN0aW9uUHJvZmlsaW5nIjpmYWxzZSwicmVhY3RTdHJpY3RNb2RlIjpudWxsLCJyZWFjdE1heEhlYWRlcnNMZW5ndGgiOjYwMDAsImh0dHBBZ2VudE9wdGlvbnMiOnsia2VlcEFsaXZlIjp0cnVlfSwibG9nZ2luZyI6e30sImV4cGlyZVRpbWUiOjMxNTM2MDAwLCJzdGF0aWNQYWdlR2VuZXJhdGlvblRpbWVvdXQiOjYwLCJtb2R1bGFyaXplSW1wb3J0cyI6eyJAbXVpL2ljb25zLW1hdGVyaWFsIjp7InRyYW5zZm9ybSI6IkBtdWkvaWNvbnMtbWF0ZXJpYWwve3ttZW1iZXJ9fSJ9LCJsb2Rhc2giOnsidHJhbnNmb3JtIjoibG9kYXNoL3t7bWVtYmVyfX0ifX0sIm91dHB1dEZpbGVUcmFjaW5nUm9vdCI6Ii90bXAvbmV4dC1zdGF0c2JoaDJFMC9zdGF0cy1hcHAiLCJleHBlcmltZW50YWwiOnsibm9kZU1pZGRsZXdhcmUiOmZhbHNlLCJjYWNoZUxpZmUiOnsiZGVmYXVsdCI6eyJzdGFsZSI6MzAwLCJyZXZhbGlkYXRlIjo5MDAsImV4cGlyZSI6NDI5NDk2NzI5NH0sInNlY29uZHMiOnsic3RhbGUiOjAsInJldmFsaWRhdGUiOjEsImV4cGlyZSI6NjB9LCJtaW51dGVzIjp7InN0YWxlIjozMDAsInJldmFsaWRhdGUiOjYwLCJleHBpcmUiOjM2MDB9LCJob3VycyI6eyJzdGFsZSI6MzAwLCJyZXZhbGlkYXRlIjozNjAwLCJleHBpcmUiOjg2NDAwfSwiZGF5cyI6eyJzdGFsZSI6MzAwLCJyZXZhbGlkYXRlIjo4NjQwMCwiZXhwaXJlIjo2MDQ4MDB9LCJ3ZWVrcyI6eyJzdGFsZSI6MzAwLCJyZXZhbGlkYXRlIjo2MDQ4MDAsImV4cGlyZSI6MjU5MjAwMH0sIm1heCI6eyJzdGFsZSI6MzAwLCJyZXZhbGlkYXRlIjoyNTkyMDAwLCJleHBpcmUiOjQyOTQ5NjcyOTR9fSwiY2FjaGVIYW5kbGVycyI6e30sImNzc0NodW5raW5nIjp0cnVlLCJtdWx0aVpvbmVEcmFmdE1vZGUiOmZhbHNlLCJhcHBOYXZGYWlsSGFuZGxpbmciOmZhbHNlLCJwcmVyZW5kZXJFYXJseUV4aXQiOnRydWUsInNlcnZlck1pbmlmaWNhdGlvbiI6dHJ1ZSwic2VydmVyU291cmNlTWFwcyI6ZmFsc2UsImxpbmtOb1RvdWNoU3RhcnQiOmZhbHNlLCJjYXNlU2Vuc2l0aXZlUm91dGVzIjpmYWxzZSwiY2xpZW50U2VnbWVudENhY2hlIjpmYWxzZSwicHJlbG9hZEVudHJpZXNPblN0YXJ0Ijp0cnVlLCJjbGllbnRSb3V0ZXJGaWx0ZXIiOnRydWUsImNsaWVudFJvdXRlckZpbHRlclJlZGlyZWN0cyI6ZmFsc2UsImZldGNoQ2FjaGVLZXlQcmVmaXgiOiIiLCJtaWRkbGV3YXJlUHJlZmV0Y2giOiJmbGV4aWJsZSIsIm9wdGltaXN0aWNDbGllbnRDYWNoZSI6dHJ1ZSwibWFudWFsQ2xpZW50QmFzZVBhdGgiOmZhbHNlLCJjcHVzIjoxOSwibWVtb3J5QmFzZWRXb3JrZXJzQ291bnQiOmZhbHNlLCJpbWdPcHRDb25jdXJyZW5jeSI6bnVsbCwiaW1nT3B0VGltZW91dEluU2Vjb25kcyI6NywiaW1nT3B0TWF4SW5wdXRQaXhlbHMiOjI2ODQwMjY4OSwiaW1nT3B0U2VxdWVudGlhbFJlYWQiOm51bGwsImlzckZsdXNoVG9EaXNrIjp0cnVlLCJ3b3JrZXJUaHJlYWRzIjpmYWxzZSwib3B0aW1pemVDc3MiOmZhbHNlLCJuZXh0U2NyaXB0V29ya2VycyI6ZmFsc2UsInNjcm9sbFJlc3RvcmF0aW9uIjpmYWxzZSwiZXh0ZXJuYWxEaXIiOmZhbHNlLCJkaXNhYmxlT3B0aW1pemVkTG9hZGluZyI6ZmFsc2UsImd6aXBTaXplIjp0cnVlLCJjcmFDb21wYXQiOmZhbHNlLCJlc21FeHRlcm5hbHMiOnRydWUsImZ1bGx5U3BlY2lmaWVkIjpmYWxzZSwic3djVHJhY2VQcm9maWxpbmciOmZhbHNlLCJmb3JjZVN3Y1RyYW5zZm9ybXMiOmZhbHNlLCJsYXJnZVBhZ2VEYXRhQnl0ZXMiOjEyODAwMCwidHVyYm8iOnsicm9vdCI6Ii90bXAvbmV4dC1zdGF0c2JoaDJFMC9zdGF0cy1hcHAifSwidHlwZWRSb3V0ZXMiOmZhbHNlLCJ0eXBlZEVudiI6ZmFsc2UsInBhcmFsbGVsU2VydmVyQ29tcGlsZXMiOmZhbHNlLCJwYXJhbGxlbFNlcnZlckJ1aWxkVHJhY2VzIjpmYWxzZSwicHByIjpmYWxzZSwiYXV0aEludGVycnVwdHMiOmZhbHNlLCJyZWFjdE93bmVyU3RhY2siOmZhbHNlLCJ3ZWJwYWNrTWVtb3J5T3B0aW1pemF0aW9ucyI6ZmFsc2UsIm9wdGltaXplU2VydmVyUmVhY3QiOnRydWUsInVzZUVhcmx5SW1wb3J0IjpmYWxzZSwidmlld1RyYW5zaXRpb24iOmZhbHNlLCJzdGFsZVRpbWVzIjp7ImR5bmFtaWMiOjAsInN0YXRpYyI6MzAwfSwic2VydmVyQ29tcG9uZW50c0htckNhY2hlIjp0cnVlLCJzdGF0aWNHZW5lcmF0aW9uTWF4Q29uY3VycmVuY3kiOjgsInN0YXRpY0dlbmVyYXRpb25NaW5QYWdlc1BlcldvcmtlciI6MjUsImR5bmFtaWNJTyI6ZmFsc2UsImlubGluZUNzcyI6ZmFsc2UsIm5ld0Rldk92ZXJsYXkiOmZhbHNlLCJzdHJlYW1pbmdNZXRhZGF0YSI6ZmFsc2UsImh0bWxMaW1pdGVkQm90cyI6Ik1lZGlhcGFydG5lcnMtR29vZ2xlfFNsdXJwfER1Y2tEdWNrQm90fGJhaWR1c3BpZGVyfHlhbmRleHxzb2dvdXxiaXRseWJvdHx0dW1ibHJ8dmtTaGFyZXxxdW9yYSBsaW5rIHByZXZpZXd8cmVkZGl0Ym90fGlhX2FyY2hpdmVyfEJpbmdib3R8QmluZ1ByZXZpZXd8YXBwbGVib3R8ZmFjZWJvb2tleHRlcm5hbGhpdHxmYWNlYm9va2NhdGFsb2d8VHdpdHRlcmJvdHxMaW5rZWRJbkJvdHxTbGFja2JvdHxEaXNjb3JkYm90fFdoYXRzQXBwfFNreXBlVXJpUHJldmlldyIsInVzZUNhY2hlIjpmYWxzZSwib3B0aW1pemVQYWNrYWdlSW1wb3J0cyI6WyJsdWNpZGUtcmVhY3QiLCJkYXRlLWZucyIsImxvZGFzaC1lcyIsInJhbWRhIiwiYW50ZCIsInJlYWN0LWJvb3RzdHJhcCIsImFob29rcyIsIkBhbnQtZGVzaWduL2ljb25zIiwiQGhlYWRsZXNzdWkvcmVhY3QiLCJAaGVhZGxlc3N1aS1mbG9hdC9yZWFjdCIsIkBoZXJvaWNvbnMvcmVhY3QvMjAvc29saWQiLCJAaGVyb2ljb25zL3JlYWN0LzI0L3NvbGlkIiwiQGhlcm9pY29ucy9yZWFjdC8yNC9vdXRsaW5lIiwiQHZpc3gvdmlzeCIsIkB0cmVtb3IvcmVhY3QiLCJyeGpzIiwiQG11aS9tYXRlcmlhbCIsIkBtdWkvaWNvbnMtbWF0ZXJpYWwiLCJyZWNoYXJ0cyIsInJlYWN0LXVzZSIsImVmZmVjdCIsIkBlZmZlY3Qvc2NoZW1hIiwiQGVmZmVjdC9wbGF0Zm9ybSIsIkBlZmZlY3QvcGxhdGZvcm0tbm9kZSIsIkBlZmZlY3QvcGxhdGZvcm0tYnJvd3NlciIsIkBlZmZlY3QvcGxhdGZvcm0tYnVuIiwiQGVmZmVjdC9zcWwiLCJAZWZmZWN0L3NxbC1tc3NxbCIsIkBlZmZlY3Qvc3FsLW15c3FsMiIsIkBlZmZlY3Qvc3FsLXBnIiwiQGVmZmVjdC9zcWwtc3F1bGl0ZS1ub2RlIiwiQGVmZmVjdC9zcWwtc3F1bGl0ZS1idW4iLCJAZWZmZWN0L3NxbC1zcXVsaXRlLXdhc20iLCJAZWZmZWN0L3NxbC1zcXVsaXRlLXJlYWN0LW5hdGl2ZSIsIkBlZmZlY3QvcnBjIiwiQGVmZmVjdC9ycGMtaHR0cCIsIkBlZmZlY3QvdHlwZWNsYXNzIiwiQGVmZmVjdC9leHBlcmltZW50YWwiLCJAZWZmZWN0L29wZW50ZWxlbWV0cnkiLCJAbWF0ZXJpYWwtdWkvY29yZSIsIkBtYXRlcmlhbC11aS9pY29ucyIsIkB0YWJsZXIvaWNvbnMtcmVhY3QiLCJtdWktY29yZSIsInJlYWN0LWljb25zL2FpIiwicmVhY3QtaWNvbnMvYmkiLCJyZWFjdC1pY29ucy9icyIsInJlYWN0LWljb25zL2NnIiwicmVhY3QtaWNvbnMvY2kiLCJyZWFjdC1pY29ucy9kaSIsInJlYWN0LWljb25zL2ZhIiwicmVhY3QtaWNvbnMvZmE2IiwicmVhY3QtaWNvbnMvZmMiLCJyZWFjdC1pY29ucy9maSIsInJlYWN0LWljb25zL2dpIiwicmVhY3QtaWNvbnMvZ28iLCJyZWFjdC1pY29ucy9nciIsInJlYWN0LWljb25zL2hpIiwicmVhY3QtaWNvbnMvaGkyIiwicmVhY3QtaWNvbnMvaW0iLCJyZWFjdC1pY29ucy9pbyIsInJlYWN0LWljb25zL2lvNSIsInJlYWN0LWljb25zL2xpYSIsInJlYWN0LWljb25zL2xpYiIsInJlYWN0LWljb25zL2x1IiwicmVhY3QtaWNvbnMvbWQiLCJyZWFjdC1pY29ucy9waSIsInJlYWN0LWljb25zL3JpIiwicmVhY3QtaWNvbnMvcngiLCJyZWFjdC1pY29ucy9zaSIsInJlYWN0LWljb25zL3NsIiwicmVhY3QtaWNvbnMvdGIiLCJyZWFjdC1pY29ucy90ZmkiLCJyZWFjdC1pY29ucy90aSIsInJlYWN0LWljb25zL3ZzYyIsInJlYWN0LWljb25zL3dpIl19LCJidW5kbGVQYWdlc1JvdXRlckRlcGVuZGVuY2llcyI6ZmFsc2UsImNvbmZpZ0ZpbGUiOiIvdG1wL25leHQtc3RhdHNiaGgyRTAvc3RhdHMtYXBwL25leHQuY29uZmlnLmpzIiwiY29uZmlnRmlsZU5hbWUiOiJuZXh0LmNvbmZpZy5qcyJ9","pagesType":"app","appDirLoader":"bmV4dC1hcHAtbG9hZGVyP25hbWU9YXBwJTJGYXBwLWVkZ2Utc3NyJTJGcGFnZSZwYWdlPSUyRmFwcC1lZGdlLXNzciUyRnBhZ2UmcGFnZVBhdGg9cHJpdmF0ZS1uZXh0LWFwcC1kaXIlMkZhcHAtZWRnZS1zc3IlMkZwYWdlLmpzJmFwcERpcj0lMkZ0bXAlMkZuZXh0LXN0YXRzYmhoMkUwJTJGc3RhdHMtYXBwJTJGYXBwJmFwcFBhdGhzPSUyRmFwcC1lZGdlLXNzciUyRnBhZ2UmcGFnZUV4dGVuc2lvbnM9dHN4JnBhZ2VFeHRlbnNpb25zPXRzJnBhZ2VFeHRlbnNpb25zPWpzeCZwYWdlRXh0ZW5zaW9ucz1qcyZiYXNlUGF0aD0mYXNzZXRQcmVmaXg9Jm5leHRDb25maWdPdXRwdXQ9JnByZWZlcnJlZFJlZ2lvbj0mbWlkZGxld2FyZUNvbmZpZz1lMzAlM0Qh","sriEnabled":false,"middlewareConfig":"e30=","cacheHandlers":"{}"}!
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/lib/page-types.js
+      var page_types = __webpack_require__(1339);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/app-render/encryption-utils.js
+      var encryption_utils = __webpack_require__(9214);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/app-render/action-utils.js
+      var action_utils = __webpack_require__(4673);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/esm/server/use-cache/constants.js
+      var constants = __webpack_require__(5130); // ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/webpack/loaders/next-edge-ssr-loader/index.js?{"absolute500Path":"","absoluteAppPath":"next/dist/pages/_app","absoluteDocumentPath":"next/dist/pages/_document","absoluteErrorPath":"next/dist/pages/_error","absolutePagePath":"private-next-app-dir/app-edge-ssr/page.js","dev":false,"isServerComponent":true,"page":"/app-edge-ssr/page","stringifiedConfig":"eyJlbnYiOnt9LCJlc2xpbnQiOnsiaWdub3JlRHVyaW5nQnVpbGRzIjpmYWxzZX0sInR5cGVzY3JpcHQiOnsiaWdub3JlQnVpbGRFcnJvcnMiOmZhbHNlLCJ0c2NvbmZpZ1BhdGgiOiJ0c2NvbmZpZy5qc29uIn0sImRpc3REaXIiOiIubmV4dCIsImNsZWFuRGlzdERpciI6dHJ1ZSwiYXNzZXRQcmVmaXgiOiIiLCJjYWNoZU1heE1lbW9yeVNpemUiOjUyNDI4ODAwLCJjb25maWdPcmlnaW4iOiJuZXh0LmNvbmZpZy5qcyIsInVzZUZpbGVTeXN0ZW1QdWJsaWNSb3V0ZXMiOnRydWUsImdlbmVyYXRlRXRhZ3MiOnRydWUsInBhZ2VFeHRlbnNpb25zIjpbInRzeCIsInRzIiwianN4IiwianMiXSwicG93ZXJlZEJ5SGVhZGVyIjp0cnVlLCJjb21wcmVzcyI6dHJ1ZSwiaW1hZ2VzIjp7ImRldmljZVNpemVzIjpbNjQwLDc1MCw4MjgsMTA4MCwxMjAwLDE5MjAsMjA0OCwzODQwXSwiaW1hZ2VTaXplcyI6WzE2LDMyLDQ4LDY0LDk2LDEyOCwyNTYsMzg0XSwicGF0aCI6Ii9fbmV4dC9pbWFnZSIsImxvYWRlciI6ImRlZmF1bHQiLCJsb2FkZXJGaWxlIjoiIiwiZG9tYWlucyI6W10sImRpc2FibGVTdGF0aWNJbWFnZXMiOmZhbHNlLCJtaW5pbXVtQ2FjaGVUVEwiOjYwLCJmb3JtYXRzIjpbImltYWdlL3dlYnAiXSwiZGFuZ2Vyb3VzbHlBbGxvd1NWRyI6ZmFsc2UsImNvbnRlbnRTZWN1cml0eVBvbGljeSI6InNjcmlwdC1zcmMgJ25vbmUnOyBmcmFtZS1zcmMgJ25vbmUnOyBzYW5kYm94OyIsImNvbnRlbnREaXNwb3NpdGlvblR5cGUiOiJhdHRhY2htZW50IiwicmVtb3RlUGF0dGVybnMiOltdLCJ1bm9wdGltaXplZCI6ZmFsc2V9LCJkZXZJbmRpY2F0b3JzIjp7ImFwcElzclN0YXR1cyI6dHJ1ZSwiYnVpbGRBY3Rpdml0eSI6dHJ1ZSwiYnVpbGRBY3Rpdml0eVBvc2l0aW9uIjoiYm90dG9tLXJpZ2h0In0sIm9uRGVtYW5kRW50cmllcyI6eyJtYXhJbmFjdGl2ZUFnZSI6NjAwMDAsInBhZ2VzQnVmZmVyTGVuZ3RoIjo1fSwiYW1wIjp7ImNhbm9uaWNhbEJhc2UiOiIifSwiYmFzZVBhdGgiOiIiLCJzYXNzT3B0aW9ucyI6e30sInRyYWlsaW5nU2xhc2giOmZhbHNlLCJpMThuIjpudWxsLCJwcm9kdWN0aW9uQnJvd3NlclNvdXJjZU1hcHMiOmZhbHNlLCJleGNsdWRlRGVmYXVsdE1vbWVudExvY2FsZXMiOnRydWUsInNlcnZlclJ1bnRpbWVDb25maWciOnt9LCJwdWJsaWNSdW50aW1lQ29uZmlnIjp7fSwicmVhY3RQcm9kdWN0aW9uUHJvZmlsaW5nIjpmYWxzZSwicmVhY3RTdHJpY3RNb2RlIjpudWxsLCJyZWFjdE1heEhlYWRlcnNMZW5ndGgiOjYwMDAsImh0dHBBZ2VudE9wdGlvbnMiOnsia2VlcEFsaXZlIjp0cnVlfSwibG9nZ2luZyI6e30sImV4cGlyZVRpbWUiOjMxNTM2MDAwLCJzdGF0aWNQYWdlR2VuZXJhdGlvblRpbWVvdXQiOjYwLCJtb2R1bGFyaXplSW1wb3J0cyI6eyJAbXVpL2ljb25zLW1hdGVyaWFsIjp7InRyYW5zZm9ybSI6IkBtdWkvaWNvbnMtbWF0ZXJpYWwve3ttZW1iZXJ9fSJ9LCJsb2Rhc2giOnsidHJhbnNmb3JtIjoibG9kYXNoL3t7bWVtYmVyfX0ifX0sIm91dHB1dEZpbGVUcmFjaW5nUm9vdCI6Ii90bXAvbmV4dC1zdGF0c2JoaDJFMC9zdGF0cy1hcHAiLCJleHBlcmltZW50YWwiOnsibm9kZU1pZGRsZXdhcmUiOmZhbHNlLCJjYWNoZUxpZmUiOnsiZGVmYXVsdCI6eyJzdGFsZSI6MzAwLCJyZXZhbGlkYXRlIjo5MDAsImV4cGlyZSI6NDI5NDk2NzI5NH0sInNlY29uZHMiOnsic3RhbGUiOjAsInJldmFsaWRhdGUiOjEsImV4cGlyZSI6NjB9LCJtaW51dGVzIjp7InN0YWxlIjozMDAsInJldmFsaWRhdGUiOjYwLCJleHBpcmUiOjM2MDB9LCJob3VycyI6eyJzdGFsZSI6MzAwLCJyZXZhbGlkYXRlIjozNjAwLCJleHBpcmUiOjg2NDAwfSwiZGF5cyI6eyJzdGFsZSI6MzAwLCJyZXZhbGlkYXRlIjo4NjQwMCwiZXhwaXJlIjo2MDQ4MDB9LCJ3ZWVrcyI6eyJzdGFsZSI6MzAwLCJyZXZhbGlkYXRlIjo2MDQ4MDAsImV4cGlyZSI6MjU5MjAwMH0sIm1heCI6eyJzdGFsZSI6MzAwLCJyZXZhbGlkYXRlIjoyNTkyMDAwLCJleHBpcmUiOjQyOTQ5NjcyOTR9fSwiY2FjaGVIYW5kbGVycyI6e30sImNzc0NodW5raW5nIjp0cnVlLCJtdWx0aVpvbmVEcmFmdE1vZGUiOmZhbHNlLCJhcHBOYXZGYWlsSGFuZGxpbmciOmZhbHNlLCJwcmVyZW5kZXJFYXJseUV4aXQiOnRydWUsInNlcnZlck1pbmlmaWNhdGlvbiI6dHJ1ZSwic2VydmVyU291cmNlTWFwcyI6ZmFsc2UsImxpbmtOb1RvdWNoU3RhcnQiOmZhbHNlLCJjYXNlU2Vuc2l0aXZlUm91dGVzIjpmYWxzZSwiY2xpZW50U2VnbWVudENhY2hlIjpmYWxzZSwicHJlbG9hZEVudHJpZXNPblN0YXJ0Ijp0cnVlLCJjbGllbnRSb3V0ZXJGaWx0ZXIiOnRydWUsImNsaWVudFJvdXRlckZpbHRlclJlZGlyZWN0cyI6ZmFsc2UsImZldGNoQ2FjaGVLZXlQcmVmaXgiOiIiLCJtaWRkbGV3YXJlUHJlZmV0Y2giOiJmbGV4aWJsZSIsIm9wdGltaXN0aWNDbGllbnRDYWNoZSI6dHJ1ZSwibWFudWFsQ2xpZW50QmFzZVBhdGgiOmZhbHNlLCJjcHVzIjoxOSwibWVtb3J5QmFzZWRXb3JrZXJzQ291bnQiOmZhbHNlLCJpbWdPcHRDb25jdXJyZW5jeSI6bnVsbCwiaW1nT3B0VGltZW91dEluU2Vjb25kcyI6NywiaW1nT3B0TWF4SW5wdXRQaXhlbHMiOjI2ODQwMjY4OSwiaW1nT3B0U2VxdWVudGlhbFJlYWQiOm51bGwsImlzckZsdXNoVG9EaXNrIjp0cnVlLCJ3b3JrZXJUaHJlYWRzIjpmYWxzZSwib3B0aW1pemVDc3MiOmZhbHNlLCJuZXh0U2NyaXB0V29ya2VycyI6ZmFsc2UsInNjcm9sbFJlc3RvcmF0aW9uIjpmYWxzZSwiZXh0ZXJuYWxEaXIiOmZhbHNlLCJkaXNhYmxlT3B0aW1pemVkTG9hZGluZyI6ZmFsc2UsImd6aXBTaXplIjp0cnVlLCJjcmFDb21wYXQiOmZhbHNlLCJlc21FeHRlcm5hbHMiOnRydWUsImZ1bGx5U3BlY2lmaWVkIjpmYWxzZSwic3djVHJhY2VQcm9maWxpbmciOmZhbHNlLCJmb3JjZVN3Y1RyYW5zZm9ybXMiOmZhbHNlLCJsYXJnZVBhZ2VEYXRhQnl0ZXMiOjEyODAwMCwidHVyYm8iOnsicm9vdCI6Ii90bXAvbmV4dC1zdGF0c2JoaDJFMC9zdGF0cy1hcHAifSwidHlwZWRSb3V0ZXMiOmZhbHNlLCJ0eXBlZEVudiI6ZmFsc2UsInBhcmFsbGVsU2VydmVyQ29tcGlsZXMiOmZhbHNlLCJwYXJhbGxlbFNlcnZlckJ1aWxkVHJhY2VzIjpmYWxzZSwicHByIjpmYWxzZSwiYXV0aEludGVycnVwdHMiOmZhbHNlLCJyZWFjdE93bmVyU3RhY2siOmZhbHNlLCJ3ZWJwYWNrTWVtb3J5T3B0aW1pemF0aW9ucyI6ZmFsc2UsIm9wdGltaXplU2VydmVyUmVhY3QiOnRydWUsInVzZUVhcmx5SW1wb3J0IjpmYWxzZSwidmlld1RyYW5zaXRpb24iOmZhbHNlLCJzdGFsZVRpbWVzIjp7ImR5bmFtaWMiOjAsInN0YXRpYyI6MzAwfSwic2VydmVyQ29tcG9uZW50c0htckNhY2hlIjp0cnVlLCJzdGF0aWNHZW5lcmF0aW9uTWF4Q29uY3VycmVuY3kiOjgsInN0YXRpY0dlbmVyYXRpb25NaW5QYWdlc1BlcldvcmtlciI6MjUsImR5bmFtaWNJTyI6ZmFsc2UsImlubGluZUNzcyI6ZmFsc2UsIm5ld0Rldk92ZXJsYXkiOmZhbHNlLCJzdHJlYW1pbmdNZXRhZGF0YSI6ZmFsc2UsImh0bWxMaW1pdGVkQm90cyI6Ik1lZGlhcGFydG5lcnMtR29vZ2xlfFNsdXJwfER1Y2tEdWNrQm90fGJhaWR1c3BpZGVyfHlhbmRleHxzb2dvdXxiaXRseWJvdHx0dW1ibHJ8dmtTaGFyZXxxdW9yYSBsaW5rIHByZXZpZXd8cmVkZGl0Ym90fGlhX2FyY2hpdmVyfEJpbmdib3R8QmluZ1ByZXZpZXd8YXBwbGVib3R8ZmFjZWJvb2tleHRlcm5hbGhpdHxmYWNlYm9va2NhdGFsb2d8VHdpdHRlcmJvdHxMaW5rZWRJbkJvdHxTbGFja2JvdHxEaXNjb3JkYm90fFdoYXRzQXBwfFNreXBlVXJpUHJldmlldyIsInVzZUNhY2hlIjpmYWxzZSwib3B0aW1pemVQYWNrYWdlSW1wb3J0cyI6WyJsdWNpZGUtcmVhY3QiLCJkYXRlLWZucyIsImxvZGFzaC1lcyIsInJhbWRhIiwiYW50ZCIsInJlYWN0LWJvb3RzdHJhcCIsImFob29rcyIsIkBhbnQtZGVzaWduL2ljb25zIiwiQGhlYWRsZXNzdWkvcmVhY3QiLCJAaGVhZGxlc3N1aS1mbG9hdC9yZWFjdCIsIkBoZXJvaWNvbnMvcmVhY3QvMjAvc29saWQiLCJAaGVyb2ljb25zL3JlYWN0LzI0L3NvbGlkIiwiQGhlcm9pY29ucy9yZWFjdC8yNC9vdXRsaW5lIiwiQHZpc3gvdmlzeCIsIkB0cmVtb3IvcmVhY3QiLCJyeGpzIiwiQG11aS9tYXRlcmlhbCIsIkBtdWkvaWNvbnMtbWF0ZXJpYWwiLCJyZWNoYXJ0cyIsInJlYWN0LXVzZSIsImVmZmVjdCIsIkBlZmZlY3Qvc2NoZW1hIiwiQGVmZmVjdC9wbGF0Zm9ybSIsIkBlZmZlY3QvcGxhdGZvcm0tbm9kZSIsIkBlZmZlY3QvcGxhdGZvcm0tYnJvd3NlciIsIkBlZmZlY3QvcGxhdGZvcm0tYnVuIiwiQGVmZmVjdC9zcWwiLCJAZWZmZWN0L3NxbC1tc3NxbCIsIkBlZmZlY3Qvc3FsLW15c3FsMiIsIkBlZmZlY3Qvc3FsLXBnIiwiQGVmZmVjdC9zcWwtc3F1bGl0ZS1ub2RlIiwiQGVmZmVjdC9zcWwtc3F1bGl0ZS1idW4iLCJAZWZmZWN0L3NxbC1zcXVsaXRlLXdhc20iLCJAZWZmZWN0L3NxbC1zcXVsaXRlLXJlYWN0LW5hdGl2ZSIsIkBlZmZlY3QvcnBjIiwiQGVmZmVjdC9ycGMtaHR0cCIsIkBlZmZlY3QvdHlwZWNsYXNzIiwiQGVmZmVjdC9leHBlcmltZW50YWwiLCJAZWZmZWN0L29wZW50ZWxlbWV0cnkiLCJAbWF0ZXJpYWwtdWkvY29yZSIsIkBtYXRlcmlhbC11aS9pY29ucyIsIkB0YWJsZXIvaWNvbnMtcmVhY3QiLCJtdWktY29yZSIsInJlYWN0LWljb25zL2FpIiwicmVhY3QtaWNvbnMvYmkiLCJyZWFjdC1pY29ucy9icyIsInJlYWN0LWljb25zL2NnIiwicmVhY3QtaWNvbnMvY2kiLCJyZWFjdC1pY29ucy9kaSIsInJlYWN0LWljb25zL2ZhIiwicmVhY3QtaWNvbnMvZmE2IiwicmVhY3QtaWNvbnMvZmMiLCJyZWFjdC1pY29ucy9maSIsInJlYWN0LWljb25zL2dpIiwicmVhY3QtaWNvbnMvZ28iLCJyZWFjdC1pY29ucy9nciIsInJlYWN0LWljb25zL2hpIiwicmVhY3QtaWNvbnMvaGkyIiwicmVhY3QtaWNvbnMvaW0iLCJyZWFjdC1pY29ucy9pbyIsInJlYWN0LWljb25zL2lvNSIsInJlYWN0LWljb25zL2xpYSIsInJlYWN0LWljb25zL2xpYiIsInJlYWN0LWljb25zL2x1IiwicmVhY3QtaWNvbnMvbWQiLCJyZWFjdC1pY29ucy9waSIsInJlYWN0LWljb25zL3JpIiwicmVhY3QtaWNvbnMvcngiLCJyZWFjdC1pY29ucy9zaSIsInJlYWN0LWljb25zL3NsIiwicmVhY3QtaWNvbnMvdGIiLCJyZWFjdC1pY29ucy90ZmkiLCJyZWFjdC1pY29ucy90aSIsInJlYWN0LWljb25zL3ZzYyIsInJlYWN0LWljb25zL3dpIl19LCJidW5kbGVQYWdlc1JvdXRlckRlcGVuZGVuY2llcyI6ZmFsc2UsImNvbmZpZ0ZpbGUiOiIvdG1wL25leHQtc3RhdHNiaGgyRTAvc3RhdHMtYXBwL25leHQuY29uZmlnLmpzIiwiY29uZmlnRmlsZU5hbWUiOiJuZXh0LmNvbmZpZy5qcyJ9","pagesType":"app","appDirLoader":"bmV4dC1hcHAtbG9hZGVyP25hbWU9YXBwJTJGYXBwLWVkZ2Utc3NyJTJGcGFnZSZwYWdlPSUyRmFwcC1lZGdlLXNzciUyRnBhZ2UmcGFnZVBhdGg9cHJpdmF0ZS1uZXh0LWFwcC1kaXIlMkZhcHAtZWRnZS1zc3IlMkZwYWdlLmpzJmFwcERpcj0lMkZ0bXAlMkZuZXh0LXN0YXRzYmhoMkUwJTJGc3RhdHMtYXBwJTJGYXBwJmFwcFBhdGhzPSUyRmFwcC1lZGdlLXNzciUyRnBhZ2UmcGFnZUV4dGVuc2lvbnM9dHN4JnBhZ2VFeHRlbnNpb25zPXRzJnBhZ2VFeHRlbnNpb25zPWpzeCZwYWdlRXh0ZW5zaW9ucz1qcyZiYXNlUGF0aD0mYXNzZXRQcmVmaXg9Jm5leHRDb25maWdPdXRwdXQ9JnByZWZlcnJlZFJlZ2lvbj0mbWlkZGxld2FyZUNvbmZpZz1lMzAlM0Qh","sriEnabled":false,"middlewareConfig":"e30=","cacheHandlers":"{}"}!
       var _self___RSC_MANIFEST;
 
       const incrementalCacheHandler = null;
@@ -507,111 +507,117 @@
       /***/
     },
 
-    /***/ 7865: /***/ (
+    /***/ 9844: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 3268)
+        __webpack_require__.bind(__webpack_require__, 4842)
+      );
+      Promise.resolve(/* import() eager */).then(
+        __webpack_require__.bind(__webpack_require__, 8480)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 2870)
+        __webpack_require__.bind(__webpack_require__, 1142)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 6736)
+        __webpack_require__.bind(__webpack_require__, 7238)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 564)
+        __webpack_require__.bind(__webpack_require__, 9313)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 487)
+        __webpack_require__.bind(__webpack_require__, 7765)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 5007)
+        __webpack_require__.bind(__webpack_require__, 5223)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 4513)
+        __webpack_require__.bind(__webpack_require__, 1718)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 2132)
+        __webpack_require__.bind(__webpack_require__, 7766)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 7816)
+        __webpack_require__.bind(__webpack_require__, 7372)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 2662)
+        __webpack_require__.bind(__webpack_require__, 6999)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 8397)
+        __webpack_require__.bind(__webpack_require__, 2770)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 1420)
+        __webpack_require__.bind(__webpack_require__, 8780)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 5990)
+        __webpack_require__.bind(__webpack_require__, 644)
       );
 
       /***/
     },
 
-    /***/ 4313: /***/ (
+    /***/ 1284: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 501)
+        __webpack_require__.bind(__webpack_require__, 3055)
+      );
+      Promise.resolve(/* import() eager */).then(
+        __webpack_require__.bind(__webpack_require__, 200)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 4318)
+        __webpack_require__.bind(__webpack_require__, 5078)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 5696)
+        __webpack_require__.bind(__webpack_require__, 8726)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 3252)
+        __webpack_require__.bind(__webpack_require__, 6153)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 7343)
+        __webpack_require__.bind(__webpack_require__, 7243)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 8761)
+        __webpack_require__.bind(__webpack_require__, 1959)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 4625)
+        __webpack_require__.bind(__webpack_require__, 822)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 6792)
+        __webpack_require__.bind(__webpack_require__, 6584)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 1595)
+        __webpack_require__.bind(__webpack_require__, 8836)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 4014)
+        __webpack_require__.bind(__webpack_require__, 6039)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 5901)
+        __webpack_require__.bind(__webpack_require__, 3122)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 988)
+        __webpack_require__.bind(__webpack_require__, 5268)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 6574)
+        __webpack_require__.bind(__webpack_require__, 8588)
       );
 
       /***/
     },
 
-    /***/ 8762: /***/ () => {
+    /***/ 4232: /***/ () => {
       /***/
     },
 
-    /***/ 1810: /***/ () => {
+    /***/ 9080: /***/ () => {
       /***/
     },
 
-    /***/ 5587: /***/ (
+    /***/ 4803: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -631,7 +637,7 @@
       /***/
     },
 
-    /***/ 985: /***/ (
+    /***/ 6377: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -643,7 +649,7 @@
         /* harmony export */
       });
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
-        __webpack_require__(7651);
+        __webpack_require__(8077);
 
       function RootLayout({ children }) {
         return /*#__PURE__*/ (0,
@@ -662,7 +668,7 @@
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
-    /******/ __webpack_require__.O(0, [6, 469], () => __webpack_exec__(9476));
+    /******/ __webpack_require__.O(0, [914, 393], () => __webpack_exec__(846));
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ (_ENTRIES = typeof _ENTRIES === "undefined" ? {} : _ENTRIES)[
       "middleware_app/app-edge-ssr/page"
Diff for middleware.js

Diff too large to display

Diff for edge-ssr.js

Diff too large to display

Diff for 5306-HASH.js

Diff too large to display

Diff for bccd1874-HASH.js
@@ -1,13 +1,13 @@
 "use strict";
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
-  [7629],
+  [1758],
   {
-    /***/ 641: /***/ (
+    /***/ 8699: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
     ) => {
-      /* provided dependency */ var process = __webpack_require__(6611);
+      /* provided dependency */ var process = __webpack_require__(9829);
       /**
        * @license React
        * react-dom-client.production.js
@@ -22,9 +22,9 @@
  Modernizr 3.0.0pre (Custom Build) | MIT
 */
 
-      var Scheduler = __webpack_require__(8684),
-        React = __webpack_require__(1446),
-        ReactDOM = __webpack_require__(8307);
+      var Scheduler = __webpack_require__(462),
+        React = __webpack_require__(228),
+        ReactDOM = __webpack_require__(9221);
       function formatProdErrorMessage(code) {
         var url = "https://react.dev/errors/" + code;
         if (1 < arguments.length) {
@@ -269,36 +269,43 @@
         push(rootInstanceStackCursor, nextRootInstance);
         push(contextFiberStackCursor, fiber);
         push(contextStackCursor, null);
-        switch (nextRootInstance.nodeType) {
+        fiber = nextRootInstance.nodeType;
+        switch (fiber) {
           case 9:
           case 11:
-            fiber = (fiber = nextRootInstance.documentElement)
-              ? (fiber = fiber.namespaceURI)
-                ? getOwnHostContext(fiber)
+            nextRootInstance = (nextRootInstance =
+              nextRootInstance.documentElement)
+              ? (nextRootInstance = nextRootInstance.namespaceURI)
+                ? getOwnHostContext(nextRootInstance)
                 : 0
               : 0;
             break;
           default:
             if (
-              ((fiber = nextRootInstance.tagName),
-              (nextRootInstance = nextRootInstance.namespaceURI))
+              ((fiber =
+                8 === fiber ? nextRootInstance.parentNode : nextRootInstance),
+              (nextRootInstance = fiber.tagName),
+              (fiber = fiber.namespaceURI))
             )
-              (nextRootInstance = getOwnHostContext(nextRootInstance)),
-                (fiber = getChildHostContextProd(nextRootInstance, fiber));
+              (fiber = getOwnHostContext(fiber)),
+                (nextRootInstance = getChildHostContextProd(
+                  fiber,
+                  nextRootInstance
+                ));
             else
-              switch (fiber) {
+              switch (nextRootInstance) {
                 case "svg":
-                  fiber = 1;
+                  nextRootInstance = 1;
                   break;
                 case "math":
-                  fiber = 2;
+                  nextRootInstance = 2;
                   break;
                 default:
-                  fiber = 0;
+                  nextRootInstance = 0;
               }
         }
         pop(contextStackCursor);
-        push(contextStackCursor, fiber);
+        push(contextStackCursor, nextRootInstance);
       }
       function popHostContainer() {
         pop(contextStackCursor);
@@ -7286,20 +7293,15 @@
                 workInProgress.stateNode.containerInfo
               );
               if (null === current) throw Error(formatProdErrorMessage(387));
-              lazyComponent = workInProgress.pendingProps;
-              var prevState = workInProgress.memoizedState;
-              init = prevState.element;
+              var nextProps = workInProgress.pendingProps;
+              init = workInProgress.memoizedState;
+              lazyComponent = init.element;
               cloneUpdateQueue(current, workInProgress);
-              processUpdateQueue(
-                workInProgress,
-                lazyComponent,
-                null,
-                renderLanes
-              );
+              processUpdateQueue(workInProgress, nextProps, null, renderLanes);
               var nextState = workInProgress.memoizedState;
-              lazyComponent = nextState.cache;
-              pushProvider(workInProgress, CacheContext, lazyComponent);
-              lazyComponent !== prevState.cache &&
+              nextProps = nextState.cache;
+              pushProvider(workInProgress, CacheContext, nextProps);
+              nextProps !== init.cache &&
                 propagateContextChanges(
                   workInProgress,
                   [CacheContext],
@@ -7307,70 +7309,62 @@
                   !0
                 );
               suspendIfUpdateReadFromEntangledAsyncAction();
-              lazyComponent = nextState.element;
-              if (prevState.isDehydrated)
+              nextProps = nextState.element;
+              if (init.isDehydrated)
                 if (
-                  ((prevState = {
-                    element: lazyComponent,
+                  ((init = {
+                    element: nextProps,
                     isDehydrated: !1,
                     cache: nextState.cache,
                   }),
-                  (workInProgress.updateQueue.baseState = prevState),
-                  (workInProgress.memoizedState = prevState),
+                  (workInProgress.updateQueue.baseState = init),
+                  (workInProgress.memoizedState = init),
                   workInProgress.flags & 256)
                 ) {
                   workInProgress = mountHostRootWithoutHydrating(
                     current,
                     workInProgress,
-                    lazyComponent,
+                    nextProps,
                     renderLanes
                   );
                   break a;
-                } else if (lazyComponent !== init) {
-                  init = createCapturedValueAtFiber(
+                } else if (nextProps !== lazyComponent) {
+                  lazyComponent = createCapturedValueAtFiber(
                     Error(formatProdErrorMessage(424)),
                     workInProgress
                   );
-                  queueHydrationError(init);
+                  queueHydrationError(lazyComponent);
                   workInProgress = mountHostRootWithoutHydrating(
                     current,
                     workInProgress,
-                    lazyComponent,
+                    nextProps,
                     renderLanes
                   );
                   break a;
-                } else {
-                  current = workInProgress.stateNode.containerInfo;
-                  switch (current.nodeType) {
-                    case 9:
-                      current = current.body;
-                      break;
-                    default:
-                      current =
-                        "HTML" === current.nodeName
-                          ? current.ownerDocument.body
-                          : current;
-                  }
-                  nextHydratableInstance = getNextHydratable(
-                    current.firstChild
-                  );
-                  hydrationParentFiber = workInProgress;
-                  isHydrating = !0;
-                  hydrationErrors = null;
-                  rootOrSingletonContext = !0;
-                  renderLanes = mountChildFibers(
-                    workInProgress,
-                    null,
-                    lazyComponent,
-                    renderLanes
-                  );
-                  for (workInProgress.child = renderLanes; renderLanes; )
+                } else
+                  for (
+                    nextHydratableInstance = getNextHydratable(
+                      workInProgress.stateNode.containerInfo.firstChild
+                    ),
+                      hydrationParentFiber = workInProgress,
+                      isHydrating = !0,
+                      hydrationErrors = null,
+                      rootOrSingletonContext = !0,
+                      renderLanes = mountChildFibers(
+                        workInProgress,
+                        null,
+                        nextProps,
+                        renderLanes
+                      ),
+                      workInProgress.child = renderLanes;
+                    renderLanes;
+
+                  )
                     (renderLanes.flags = (renderLanes.flags & -3) | 4096),
                       (renderLanes = renderLanes.sibling);
-                }
               else {
                 resetHydrationState();
-                if (lazyComponent === init) {
+                if (nextProps === lazyComponent) {
                   workInProgress = bailoutOnAlreadyFinishedWork(
                     current,
                     workInProgress,
@@ -7381,7 +7375,7 @@
                 reconcileChildren(
                   current,
                   workInProgress,
-                  lazyComponent,
+                  nextProps,
                   renderLanes
                 );
               }
@@ -7431,13 +7425,9 @@
                   )),
                 (hydrationParentFiber = workInProgress),
                 (rootOrSingletonContext = !0),
-                (init = nextHydratableInstance),
-                isSingletonScope(workInProgress.type)
-                  ? ((previousHydratableOnEnteringScopedSingleton = init),
-                    (nextHydratableInstance = getNextHydratable(
-                      lazyComponent.firstChild
-                    )))
-                  : (nextHydratableInstance = init)),
+                (nextHydratableInstance = getNextHydratable(
+                  lazyComponent.firstChild
+                ))),
               reconcileChildren(
                 current,
                 workInProgress,
@@ -7473,10 +7463,10 @@
                 init && throwOnHydrationMismatch(workInProgress)),
               pushHostContext(workInProgress),
               (init = workInProgress.type),
-              (prevState = workInProgress.pendingProps),
+              (nextProps = workInProgress.pendingProps),
               (nextState = null !== current ? current.memoizedProps : null),
-              (lazyComponent = prevState.children),
-              shouldSetTextContent(init, prevState)
+              (lazyComponent = nextProps.children),
+              shouldSetTextContent(init, nextProps)
                 ? (lazyComponent = null)
                 : null !== nextState &&
                   shouldSetTextContent(init, nextState) &&
@@ -7655,12 +7645,12 @@
                 ? ((init = peekCacheFromPool()),
                   null === init &&
                     ((init = workInProgressRoot),
-                    (prevState = createCache()),
-                    (init.pooledCache = prevState),
-                    prevState.refCount++,
-                    null !== prevState &&
+                    (nextProps = createCache()),
+                    (init.pooledCache = nextProps),
+                    nextProps.refCount++,
+                    null !== nextProps &&
                       (init.pooledCacheLanes |= renderLanes),
-                    (init = prevState)),
+                    (init = nextProps)),
                   (workInProgress.memoizedState = {
                     parent: lazyComponent,
                     cache: init,
@@ -7672,7 +7662,7 @@
                     processUpdateQueue(workInProgress, null, null, renderLanes),
                     suspendIfUpdateReadFromEntangledAsyncAction()),
                   (init = current.memoizedState),
-                  (prevState = workInProgress.memoizedState),
+                  (nextProps = workInProgress.memoizedState),
                   init.parent !== lazyComponent
                     ? ((init = { parent: lazyComponent, cache: lazyComponent }),
                       (workInProgress.memoizedState = init),
@@ -7681,7 +7671,7 @@
                           workInProgress.updateQueue.baseState =
                             init),
                       pushProvider(workInProgress, CacheContext, lazyComponent))
-                    : ((lazyComponent = prevState.cache),
+                    : ((lazyComponent = nextProps.cache),
                       pushProvider(workInProgress, CacheContext, lazyComponent),
                       lazyComponent !== init.cache &&
                         propagateContextChanges(
@@ -7871,7 +7861,7 @@
           5 === fiber.tag ||
           3 === fiber.tag ||
           26 === fiber.tag ||
-          (27 === fiber.tag && isSingletonScope(fiber.type)) ||
+          (27 === fiber.tag && "head" === fiber.type) ||
           4 === fiber.tag
         );
       }
@@ -7888,7 +7878,7 @@
             5 !== fiber.tag && 6 !== fiber.tag && 18 !== fiber.tag;
 
           ) {
-            if (27 === fiber.tag && isSingletonScope(fiber.type)) continue a;
+            if (27 === fiber.tag && "head" === fiber.type) continue a;
             if (fiber.flags & 2) continue a;
             if (null === fiber.child || 4 === fiber.tag) continue a;
             else (fiber.child.return = fiber), (fiber = fiber.child);
@@ -7899,30 +7889,46 @@
       function insertOrAppendPlacementNodeIntoContainer(node, before, parent) {
         var tag = node.tag;
         if (5 === tag || 6 === tag)
-          (node = node.stateNode),
-            before
-              ? (9 === parent.nodeType
-                  ? parent.body
-                  : "HTML" === parent.nodeName
-                  ? parent.ownerDocument.body
-                  : parent
-                ).insertBefore(node, before)
-              : ((before =
-                  9 === parent.nodeType
-                    ? parent.body
-                    : "HTML" === parent.nodeName
+          if (((node = node.stateNode), before)) {
+            switch (parent.nodeType) {
+              case 8:
+                parent = parent.parentNode;
+                break;
+              case 9:
+                parent = parent.body;
+                break;
+              default:
+                parent =
+                  "HTML" === parent.nodeName
                     ? parent.ownerDocument.body
-                    : parent),
-                before.appendChild(node),
-                (parent = parent._reactRootContainer),
-                (null !== parent && void 0 !== parent) ||
-                  null !== before.onclick ||
-                  (before.onclick = noop$1));
+                    : parent;
+            }
+            parent.insertBefore(node, before);
+          } else
+            a: {
+              switch (parent.nodeType) {
+                case 8:
+                  before = parent.parentNode;
+                  before.insertBefore(node, parent);
+                  break a;
+                case 9:
+                  before = parent.body;
+                  break;
+                default:
+                  before =
+                    "HTML" === parent.nodeName
+                      ? parent.ownerDocument.body
+                      : parent;
+              }
+              before.appendChild(node);
+              parent = parent._reactRootContainer;
+              (null !== parent && void 0 !== parent) ||
+                null !== before.onclick ||
+                (before.onclick = noop$1);
+            }
         else if (
           4 !== tag &&
-          (27 === tag &&
-            isSingletonScope(node.type) &&
-            ((parent = node.stateNode), (before = null)),
+          (27 === tag && "head" === node.type && (parent = node.stateNode),
           (node = node.child),
           null !== node)
         )
@@ -7944,9 +7950,7 @@
               : parent.appendChild(node);
         else if (
           4 !== tag &&
-          (27 === tag &&
-            isSingletonScope(node.type) &&
-            (parent = node.stateNode),
+          (27 === tag && "head" === node.type && (parent = node.stateNode),
           (node = node.child),
           null !== node)
         )
@@ -8337,7 +8341,7 @@
               safelyDetachRef(deletedFiber, nearestMountedAncestor);
             var prevHostParent = hostParent,
               prevHostParentIsContainer = hostParentIsContainer;
-            isSingletonScope(deletedFiber.type) &&
+            "head" === deletedFiber.type &&
               ((hostParent = deletedFiber.stateNode),
               (hostParentIsContainer = !1));
             recursivelyTraverseDeletionEffects(
@@ -8366,12 +8370,20 @@
             if (null !== hostParent)
               if (hostParentIsContainer)
                 try {
-                  (9 === hostParent.nodeType
-                    ? hostParent.body
-                    : "HTML" === hostParent.nodeName
-                    ? hostParent.ownerDocument.body
-                    : hostParent
-                  ).removeChild(deletedFiber.stateNode);
+                  switch (hostParent.nodeType) {
+                    case 8:
+                      var parentNode = hostParent.parentNode;
+                      break;
+                    case 9:
+                      parentNode = hostParent.body;
+                      break;
+                    default:
+                      parentNode =
+                        "HTML" === hostParent.nodeName
+                          ? hostParent.ownerDocument.body
+                          : hostParent;
+                  }
+                  parentNode.removeChild(deletedFiber.stateNode);
                 } catch (error) {
                   captureCommitPhaseError(
                     deletedFiber,
@@ -8394,14 +8406,20 @@
             null !== hostParent &&
               (hostParentIsContainer
                 ? ((finishedRoot = hostParent),
-                  clearSuspenseBoundary(
-                    9 === finishedRoot.nodeType
-                      ? finishedRoot.body
-                      : "HTML" === finishedRoot.nodeName
-                      ? finishedRoot.ownerDocument.body
-                      : finishedRoot,
-                    deletedFiber.stateNode
-                  ),
+                  (deletedFiber = deletedFiber.stateNode),
+                  8 === finishedRoot.nodeType
+                    ? clearSuspenseBoundary(
+                        finishedRoot.parentNode,
+                        deletedFiber
+                      )
+                    : 9 === finishedRoot.nodeType
+                    ? clearSuspenseBoundary(finishedRoot.body, deletedFiber)
+                    : "HTML" === finishedRoot.nodeName
+                    ? clearSuspenseBoundary(
+                        finishedRoot.ownerDocument.body,
+                        deletedFiber
+                      )
+                    : clearSuspenseBoundary(finishedRoot, deletedFiber),
                   retryIfBlockedOn(finishedRoot))
                 : clearSuspenseBoundary(hostParent, deletedFiber.stateNode));
             break;
@@ -8539,7 +8557,7 @@
             a: for (; null !== parent; ) {
               switch (parent.tag) {
                 case 27:
-                  if (isSingletonScope(parent.type)) {
+                  if ("head" === parent.type) {
                     hostParent = parent.stateNode;
                     hostParentIsContainer = !1;
                     break a;
@@ -10095,14 +10113,14 @@
       function popToNextHostParent(fiber) {
         for (hydrationParentFiber = fiber.return; hydrationParentFiber; )
           switch (hydrationParentFiber.tag) {
+            case 3:
+            case 27:
+              rootOrSingletonContext = !0;
+              return;
             case 5:
             case 13:
               rootOrSingletonContext = !1;
               return;
-            case 27:
-            case 3:
-              rootOrSingletonContext = !0;
-              return;
             default:
               hydrationParentFiber = hydrationParentFiber.return;
           }
@@ -10111,58 +10129,52 @@
         if (fiber !== hydrationParentFiber) return !1;
         if (!isHydrating)
           return popToNextHostParent(fiber), (isHydrating = !0), !1;
-        var tag = fiber.tag,
+        var shouldClear = !1,
           JSCompiler_temp;
-        if ((JSCompiler_temp = 3 !== tag && 27 !== tag)) {
-          if ((JSCompiler_temp = 5 === tag))
+        if ((JSCompiler_temp = 3 !== fiber.tag && 27 !== fiber.tag)) {
+          if ((JSCompiler_temp = 5 === fiber.tag))
             (JSCompiler_temp = fiber.type),
               (JSCompiler_temp =
                 !("form" !== JSCompiler_temp && "button" !== JSCompiler_temp) ||
                 shouldSetTextContent(fiber.type, fiber.memoizedProps));
           JSCompiler_temp = !JSCompiler_temp;
         }
-        JSCompiler_temp &&
+        JSCompiler_temp && (shouldClear = !0);
+        shouldClear &&
           nextHydratableInstance &&
           throwOnHydrationMismatch(fiber);
         popToNextHostParent(fiber);
-        if (13 === tag) {
+        if (13 === fiber.tag) {
           fiber = fiber.memoizedState;
           fiber = null !== fiber ? fiber.dehydrated : null;
           if (!fiber) throw Error(formatProdErrorMessage(317));
           a: {
             fiber = fiber.nextSibling;
-            for (tag = 0; fiber; ) {
+            for (shouldClear = 0; fiber; ) {
               if (8 === fiber.nodeType)
                 if (
                   ((JSCompiler_temp = fiber.data), "/$" === JSCompiler_temp)
                 ) {
-                  if (0 === tag) {
+                  if (0 === shouldClear) {
                     nextHydratableInstance = getNextHydratable(
                       fiber.nextSibling
                     );
                     break a;
                   }
-                  tag--;
+                  shouldClear--;
                 } else
                   ("$" !== JSCompiler_temp &&
                     "$!" !== JSCompiler_temp &&
                     "$?" !== JSCompiler_temp) ||
-                    tag++;
+                    shouldClear++;
               fiber = fiber.nextSibling;
             }
             nextHydratableInstance = null;
           }
         } else
-          27 === tag
-            ? ((tag = nextHydratableInstance),
-              isSingletonScope(fiber.type)
-                ? ((fiber = previousHydratableOnEnteringScopedSingleton),
-                  (previousHydratableOnEnteringScopedSingleton = null),
-                  (nextHydratableInstance = fiber))
-                : (nextHydratableInstance = tag))
-            : (nextHydratableInstance = hydrationParentFiber
-                ? getNextHydratable(fiber.stateNode.nextSibling)
-                : null);
+          nextHydratableInstance = hydrationParentFiber
+            ? getNextHydratable(fiber.stateNode.nextSibling)
+            : null;
         return !0;
       }
       function resetHydrationState() {
@@ -12516,20 +12528,20 @@
         }
       }
       for (
-        var i$jscomp$inline_1502 = 0;
-        i$jscomp$inline_1502 < simpleEventPluginEvents.length;
-        i$jscomp$inline_1502++
+        var i$jscomp$inline_1491 = 0;
+        i$jscomp$inline_1491 < simpleEventPluginEvents.length;
+        i$jscomp$inline_1491++
       ) {
-        var eventName$jscomp$inline_1503 =
-            simpleEventPluginEvents[i$jscomp$inline_1502],
-          domEventName$jscomp$inline_1504 =
-            eventName$jscomp$inline_1503.toLowerCase(),
-          capitalizedEvent$jscomp$inline_1505 =
-            eventName$jscomp$inline_1503[0].toUpperCase() +
-            eventName$jscomp$inline_1503.slice(1);
+        var eventName$jscomp$inline_1492 =
+            simpleEventPluginEvents[i$jscomp$inline_1491],
+          domEventName$jscomp$inline_1493 =
+            eventName$jscomp$inline_1492.toLowerCase(),
+          capitalizedEvent$jscomp$inline_1494 =
+            eventName$jscomp$inline_1492[0].toUpperCase() +
+            eventName$jscomp$inline_1492.slice(1);
         registerSimpleEvent(
-          domEventName$jscomp$inline_1504,
-          "on" + capitalizedEvent$jscomp$inline_1505
+          domEventName$jscomp$inline_1493,
+          "on" + capitalizedEvent$jscomp$inline_1494
         );
       }
       registerSimpleEvent(ANIMATION_END, "onAnimationEnd");
@@ -12758,15 +12770,23 @@
             var nodeTag = targetInst$jscomp$0.tag;
             if (3 === nodeTag || 4 === nodeTag) {
               var container = targetInst$jscomp$0.stateNode.containerInfo;
-              if (container === targetContainer) break;
+              if (
+                container === targetContainer ||
+                (8 === container.nodeType &&
+                  container.parentNode === targetContainer)
+              )
+                break;
               if (4 === nodeTag)
                 for (nodeTag = targetInst$jscomp$0.return; null !== nodeTag; ) {
                   var grandTag = nodeTag.tag;
-                  if (
-                    (3 === grandTag || 4 === grandTag) &&
-                    nodeTag.stateNode.containerInfo === targetContainer
-                  )
-                    return;
+                  if (3 === grandTag || 4 === grandTag)
+                    if (
+                      ((grandTag = nodeTag.stateNode.containerInfo),
+                      grandTag === targetContainer ||
+                        (8 === grandTag.nodeType &&
+                          grandTag.parentNode === targetContainer))
+                    )
+                      return;
                   nodeTag = nodeTag.return;
                 }
               for (; null !== container; ) {
@@ -14456,57 +14476,21 @@
           throw error;
         });
       }
-      function isSingletonScope(type) {
-        return "head" === type;
-      }
       function clearSuspenseBoundary(parentInstance, suspenseInstance) {
         var node = suspenseInstance,
-          possiblePreambleContribution = 0,
           depth = 0;
         do {
           var nextNode = node.nextSibling;
           parentInstance.removeChild(node);
           if (nextNode && 8 === nextNode.nodeType)
             if (((node = nextNode.data), "/$" === node)) {
-              if (
-                0 < possiblePreambleContribution &&
-                8 > possiblePreambleContribution
-              ) {
-                node = possiblePreambleContribution;
-                var ownerDocument = parentInstance.ownerDocument;
-                node & 1 &&
-                  releaseSingletonInstance(ownerDocument.documentElement);
-                node & 2 && releaseSingletonInstance(ownerDocument.body);
-                if (node & 4)
-                  for (
-                    node = ownerDocument.head,
-                      releaseSingletonInstance(node),
-                      ownerDocument = node.firstChild;
-                    ownerDocument;
-
-                  ) {
-                    var nextNode$jscomp$0 = ownerDocument.nextSibling,
-                      nodeName = ownerDocument.nodeName;
-                    ownerDocument[internalHoistableMarker] ||
-                      "SCRIPT" === nodeName ||
-                      "STYLE" === nodeName ||
-                      ("LINK" === nodeName &&
-                        "stylesheet" === ownerDocument.rel.toLowerCase()) ||
-                      node.removeChild(ownerDocument);
-                    ownerDocument = nextNode$jscomp$0;
-                  }
-              }
               if (0 === depth) {
                 parentInstance.removeChild(nextNode);
                 retryIfBlockedOn(suspenseInstance);
                 return;
               }
               depth--;
-            } else
-              "$" === node || "$?" === node || "$!" === node
-                ? depth++
-                : (possiblePreambleContribution = node.charCodeAt(0) - 48);
-          else possiblePreambleContribution = 0;
+            } else ("$" !== node && "$?" !== node && "$!" !== node) || depth++;
           node = nextNode;
         } while (node);
         retryIfBlockedOn(suspenseInstance);
@@ -14661,7 +14645,6 @@
         }
         return node;
       }
-      var previousHydratableOnEnteringScopedSingleton = null;
       function getParentSuspenseInstance(targetInstance) {
         targetInstance = targetInstance.previousSibling;
         for (var depth = 0; targetInstance; ) {
@@ -16249,16 +16232,16 @@
           0 === i && attemptExplicitHydrationTarget(target);
         }
       };
-      var isomorphicReactPackageVersion$jscomp$inline_1754 = React.version;
+      var isomorphicReactPackageVersion$jscomp$inline_1738 = React.version;
       if (
-        "19.1.0-canary-d85cf3e5-20250205" !==
-        isomorphicReactPackageVersion$jscomp$inline_1754
+        "19.1.0-canary-0a82580b-20250203" !==
+        isomorphicReactPackageVersion$jscomp$inline_1738
       )
         throw Error(
           formatProdErrorMessage(
             527,
-            isomorphicReactPackageVersion$jscomp$inline_1754,
-            "19.1.0-canary-d85cf3e5-20250205"
+            isomorphicReactPackageVersion$jscomp$inline_1738,
+            "19.1.0-canary-0a82580b-20250203"
           )
         );
       ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
@@ -16278,24 +16261,24 @@
           null === componentOrElement ? null : componentOrElement.stateNode;
         return componentOrElement;
       };
-      var internals$jscomp$inline_2235 = {
+      var internals$jscomp$inline_2215 = {
         bundleType: 0,
-        version: "19.1.0-canary-d85cf3e5-20250205",
+        version: "19.1.0-canary-0a82580b-20250203",
         rendererPackageName: "react-dom",
         currentDispatcherRef: ReactSharedInternals,
-        reconcilerVersion: "19.1.0-canary-d85cf3e5-20250205",
+        reconcilerVersion: "19.1.0-canary-0a82580b-20250203",
       };
       if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
-        var hook$jscomp$inline_2236 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
+        var hook$jscomp$inline_2216 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
         if (
-          !hook$jscomp$inline_2236.isDisabled &&
-          hook$jscomp$inline_2236.supportsFiber
+          !hook$jscomp$inline_2216.isDisabled &&
+          hook$jscomp$inline_2216.supportsFiber
         )
           try {
-            (rendererID = hook$jscomp$inline_2236.inject(
-              internals$jscomp$inline_2235
+            (rendererID = hook$jscomp$inline_2216.inject(
+              internals$jscomp$inline_2215
             )),
-              (injectedHook = hook$jscomp$inline_2236);
+              (injectedHook = hook$jscomp$inline_2216);
           } catch (err) {}
       }
       exports.createRoot = function (container, options) {
@@ -16335,7 +16318,9 @@
           null
         );
         container[internalContainerInstanceKey] = options.current;
-        listenToAllSupportedEvents(container);
+        listenToAllSupportedEvents(
+          8 === container.nodeType ? container.parentNode : container
+        );
         return new ReactDOMRoot(options);
       };
       exports.hydrateRoot = function (container, initialChildren, options) {
@@ -16391,7 +16376,7 @@
         listenToAllSupportedEvents(container);
         return new ReactDOMHydrationRoot(initialChildren);
       };
-      exports.version = "19.1.0-canary-d85cf3e5-20250205";
+      exports.version = "19.1.0-canary-0a82580b-20250203";
 
       /***/
     },
Diff for main-HASH.js

Diff too large to display

Diff for main-app-HASH.js
@@ -1,49 +1,52 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [4977],
   {
-    /***/ 7705: /***/ (
+    /***/ 2572: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 9656, 23)
+        __webpack_require__.t.bind(__webpack_require__, 2273, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 5220, 23)
+        __webpack_require__.t.bind(__webpack_require__, 1646, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 6780, 23)
+        __webpack_require__.t.bind(__webpack_require__, 5802, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 2020, 23)
+        __webpack_require__.t.bind(__webpack_require__, 6022, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 589, 23)
+        __webpack_require__.t.bind(__webpack_require__, 3071, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 9341, 23)
+        __webpack_require__.t.bind(__webpack_require__, 8099, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 9497, 23)
+        __webpack_require__.t.bind(__webpack_require__, 1167, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 7112, 23)
+        __webpack_require__.t.bind(__webpack_require__, 2618, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 4226)
+        __webpack_require__.bind(__webpack_require__, 5968)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 2962, 23)
+        __webpack_require__.t.bind(__webpack_require__, 4667, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 3017, 23)
+        __webpack_require__.t.bind(__webpack_require__, 587, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 7272, 23)
+        __webpack_require__.t.bind(__webpack_require__, 3110, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 4194, 23)
+        __webpack_require__.t.bind(__webpack_require__, 2032, 23)
+      );
+      Promise.resolve(/* import() eager */).then(
+        __webpack_require__.bind(__webpack_require__, 3632)
       );
 
       /***/
@@ -55,8 +58,8 @@
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(
       0,
-      [7629, 5306],
-      () => (__webpack_exec__(7241), __webpack_exec__(7705))
+      [1758, 9920],
+      () => (__webpack_exec__(8183), __webpack_exec__(2572))
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
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
failed to diff
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 server.runtime.prod.js

Diff too large to display

Commit: 9f1e0c3

@ijjk ijjk added the tests label Jan 27, 2025
@huozhi huozhi marked this pull request as ready for review January 27, 2025 17:41
@huozhi huozhi requested a review from ztanner January 27, 2025 17:41
@huozhi huozhi changed the title [metadata] internal api useServerInsertedMetadata for inserting suspended metadata [metadata] new approach to insert streamed metadata and support PPR Jan 27, 2025
@huozhi huozhi requested a review from gnoff January 27, 2025 22:15
@huozhi huozhi marked this pull request as draft January 29, 2025 17:07
@huozhi huozhi marked this pull request as ready for review January 31, 2025 11:25
const StreamingMetadata: React.ComponentType<{}> = serveStreamingMetadata
? () => (
<React.Suspense fallback={null}>
Copy link
Member Author

Choose a reason for hiding this comment

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

Moved this suspense boundary into async-metadata, it's more clear to wrap there. And app-render only needs to focus on creating the components themselves


export async function renderToString({
ReactDOMServer,
renderToReadableStream,
Copy link
Member Author

Choose a reason for hiding this comment

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

this is an existing util but not used anywhere, just clean it up and reuse it

@huozhi huozhi changed the title [metadata] new approach to insert streamed metadata and support PPR [metadata] new metadata insertion API and support PPR Feb 1, 2025
@huozhi huozhi force-pushed the huozhi/01-24-metadata_insertion_helper branch from 74e0270 to ed36e17 Compare February 1, 2025 19:06
@huozhi huozhi changed the base branch from canary to huozhi/01-31-fix_ppr_insertion February 1, 2025 19:06
@huozhi huozhi force-pushed the huozhi/01-24-metadata_insertion_helper branch from ed36e17 to dd1220b Compare February 1, 2025 19:27
@huozhi huozhi marked this pull request as draft February 3, 2025 15:29
@huozhi huozhi force-pushed the huozhi/01-24-metadata_insertion_helper branch from dd1220b to 456dea0 Compare February 3, 2025 15:48
@huozhi huozhi force-pushed the huozhi/01-31-fix_ppr_insertion branch from 9760a61 to 6217540 Compare February 3, 2025 15:48
@huozhi huozhi marked this pull request as ready for review February 3, 2025 19:07
@huozhi huozhi force-pushed the huozhi/01-31-fix_ppr_insertion branch from 6217540 to bb68419 Compare February 3, 2025 22:48
Base automatically changed from huozhi/01-31-fix_ppr_insertion to canary February 4, 2025 00:22
@huozhi huozhi force-pushed the huozhi/01-24-metadata_insertion_helper branch from 456dea0 to 85667e0 Compare February 4, 2025 13:53
@huozhi huozhi requested review from gnoff and ztanner February 4, 2025 21:04
…nded metadata

append to ppr body

add ppr test

add new test case

change the insertion stream helper

fix the hidden postpone error causing dynamic missing metadata

revert test suite changes
@huozhi huozhi force-pushed the huozhi/01-24-metadata_insertion_helper branch from 6dabe3a to 06e4fed Compare February 5, 2025 18:06
@huozhi huozhi requested a review from gnoff February 5, 2025 18:26
@huozhi huozhi requested a review from gnoff February 5, 2025 22:03
@huozhi huozhi requested a review from gnoff February 5, 2025 23:28
@huozhi huozhi merged commit 2220d73 into canary Feb 8, 2025
131 checks passed
@huozhi huozhi deleted the huozhi/01-24-metadata_insertion_helper branch February 8, 2025 17:56
huozhi added a commit that referenced this pull request Feb 10, 2025
huozhi added a commit that referenced this pull request Feb 10, 2025
Reverts #75366

Noticed there's bug with `__nextppronly=fallback` even streaming
metadata is not enabled in PPR
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Feb 23, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants