diff --git a/.next/cache/webpack/client-development/1.pack.gz b/.next/cache/webpack/client-development/1.pack.gz index ebd5056..1e02bd7 100644 Binary files a/.next/cache/webpack/client-development/1.pack.gz and b/.next/cache/webpack/client-development/1.pack.gz differ diff --git a/.next/cache/webpack/client-development/10.pack.gz b/.next/cache/webpack/client-development/10.pack.gz index 49f9026..e99ba55 100644 Binary files a/.next/cache/webpack/client-development/10.pack.gz and b/.next/cache/webpack/client-development/10.pack.gz differ diff --git a/.next/cache/webpack/client-development/12.pack.gz b/.next/cache/webpack/client-development/12.pack.gz index 3219bc8..d35220b 100644 Binary files a/.next/cache/webpack/client-development/12.pack.gz and b/.next/cache/webpack/client-development/12.pack.gz differ diff --git a/.next/cache/webpack/client-development/13.pack.gz b/.next/cache/webpack/client-development/13.pack.gz index 8d77e44..a89d2b9 100644 Binary files a/.next/cache/webpack/client-development/13.pack.gz and b/.next/cache/webpack/client-development/13.pack.gz differ diff --git a/.next/cache/webpack/client-development/14.pack.gz b/.next/cache/webpack/client-development/14.pack.gz index b30a9eb..cc92307 100644 Binary files a/.next/cache/webpack/client-development/14.pack.gz and b/.next/cache/webpack/client-development/14.pack.gz differ diff --git a/.next/cache/webpack/client-development/15.pack.gz b/.next/cache/webpack/client-development/15.pack.gz index cba26ad..5682884 100644 Binary files a/.next/cache/webpack/client-development/15.pack.gz and b/.next/cache/webpack/client-development/15.pack.gz differ diff --git a/.next/cache/webpack/client-development/index.pack.gz b/.next/cache/webpack/client-development/index.pack.gz index b84bb44..0d2157b 100644 Binary files a/.next/cache/webpack/client-development/index.pack.gz and b/.next/cache/webpack/client-development/index.pack.gz differ diff --git a/.next/cache/webpack/client-development/index.pack.gz.old b/.next/cache/webpack/client-development/index.pack.gz.old index bcb7b8e..ea8d284 100644 Binary files a/.next/cache/webpack/client-development/index.pack.gz.old and b/.next/cache/webpack/client-development/index.pack.gz.old differ diff --git a/.next/cache/webpack/server-development/0.pack.gz b/.next/cache/webpack/server-development/0.pack.gz index efc642a..490741d 100644 Binary files a/.next/cache/webpack/server-development/0.pack.gz and b/.next/cache/webpack/server-development/0.pack.gz differ diff --git a/.next/cache/webpack/server-development/1.pack.gz b/.next/cache/webpack/server-development/1.pack.gz index 5af16d1..b656e8b 100644 Binary files a/.next/cache/webpack/server-development/1.pack.gz and b/.next/cache/webpack/server-development/1.pack.gz differ diff --git a/.next/cache/webpack/server-development/10.pack.gz b/.next/cache/webpack/server-development/10.pack.gz index e2764d5..22e8f38 100644 Binary files a/.next/cache/webpack/server-development/10.pack.gz and b/.next/cache/webpack/server-development/10.pack.gz differ diff --git a/.next/cache/webpack/server-development/2.pack.gz b/.next/cache/webpack/server-development/2.pack.gz index 1b2a258..d8b0707 100644 Binary files a/.next/cache/webpack/server-development/2.pack.gz and b/.next/cache/webpack/server-development/2.pack.gz differ diff --git a/.next/cache/webpack/server-development/3.pack.gz b/.next/cache/webpack/server-development/3.pack.gz index 9df7501..ca4b689 100644 Binary files a/.next/cache/webpack/server-development/3.pack.gz and b/.next/cache/webpack/server-development/3.pack.gz differ diff --git a/.next/cache/webpack/server-development/index.pack.gz b/.next/cache/webpack/server-development/index.pack.gz index 0b7046b..86cc9a3 100644 Binary files a/.next/cache/webpack/server-development/index.pack.gz and b/.next/cache/webpack/server-development/index.pack.gz differ diff --git a/.next/cache/webpack/server-development/index.pack.gz.old b/.next/cache/webpack/server-development/index.pack.gz.old index ee2d067..e119e8e 100644 Binary files a/.next/cache/webpack/server-development/index.pack.gz.old and b/.next/cache/webpack/server-development/index.pack.gz.old differ diff --git a/.next/server/app-paths-manifest.json b/.next/server/app-paths-manifest.json index 7ce0893..b1444c2 100644 --- a/.next/server/app-paths-manifest.json +++ b/.next/server/app-paths-manifest.json @@ -1,6 +1,6 @@ { - "/gunbuilder/build/page": "app/gunbuilder/build/page.js", "/gunbuilder/[categoryId]/page": "app/gunbuilder/[categoryId]/page.js", "/gunbuilder/[categoryId]/[partId]/page": "app/gunbuilder/[categoryId]/[partId]/page.js", - "/gunbuilder/page": "app/gunbuilder/page.js" + "/gunbuilder/page": "app/gunbuilder/page.js", + "/gunbuilder/build/page": "app/gunbuilder/build/page.js" } \ No newline at end of file diff --git a/.next/server/app/gunbuilder/[categoryId]/page.js b/.next/server/app/gunbuilder/[categoryId]/page.js index 08c1270..fbc1d61 100644 --- a/.next/server/app/gunbuilder/[categoryId]/page.js +++ b/.next/server/app/gunbuilder/[categoryId]/page.js @@ -137,7 +137,7 @@ eval("Promise.resolve(/*! import() eager */).then(__webpack_require__.t.bind(__w /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CategoryPage)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js\");\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(ssr)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(ssr)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(ssr)/./data/gunbuilderParts.ts\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \n\n\n\n\nconst API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL ?? \"http://localhost:8080\";\n/**\n * Map from category id -> Ballistic partRole(s)\n * Keep this in sync with whatever you’re using on the main /gunbuilder page.\n */ const CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ]\n};\nfunction CategoryPage() {\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n const roles = CATEGORY_TO_PART_ROLES[categoryId] ?? [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = `${API_BASE_URL}/api/products/gunbuilder${roles.length ? `?${search.toString()}` : \"\"}`;\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(`Failed to load products (${res.status})`);\n }\n const data = await res.json();\n // πŸ”‘ Normalize into your Part type using *id* and *brand*\n const normalized = data.map((p)=>({\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: p.price ?? 0,\n imageUrl: p.mainImageUrl ?? undefined,\n url: p.buyUrl ?? undefined,\n notes: undefined\n }));\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n setError(err.message ?? \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 111,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 114,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 110,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 109,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 108,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 131,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 139,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 143,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 142,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 145,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 138,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: `px-3 py-1.5 text-xs font-medium rounded transition-colors ${viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"}`,\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 152,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: `px-3 py-1.5 text-xs font-medium rounded transition-colors ${viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"}`,\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 164,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 151,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 137,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 130,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 184,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" β€” check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 188,\n columnNumber: 13\n }, this) : parts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 192,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: parts.map((part)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: `/gunbuilder?select=${categoryId}:${part.id}`,\n className: \"flex-1\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"β€” \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 210,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 208,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 213,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 207,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 218,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 206,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 202,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: `/gunbuilder/${categoryId}/${part.id}`,\n className: \"w-full rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 223,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"absolute inset-0 rounded-md bg-amber-400/10 opacity-0 group-hover:opacity-100 transition-opacity duration-200 pointer-events-none flex items-center justify-center\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-200 tracking-wide\",\n children: \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 231,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 230,\n columnNumber: 19\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 198,\n columnNumber: 17\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 196,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: parts.map((part)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: `/gunbuilder?select=${categoryId}:${part.id}`,\n className: \"block\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"β€” \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 253,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 251,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 256,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 247,\n columnNumber: 23\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 246,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 263,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: `/gunbuilder/${categoryId}/${part.id}`,\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 266,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 262,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 245,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"absolute inset-0 rounded-md bg-amber-400/10 opacity-0 group-hover:opacity-100 transition-opacity duration-200 pointer-events-none flex items-center justify-center\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-200 tracking-wide\",\n children: \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 276,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 275,\n columnNumber: 19\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 241,\n columnNumber: 17\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 239,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 182,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 128,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 127,\n columnNumber: 5\n }, this);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9hcHAvZ3VuYnVpbGRlci9bY2F0ZWdvcnlJZF0vcGFnZS50c3giLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQ2U7QUFDUTtBQWdCcEQsTUFBTU0sZUFDSkMsUUFBUUMsR0FBRyxDQUFDQyx3QkFBd0IsSUFBSTtBQUUxQzs7O0NBR0MsR0FDRCxNQUFNQyx5QkFBdUQ7SUFDM0RDLE9BQU87UUFBQztLQUFpQjtJQUN6QkMsUUFBUTtRQUFDO0tBQVM7SUFDbEJDLFdBQVc7UUFBQztLQUFZO0lBQ3hCQyxnQkFBZ0I7UUFBQztLQUFrQjtJQUNuQ0MsUUFBUTtRQUFDO0tBQWE7SUFDdEJDLFlBQVk7UUFBQztLQUFrQjtJQUMvQkMsUUFBUTtRQUFDO0tBQVE7QUFDbkI7QUFFZSxTQUFTQztJQUN0QixNQUFNQyxTQUFTZiwwREFBU0E7SUFDeEIsTUFBTWdCLGFBQWFELE9BQU9DLFVBQVU7SUFDcEMsTUFBTSxDQUFDQyxVQUFVQyxZQUFZLEdBQUdwQiwrQ0FBUUEsQ0FBVztJQUNuRCxNQUFNLENBQUNxQixPQUFPQyxTQUFTLEdBQUd0QiwrQ0FBUUEsQ0FBUyxFQUFFO0lBQzdDLE1BQU0sQ0FBQ3VCLFNBQVNDLFdBQVcsR0FBR3hCLCtDQUFRQSxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQ3lCLE9BQU9DLFNBQVMsR0FBRzFCLCtDQUFRQSxDQUFnQjtJQUVsRCxNQUFNMkIsV0FBVzVCLDhDQUFPQSxDQUN0QixJQUFNSSw2REFBVUEsQ0FBQ3lCLElBQUksQ0FBQyxDQUFDQyxJQUFNQSxFQUFFQyxFQUFFLEtBQUtaLGFBQ3RDO1FBQUNBO0tBQVc7SUFHZHBCLGdEQUFTQSxDQUFDO1FBQ1IsSUFBSSxDQUFDb0IsWUFBWTtRQUVqQixNQUFNYSxhQUFhLElBQUlDO1FBRXZCLGVBQWVDO1lBQ2IsSUFBSTtnQkFDRlQsV0FBVztnQkFDWEUsU0FBUztnQkFFVCxNQUFNUSxRQUFRMUIsc0JBQXNCLENBQUNVLFdBQVcsSUFBSSxFQUFFO2dCQUV0RCxNQUFNaUIs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Ozs7Ozs7Ozs7OztBQThDOUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ndW5idWlsZGVyLXByb3RvdHlwZS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeD84YjVkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgTGluayBmcm9tIFwibmV4dC9saW5rXCI7XG5pbXBvcnQgeyB1c2VQYXJhbXMgfSBmcm9tIFwibmV4dC9uYXZpZ2F0aW9uXCI7XG5pbXBvcnQgeyBDQVRFR09SSUVTIH0gZnJvbSBcIkAvZGF0YS9ndW5idWlsZGVyUGFydHNcIjtcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcnlJZCwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxudHlwZSBWaWV3TW9kZSA9IFwiY2FyZFwiIHwgXCJsaXN0XCI7XG5cbnR5cGUgR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpID0ge1xuICBpZDogc3RyaW5nOyAgICAgICAgICAgICAgICAgLy8gYmFja2VuZCBVVUlEIGFzIHN0cmluZ1xuICBuYW1lOiBzdHJpbmc7XG4gIGJyYW5kOiBzdHJpbmc7ICAgICAgICAgICAgICAvLyBiYWNrZW5kIGJyYW5kIGZpZWxkXG4gIHBsYXRmb3JtOiBzdHJpbmc7XG4gIHBhcnRSb2xlOiBzdHJpbmc7XG4gIHByaWNlOiBudW1iZXIgfCBudWxsO1xuICBtYWluSW1hZ2VVcmw6IHN0cmluZyB8IG51bGw7XG4gIGJ1eVVybDogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9XG4gIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCA/PyBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiO1xuXG4vKipcbiAqIE1hcCBmcm9tIGNhdGVnb3J5IGlkIC0+IEJhbGxpc3RpYyBwYXJ0Um9sZShzKVxuICogS2VlcCB0aGlzIGluIHN5bmMgd2l0aCB3aGF0ZXZlciB5b3XigJlyZSB1c2luZyBvbiB0aGUgbWFpbiAvZ3VuYnVpbGRlciBwYWdlLlxuICovXG5jb25zdCBDQVRFR09SWV9UT19QQVJUX1JPTEVTOiBSZWNvcmQ8Q2F0ZWdvcnlJZCwgc3RyaW5nW10+ID0ge1xuICB1cHBlcjogW1widXBwZXItcmVjZWl2ZXJcIl0sXG4gIGJhcnJlbDogW1wiYmFycmVsXCJdLFxuICBoYW5kZ3VhcmQ6IFtcImhhbmRndWFyZFwiXSxcbiAgY2hhcmdpbmdIYW5kbGU6IFtcImNoYXJnaW5nLWhhbmRsZVwiXSxcbiAgYnVmZmVyOiBbXCJidWZmZXIta2l0XCJdLFxuICBsb3dlclBhcnRzOiBbXCJsb3dlci1wYXJ0cy1raXRcIl0sXG4gIHNpZ2h0czogW1wic2lnaHRcIl0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDYXRlZ29yeVBhZ2UoKSB7XG4gIGNvbnN0IHBhcmFtcyA9IHVzZVBhcmFtcygpO1xuICBjb25zdCBjYXRlZ29yeUlkID0gcGFyYW1zLmNhdGVnb3J5SWQgYXMgQ2F0ZWdvcnlJZDtcbiAgY29uc3QgW3ZpZXdNb2RlLCBzZXRWaWV3TW9kZV0gPSB1c2VTdGF0ZTxWaWV3TW9kZT4oXCJsaXN0XCIpO1xuICBjb25zdCBbcGFydHMsIHNldFBhcnRzXSA9IHVzZVN0YXRlPFBhcnRbXT4oW10pO1xuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICBjb25zdCBjYXRlZ29yeSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gQ0FURUdPUklFUy5maW5kKChjKSA9PiBjLmlkID09PSBjYXRlZ29yeUlkKSxcbiAgICBbY2F0ZWdvcnlJZF0sXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNhdGVnb3J5SWQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaENhdGVnb3J5UGFydHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgICAgICBzZXRFcnJvcihudWxsKTtcblxuICAgICAgICBjb25zdCByb2xlcyA9IENBVEVHT1JZX1RPX1BBUlRfUk9MRVNbY2F0ZWdvcnlJZF0gPz8gW107XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICBzZWFyY2guc2V0KFwicGxhdGZvcm1cIiwgXCJBUi0xNVwiKTtcbiAgICAgICAgcm9sZXMuZm9yRWFjaCgocikgPT4gc2VhcmNoLmFwcGVuZChcInBhcnRSb2xlc1wiLCByKSk7XG5cbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJX0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvZ3VuYnVpbGRlciR7XG4gICAgICAgICAgcm9sZXMubGVuZ3RoID8gYD8ke3NlYXJjaC50b1N0cmluZygpfWAgOiBcIlwiXG4gICAgICAgIH1gO1xuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pO1xuXG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBwcm9kdWN0cyAoJHtyZXMuc3RhdHVzfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGE6IEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaVtdID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgICAvLyDwn5SRIE5vcm1hbGl6ZSBpbnRvIHlvdXIgUGFydCB0eXBlIHVzaW5nICppZCogYW5kICpicmFuZCpcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZDogUGFydFtdID0gZGF0YS5tYXAoKHApID0+ICh7XG4gICAgICAgICAgaWQ6IHAuaWQsICAgICAgICAgICAgICAgICAgICAgIC8vIOKchSBiYWNrZW5kIGlkIChVVUlEIHN0cmluZylcbiAgICAgICAgICBjYXRlZ29yeUlkLFxuICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICBicmFuZDogcC5icmFuZCwgICAgICAgICAgICAgICAgLy8g4pyFIGJhY2tlbmQgYnJhbmRcbiAgICAgICAgICBwcmljZTogcC5wcmljZSA/PyAwLFxuICAgICAgICAgIGltYWdlVXJsOiBwLm1haW5JbWFnZVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgdXJsOiBwLmJ1eVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgbm90ZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHNldFBhcnRzKG5vcm1hbGl6ZWQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuO1xuICAgICAgICBzZXRFcnJvcihlcnIubWVzc2FnZSA/PyBcIkZhaWxlZCB0byBsb2FkIHByb2R1Y3RzXCIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hDYXRlZ29yeVBhcnRzKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuICB9LCBbY2F0ZWdvcnlJZF0pO1xuXG4gIGlmICghY2F0ZWdvcnkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LWF1dG8gbWF4LXctNnhsIHB4LTQgcHktNiBsZzpweS0xMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LXNlbWlib2xkIHRleHQtemluYy01MCBtYi00XCI+XG4gICAgICAgICAgICAgIENhdGVnb3J5IE5vdCBGb3VuZFxuICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtYW1iZXItMzAwIGhvdmVyOnRleHQtYW1iZXItMjAwIHVuZGVybGluZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIFJldHVybiB0byBHdW5idWlsZGVyXG4gICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9tYWluPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxtYWluIGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1ibGFjayB0ZXh0LXppbmMtNTBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgIHsvKiBIZWFkZXIgKi99XG4gICAgICAgIDxoZWFkZXIgY2xhc3NOYW1lPVwibWItNlwiPlxuICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICBocmVmPVwiL2d1bmJ1aWxkZXJcIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDAgbWItNCBpbmxpbmUtYmxvY2tcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIOKGkCBCYWNrIHRvIEd1bmJ1aWxkZXJcbiAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlbiBnYXAtNFwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRyYWNraW5nLVswLjJlbV0gdXBwZXJjYXNlIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBTaGFkb3cgU3RhbmRhcmRcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LTJ4bCBtZDp0ZXh0LTN4bCBmb250LXNlbWlib2xkIHRyYWNraW5nLXRpZ2h0XCI+XG4gICAgICAgICAgICAgICAge2NhdGVnb3J5Lm5hbWV9IDxzcGFuIGNsYXNzTmFtZT1cInRleHQtYW1iZXItMzAwXCI+UGFydHM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTIgdGV4dC1zbSB0ZXh0LXppbmMtNDAwIG1heC13LXhsXCI+XG4gICAgICAgICAgICAgICAgQnJvd3NlIGFsbCBhdmFpbGFibGUge2NhdGVnb3J5Lm5hbWUudG9Mb3dlckNhc2UoKX0gb3B0aW9ucyBmb3JcbiAgICAgICAgICAgICAgICB5b3VyIGJ1aWxkLCBwdWxsZWQgbGl2ZSBmcm9tIHlvdXIgQmFsbGlzdGljIGJhY2tlbmQuXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiBwYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGdhcC0yIGJvcmRlciBib3JkZXItemluYy04MDAgcm91bmRlZC1tZCBwLTEgYmctemluYy05NTAvNjBcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFZpZXdNb2RlKFwiY2FyZFwiKX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gcm91bmRlZCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgICB2aWV3TW9kZSA9PT0gXCJjYXJkXCJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTUwXCJcbiAgICAgICAgICAgICAgICAgICAgICA6IFwidGV4dC16aW5jLTQwMCBob3Zlcjp0ZXh0LXppbmMtMzAwXCJcbiAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNhcmQgdmlld1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQ2FyZFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJsaXN0XCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImxpc3RcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiTGlzdCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBMaXN0XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9oZWFkZXI+XG5cbiAgICAgICAgey8qIFBhcnRzIEdyaWQvTGlzdCAqL31cbiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwicm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzYwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIExvYWRpbmcge2NhdGVnb3J5Lm5hbWUudG9Mb3dlckNhc2UoKX3igKZcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogZXJyb3IgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtcmVkLTQwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIHtlcnJvcn0g4oCUIGNoZWNrIHRoYXQgdGhlIEJhbGxpc3RpYyBBUEkgaXMgcnVubmluZy5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogcGFydHMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAgTm8gcGFydHMgYXZhaWxhYmxlIGZvciB0aGlzIGNhdGVnb3J5IHlldC5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogdmlld01vZGUgPT09IFwiY2FyZFwiID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC0zIG1kOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zXCI+XG4gICAgICAgICAgICAgIHtwYXJ0cy5tYXAoKHBhcnQpID0+IChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBrZXk9e3BhcnQuaWR9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJncm91cCByZWxhdGl2ZSBib3JkZXIgYm9yZGVyLXppbmMtNzAwIHJvdW5kZWQtbWQgcC0zIGJnLXppbmMtOTAwLzUwIGhvdmVyOmJvcmRlci1hbWJlci00MDAvNjAgaG92ZXI6YmctYW1iZXItNDAwLzEwIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCBmbGV4IGZsZXgtY29sXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXI/c2VsZWN0PSR7Y2F0ZWdvcnlJZH06JHtwYXJ0LmlkfWB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXgtMVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIGdhcC0yIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0LmJyYW5kfXtcIiBcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1ub3JtYWxcIj7igJQge3BhcnQubmFtZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LXhzIHRleHQtemluYy00MDAgbGluZS1jbGFtcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDAgd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7cGFydC5wcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtODAwLzUwIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHRleHQtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgVmlldyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICB7LyogSG92ZXIgT3ZlcmxheSAqL31cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQtMCByb3VuZGVkLW1kIGJnLWFtYmVyLTQwMC8xMCBvcGFjaXR5LTAgZ3JvdXAtaG92ZXI6b3BhY2l0eS0xMDAgdHJhbnNpdGlvbi1vcGFjaXR5IGR1cmF0aW9uLTIwMCBwb2ludGVyLWV2ZW50cy1ub25lIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMjAwIHRyYWNraW5nLXdpZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICBBZGQgdG8gQnVpbGRcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAge3BhcnRzLm1hcCgocGFydCkgPT4gKFxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGtleT17cGFydC5pZH1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImdyb3VwIHJlbGF0aXZlIGJvcmRlciBib3JkZXItemluYy03MDAgcm91bmRlZC1tZCBwLTMgYmctemluYy05MDAvNTAgaG92ZXI6Ym9yZGVyLWFtYmVyLTQwMC82MCBob3ZlcjpiZy1hbWJlci00MDAvMTAgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtNFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBtaW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlcj9zZWxlY3Q9JHtjYXRlZ29yeUlkfToke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJsb2NrXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9e1wiIFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW5vcm1hbFwiPuKAlCB7cGFydC5uYW1lfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXMgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTQwMCBsaW5lLWNsYW1wLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3Rlc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDAgd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7cGFydC5wcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeUlkfS8ke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBWaWV3IERldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB7LyogSG92ZXIgT3ZlcmxheSAqL31cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQtMCByb3VuZGVkLW1kIGJnLWFtYmVyLTQwMC8xMCBvcGFjaXR5LTAgZ3JvdXAtaG92ZXI6b3BhY2l0eS0xMDAgdHJhbnNpdGlvbi1vcGFjaXR5IGR1cmF0aW9uLTIwMCBwb2ludGVyLWV2ZW50cy1ub25lIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMjAwIHRyYWNraW5nLXdpZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICBBZGQgdG8gQnVpbGRcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsIkxpbmsiLCJ1c2VQYXJhbXMiLCJDQVRFR09SSUVTIiwiQVBJX0JBU0VfVVJMIiwicHJvY2VzcyIsImVudiIsIk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCIsIkNBVEVHT1JZX1RPX1BBUlRfUk9MRVMiLCJ1cHBlciIsImJhcnJlbCIsImhhbmRndWFyZCIsImNoYXJnaW5nSGFuZGxlIiwiYnVmZmVyIiwibG93ZXJQYXJ0cyIsInNpZ2h0cyIsIkNhdGVnb3J5UGFnZSIsInBhcmFtcyIsImNhdGVnb3J5SWQiLCJ2aWV3TW9kZSIsInNldFZpZXdNb2RlIiwicGFydHMiLCJzZXRQYXJ0cyIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsImNhdGVnb3J5IiwiZmluZCIsImMiLCJpZCIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJmZXRjaENhdGVnb3J5UGFydHMiLCJyb2xlcyIsInNlYXJjaCIsIlVSTFNlYXJjaFBhcmFtcyIsInNldCIsImZvckVhY2giLCJyIiwiYXBwZW5kIiwidXJsIiwibGVuZ3RoIiwidG9TdHJpbmciLCJyZXMiLCJmZXRjaCIsInNpZ25hbCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsIm5vcm1hbGl6ZWQiLCJtYXAiLCJwIiwibmFtZSIsImJyYW5kIiwicHJpY2UiLCJpbWFnZVVybCIsIm1haW5JbWFnZVVybCIsInVuZGVmaW5lZCIsImJ1eVVybCIsIm5vdGVzIiwiZXJyIiwibWVzc2FnZSIsImFib3J0IiwibWFpbiIsImNsYXNzTmFtZSIsImRpdiIsImgxIiwiaHJlZiIsImhlYWRlciIsInNwYW4iLCJ0b0xvd2VyQ2FzZSIsImJ1dHRvbiIsInR5cGUiLCJvbkNsaWNrIiwiYXJpYS1sYWJlbCIsInNlY3Rpb24iLCJwYXJ0IiwidG9GaXhlZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./app/gunbuilder/[categoryId]/page.tsx\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CategoryPage)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js\");\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(ssr)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(ssr)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(ssr)/./data/gunbuilderParts.ts\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \n\n\n\n\nconst API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL ?? \"http://localhost:8080\";\nconst CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ]\n};\nconst STORAGE_KEY = \"gunbuilder-build-state\";\nfunction CategoryPage() {\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // NEW: filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n // NEW: build state for this page, synced with localStorage\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (true) return {};\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : {};\n } catch {\n return {};\n }\n });\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n const roles = CATEGORY_TO_PART_ROLES[categoryId] ?? [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = `${API_BASE_URL}/api/products/gunbuilder${roles.length ? `?${search.toString()}` : \"\"}`;\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(`Failed to load products (${res.status})`);\n }\n const data = await res.json();\n const normalized = data.map((p)=>({\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: p.price ?? 0,\n imageUrl: p.mainImageUrl ?? undefined,\n url: p.buyUrl ?? undefined,\n notes: undefined\n }));\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n setError(err.message ?? \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // NEW: persist build to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (true) return;\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n } catch {\n // ignore\n }\n }, [\n build\n ]);\n // NEW: handler to toggle Add / Remove for this category\n const handleTogglePart = (categoryId, partId)=>{\n const isSelected = build[categoryId] === partId;\n if (isSelected) {\n // Remove from build\n setBuild((prev)=>{\n const updated = {\n ...prev\n };\n delete updated[categoryId];\n return updated;\n });\n } else {\n // Add to build and navigate back to main gunbuilder page\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n router.push(\"/gunbuilder\");\n }\n };\n // NEW: available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // NEW: filtered + sorted parts\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 197,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 200,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 196,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 195,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 194,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 217,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 225,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 229,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 228,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 231,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 224,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: `px-3 py-1.5 text-xs font-medium rounded transition-colors ${viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"}`,\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 238,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: `px-3 py-1.5 text-xs font-medium rounded transition-colors ${viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"}`,\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 250,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 237,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 223,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 216,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 274,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 278,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 272,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 285,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 297,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 299,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 291,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 284,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 306,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 317,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low β†’ High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 318,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High β†’ Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 319,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A β†’ Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 320,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 309,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 305,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 283,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 271,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 328,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" β€” check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 332,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 336,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"β€” \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 353,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 351,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 356,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 350,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 361,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 349,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: `/gunbuilder/${categoryId}/${part.id}`,\n className: \"flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 366,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: `flex-1 rounded-md px-3 py-2 text-xs font-semibold transition-colors text-center ${isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"}`,\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 372,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 365,\n columnNumber: 21\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 345,\n columnNumber: 19\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 340,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 392,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 393,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 394,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 395,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 391,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 409,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 413,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 408,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 418,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 421,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: `/gunbuilder/${categoryId}/${part.id}`,\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 425,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: `rounded-md px-3 py-1.5 text-xs font-semibold transition-colors whitespace-nowrap ${isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"}`,\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 431,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 424,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 407,\n columnNumber: 23\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 403,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 398,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 268,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 214,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 213,\n columnNumber: 5\n }, this);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9hcHAvZ3VuYnVpbGRlci9bY2F0ZWdvcnlJZF0vcGFnZS50c3giLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQzBCO0FBQ0g7QUFnQnBELE1BQU1PLGVBQ0pDLFFBQVFDLEdBQUcsQ0FBQ0Msd0JBQXdCLElBQUk7QUFFMUMsTUFBTUMseUJBQXVEO0lBQzNEQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLFFBQVE7UUFBQztLQUFTO0lBQ2xCQyxXQUFXO1FBQUM7S0FBWTtJQUN4QkMsZ0JBQWdCO1FBQUM7S0FBa0I7SUFDbkNDLFFBQVE7UUFBQztLQUFhO0lBQ3RCQyxZQUFZO1FBQUM7S0FBa0I7SUFDL0JDLFFBQVE7UUFBQztLQUFRO0FBQ25CO0FBT0EsTUFBTUMsY0FBYztBQUVMLFNBQVNDO0lBQ3RCLE1BQU1DLFNBQVNqQiwwREFBU0E7SUFDeEIsTUFBTWtCLGFBQWFELE9BQU9DLFVBQVU7SUFDcEMsTUFBTUMsU0FBU2xCLDBEQUFTQTtJQUV4QixNQUFNLENBQUNtQixVQUFVQyxZQUFZLEdBQUd2QiwrQ0FBUUEsQ0FBVztJQUNuRCxNQUFNLENBQUN3QixPQUFPQyxTQUFTLEdBQUd6QiwrQ0FBUUEsQ0FBUyxFQUFFO0lBQzdDLE1BQU0sQ0FBQzBCLFNBQVNDLFdBQVcsR0FBRzNCLCtDQUFRQSxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQzRCLE9BQU9DLFNBQVMsR0FBRzdCLCtDQUFRQSxDQUFnQjtJQUVsRCwyQkFBMkI7SUFDM0IsTUFBTSxDQUFDOEIsYUFBYUMsZUFBZSxHQUFHL0IsK0NBQVFBLENBQVM7SUFDdkQsTUFBTSxDQUFDZ0MsUUFBUUMsVUFBVSxHQUFHakMsK0NBQVFBLENBQWE7SUFFakQsMkRBQTJEO0lBQzNELE1BQU0sQ0FBQ2tDLE9BQU9DLFNBQVMsR0FBR25DLCtDQUFRQSxDQUFhO1FBQzdDLElBQUksSUFBNkIsRUFBRSxPQUFPLENBQUM7UUFDM0MsSUFBSTtZQUNGLE1BQU1vQyxTQUFTQyxPQUFPQyxZQUFZLENBQUND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QUNDQyxNQUFLO2dFQUNMQyxTQUFTLElBQ1A1QixpQkFBaUIvRCxZQUFZc0csS0FBSzdFLEVBQUU7Z0VBRXRDeUQsV0FBVyxDQUFDLGlGQUFpRixFQUMzRmpCLGFBQ0ksdUVBQ0EsNkNBQ0wsQ0FBQzswRUFFREEsYUFBYSxzQkFBc0I7Ozs7Ozs7Ozs7Ozs7Ozs7OzsyQ0F0Q3JDcUMsS0FBSzdFLEVBQUU7Ozs7O29DQTRDbEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRaEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ndW5idWlsZGVyLXByb3RvdHlwZS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeD84YjVkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgTGluayBmcm9tIFwibmV4dC9saW5rXCI7XG5pbXBvcnQgeyB1c2VQYXJhbXMsIHVzZVJvdXRlciB9IGZyb20gXCJuZXh0L25hdmlnYXRpb25cIjtcbmltcG9ydCB7IENBVEVHT1JJRVMgfSBmcm9tIFwiQC9kYXRhL2d1bmJ1aWxkZXJQYXJ0c1wiO1xuaW1wb3J0IHR5cGUgeyBDYXRlZ29yeUlkLCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuXG50eXBlIFZpZXdNb2RlID0gXCJjYXJkXCIgfCBcImxpc3RcIjtcblxudHlwZSBHdW5idWlsZGVyUHJvZHVjdEZyb21BcGkgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgYnJhbmQ6IHN0cmluZztcbiAgcGxhdGZvcm06IHN0cmluZztcbiAgcGFydFJvbGU6IHN0cmluZztcbiAgcHJpY2U6IG51bWJlciB8IG51bGw7XG4gIG1haW5JbWFnZVVybDogc3RyaW5nIHwgbnVsbDtcbiAgYnV5VXJsOiBzdHJpbmcgfCBudWxsO1xufTtcblxuY29uc3QgQVBJX0JBU0VfVVJMID1cbiAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMID8/IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCI7XG5cbmNvbnN0IENBVEVHT1JZX1RPX1BBUlRfUk9MRVM6IFJlY29yZDxDYXRlZ29yeUlkLCBzdHJpbmdbXT4gPSB7XG4gIHVwcGVyOiBbXCJ1cHBlci1yZWNlaXZlclwiXSxcbiAgYmFycmVsOiBbXCJiYXJyZWxcIl0sXG4gIGhhbmRndWFyZDogW1wiaGFuZGd1YXJkXCJdLFxuICBjaGFyZ2luZ0hhbmRsZTogW1wiY2hhcmdpbmctaGFuZGxlXCJdLFxuICBidWZmZXI6IFtcImJ1ZmZlci1raXRcIl0sXG4gIGxvd2VyUGFydHM6IFtcImxvd2VyLXBhcnRzLWtpdFwiXSxcbiAgc2lnaHRzOiBbXCJzaWdodFwiXSxcbn07XG5cbi8vIE5FVzogc29ydCBvcHRpb25zXG50eXBlIFNvcnRPcHRpb24gPSBcInJlbGV2YW5jZVwiIHwgXCJwcmljZS1hc2NcIiB8IFwicHJpY2UtZGVzY1wiIHwgXCJicmFuZC1hc2NcIjtcblxuLy8gTkVXOiBidWlsZCBzdGF0ZSB0eXBlICsgc3RvcmFnZSBrZXkgKG1hdGNoZXMgL2d1bmJ1aWxkZXIpXG50eXBlIEJ1aWxkU3RhdGUgPSBQYXJ0aWFsPFJlY29yZDxDYXRlZ29yeUlkLCBzdHJpbmc+PjtcbmNvbnN0IFNUT1JBR0VfS0VZID0gXCJndW5idWlsZGVyLWJ1aWxkLXN0YXRlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENhdGVnb3J5UGFnZSgpIHtcbiAgY29uc3QgcGFyYW1zID0gdXNlUGFyYW1zKCk7XG4gIGNvbnN0IGNhdGVnb3J5SWQgPSBwYXJhbXMuY2F0ZWdvcnlJZCBhcyBDYXRlZ29yeUlkO1xuICBjb25zdCByb3V0ZXIgPSB1c2VSb3V0ZXIoKTtcblxuICBjb25zdCBbdmlld01vZGUsIHNldFZpZXdNb2RlXSA9IHVzZVN0YXRlPFZpZXdNb2RlPihcImxpc3RcIik7XG4gIGNvbnN0IFtwYXJ0cywgc2V0UGFydHNdID0gdXNlU3RhdGU8UGFydFtdPihbXSk7XG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpO1xuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIE5FVzogZmlsdGVyICsgc29ydCBzdGF0ZVxuICBjb25zdCBbYnJhbmRGaWx0ZXIsIHNldEJyYW5kRmlsdGVyXSA9IHVzZVN0YXRlPHN0cmluZz4oXCJhbGxcIik7XG4gIGNvbnN0IFtzb3J0QnksIHNldFNvcnRCeV0gPSB1c2VTdGF0ZTxTb3J0T3B0aW9uPihcInJlbGV2YW5jZVwiKTtcblxuICAvLyBORVc6IGJ1aWxkIHN0YXRlIGZvciB0aGlzIHBhZ2UsIHN5bmNlZCB3aXRoIGxvY2FsU3RvcmFnZVxuICBjb25zdCBbYnVpbGQsIHNldEJ1aWxkXSA9IHVzZVN0YXRlPEJ1aWxkU3RhdGU+KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHt9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yZWQgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9LRVkpO1xuICAgICAgcmV0dXJuIHN0b3JlZCA/IChKU09OLnBhcnNlKHN0b3JlZCkgYXMgQnVpbGRTdGF0ZSkgOiB7fTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGNhdGVnb3J5ID0gdXNlTWVtbyhcbiAgICAoKSA9PiBDQVRFR09SSUVTLmZpbmQoKGMpID0+IGMuaWQgPT09IGNhdGVnb3J5SWQpLFxuICAgIFtjYXRlZ29yeUlkXSxcbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY2F0ZWdvcnlJZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGZldGNoQ2F0ZWdvcnlQYXJ0cygpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgICAgIHNldEVycm9yKG51bGwpO1xuXG4gICAgICAgIGNvbnN0IHJvbGVzID0gQ0FURUdPUllfVE9fUEFSVF9ST0xFU1tjYXRlZ29yeUlkXSA/PyBbXTtcblxuICAgICAgICBjb25zdCBzZWFyY2ggPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICAgIHNlYXJjaC5zZXQoXCJwbGF0Zm9ybVwiLCBcIkFSLTE1XCIpO1xuICAgICAgICByb2xlcy5mb3JFYWNoKChyKSA9PiBzZWFyY2guYXBwZW5kKFwicGFydFJvbGVzXCIsIHIpKTtcblxuICAgICAgICBjb25zdCB1cmwgPSBgJHtBUElfQkFTRV9VUkx9L2FwaS9wcm9kdWN0cy9ndW5idWlsZGVyJHtcbiAgICAgICAgICByb2xlcy5sZW5ndGggPyBgPyR7c2VhcmNoLnRvU3RyaW5nKCl9YCA6IFwiXCJcbiAgICAgICAgfWA7XG5cbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSk7XG5cbiAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIHByb2R1Y3RzICgke3Jlcy5zdGF0dXN9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YTogR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpW10gPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQ6IFBhcnRbXSA9IGRhdGEubWFwKChwKSA9PiAoe1xuICAgICAgICAgIGlkOiBwLmlkLFxuICAgICAgICAgIGNhdGVnb3J5SWQsXG4gICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgIGJyYW5kOiBwLmJyYW5kLFxuICAgICAgICAgIHByaWNlOiBwLnByaWNlID8/IDAsXG4gICAgICAgICAgaW1hZ2VVcmw6IHAubWFpbkltYWdlVXJsID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICB1cmw6IHAuYnV5VXJsID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBub3RlczogdW5kZWZpbmVkLFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgc2V0UGFydHMobm9ybWFsaXplZCk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpZiAoZXJyLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSByZXR1cm47XG4gICAgICAgIHNldEVycm9yKGVyci5tZXNzYWdlID8/IFwiRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHNcIik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmZXRjaENhdGVnb3J5UGFydHMoKTtcblxuICAgIHJldHVybiAoKSA9PiBjb250cm9sbGVyLmFib3J0KCk7XG4gIH0sIFtjYXRlZ29yeUlkXSk7XG5cbiAgLy8gTkVXOiBwZXJzaXN0IGJ1aWxkIHRvIGxvY2FsU3RvcmFnZSB3aGVuZXZlciBpdCBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShidWlsZCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9LCBbYnVpbGRdKTtcblxuICAvLyBORVc6IGhhbmRsZXIgdG8gdG9nZ2xlIEFkZCAvIFJlbW92ZSBmb3IgdGhpcyBjYXRlZ29yeVxuICBjb25zdCBoYW5kbGVUb2dnbGVQYXJ0ID0gKGNhdGVnb3J5SWQ6IENhdGVnb3J5SWQsIHBhcnRJZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgaXNTZWxlY3RlZCA9IGJ1aWxkW2NhdGVnb3J5SWRdID09PSBwYXJ0SWQ7XG5cbiAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgLy8gUmVtb3ZlIGZyb20gYnVpbGRcbiAgICAgIHNldEJ1aWxkKChwcmV2KSA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWQ6IEJ1aWxkU3RhdGUgPSB7IC4uLnByZXYgfTtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRbY2F0ZWdvcnlJZF07XG4gICAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFkZCB0byBidWlsZCBhbmQgbmF2aWdhdGUgYmFjayB0byBtYWluIGd1bmJ1aWxkZXIgcGFnZVxuICAgICAgc2V0QnVpbGQoKHByZXYpID0+ICh7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIFtjYXRlZ29yeUlkXTogcGFydElkLFxuICAgICAgfSkpO1xuICAgICAgcm91dGVyLnB1c2goXCIvZ3VuYnVpbGRlclwiKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gTkVXOiBhdmFpbGFibGUgYnJhbmRzIGZvciBmaWx0ZXJcbiAgY29uc3QgYXZhaWxhYmxlQnJhbmRzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgQXJyYXkuZnJvbShuZXcgU2V0KHBhcnRzLm1hcCgocCkgPT4gcC5icmFuZCkpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpLFxuICAgIFtwYXJ0c10sXG4gICk7XG5cbiAgLy8gTkVXOiBmaWx0ZXJlZCArIHNvcnRlZCBwYXJ0c1xuICBjb25zdCBmaWx0ZXJlZFBhcnRzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgbGV0IHJlc3VsdCA9IFsuLi5wYXJ0c107XG5cbiAgICBpZiAoYnJhbmRGaWx0ZXIgIT09IFwiYWxsXCIpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoKHApID0+IHAuYnJhbmQgPT09IGJyYW5kRmlsdGVyKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHNvcnRCeSkge1xuICAgICAgY2FzZSBcInByaWNlLWFzY1wiOlxuICAgICAgICByZXN1bHQuc29ydCgoYSwgYikgPT4gYS5wcmljZSAtIGIucHJpY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJwcmljZS1kZXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBiLnByaWNlIC0gYS5wcmljZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImJyYW5kLWFzY1wiOlxuICAgICAgICByZXN1bHQuc29ydCgoYSwgYikgPT4gYS5icmFuZC5sb2NhbGVDb21wYXJlKGIuYnJhbmQpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicmVsZXZhbmNlXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBsZWF2ZSBpbiBiYWNrZW5kIG9yZGVyXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIFtwYXJ0cywgYnJhbmRGaWx0ZXIsIHNvcnRCeV0pO1xuXG4gIGlmICghY2F0ZWdvcnkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LWF1dG8gbWF4LXctNnhsIHB4LTQgcHktNiBsZzpweS0xMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LXNlbWlib2xkIHRleHQtemluYy01MCBtYi00XCI+XG4gICAgICAgICAgICAgIENhdGVnb3J5IE5vdCBGb3VuZFxuICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtYW1iZXItMzAwIGhvdmVyOnRleHQtYW1iZXItMjAwIHVuZGVybGluZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIFJldHVybiB0byBHdW5idWlsZGVyXG4gICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9tYWluPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxtYWluIGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1ibGFjayB0ZXh0LXppbmMtNTBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgIHsvKiBIZWFkZXIgKi99XG4gICAgICAgIDxoZWFkZXIgY2xhc3NOYW1lPVwibWItNlwiPlxuICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICBocmVmPVwiL2d1bmJ1aWxkZXJcIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDAgbWItNCBpbmxpbmUtYmxvY2tcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIOKGkCBCYWNrIHRvIEd1bmJ1aWxkZXJcbiAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlbiBnYXAtNFwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRyYWNraW5nLVswLjJlbV0gdXBwZXJjYXNlIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBTaGFkb3cgU3RhbmRhcmRcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LTJ4bCBtZDp0ZXh0LTN4bCBmb250LXNlbWlib2xkIHRyYWNraW5nLXRpZ2h0XCI+XG4gICAgICAgICAgICAgICAge2NhdGVnb3J5Lm5hbWV9IDxzcGFuIGNsYXNzTmFtZT1cInRleHQtYW1iZXItMzAwXCI+UGFydHM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTIgdGV4dC1zbSB0ZXh0LXppbmMtNDAwIG1heC13LXhsXCI+XG4gICAgICAgICAgICAgICAgQnJvd3NlIGFsbCBhdmFpbGFibGUge2NhdGVnb3J5Lm5hbWUudG9Mb3dlckNhc2UoKX0gb3B0aW9ucyBmb3JcbiAgICAgICAgICAgICAgICB5b3VyIGJ1aWxkLCBwdWxsZWQgbGl2ZSBmcm9tIHlvdXIgQmFsbGlzdGljIGJhY2tlbmQuXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiBwYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGdhcC0yIGJvcmRlciBib3JkZXItemluYy04MDAgcm91bmRlZC1tZCBwLTEgYmctemluYy05NTAvNjBcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFZpZXdNb2RlKFwiY2FyZFwiKX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gcm91bmRlZCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgICB2aWV3TW9kZSA9PT0gXCJjYXJkXCJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTUwXCJcbiAgICAgICAgICAgICAgICAgICAgICA6IFwidGV4dC16aW5jLTQwMCBob3Zlcjp0ZXh0LXppbmMtMzAwXCJcbiAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNhcmQgdmlld1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQ2FyZFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJsaXN0XCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImxpc3RcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiTGlzdCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBMaXN0XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9oZWFkZXI+XG5cbiAgICAgICAgey8qIFBhcnRzIEdyaWQvTGlzdCAqL31cbiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwicm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzYwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICB7LyogRmlsdGVyICsgc29ydCB0b29sYmFyICovfVxuICAgICAgICAgIHshbG9hZGluZyAmJiAhZXJyb3IgJiYgcGFydHMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTQgZmxleCBmbGV4LWNvbCBnYXAtMyBtZDpmbGV4LXJvdyBtZDppdGVtcy1jZW50ZXIgbWQ6anVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgU2hvd2luZ3tcIiBcIn1cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXppbmMtMjAwIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICB7ZmlsdGVyZWRQYXJ0cy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgPC9zcGFuPntcIiBcIn1cbiAgICAgICAgICAgICAgICBvZntcIiBcIn1cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXppbmMtMjAwIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICB7cGFydHMubGVuZ3RofVxuICAgICAgICAgICAgICAgIDwvc3Bhbj57XCIgXCJ9XG4gICAgICAgICAgICAgICAgcGFydHNcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgaHRtbEZvcj1cImJyYW5kLWZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEJyYW5kXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBpZD1cImJyYW5kLWZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXticmFuZEZpbHRlcn1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRCcmFuZEZpbHRlcihlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC83MCB0ZXh0LXhzIHRleHQtemluYy0yMDAgcHgtMiBweS0xIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1hbWJlci00MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYWxsXCI+QWxsIGJyYW5kczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICB7YXZhaWxhYmxlQnJhbmRzLm1hcCgoYikgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ga2V5PXtifSB2YWx1ZT17Yn0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7Yn1cbiAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgaHRtbEZvcj1cInNvcnQtYnlcIiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgU29ydFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJzb3J0LWJ5XCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NvcnRCeX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHNldFNvcnRCeShlLnRhcmdldC52YWx1ZSBhcyBTb3J0T3B0aW9uKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC83MCB0ZXh0LXhzIHRleHQtemluYy0yMDAgcHgtMiBweS0xIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1hbWJlci00MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVsZXZhbmNlXCI+UmVsZXZhbmNlPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwcmljZS1hc2NcIj5QcmljZTogTG93IOKGkiBIaWdoPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwcmljZS1kZXNjXCI+UHJpY2U6IEhpZ2gg4oaSIExvdzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYnJhbmQtYXNjXCI+QnJhbmQ6IEEg4oaSIFo8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIExvYWRpbmcge2NhdGVnb3J5Lm5hbWUudG9Mb3dlckNhc2UoKX3igKZcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogZXJyb3IgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtcmVkLTQwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIHtlcnJvcn0g4oCUIGNoZWNrIHRoYXQgdGhlIEJhbGxpc3RpYyBBUEkgaXMgcnVubmluZy5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogZmlsdGVyZWRQYXJ0cy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICBObyBwYXJ0cyBhdmFpbGFibGUgZm9yIHRoaXMgY2F0ZWdvcnkgeWV0LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiB2aWV3TW9kZSA9PT0gXCJjYXJkXCIgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTMgbWQ6Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTNcIj5cbiAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGJ1aWxkW2NhdGVnb3J5SWRdID09PSBwYXJ0LmlkO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAga2V5PXtwYXJ0LmlkfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJncm91cCByZWxhdGl2ZSBib3JkZXIgYm9yZGVyLXppbmMtNzAwIHJvdW5kZWQtbWQgcC0zIGJnLXppbmMtOTAwLzUwIGhvdmVyOmJvcmRlci1hbWJlci00MDAvNjAgaG92ZXI6YmctYW1iZXItNDAwLzEwIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCBmbGV4IGZsZXgtY29sXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgZ2FwLTIgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9e1wiIFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW5vcm1hbFwiPuKAlCB7cGFydC5uYW1lfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXMgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTQwMCBsaW5lLWNsYW1wLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3Rlc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTMwMCB3aGl0ZXNwYWNlLW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJ0LnByaWNlLnRvRml4ZWQoMil9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTIgZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeUlkfS8ke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXgtMSByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy04MDAvNTAgcHgtMyBweS0yIHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC16aW5jLTMwMCBob3ZlcjpiZy16aW5jLTcwMCBob3Zlcjpib3JkZXItemluYy02MDAgdHJhbnNpdGlvbi1jb2xvcnMgdGV4dC1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZVRvZ2dsZVBhcnQoY2F0ZWdvcnlJZCwgcGFydC5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BmbGV4LTEgcm91bmRlZC1tZCBweC0zIHB5LTIgdGV4dC14cyBmb250LXNlbWlib2xkIHRyYW5zaXRpb24tY29sb3JzIHRleHQtY2VudGVyICR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTEwMCBib3JkZXIgYm9yZGVyLXppbmMtNjAwIGhvdmVyOmJnLXppbmMtNzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiYmctYW1iZXItNDAwIHRleHQtYmxhY2sgaG92ZXI6YmctYW1iZXItMzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtpc1NlbGVjdGVkID8gXCJSZW1vdmUgZnJvbSBCdWlsZFwiIDogXCJBZGQgdG8gQnVpbGRcIn1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICB7LyogSGVhZGVyIHJvdyBmb3IgbGlzdCB2aWV3ICovfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImhpZGRlbiBtZDpncmlkIGdyaWQtY29scy1bbWlubWF4KDAsM2ZyKV9taW5tYXgoMCwxZnIpX21pbm1heCgwLDFmcilfYXV0b10gZ2FwLTQgcHgtMyBwYi0yIHRleHQtWzAuN3JlbV0gdXBwZXJjYXNlIHRyYWNraW5nLVswLjE2ZW1dIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5QYXJ0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuPkJyYW5kPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtcmlnaHRcIj5QcmljZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXJpZ2h0IHByLTJcIj5BY3Rpb25zPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMlwiPlxuICAgICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGJ1aWxkW2NhdGVnb3J5SWRdID09PSBwYXJ0LmlkO1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAga2V5PXtwYXJ0LmlkfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImdyb3VwIHJlbGF0aXZlIGJvcmRlciBib3JkZXItemluYy03MDAgcm91bmRlZC1tZCBwLTMgYmctemluYy05MDAvNTAgaG92ZXI6Ym9yZGVyLWFtYmVyLTQwMC82MCBob3ZlcjpiZy1hbWJlci00MDAvMTAgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMiBtZDpncmlkIG1kOmdyaWQtY29scy1bbWlubWF4KDAsM2ZyKV9taW5tYXgoMCwxZnIpX21pbm1heCgwLDFmcilfYXV0b10gbWQ6aXRlbXMtY2VudGVyIG1kOmdhcC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBtaW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3RlcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LXhzIHRleHQtemluYy00MDAgbGluZS1jbGFtcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3Rlc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyBtZDp0ZXh0LXNtIHRleHQtemluYy00MDAgbWQ6dGV4dC1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0LmJyYW5kfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTMwMCBtZDp0ZXh0LXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICR7cGFydC5wcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1lbmQgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeUlkfS8ke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy04MDAvNTAgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtNzAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB3aGl0ZXNwYWNlLW5vd3JhcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IERldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRvZ2dsZVBhcnQoY2F0ZWdvcnlJZCwgcGFydC5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcm91bmRlZC1tZCBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhbnNpdGlvbi1jb2xvcnMgd2hpdGVzcGFjZS1ub3dyYXAgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy0xMDAgYm9yZGVyIGJvcmRlci16aW5jLTYwMCBob3ZlcjpiZy16aW5jLTcwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJiZy1hbWJlci00MDAgdGV4dC1ibGFjayBob3ZlcjpiZy1hbWJlci0zMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2lzU2VsZWN0ZWQgPyBcIlJlbW92ZSBmcm9tIEJ1aWxkXCIgOiBcIkFkZCB0byBCdWlsZFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYWluPlxuICApO1xufSJdLCJuYW1lcyI6WyJ1c2VFZmZlY3QiLCJ1c2VNZW1vIiwidXNlU3RhdGUiLCJMaW5rIiwidXNlUGFyYW1zIiwidXNlUm91dGVyIiwiQ0FURUdPUklFUyIsIkFQSV9CQVNFX1VSTCIsInByb2Nlc3MiLCJlbnYiLCJORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwiLCJDQVRFR09SWV9UT19QQVJUX1JPTEVTIiwidXBwZXIiLCJiYXJyZWwiLCJoYW5kZ3VhcmQiLCJjaGFyZ2luZ0hhbmRsZSIsImJ1ZmZlciIsImxvd2VyUGFydHMiLCJzaWdodHMiLCJTVE9SQUdFX0tFWSIsIkNhdGVnb3J5UGFnZSIsInBhcmFtcyIsImNhdGVnb3J5SWQiLCJyb3V0ZXIiLCJ2aWV3TW9kZSIsInNldFZpZXdNb2RlIiwicGFydHMiLCJzZXRQYXJ0cyIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsImJyYW5kRmlsdGVyIiwic2V0QnJhbmRGaWx0ZXIiLCJzb3J0QnkiLCJzZXRTb3J0QnkiLCJidWlsZCIsInNldEJ1aWxkIiwic3RvcmVkIiwid2luZG93IiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsIkpTT04iLCJwYXJzZSIsImNhdGVnb3J5IiwiZmluZCIsImMiLCJpZCIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJmZXRjaENhdGVnb3J5UGFydHMiLCJyb2xlcyIsInNlYXJjaCIsIlVSTFNlYXJjaFBhcmFtcyIsInNldCIsImZvckVhY2giLCJyIiwiYXBwZW5kIiwidXJsIiwibGVuZ3RoIiwidG9TdHJpbmciLCJyZXMiLCJmZXRjaCIsInNpZ25hbCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsIm5vcm1hbGl6ZWQiLCJtYXAiLCJwIiwibmFtZSIsImJyYW5kIiwicHJpY2UiLCJpbWFnZVVybCIsIm1haW5JbWFnZVVybCIsInVuZGVmaW5lZCIsImJ1eVVybCIsIm5vdGVzIiwiZXJyIiwibWVzc2FnZSIsImFib3J0Iiwic2V0SXRlbSIsInN0cmluZ2lmeSIsImhhbmRsZVRvZ2dsZVBhcnQiLCJwYXJ0SWQiLCJpc1NlbGVjdGVkIiwicHJldiIsInVwZGF0ZWQiLCJwdXNoIiwiYXZhaWxhYmxlQnJhbmRzIiwiQXJyYXkiLCJmcm9tIiwiU2V0IiwiZmlsdGVyIiwiQm9vbGVhbiIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJmaWx0ZXJlZFBhcnRzIiwicmVzdWx0IiwibWFpbiIsImNsYXNzTmFtZSIsImRpdiIsImgxIiwiaHJlZiIsImhlYWRlciIsInNwYW4iLCJ0b0xvd2VyQ2FzZSIsImJ1dHRvbiIsInR5cGUiLCJvbkNsaWNrIiwiYXJpYS1sYWJlbCIsInNlY3Rpb24iLCJsYWJlbCIsImh0bWxGb3IiLCJzZWxlY3QiLCJ2YWx1ZSIsIm9uQ2hhbmdlIiwiZSIsInRhcmdldCIsIm9wdGlvbiIsInBhcnQiLCJ0b0ZpeGVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./app/gunbuilder/[categoryId]/page.tsx\n"); /***/ }), diff --git a/.next/server/webpack-runtime.js b/.next/server/webpack-runtime.js index 2bcea4f..d02563a 100644 --- a/.next/server/webpack-runtime.js +++ b/.next/server/webpack-runtime.js @@ -125,7 +125,7 @@ /******/ /******/ /* webpack/runtime/getFullHash */ /******/ (() => { -/******/ __webpack_require__.h = () => ("fb1a4529a6f0290a") +/******/ __webpack_require__.h = () => ("dee79c389764e4e8") /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ diff --git a/.next/static/chunks/app/gunbuilder/[categoryId]/page.js b/.next/static/chunks/app/gunbuilder/[categoryId]/page.js index 3b9e9d0..38ebe24 100644 --- a/.next/static/chunks/app/gunbuilder/[categoryId]/page.js +++ b/.next/static/chunks/app/gunbuilder/[categoryId]/page.js @@ -68,7 +68,7 @@ eval(__webpack_require__.ts("var __dirname = \"/\";\n(function(){var e={229:func /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\n/**\n * Map from category id -> Ballistic partRole(s)\n * Keep this in sync with whatever you’re using on the main /gunbuilder page.\n */ const CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ]\n};\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n var _CATEGORY_TO_PART_ROLES_categoryId;\n const roles = (_CATEGORY_TO_PART_ROLES_categoryId = CATEGORY_TO_PART_ROLES[categoryId]) !== null && _CATEGORY_TO_PART_ROLES_categoryId !== void 0 ? _CATEGORY_TO_PART_ROLES_categoryId : [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n // πŸ”‘ Normalize into your Part type using *id* and *brand*\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 111,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 114,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 110,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 109,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 108,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 131,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 139,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 143,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 142,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 145,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 138,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 152,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 164,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 151,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 137,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 130,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 184,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" β€” check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 188,\n columnNumber: 13\n }, this) : parts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 192,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: parts.map((part)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder?select=\".concat(categoryId, \":\").concat(part.id),\n className: \"flex-1\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"β€” \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 210,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 208,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 213,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 207,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 218,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 206,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 202,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"w-full rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 223,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"absolute inset-0 rounded-md bg-amber-400/10 opacity-0 group-hover:opacity-100 transition-opacity duration-200 pointer-events-none flex items-center justify-center\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-200 tracking-wide\",\n children: \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 231,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 230,\n columnNumber: 19\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 198,\n columnNumber: 17\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 196,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: parts.map((part)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder?select=\".concat(categoryId, \":\").concat(part.id),\n className: \"block\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"β€” \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 253,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 251,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 256,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 247,\n columnNumber: 23\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 246,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 263,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 266,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 262,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 245,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"absolute inset-0 rounded-md bg-amber-400/10 opacity-0 group-hover:opacity-100 transition-opacity duration-200 pointer-events-none flex items-center justify-center\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-200 tracking-wide\",\n children: \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 276,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 275,\n columnNumber: 19\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 241,\n columnNumber: 17\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 239,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 182,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 128,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 127,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"G//oj+kZqKJFzeectyiyn6hCoEw=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQ2U7QUFDUTtJQWlCbERNO0FBREYsTUFBTUMsZUFDSkQsQ0FBQUEsd0NBQUFBLE9BQU9BLENBQUNFLEdBQUcsQ0FBQ0Msd0JBQXdCLGNBQXBDSCxtREFBQUEsd0NBQXdDO0FBRTFDOzs7Q0FHQyxHQUNELE1BQU1JLHlCQUF1RDtJQUMzREMsT0FBTztRQUFDO0tBQWlCO0lBQ3pCQyxRQUFRO1FBQUM7S0FBUztJQUNsQkMsV0FBVztRQUFDO0tBQVk7SUFDeEJDLGdCQUFnQjtRQUFDO0tBQWtCO0lBQ25DQyxRQUFRO1FBQUM7S0FBYTtJQUN0QkMsWUFBWTtRQUFDO0tBQWtCO0lBQy9CQyxRQUFRO1FBQUM7S0FBUTtBQUNuQjtBQUVlLFNBQVNDOztJQUN0QixNQUFNQyxTQUFTZiwwREFBU0E7SUFDeEIsTUFBTWdCLGFBQWFELE9BQU9DLFVBQVU7SUFDcEMsTUFBTSxDQUFDQyxVQUFVQyxZQUFZLEdBQUdwQiwrQ0FBUUEsQ0FBVztJQUNuRCxNQUFNLENBQUNxQixPQUFPQyxTQUFTLEdBQUd0QiwrQ0FBUUEsQ0FBUyxFQUFFO0lBQzdDLE1BQU0sQ0FBQ3VCLFNBQVNDLFdBQVcsR0FBR3hCLCtDQUFRQSxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQ3lCLE9BQU9DLFNBQVMsR0FBRzFCLCtDQUFRQSxDQUFnQjtJQUVsRCxNQUFNMkIsV0FBVzVCLDhDQUFPQSxDQUN0QixJQUFNSSw2REFBVUEsQ0FBQ3lCLElBQUksQ0FBQyxDQUFDQyxJQUFNQSxFQUFFQyxFQUFFLEtBQUtaLGFBQ3RDO1FBQUNBO0tBQVc7SUFHZHBCLGdEQUFTQSxDQUFDO1FBQ1IsSUFBSSxDQUFDb0IsWUFBWTtRQUVqQixNQUFNYSxhQUFhLElBQUlDO1FBRXZCLGVBQWVDO1lBQ2IsSUFBSTtnQkFDRlQsV0FBVztnQkFDWEUsU0FBUztvQkFF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Ozs7a0RBTUwsOERBQUNDO3dDQUFJRCxXQUFVO2tEQUNiLDRFQUFDQzs0Q0FBSUQsV0FBVTtzREFBcUQ7Ozs7Ozs7Ozs7OzsrQkFsQ2pFWSxLQUFLakQsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4QzlCO0dBelB3QmQ7O1FBQ1BkLHNEQUFTQTs7O0tBREZjIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeD84YjVkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgTGluayBmcm9tIFwibmV4dC9saW5rXCI7XG5pbXBvcnQgeyB1c2VQYXJhbXMgfSBmcm9tIFwibmV4dC9uYXZpZ2F0aW9uXCI7XG5pbXBvcnQgeyBDQVRFR09SSUVTIH0gZnJvbSBcIkAvZGF0YS9ndW5idWlsZGVyUGFydHNcIjtcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcnlJZCwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxudHlwZSBWaWV3TW9kZSA9IFwiY2FyZFwiIHwgXCJsaXN0XCI7XG5cbnR5cGUgR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpID0ge1xuICBpZDogc3RyaW5nOyAgICAgICAgICAgICAgICAgLy8gYmFja2VuZCBVVUlEIGFzIHN0cmluZ1xuICBuYW1lOiBzdHJpbmc7XG4gIGJyYW5kOiBzdHJpbmc7ICAgICAgICAgICAgICAvLyBiYWNrZW5kIGJyYW5kIGZpZWxkXG4gIHBsYXRmb3JtOiBzdHJpbmc7XG4gIHBhcnRSb2xlOiBzdHJpbmc7XG4gIHByaWNlOiBudW1iZXIgfCBudWxsO1xuICBtYWluSW1hZ2VVcmw6IHN0cmluZyB8IG51bGw7XG4gIGJ1eVVybDogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9XG4gIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCA/PyBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiO1xuXG4vKipcbiAqIE1hcCBmcm9tIGNhdGVnb3J5IGlkIC0+IEJhbGxpc3RpYyBwYXJ0Um9sZShzKVxuICogS2VlcCB0aGlzIGluIHN5bmMgd2l0aCB3aGF0ZXZlciB5b3XigJlyZSB1c2luZyBvbiB0aGUgbWFpbiAvZ3VuYnVpbGRlciBwYWdlLlxuICovXG5jb25zdCBDQVRFR09SWV9UT19QQVJUX1JPTEVTOiBSZWNvcmQ8Q2F0ZWdvcnlJZCwgc3RyaW5nW10+ID0ge1xuICB1cHBlcjogW1widXBwZXItcmVjZWl2ZXJcIl0sXG4gIGJhcnJlbDogW1wiYmFycmVsXCJdLFxuICBoYW5kZ3VhcmQ6IFtcImhhbmRndWFyZFwiXSxcbiAgY2hhcmdpbmdIYW5kbGU6IFtcImNoYXJnaW5nLWhhbmRsZVwiXSxcbiAgYnVmZmVyOiBbXCJidWZmZXIta2l0XCJdLFxuICBsb3dlclBhcnRzOiBbXCJsb3dlci1wYXJ0cy1raXRcIl0sXG4gIHNpZ2h0czogW1wic2lnaHRcIl0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDYXRlZ29yeVBhZ2UoKSB7XG4gIGNvbnN0IHBhcmFtcyA9IHVzZVBhcmFtcygpO1xuICBjb25zdCBjYXRlZ29yeUlkID0gcGFyYW1zLmNhdGVnb3J5SWQgYXMgQ2F0ZWdvcnlJZDtcbiAgY29uc3QgW3ZpZXdNb2RlLCBzZXRWaWV3TW9kZV0gPSB1c2VTdGF0ZTxWaWV3TW9kZT4oXCJsaXN0XCIpO1xuICBjb25zdCBbcGFydHMsIHNldFBhcnRzXSA9IHVzZVN0YXRlPFBhcnRbXT4oW10pO1xuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICBjb25zdCBjYXRlZ29yeSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gQ0FURUdPUklFUy5maW5kKChjKSA9PiBjLmlkID09PSBjYXRlZ29yeUlkKSxcbiAgICBbY2F0ZWdvcnlJZF0sXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNhdGVnb3J5SWQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaENhdGVnb3J5UGFydHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgICAgICBzZXRFcnJvcihudWxsKTtcblxuICAgICAgICBjb25zdCByb2xlcyA9IENBVEVHT1JZX1RPX1BBUlRfUk9MRVNbY2F0ZWdvcnlJZF0gPz8gW107XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICBzZWFyY2guc2V0KFwicGxhdGZvcm1cIiwgXCJBUi0xNVwiKTtcbiAgICAgICAgcm9sZXMuZm9yRWFjaCgocikgPT4gc2VhcmNoLmFwcGVuZChcInBhcnRSb2xlc1wiLCByKSk7XG5cbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJX0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvZ3VuYnVpbGRlciR7XG4gICAgICAgICAgcm9sZXMubGVuZ3RoID8gYD8ke3NlYXJjaC50b1N0cmluZygpfWAgOiBcIlwiXG4gICAgICAgIH1gO1xuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pO1xuXG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBwcm9kdWN0cyAoJHtyZXMuc3RhdHVzfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGE6IEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaVtdID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgICAvLyDwn5SRIE5vcm1hbGl6ZSBpbnRvIHlvdXIgUGFydCB0eXBlIHVzaW5nICppZCogYW5kICpicmFuZCpcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZDogUGFydFtdID0gZGF0YS5tYXAoKHApID0+ICh7XG4gICAgICAgICAgaWQ6IHAuaWQsICAgICAgICAgICAgICAgICAgICAgIC8vIOKchSBiYWNrZW5kIGlkIChVVUlEIHN0cmluZylcbiAgICAgICAgICBjYXRlZ29yeUlkLFxuICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICBicmFuZDogcC5icmFuZCwgICAgICAgICAgICAgICAgLy8g4pyFIGJhY2tlbmQgYnJhbmRcbiAgICAgICAgICBwcmljZTogcC5wcmljZSA/PyAwLFxuICAgICAgICAgIGltYWdlVXJsOiBwLm1haW5JbWFnZVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgdXJsOiBwLmJ1eVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgbm90ZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHNldFBhcnRzKG5vcm1hbGl6ZWQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuO1xuICAgICAgICBzZXRFcnJvcihlcnIubWVzc2FnZSA/PyBcIkZhaWxlZCB0byBsb2FkIHByb2R1Y3RzXCIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hDYXRlZ29yeVBhcnRzKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuICB9LCBbY2F0ZWdvcnlJZF0pO1xuXG4gIGlmICghY2F0ZWdvcnkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LWF1dG8gbWF4LXctNnhsIHB4LTQgcHktNiBsZzpweS0xMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LXNlbWlib2xkIHRleHQtemluYy01MCBtYi00XCI+XG4gICAgICAgICAgICAgIENhdGVnb3J5IE5vdCBGb3VuZFxuICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtYW1iZXItMzAwIGhvdmVyOnRleHQtYW1iZXItMjAwIHVuZGVybGluZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIFJldHVybiB0byBHdW5idWlsZGVyXG4gICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9tYWluPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxtYWluIGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1ibGFjayB0ZXh0LXppbmMtNTBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgIHsvKiBIZWFkZXIgKi99XG4gICAgICAgIDxoZWFkZXIgY2xhc3NOYW1lPVwibWItNlwiPlxuICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICBocmVmPVwiL2d1bmJ1aWxkZXJcIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDAgbWItNCBpbmxpbmUtYmxvY2tcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIOKGkCBCYWNrIHRvIEd1bmJ1aWxkZXJcbiAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlbiBnYXAtNFwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRyYWNraW5nLVswLjJlbV0gdXBwZXJjYXNlIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBTaGFkb3cgU3RhbmRhcmRcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LTJ4bCBtZDp0ZXh0LTN4bCBmb250LXNlbWlib2xkIHRyYWNraW5nLXRpZ2h0XCI+XG4gICAgICAgICAgICAgICAge2NhdGVnb3J5Lm5hbWV9IDxzcGFuIGNsYXNzTmFtZT1cInRleHQtYW1iZXItMzAwXCI+UGFydHM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTIgdGV4dC1zbSB0ZXh0LXppbmMtNDAwIG1heC13LXhsXCI+XG4gICAgICAgICAgICAgICAgQnJvd3NlIGFsbCBhdmFpbGFibGUge2NhdGVnb3J5Lm5hbWUudG9Mb3dlckNhc2UoKX0gb3B0aW9ucyBmb3JcbiAgICAgICAgICAgICAgICB5b3VyIGJ1aWxkLCBwdWxsZWQgbGl2ZSBmcm9tIHlvdXIgQmFsbGlzdGljIGJhY2tlbmQuXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiBwYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGdhcC0yIGJvcmRlciBib3JkZXItemluYy04MDAgcm91bmRlZC1tZCBwLTEgYmctemluYy05NTAvNjBcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFZpZXdNb2RlKFwiY2FyZFwiKX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gcm91bmRlZCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgICB2aWV3TW9kZSA9PT0gXCJjYXJkXCJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTUwXCJcbiAgICAgICAgICAgICAgICAgICAgICA6IFwidGV4dC16aW5jLTQwMCBob3Zlcjp0ZXh0LXppbmMtMzAwXCJcbiAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNhcmQgdmlld1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQ2FyZFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJsaXN0XCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImxpc3RcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiTGlzdCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBMaXN0XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9oZWFkZXI+XG5cbiAgICAgICAgey8qIFBhcnRzIEdyaWQvTGlzdCAqL31cbiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwicm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzYwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIExvYWRpbmcge2NhdGVnb3J5Lm5hbWUudG9Mb3dlckNhc2UoKX3igKZcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogZXJyb3IgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtcmVkLTQwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIHtlcnJvcn0g4oCUIGNoZWNrIHRoYXQgdGhlIEJhbGxpc3RpYyBBUEkgaXMgcnVubmluZy5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogcGFydHMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAgTm8gcGFydHMgYXZhaWxhYmxlIGZvciB0aGlzIGNhdGVnb3J5IHlldC5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogdmlld01vZGUgPT09IFwiY2FyZFwiID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC0zIG1kOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zXCI+XG4gICAgICAgICAgICAgIHtwYXJ0cy5tYXAoKHBhcnQpID0+IChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBrZXk9e3BhcnQuaWR9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJncm91cCByZWxhdGl2ZSBib3JkZXIgYm9yZGVyLXppbmMtNzAwIHJvdW5kZWQtbWQgcC0zIGJnLXppbmMtOTAwLzUwIGhvdmVyOmJvcmRlci1hbWJlci00MDAvNjAgaG92ZXI6YmctYW1iZXItNDAwLzEwIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCBmbGV4IGZsZXgtY29sXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXI/c2VsZWN0PSR7Y2F0ZWdvcnlJZH06JHtwYXJ0LmlkfWB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXgtMVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIGdhcC0yIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0LmJyYW5kfXtcIiBcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1ub3JtYWxcIj7igJQge3BhcnQubmFtZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LXhzIHRleHQtemluYy00MDAgbGluZS1jbGFtcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDAgd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7cGFydC5wcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtODAwLzUwIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHRleHQtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgVmlldyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICB7LyogSG92ZXIgT3ZlcmxheSAqL31cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQtMCByb3VuZGVkLW1kIGJnLWFtYmVyLTQwMC8xMCBvcGFjaXR5LTAgZ3JvdXAtaG92ZXI6b3BhY2l0eS0xMDAgdHJhbnNpdGlvbi1vcGFjaXR5IGR1cmF0aW9uLTIwMCBwb2ludGVyLWV2ZW50cy1ub25lIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMjAwIHRyYWNraW5nLXdpZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICBBZGQgdG8gQnVpbGRcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAge3BhcnRzLm1hcCgocGFydCkgPT4gKFxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGtleT17cGFydC5pZH1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImdyb3VwIHJlbGF0aXZlIGJvcmRlciBib3JkZXItemluYy03MDAgcm91bmRlZC1tZCBwLTMgYmctemluYy05MDAvNTAgaG92ZXI6Ym9yZGVyLWFtYmVyLTQwMC82MCBob3ZlcjpiZy1hbWJlci00MDAvMTAgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtNFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBtaW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlcj9zZWxlY3Q9JHtjYXRlZ29yeUlkfToke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJsb2NrXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9e1wiIFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW5vcm1hbFwiPuKAlCB7cGFydC5uYW1lfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXMgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTQwMCBsaW5lLWNsYW1wLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3Rlc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDAgd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7cGFydC5wcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeUlkfS8ke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBWaWV3IERldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB7LyogSG92ZXIgT3ZlcmxheSAqL31cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQtMCByb3VuZGVkLW1kIGJnLWFtYmVyLTQwMC8xMCBvcGFjaXR5LTAgZ3JvdXAtaG92ZXI6b3BhY2l0eS0xMDAgdHJhbnNpdGlvbi1vcGFjaXR5IGR1cmF0aW9uLTIwMCBwb2ludGVyLWV2ZW50cy1ub25lIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMjAwIHRyYWNraW5nLXdpZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICBBZGQgdG8gQnVpbGRcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsIkxpbmsiLCJ1c2VQYXJhbXMiLCJDQVRFR09SSUVTIiwicHJvY2VzcyIsIkFQSV9CQVNFX1VSTCIsImVudiIsIk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCIsIkNBVEVHT1JZX1RPX1BBUlRfUk9MRVMiLCJ1cHBlciIsImJhcnJlbCIsImhhbmRndWFyZCIsImNoYXJnaW5nSGFuZGxlIiwiYnVmZmVyIiwibG93ZXJQYXJ0cyIsInNpZ2h0cyIsIkNhdGVnb3J5UGFnZSIsInBhcmFtcyIsImNhdGVnb3J5SWQiLCJ2aWV3TW9kZSIsInNldFZpZXdNb2RlIiwicGFydHMiLCJzZXRQYXJ0cyIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsImNhdGVnb3J5IiwiZmluZCIsImMiLCJpZCIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJmZXRjaENhdGVnb3J5UGFydHMiLCJyb2xlcyIsInNlYXJjaCIsIlVSTFNlYXJjaFBhcmFtcyIsInNldCIsImZvckVhY2giLCJyIiwiYXBwZW5kIiwidXJsIiwibGVuZ3RoIiwidG9TdHJpbmciLCJyZXMiLCJmZXRjaCIsInNpZ25hbCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsIm5vcm1hbGl6ZWQiLCJtYXAiLCJwIiwibmFtZSIsImJyYW5kIiwicHJpY2UiLCJpbWFnZVVybCIsIm1haW5JbWFnZVVybCIsInVuZGVmaW5lZCIsImJ1eVVybCIsIm5vdGVzIiwiZXJyIiwibWVzc2FnZSIsImFib3J0IiwibWFpbiIsImNsYXNzTmFtZSIsImRpdiIsImgxIiwiaHJlZiIsImhlYWRlciIsInNwYW4iLCJ0b0xvd2VyQ2FzZSIsImJ1dHRvbiIsInR5cGUiLCJvbkNsaWNrIiwiYXJpYS1sYWJlbCIsInNlY3Rpb24iLCJwYXJ0IiwidG9GaXhlZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ]\n};\nconst STORAGE_KEY = \"gunbuilder-build-state\";\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // NEW: filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n // NEW: build state for this page, synced with localStorage\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (false) {}\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : {};\n } catch (e) {\n return {};\n }\n });\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n var _CATEGORY_TO_PART_ROLES_categoryId;\n const roles = (_CATEGORY_TO_PART_ROLES_categoryId = CATEGORY_TO_PART_ROLES[categoryId]) !== null && _CATEGORY_TO_PART_ROLES_categoryId !== void 0 ? _CATEGORY_TO_PART_ROLES_categoryId : [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // NEW: persist build to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (false) {}\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n } catch (e) {\n // ignore\n }\n }, [\n build\n ]);\n // NEW: handler to toggle Add / Remove for this category\n const handleTogglePart = (categoryId, partId)=>{\n const isSelected = build[categoryId] === partId;\n if (isSelected) {\n // Remove from build\n setBuild((prev)=>{\n const updated = {\n ...prev\n };\n delete updated[categoryId];\n return updated;\n });\n } else {\n // Add to build and navigate back to main gunbuilder page\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n router.push(\"/gunbuilder\");\n }\n };\n // NEW: available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // NEW: filtered + sorted parts\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 197,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 200,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 196,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 195,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 194,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 217,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 225,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 229,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 228,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 231,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 224,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 238,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 250,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 237,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 223,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 216,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 274,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 278,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 272,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 285,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 297,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 299,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 291,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 284,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 306,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 317,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low β†’ High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 318,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High β†’ Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 319,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A β†’ Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 320,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 309,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 305,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 283,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 271,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 328,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" β€” check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 332,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 336,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"β€” \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 353,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 351,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 356,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 350,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 361,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 349,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 366,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"flex-1 rounded-md px-3 py-2 text-xs font-semibold transition-colors text-center \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 372,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 365,\n columnNumber: 21\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 345,\n columnNumber: 19\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 340,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 392,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 393,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 394,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 395,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 391,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 409,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 413,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 408,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 418,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 421,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 425,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"rounded-md px-3 py-1.5 text-xs font-semibold transition-colors whitespace-nowrap \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 431,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 424,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 407,\n columnNumber: 23\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 403,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 398,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 268,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 214,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 213,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"pJYAu1Vs5wLdusWqq2Thip72pdg=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQzBCO0FBQ0g7SUFpQmxETztBQURGLE1BQU1DLGVBQ0pELENBQUFBLHdDQUFBQSxPQUFPQSxDQUFDRSxHQUFHLENBQUNDLHdCQUF3QixjQUFwQ0gsbURBQUFBLHdDQUF3QztBQUUxQyxNQUFNSSx5QkFBdUQ7SUFDM0RDLE9BQU87UUFBQztLQUFpQjtJQUN6QkMsUUFBUTtRQUFDO0tBQVM7SUFDbEJDLFdBQVc7UUFBQztLQUFZO0lBQ3hCQyxnQkFBZ0I7UUFBQztLQUFrQjtJQUNuQ0MsUUFBUTtRQUFDO0tBQWE7SUFDdEJDLFlBQVk7UUFBQztLQUFrQjtJQUMvQkMsUUFBUTtRQUFDO0tBQVE7QUFDbkI7QUFPQSxNQUFNQyxjQUFjO0FBRUwsU0FBU0M7O0lBQ3RCLE1BQU1DLFNBQVNqQiwwREFBU0E7SUFDeEIsTUFBTWtCLGFBQWFELE9BQU9DLFVBQVU7SUFDcEMsTUFBTUMsU0FBU2xCLDBEQUFTQTtJQUV4QixNQUFNLENBQUNtQixVQUFVQyxZQUFZLEdBQUd2QiwrQ0FBUUEsQ0FBVztJQUNuRCxNQUFNLENBQUN3QixPQUFPQyxTQUFTLEdBQUd6QiwrQ0FBUUEsQ0FBUyxFQUFFO0lBQzdDLE1BQU0sQ0FBQzBCLFNBQVNDLFdBQVcsR0FBRzNCLCtDQUFRQSxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQzRCLE9BQU9DLFNBQVMsR0FBRzdCLCtDQUFRQSxDQUFnQjtJQUVsRCwyQkFBMkI7SUFDM0IsTUFBTSxDQUFDOEIsYUFBYUMsZUFBZSxHQUFHL0IsK0NBQVFBLENBQVM7SUFDdkQsTUFBTSxDQUFDZ0MsUUFBUUMsVUFBVSxHQUFHakMsK0NBQVFBLENBQWE7SUFFakQsMkRBQTJEO0lBQzNELE1BQU0sQ0FBQ2tDLE9BQU9DLFNBQVMsR0FBR25DLCtDQUFRQSxDQUFhO1FBQzdDLElBQUksS0FBNkIsRUFB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RUFDYiw4REFBQ3JHLGlEQUFJQTtnRUFDSHdHLE1BQU0sZUFBNkJpQixPQUFkdEcsWUFBVyxLQUFXLE9BQVJzRyxLQUFLN0UsRUFBRTtnRUFDMUN5RCxXQUFVOzBFQUNYOzs7Ozs7MEVBR0QsOERBQUNPO2dFQUNDQyxNQUFLO2dFQUNMQyxTQUFTLElBQ1A1QixpQkFBaUIvRCxZQUFZc0csS0FBSzdFLEVBQUU7Z0VBRXRDeUQsV0FBVyxvRkFJVixPQUhDakIsYUFDSSx1RUFDQTswRUFHTEEsYUFBYSxzQkFBc0I7Ozs7Ozs7Ozs7Ozs7Ozs7OzsyQ0F0Q3JDcUMsS0FBSzdFLEVBQUU7Ozs7O29DQTRDbEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRaEI7R0E5WndCM0I7O1FBQ1BoQixzREFBU0E7UUFFVEMsc0RBQVNBOzs7S0FIRmUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2d1bmJ1aWxkZXIvW2NhdGVnb3J5SWRdL3BhZ2UudHN4PzhiNWQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBMaW5rIGZyb20gXCJuZXh0L2xpbmtcIjtcbmltcG9ydCB7IHVzZVBhcmFtcywgdXNlUm91dGVyIH0gZnJvbSBcIm5leHQvbmF2aWdhdGlvblwiO1xuaW1wb3J0IHsgQ0FURUdPUklFUyB9IGZyb20gXCJAL2RhdGEvZ3VuYnVpbGRlclBhcnRzXCI7XG5pbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQsIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbnR5cGUgVmlld01vZGUgPSBcImNhcmRcIiB8IFwibGlzdFwiO1xuXG50eXBlIEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaSA9IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBicmFuZDogc3RyaW5nO1xuICBwbGF0Zm9ybTogc3RyaW5nO1xuICBwYXJ0Um9sZTogc3RyaW5nO1xuICBwcmljZTogbnVtYmVyIHwgbnVsbDtcbiAgbWFpbkltYWdlVXJsOiBzdHJpbmcgfCBudWxsO1xuICBidXlVcmw6IHN0cmluZyB8IG51bGw7XG59O1xuXG5jb25zdCBBUElfQkFTRV9VUkwgPVxuICBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwgPz8gXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIjtcblxuY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgdXBwZXI6IFtcInVwcGVyLXJlY2VpdmVyXCJdLFxuICBiYXJyZWw6IFtcImJhcnJlbFwiXSxcbiAgaGFuZGd1YXJkOiBbXCJoYW5kZ3VhcmRcIl0sXG4gIGNoYXJnaW5nSGFuZGxlOiBbXCJjaGFyZ2luZy1oYW5kbGVcIl0sXG4gIGJ1ZmZlcjogW1wiYnVmZmVyLWtpdFwiXSxcbiAgbG93ZXJQYXJ0czogW1wibG93ZXItcGFydHMta2l0XCJdLFxuICBzaWdodHM6IFtcInNpZ2h0XCJdLFxufTtcblxuLy8gTkVXOiBzb3J0IG9wdGlvbnNcbnR5cGUgU29ydE9wdGlvbiA9IFwicmVsZXZhbmNlXCIgfCBcInByaWNlLWFzY1wiIHwgXCJwcmljZS1kZXNjXCIgfCBcImJyYW5kLWFzY1wiO1xuXG4vLyBORVc6IGJ1aWxkIHN0YXRlIHR5cGUgKyBzdG9yYWdlIGtleSAobWF0Y2hlcyAvZ3VuYnVpbGRlcilcbnR5cGUgQnVpbGRTdGF0ZSA9IFBhcnRpYWw8UmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZz4+O1xuY29uc3QgU1RPUkFHRV9LRVkgPSBcImd1bmJ1aWxkZXItYnVpbGQtc3RhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ2F0ZWdvcnlQYWdlKCkge1xuICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXMoKTtcbiAgY29uc3QgY2F0ZWdvcnlJZCA9IHBhcmFtcy5jYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpO1xuXG4gIGNvbnN0IFt2aWV3TW9kZSwgc2V0Vmlld01vZGVdID0gdXNlU3RhdGU8Vmlld01vZGU+KFwibGlzdFwiKTtcbiAgY29uc3QgW3BhcnRzLCBzZXRQYXJ0c10gPSB1c2VTdGF0ZTxQYXJ0W10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gTkVXOiBmaWx0ZXIgKyBzb3J0IHN0YXRlXG4gIGNvbnN0IFticmFuZEZpbHRlciwgc2V0QnJhbmRGaWx0ZXJdID0gdXNlU3RhdGU8c3RyaW5nPihcImFsbFwiKTtcbiAgY29uc3QgW3NvcnRCeSwgc2V0U29ydEJ5XSA9IHVzZVN0YXRlPFNvcnRPcHRpb24+KFwicmVsZXZhbmNlXCIpO1xuXG4gIC8vIE5FVzogYnVpbGQgc3RhdGUgZm9yIHRoaXMgcGFnZSwgc3luY2VkIHdpdGggbG9jYWxTdG9yYWdlXG4gIGNvbnN0IFtidWlsZCwgc2V0QnVpbGRdID0gdXNlU3RhdGU8QnVpbGRTdGF0ZT4oKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4ge307XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWSk7XG4gICAgICByZXR1cm4gc3RvcmVkID8gKEpTT04ucGFyc2Uoc3RvcmVkKSBhcyBCdWlsZFN0YXRlKSA6IHt9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgY2F0ZWdvcnkgPSB1c2VNZW1vKFxuICAgICgpID0+IENBVEVHT1JJRVMuZmluZCgoYykgPT4gYy5pZCA9PT0gY2F0ZWdvcnlJZCksXG4gICAgW2NhdGVnb3J5SWRdLFxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFjYXRlZ29yeUlkKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hDYXRlZ29yeVBhcnRzKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG5cbiAgICAgICAgY29uc3Qgcm9sZXMgPSBDQVRFR09SWV9UT19QQVJUX1JPTEVTW2NhdGVnb3J5SWRdID8/IFtdO1xuXG4gICAgICAgIGNvbnN0IHNlYXJjaCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgICAgc2VhcmNoLnNldChcInBsYXRmb3JtXCIsIFwiQVItMTVcIik7XG4gICAgICAgIHJvbGVzLmZvckVhY2goKHIpID0+IHNlYXJjaC5hcHBlbmQoXCJwYXJ0Um9sZXNcIiwgcikpO1xuXG4gICAgICAgIGNvbnN0IHVybCA9IGAke0FQSV9CQVNFX1VSTH0vYXBpL3Byb2R1Y3RzL2d1bmJ1aWxkZXIke1xuICAgICAgICAgIHJvbGVzLmxlbmd0aCA/IGA/JHtzZWFyY2gudG9TdHJpbmcoKX1gIDogXCJcIlxuICAgICAgICB9YDtcblxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KTtcblxuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHMgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhOiBHdW5idWlsZGVyUHJvZHVjdEZyb21BcGlbXSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZDogUGFydFtdID0gZGF0YS5tYXAoKHApID0+ICh7XG4gICAgICAgICAgaWQ6IHAuaWQsXG4gICAgICAgICAgY2F0ZWdvcnlJZCxcbiAgICAgICAgICBuYW1lOiBwLm5hbWUsXG4gICAgICAgICAgYnJhbmQ6IHAuYnJhbmQsXG4gICAgICAgICAgcHJpY2U6IHAucHJpY2UgPz8gMCxcbiAgICAgICAgICBpbWFnZVVybDogcC5tYWluSW1hZ2VVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIHVybDogcC5idXlVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIG5vdGVzOiB1bmRlZmluZWQsXG4gICAgICAgIH0pKTtcblxuICAgICAgICBzZXRQYXJ0cyhub3JtYWxpemVkKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGlmIChlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHJldHVybjtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBwcm9kdWN0c1wiKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoQ2F0ZWdvcnlQYXJ0cygpO1xuXG4gICAgcmV0dXJuICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfSwgW2NhdGVnb3J5SWRdKTtcblxuICAvLyBORVc6IHBlcnNpc3QgYnVpbGQgdG8gbG9jYWxTdG9yYWdlIHdoZW5ldmVyIGl0IGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KGJ1aWxkKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH0sIFtidWlsZF0pO1xuXG4gIC8vIE5FVzogaGFuZGxlciB0byB0b2dnbGUgQWRkIC8gUmVtb3ZlIGZvciB0aGlzIGNhdGVnb3J5XG4gIGNvbnN0IGhhbmRsZVRvZ2dsZVBhcnQgPSAoY2F0ZWdvcnlJZDogQ2F0ZWdvcnlJZCwgcGFydElkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnRJZDtcblxuICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAvLyBSZW1vdmUgZnJvbSBidWlsZFxuICAgICAgc2V0QnVpbGQoKHByZXYpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZDogQnVpbGRTdGF0ZSA9IHsgLi4ucHJldiB9O1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtjYXRlZ29yeUlkXTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWRkIHRvIGJ1aWxkIGFuZCBuYXZpZ2F0ZSBiYWNrIHRvIG1haW4gZ3VuYnVpbGRlciBwYWdlXG4gICAgICBzZXRCdWlsZCgocHJldikgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgW2NhdGVnb3J5SWRdOiBwYXJ0SWQsXG4gICAgICB9KSk7XG4gICAgICByb3V0ZXIucHVzaChcIi9ndW5idWlsZGVyXCIpO1xuICAgIH1cbiAgfTtcblxuICAvLyBORVc6IGF2YWlsYWJsZSBicmFuZHMgZm9yIGZpbHRlclxuICBjb25zdCBhdmFpbGFibGVCcmFuZHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBBcnJheS5mcm9tKG5ldyBTZXQocGFydHMubWFwKChwKSA9PiBwLmJyYW5kKSkpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgW3BhcnRzXSxcbiAgKTtcblxuICAvLyBORVc6IGZpbHRlcmVkICsgc29ydGVkIHBhcnRzXG4gIGNvbnN0IGZpbHRlcmVkUGFydHMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBsZXQgcmVzdWx0ID0gWy4uLnBhcnRzXTtcblxuICAgIGlmIChicmFuZEZpbHRlciAhPT0gXCJhbGxcIikge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcigocCkgPT4gcC5icmFuZCA9PT0gYnJhbmRGaWx0ZXIpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc29ydEJ5KSB7XG4gICAgICBjYXNlIFwicHJpY2UtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLnByaWNlIC0gYi5wcmljZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInByaWNlLWRlc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGIucHJpY2UgLSBhLnByaWNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYnJhbmQtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLmJyYW5kLmxvY2FsZUNvbXBhcmUoYi5icmFuZCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJyZWxldmFuY2VcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGxlYXZlIGluIGJhY2tlbmQgb3JkZXJcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwgW3BhcnRzLCBicmFuZEZpbHRlciwgc29ydEJ5XSk7XG5cbiAgaWYgKCFjYXRlZ29yeSkge1xuICAgIHJldHVybiAoXG4gICAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwIG1iLTRcIj5cbiAgICAgICAgICAgICAgQ2F0ZWdvcnkgTm90IEZvdW5kXG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDAgaG92ZXI6dGV4dC1hbWJlci0yMDAgdW5kZXJsaW5lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgUmV0dXJuIHRvIEd1bmJ1aWxkZXJcbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21haW4+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02XCI+XG4gICAgICAgICAgPExpbmtcbiAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMCBtYi00IGlubGluZS1ibG9ja1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAg4oaQIEJhY2sgdG8gR3VuYnVpbGRlclxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNoYWRvdyBTdGFuZGFyZFxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgICB7Y2F0ZWdvcnkubmFtZX0gPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDBcIj5QYXJ0czwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgICBCcm93c2UgYWxsIGF2YWlsYWJsZSB7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfSBvcHRpb25zIGZvclxuICAgICAgICAgICAgICAgIHlvdXIgYnVpbGQsIHB1bGxlZCBsaXZlIGZyb20geW91ciBCYWxsaXN0aWMgYmFja2VuZC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTIgYm9yZGVyIGJvcmRlci16aW5jLTgwMCByb3VuZGVkLW1kIHAtMSBiZy16aW5jLTk1MC82MFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJjYXJkXCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImNhcmRcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2FyZCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBDYXJkXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWaWV3TW9kZShcImxpc3RcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGUgPT09IFwibGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy01MFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJMaXN0IHZpZXdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIExpc3RcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICB7LyogUGFydHMgR3JpZC9MaXN0ICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvNjAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgIHsvKiBGaWx0ZXIgKyBzb3J0IHRvb2xiYXIgKi99XG4gICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiBwYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNCBmbGV4IGZsZXgtY29sIGdhcC0zIG1kOmZsZXgtcm93IG1kOml0ZW1zLWNlbnRlciBtZDpqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBTaG93aW5ne1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLmxlbmd0aH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+e1wiIFwifVxuICAgICAgICAgICAgICAgIG9me1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtwYXJ0cy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgPC9zcGFuPntcIiBcIn1cbiAgICAgICAgICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBnYXAtM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBodG1sRm9yPVwiYnJhbmQtZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQnJhbmRcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGlkPVwiYnJhbmQtZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2JyYW5kRmlsdGVyfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldEJyYW5kRmlsdGVyKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQteHMgdGV4dC16aW5jLTIwMCBweC0yIHB5LTEgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMSBmb2N1czpyaW5nLWFtYmVyLTQwMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhbGxcIj5BbGwgYnJhbmRzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIHthdmFpbGFibGVCcmFuZHMubWFwKChiKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e2J9IHZhbHVlPXtifT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtifVxuICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBodG1sRm9yPVwic29ydC1ieVwiIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICBTb3J0XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBpZD1cInNvcnQtYnlcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c29ydEJ5fVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgc2V0U29ydEJ5KGUudGFyZ2V0LnZhbHVlIGFzIFNvcnRPcHRpb24pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQteHMgdGV4dC16aW5jLTIwMCBweC0yIHB5LTEgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMSBmb2N1czpyaW5nLWFtYmVyLTQwMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJyZWxldmFuY2VcIj5SZWxldmFuY2U8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInByaWNlLWFzY1wiPlByaWNlOiBMb3cg4oaSIEhpZ2g8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInByaWNlLWRlc2NcIj5QcmljZTogSGlnaCDihpIgTG93PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJicmFuZC1hc2NcIj5CcmFuZDogQSDihpIgWjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAgTG9hZGluZyB7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfeKAplxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiBlcnJvciA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1yZWQtNDAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAge2Vycm9yfSDigJQgY2hlY2sgdGhhdCB0aGUgQmFsbGlzdGljIEFQSSBpcyBydW5uaW5nLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiBmaWx0ZXJlZFBhcnRzLmxlbmd0aCA9PT0gMCA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIE5vIHBhcnRzIGF2YWlsYWJsZSBmb3IgdGhpcyBjYXRlZ29yeSB5ZXQuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IHZpZXdNb2RlID09PSBcImNhcmRcIiA/IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtMyBtZDpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtM1wiPlxuICAgICAgICAgICAgICB7ZmlsdGVyZWRQYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnQuaWQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBrZXk9e3BhcnQuaWR9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImdyb3VwIHJlbGF0aXZlIGJvcmRlciBib3JkZXItemluYy03MDAgcm91bmRlZC1tZCBwLTMgYmctemluYy05MDAvNTAgaG92ZXI6Ym9yZGVyLWFtYmVyLTQwMC82MCBob3ZlcjpiZy1hbWJlci00MDAvMTAgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGZsZXggZmxleC1jb2xcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBnYXAtMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbm9ybWFsXCI+4oCUIHtwYXJ0Lm5hbWV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3RlcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNDAwIGxpbmUtY2xhbXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIHdoaXRlc3BhY2Utbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTIgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtNzAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGZsZXgtMSByb3VuZGVkLW1kIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhbnNpdGlvbi1jb2xvcnMgdGV4dC1jZW50ZXIgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtMTAwIGJvcmRlciBib3JkZXItemluYy02MDAgaG92ZXI6YmctemluYy03MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJiZy1hbWJlci00MDAgdGV4dC1ibGFjayBob3ZlcjpiZy1hbWJlci0zMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge2lzU2VsZWN0ZWQgPyBcIlJlbW92ZSBmcm9tIEJ1aWxkXCIgOiBcIkFkZCB0byBCdWlsZFwifVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIHsvKiBIZWFkZXIgcm93IGZvciBsaXN0IHZpZXcgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmdyaWQgZ3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBnYXAtNCBweC0zIHBiLTIgdGV4dC1bMC43cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlBhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+QnJhbmQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1yaWdodFwiPlByaWNlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtcmlnaHQgcHItMlwiPkFjdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnQuaWQ7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBrZXk9e3BhcnQuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZ3JvdXAgcmVsYXRpdmUgYm9yZGVyIGJvcmRlci16aW5jLTcwMCByb3VuZGVkLW1kIHAtMyBiZy16aW5jLTkwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNDAwLzYwIGhvdmVyOmJnLWFtYmVyLTQwMC8xMCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG1kOmdyaWQgbWQ6Z3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBtZDppdGVtcy1jZW50ZXIgbWQ6Z2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTQwMCBsaW5lLWNsYW1wLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gdGV4dC16aW5jLTQwMCBtZDp0ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIG1kOnRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJ0LnByaWNlLnRvRml4ZWQoMil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Byb3VuZGVkLW1kIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFuc2l0aW9uLWNvbG9ycyB3aGl0ZXNwYWNlLW5vd3JhcCAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTEwMCBib3JkZXIgYm9yZGVyLXppbmMtNjAwIGhvdmVyOmJnLXppbmMtNzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJnLWFtYmVyLTQwMCB0ZXh0LWJsYWNrIGhvdmVyOmJnLWFtYmVyLTMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aXNTZWxlY3RlZCA/IFwiUmVtb3ZlIGZyb20gQnVpbGRcIiA6IFwiQWRkIHRvIEJ1aWxkXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsIkxpbmsiLCJ1c2VQYXJhbXMiLCJ1c2VSb3V0ZXIiLCJDQVRFR09SSUVTIiwicHJvY2VzcyIsIkFQSV9CQVNFX1VSTCIsImVudiIsIk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCIsIkNBVEVHT1JZX1RPX1BBUlRfUk9MRVMiLCJ1cHBlciIsImJhcnJlbCIsImhhbmRndWFyZCIsImNoYXJnaW5nSGFuZGxlIiwiYnVmZmVyIiwibG93ZXJQYXJ0cyIsInNpZ2h0cyIsIlNUT1JBR0VfS0VZIiwiQ2F0ZWdvcnlQYWdlIiwicGFyYW1zIiwiY2F0ZWdvcnlJZCIsInJvdXRlciIsInZpZXdNb2RlIiwic2V0Vmlld01vZGUiLCJwYXJ0cyIsInNldFBhcnRzIiwibG9hZGluZyIsInNldExvYWRpbmciLCJlcnJvciIsInNldEVycm9yIiwiYnJhbmRGaWx0ZXIiLCJzZXRCcmFuZEZpbHRlciIsInNvcnRCeSIsInNldFNvcnRCeSIsImJ1aWxkIiwic2V0QnVpbGQiLCJzdG9yZWQiLCJ3aW5kb3ciLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwiSlNPTiIsInBhcnNlIiwiY2F0ZWdvcnkiLCJmaW5kIiwiYyIsImlkIiwiY29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsImZldGNoQ2F0ZWdvcnlQYXJ0cyIsInJvbGVzIiwic2VhcmNoIiwiVVJMU2VhcmNoUGFyYW1zIiwic2V0IiwiZm9yRWFjaCIsInIiLCJhcHBlbmQiLCJ1cmwiLCJsZW5ndGgiLCJ0b1N0cmluZyIsInJlcyIsImZldGNoIiwic2lnbmFsIiwib2siLCJFcnJvciIsInN0YXR1cyIsImRhdGEiLCJqc29uIiwibm9ybWFsaXplZCIsIm1hcCIsInAiLCJuYW1lIiwiYnJhbmQiLCJwcmljZSIsImltYWdlVXJsIiwibWFpbkltYWdlVXJsIiwidW5kZWZpbmVkIiwiYnV5VXJsIiwibm90ZXMiLCJlcnIiLCJtZXNzYWdlIiwiYWJvcnQiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwiaGFuZGxlVG9nZ2xlUGFydCIsInBhcnRJZCIsImlzU2VsZWN0ZWQiLCJwcmV2IiwidXBkYXRlZCIsInB1c2giLCJhdmFpbGFibGVCcmFuZHMiLCJBcnJheSIsImZyb20iLCJTZXQiLCJmaWx0ZXIiLCJCb29sZWFuIiwic29ydCIsImEiLCJiIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkUGFydHMiLCJyZXN1bHQiLCJtYWluIiwiY2xhc3NOYW1lIiwiZGl2IiwiaDEiLCJocmVmIiwiaGVhZGVyIiwic3BhbiIsInRvTG93ZXJDYXNlIiwiYnV0dG9uIiwidHlwZSIsIm9uQ2xpY2siLCJhcmlhLWxhYmVsIiwic2VjdGlvbiIsImxhYmVsIiwiaHRtbEZvciIsInNlbGVjdCIsInZhbHVlIiwib25DaGFuZ2UiLCJlIiwidGFyZ2V0Iiwib3B0aW9uIiwicGFydCIsInRvRml4ZWQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); /***/ }), diff --git a/.next/static/chunks/app/layout.js b/.next/static/chunks/app/layout.js index ae890b5..c1f9689 100644 --- a/.next/static/chunks/app/layout.js +++ b/.next/static/chunks/app/layout.js @@ -25,7 +25,7 @@ eval(__webpack_require__.ts("Promise.resolve(/*! import() eager */).then(__webpa /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"b676bdc45d0b\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJiNjc2YmRjNDVkMGJcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"5589102c78c1\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCI1NTg5MTAyYzc4YzFcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); /***/ }) diff --git a/.next/static/chunks/webpack.js b/.next/static/chunks/webpack.js index 7850467..e5971e2 100644 --- a/.next/static/chunks/webpack.js +++ b/.next/static/chunks/webpack.js @@ -192,7 +192,7 @@ /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { -/******/ __webpack_require__.h = function() { return "a73da2d4cd917396"; } +/******/ __webpack_require__.h = function() { return "b05ead14ffc790b9"; } /******/ }(); /******/ /******/ /* webpack/runtime/global */ diff --git a/.next/static/css/app/layout.css b/.next/static/css/app/layout.css index 1bb709f..60fc478 100644 --- a/.next/static/css/app/layout.css +++ b/.next/static/css/app/layout.css @@ -581,6 +581,9 @@ video { .grid { display: grid; } +.hidden { + display: none; +} .h-32 { height: 8rem; } @@ -623,6 +626,9 @@ video { .cursor-not-allowed { cursor: not-allowed; } +.grid-cols-\[minmax\(0\2c 3fr\)_minmax\(0\2c 1fr\)_minmax\(0\2c 1fr\)_auto\] { + grid-template-columns: minmax(0,3fr) minmax(0,1fr) minmax(0,1fr) auto; +} .flex-col { flex-direction: column; } @@ -635,6 +641,9 @@ video { .items-center { align-items: center; } +.justify-end { + justify-content: flex-end; +} .justify-center { justify-content: center; } @@ -723,6 +732,10 @@ video { --tw-border-opacity: 1; border-color: rgb(39 39 42 / var(--tw-border-opacity)); } +.border-zinc-600 { + --tw-border-opacity: 1; + border-color: rgb(82 82 91 / var(--tw-border-opacity)); +} .bg-amber-400 { --tw-bg-opacity: 1; background-color: rgb(251 191 36 / var(--tw-bg-opacity)); @@ -779,6 +792,9 @@ video { .bg-zinc-950\/80 { background-color: rgb(9 9 11 / 0.8); } +.bg-zinc-900\/70 { + background-color: rgb(24 24 27 / 0.7); +} .object-contain { -o-object-fit: contain; object-fit: contain; @@ -855,12 +871,22 @@ video { padding-top: 2rem; padding-bottom: 2rem; } +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} .pr-1 { padding-right: 0.25rem; } .pt-3 { padding-top: 0.75rem; } +.pb-2 { + padding-bottom: 0.5rem; +} +.pr-2 { + padding-right: 0.5rem; +} .text-left { text-align: left; } @@ -974,6 +1000,10 @@ video { --tw-text-opacity: 1; color: rgb(82 82 91 / var(--tw-text-opacity)); } +.text-zinc-100 { + --tw-text-opacity: 1; + color: rgb(244 244 245 / var(--tw-text-opacity)); +} .underline { text-decoration-line: underline; } @@ -1070,6 +1100,22 @@ body { color: rgb(212 212 216 / var(--tw-text-opacity)); } +.focus\:outline-none:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.focus\:ring-1:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:ring-amber-400:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(251 191 36 / var(--tw-ring-opacity)); +} + .group:hover .group-hover\:opacity-100 { opacity: 1; } @@ -1095,6 +1141,10 @@ body { margin-top: 0px; } + .md\:grid { + display: grid; + } + .md\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } @@ -1103,6 +1153,10 @@ body { grid-template-columns: minmax(0,2fr) minmax(0,1.3fr); } + .md\:grid-cols-\[minmax\(0\2c 3fr\)_minmax\(0\2c 1fr\)_minmax\(0\2c 1fr\)_auto\] { + grid-template-columns: minmax(0,3fr) minmax(0,1fr) minmax(0,1fr) auto; + } + .md\:flex-row { flex-direction: row; } @@ -1111,10 +1165,18 @@ body { align-items: flex-end; } + .md\:items-center { + align-items: center; + } + .md\:justify-between { justify-content: space-between; } + .md\:gap-4 { + gap: 1rem; + } + .md\:p-3 { padding: 0.75rem; } @@ -1127,6 +1189,14 @@ body { padding: 1.5rem; } + .md\:text-left { + text-align: left; + } + + .md\:text-right { + text-align: right; + } + .md\:text-3xl { font-size: 1.875rem; line-height: 2.25rem; @@ -1141,6 +1211,11 @@ body { font-size: 1rem; line-height: 1.5rem; } + + .md\:text-sm { + font-size: 0.875rem; + line-height: 1.25rem; + } } @media (min-width: 1024px) { diff --git a/.next/static/webpack/32693299354f3264.webpack.hot-update.json b/.next/static/webpack/32693299354f3264.webpack.hot-update.json new file mode 100644 index 0000000..6a4f8ba --- /dev/null +++ b/.next/static/webpack/32693299354f3264.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/[categoryId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/385ea9265ba687b2.webpack.hot-update.json b/.next/static/webpack/385ea9265ba687b2.webpack.hot-update.json new file mode 100644 index 0000000..6a4f8ba --- /dev/null +++ b/.next/static/webpack/385ea9265ba687b2.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/[categoryId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/4528b572b2c1fb3a.webpack.hot-update.json b/.next/static/webpack/4528b572b2c1fb3a.webpack.hot-update.json new file mode 100644 index 0000000..6a4f8ba --- /dev/null +++ b/.next/static/webpack/4528b572b2c1fb3a.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/[categoryId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/96a4c04f3af3cc7f.webpack.hot-update.json b/.next/static/webpack/96a4c04f3af3cc7f.webpack.hot-update.json new file mode 100644 index 0000000..6a4f8ba --- /dev/null +++ b/.next/static/webpack/96a4c04f3af3cc7f.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/[categoryId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/a73da2d4cd917396.webpack.hot-update.json b/.next/static/webpack/a73da2d4cd917396.webpack.hot-update.json new file mode 100644 index 0000000..6a4f8ba --- /dev/null +++ b/.next/static/webpack/a73da2d4cd917396.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/[categoryId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.32693299354f3264.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.32693299354f3264.hot-update.js new file mode 100644 index 0000000..c4727c4 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.32693299354f3264.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx": +/*!**********************************************!*\ + !*** ./app/gunbuilder/[categoryId]/page.tsx ***! + \**********************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ]\n};\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // NEW: filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n var _CATEGORY_TO_PART_ROLES_categoryId;\n const roles = (_CATEGORY_TO_PART_ROLES_categoryId = CATEGORY_TO_PART_ROLES[categoryId]) !== null && _CATEGORY_TO_PART_ROLES_categoryId !== void 0 ? _CATEGORY_TO_PART_ROLES_categoryId : [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // NEW: available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // NEW: filtered + sorted parts\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 149,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 152,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 148,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 147,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 146,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 169,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 177,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 181,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 180,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 183,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 176,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 190,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 202,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 189,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 175,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 168,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 226,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 230,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 224,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 237,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 249,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 251,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 243,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 236,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 258,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 272,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low β†’ High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 273,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High β†’ Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 274,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A β†’ Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 275,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 264,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 257,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 235,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 223,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 283,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" β€” check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 287,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 291,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder?select=\".concat(categoryId, \":\").concat(part.id),\n className: \"flex-1\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"β€” \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 309,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 307,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 312,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 306,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 317,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 305,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 301,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"w-full rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 322,\n columnNumber: 19\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 297,\n columnNumber: 17\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 295,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 335,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 336,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 337,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 338,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 334,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder?select=\".concat(categoryId, \":\").concat(part.id),\n className: \"block\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 353,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 357,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 349,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 348,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 363,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 366,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 370,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder?select=\".concat(categoryId, \":\").concat(part.id),\n className: \"rounded-md bg-amber-400 text-black px-3 py-1.5 text-xs font-semibold hover:bg-amber-300 transition-colors whitespace-nowrap\",\n children: \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 376,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 369,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 347,\n columnNumber: 21\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 343,\n columnNumber: 19\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 341,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 220,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 166,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 165,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"TCzyDO/Rdq+dZXo2cWnlf+kd3uc=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQ2U7QUFDUTtJQWlCbERNO0FBREYsTUFBTUMsZUFDSkQsQ0FBQUEsd0NBQUFBLE9BQU9BLENBQUNFLEdBQUcsQ0FBQ0Msd0JBQXdCLGNBQXBDSCxtREFBQUEsd0NBQXdDO0FBRTFDLE1BQU1JLHlCQUF1RDtJQUMzREMsT0FBTztRQUFDO0tBQWlCO0lBQ3pCQyxRQUFRO1FBQUM7S0FBUztJQUNsQkMsV0FBVztRQUFDO0tBQVk7SUFDeEJDLGdCQUFnQjtRQUFDO0tBQWtCO0lBQ25DQyxRQUFRO1FBQUM7S0FBYTtJQUN0QkMsWUFBWTtRQUFDO0tBQWtCO0lBQy9CQyxRQUFRO1FBQUM7S0FBUTtBQUNuQjtBQUtlLFNBQVNDOztJQUN0QixNQUFNQyxTQUFTZiwwREFBU0E7SUFDeEIsTUFBTWdCLGFBQWFELE9BQU9DLFVBQVU7SUFDcEMsTUFBTSxDQUFDQyxVQUFVQyxZQUFZLEdBQUdwQiwrQ0FBUUEsQ0FBVztJQUNuRCxNQUFNLENBQUNxQixPQUFPQyxTQUFTLEdBQUd0QiwrQ0FBUUEsQ0FBUyxFQUFFO0lBQzdDLE1BQU0sQ0FBQ3VCLFNBQVNDLFdBQVcsR0FBR3hCLCtDQUFRQSxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQ3lCLE9BQU9DLFNBQVMsR0FBRzFCLCtDQUFRQSxDQUFnQjtJQUVsRCwyQkFBMkI7SUFDM0IsTUFBTSxDQUFDMkIsYUFBYUMsZUFBZSxHQUFHNUIsK0NBQVFBLENBQVM7SUFDdkQsTUFBTSxDQUFDNkIsUUFBUUMsVUFBVSxHQUFHOUIsK0NBQVFBLENBQWE7SUFFakQsTUFBTStCLFdBQVdoQyw4Q0FBT0EsQ0FDdEIsSUFBTUksNkRBQVVBLENBQUM2QixJQUFJLENBQUMsQ0FBQ0MsSUFBTUEsRUFBRUMsRUFBRSxLQUFLaEIsYUFDdEM7UUFBQ0E7S0FBVztJQUdkcEIsZ0RBQVNBLENB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LE1BQU0sZUFBNkJpQixPQUFkckYsWUFBVyxLQUFXLE9BQVJxRixLQUFLckUsRUFBRTtnRUFDMUNpRCxXQUFVOzBFQUNYOzs7Ozs7MEVBR0QsOERBQUNsRixpREFBSUE7Z0VBQ0hxRixNQUFNLHNCQUFvQ2lCLE9BQWRyRixZQUFXLEtBQVcsT0FBUnFGLEtBQUtyRSxFQUFFO2dFQUNqRGlELFdBQVU7MEVBQ1g7Ozs7Ozs7Ozs7Ozs7Ozs7OzsyQ0FuQ0FvQixLQUFLckUsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpRGhDO0dBbld3QmxCOztRQUNQZCxzREFBU0E7OztLQURGYyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9hcHAvZ3VuYnVpbGRlci9bY2F0ZWdvcnlJZF0vcGFnZS50c3g/OGI1ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHsgdXNlUGFyYW1zIH0gZnJvbSBcIm5leHQvbmF2aWdhdGlvblwiO1xuaW1wb3J0IHsgQ0FURUdPUklFUyB9IGZyb20gXCJAL2RhdGEvZ3VuYnVpbGRlclBhcnRzXCI7XG5pbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQsIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbnR5cGUgVmlld01vZGUgPSBcImNhcmRcIiB8IFwibGlzdFwiO1xuXG50eXBlIEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaSA9IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBicmFuZDogc3RyaW5nO1xuICBwbGF0Zm9ybTogc3RyaW5nO1xuICBwYXJ0Um9sZTogc3RyaW5nO1xuICBwcmljZTogbnVtYmVyIHwgbnVsbDtcbiAgbWFpbkltYWdlVXJsOiBzdHJpbmcgfCBudWxsO1xuICBidXlVcmw6IHN0cmluZyB8IG51bGw7XG59O1xuXG5jb25zdCBBUElfQkFTRV9VUkwgPVxuICBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwgPz8gXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIjtcblxuY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgdXBwZXI6IFtcInVwcGVyLXJlY2VpdmVyXCJdLFxuICBiYXJyZWw6IFtcImJhcnJlbFwiXSxcbiAgaGFuZGd1YXJkOiBbXCJoYW5kZ3VhcmRcIl0sXG4gIGNoYXJnaW5nSGFuZGxlOiBbXCJjaGFyZ2luZy1oYW5kbGVcIl0sXG4gIGJ1ZmZlcjogW1wiYnVmZmVyLWtpdFwiXSxcbiAgbG93ZXJQYXJ0czogW1wibG93ZXItcGFydHMta2l0XCJdLFxuICBzaWdodHM6IFtcInNpZ2h0XCJdLFxufTtcblxuLy8gTkVXOiBzb3J0IG9wdGlvbnNcbnR5cGUgU29ydE9wdGlvbiA9IFwicmVsZXZhbmNlXCIgfCBcInByaWNlLWFzY1wiIHwgXCJwcmljZS1kZXNjXCIgfCBcImJyYW5kLWFzY1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDYXRlZ29yeVBhZ2UoKSB7XG4gIGNvbnN0IHBhcmFtcyA9IHVzZVBhcmFtcygpO1xuICBjb25zdCBjYXRlZ29yeUlkID0gcGFyYW1zLmNhdGVnb3J5SWQgYXMgQ2F0ZWdvcnlJZDtcbiAgY29uc3QgW3ZpZXdNb2RlLCBzZXRWaWV3TW9kZV0gPSB1c2VTdGF0ZTxWaWV3TW9kZT4oXCJsaXN0XCIpO1xuICBjb25zdCBbcGFydHMsIHNldFBhcnRzXSA9IHVzZVN0YXRlPFBhcnRbXT4oW10pO1xuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBORVc6IGZpbHRlciArIHNvcnQgc3RhdGVcbiAgY29uc3QgW2JyYW5kRmlsdGVyLCBzZXRCcmFuZEZpbHRlcl0gPSB1c2VTdGF0ZTxzdHJpbmc+KFwiYWxsXCIpO1xuICBjb25zdCBbc29ydEJ5LCBzZXRTb3J0QnldID0gdXNlU3RhdGU8U29ydE9wdGlvbj4oXCJyZWxldmFuY2VcIik7XG5cbiAgY29uc3QgY2F0ZWdvcnkgPSB1c2VNZW1vKFxuICAgICgpID0+IENBVEVHT1JJRVMuZmluZCgoYykgPT4gYy5pZCA9PT0gY2F0ZWdvcnlJZCksXG4gICAgW2NhdGVnb3J5SWRdLFxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFjYXRlZ29yeUlkKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hDYXRlZ29yeVBhcnRzKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG5cbiAgICAgICAgY29uc3Qgcm9sZXMgPSBDQVRFR09SWV9UT19QQVJUX1JPTEVTW2NhdGVnb3J5SWRdID8/IFtdO1xuXG4gICAgICAgIGNvbnN0IHNlYXJjaCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgICAgc2VhcmNoLnNldChcInBsYXRmb3JtXCIsIFwiQVItMTVcIik7XG4gICAgICAgIHJvbGVzLmZvckVhY2goKHIpID0+IHNlYXJjaC5hcHBlbmQoXCJwYXJ0Um9sZXNcIiwgcikpO1xuXG4gICAgICAgIGNvbnN0IHVybCA9IGAke0FQSV9CQVNFX1VSTH0vYXBpL3Byb2R1Y3RzL2d1bmJ1aWxkZXIke1xuICAgICAgICAgIHJvbGVzLmxlbmd0aCA/IGA/JHtzZWFyY2gudG9TdHJpbmcoKX1gIDogXCJcIlxuICAgICAgICB9YDtcblxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KTtcblxuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHMgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhOiBHdW5idWlsZGVyUHJvZHVjdEZyb21BcGlbXSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZDogUGFydFtdID0gZGF0YS5tYXAoKHApID0+ICh7XG4gICAgICAgICAgaWQ6IHAuaWQsXG4gICAgICAgICAgY2F0ZWdvcnlJZCxcbiAgICAgICAgICBuYW1lOiBwLm5hbWUsXG4gICAgICAgICAgYnJhbmQ6IHAuYnJhbmQsXG4gICAgICAgICAgcHJpY2U6IHAucHJpY2UgPz8gMCxcbiAgICAgICAgICBpbWFnZVVybDogcC5tYWluSW1hZ2VVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIHVybDogcC5idXlVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIG5vdGVzOiB1bmRlZmluZWQsXG4gICAgICAgIH0pKTtcblxuICAgICAgICBzZXRQYXJ0cyhub3JtYWxpemVkKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGlmIChlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHJldHVybjtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBwcm9kdWN0c1wiKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoQ2F0ZWdvcnlQYXJ0cygpO1xuXG4gICAgcmV0dXJuICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfSwgW2NhdGVnb3J5SWRdKTtcblxuICAvLyBORVc6IGF2YWlsYWJsZSBicmFuZHMgZm9yIGZpbHRlclxuICBjb25zdCBhdmFpbGFibGVCcmFuZHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBBcnJheS5mcm9tKG5ldyBTZXQocGFydHMubWFwKChwKSA9PiBwLmJyYW5kKSkpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgW3BhcnRzXSxcbiAgKTtcblxuICAvLyBORVc6IGZpbHRlcmVkICsgc29ydGVkIHBhcnRzXG4gIGNvbnN0IGZpbHRlcmVkUGFydHMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBsZXQgcmVzdWx0ID0gWy4uLnBhcnRzXTtcblxuICAgIGlmIChicmFuZEZpbHRlciAhPT0gXCJhbGxcIikge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcigocCkgPT4gcC5icmFuZCA9PT0gYnJhbmRGaWx0ZXIpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc29ydEJ5KSB7XG4gICAgICBjYXNlIFwicHJpY2UtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLnByaWNlIC0gYi5wcmljZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInByaWNlLWRlc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGIucHJpY2UgLSBhLnByaWNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYnJhbmQtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLmJyYW5kLmxvY2FsZUNvbXBhcmUoYi5icmFuZCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJyZWxldmFuY2VcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGxlYXZlIGluIGJhY2tlbmQgb3JkZXJcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwgW3BhcnRzLCBicmFuZEZpbHRlciwgc29ydEJ5XSk7XG5cbiAgaWYgKCFjYXRlZ29yeSkge1xuICAgIHJldHVybiAoXG4gICAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwIG1iLTRcIj5cbiAgICAgICAgICAgICAgQ2F0ZWdvcnkgTm90IEZvdW5kXG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDAgaG92ZXI6dGV4dC1hbWJlci0yMDAgdW5kZXJsaW5lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgUmV0dXJuIHRvIEd1bmJ1aWxkZXJcbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21haW4+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02XCI+XG4gICAgICAgICAgPExpbmtcbiAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMCBtYi00IGlubGluZS1ibG9ja1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAg4oaQIEJhY2sgdG8gR3VuYnVpbGRlclxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNoYWRvdyBTdGFuZGFyZFxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgICB7Y2F0ZWdvcnkubmFtZX0gPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDBcIj5QYXJ0czwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgICBCcm93c2UgYWxsIGF2YWlsYWJsZSB7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfSBvcHRpb25zIGZvclxuICAgICAgICAgICAgICAgIHlvdXIgYnVpbGQsIHB1bGxlZCBsaXZlIGZyb20geW91ciBCYWxsaXN0aWMgYmFja2VuZC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTIgYm9yZGVyIGJvcmRlci16aW5jLTgwMCByb3VuZGVkLW1kIHAtMSBiZy16aW5jLTk1MC82MFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJjYXJkXCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImNhcmRcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2FyZCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBDYXJkXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWaWV3TW9kZShcImxpc3RcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGUgPT09IFwibGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy01MFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJMaXN0IHZpZXdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIExpc3RcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICB7LyogUGFydHMgR3JpZC9MaXN0ICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvNjAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgIHsvKiBORVc6IGZpbHRlciArIHNvcnQgdG9vbGJhciAqL31cbiAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi00IGZsZXggZmxleC1jb2wgZ2FwLTMgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtY2VudGVyIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNob3dpbmd7XCIgXCJ9XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTIwMCBmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubGVuZ3RofVxuICAgICAgICAgICAgICAgIDwvc3Bhbj57XCIgXCJ9XG4gICAgICAgICAgICAgICAgb2Z7XCIgXCJ9XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTIwMCBmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAge3BhcnRzLmxlbmd0aH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+e1wiIFwifVxuICAgICAgICAgICAgICAgIHBhcnRzXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC13cmFwIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGh0bWxGb3I9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBCcmFuZFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YnJhbmRGaWx0ZXJ9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0QnJhbmRGaWx0ZXIoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsbFwiPkFsbCBicmFuZHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAge2F2YWlsYWJsZUJyYW5kcy5tYXAoKGIpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17Yn0gdmFsdWU9e2J9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2J9XG4gICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGh0bWxGb3I9XCJzb3J0LWJ5XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgU29ydFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJzb3J0LWJ5XCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NvcnRCeX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHNldFNvcnRCeShlLnRhcmdldC52YWx1ZSBhcyBTb3J0T3B0aW9uKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC83MCB0ZXh0LXhzIHRleHQtemluYy0yMDAgcHgtMiBweS0xIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1hbWJlci00MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVsZXZhbmNlXCI+UmVsZXZhbmNlPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwcmljZS1hc2NcIj5QcmljZTogTG93IOKGkiBIaWdoPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwcmljZS1kZXNjXCI+UHJpY2U6IEhpZ2gg4oaSIExvdzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYnJhbmQtYXNjXCI+QnJhbmQ6IEEg4oaSIFo8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIExvYWRpbmcge2NhdGVnb3J5Lm5hbWUudG9Mb3dlckNhc2UoKX3igKZcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogZXJyb3IgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtcmVkLTQwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIHtlcnJvcn0g4oCUIGNoZWNrIHRoYXQgdGhlIEJhbGxpc3RpYyBBUEkgaXMgcnVubmluZy5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogZmlsdGVyZWRQYXJ0cy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICBObyBwYXJ0cyBhdmFpbGFibGUgZm9yIHRoaXMgY2F0ZWdvcnkgeWV0LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiB2aWV3TW9kZSA9PT0gXCJjYXJkXCIgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTMgbWQ6Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTNcIj5cbiAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiAoXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAga2V5PXtwYXJ0LmlkfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZ3JvdXAgcmVsYXRpdmUgYm9yZGVyIGJvcmRlci16aW5jLTcwMCByb3VuZGVkLW1kIHAtMyBiZy16aW5jLTkwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNDAwLzYwIGhvdmVyOmJnLWFtYmVyLTQwMC8xMCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAgZmxleCBmbGV4LWNvbFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgaHJlZj17YC9ndW5idWlsZGVyP3NlbGVjdD0ke2NhdGVnb3J5SWR9OiR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4LTFcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBnYXAtMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbm9ybWFsXCI+4oCUIHtwYXJ0Lm5hbWV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3RlcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNDAwIGxpbmUtY2xhbXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIHdoaXRlc3BhY2Utbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeUlkfS8ke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTIgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtNzAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICB7LyogTkVXOiBoZWFkZXIgcm93IGZvciBsaXN0IHZpZXcgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmdyaWQgZ3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBnYXAtNCBweC0zIHBiLTIgdGV4dC1bMC43cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlBhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+QnJhbmQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1yaWdodFwiPlByaWNlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtcmlnaHQgcHItMlwiPkFjdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGtleT17cGFydC5pZH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZ3JvdXAgcmVsYXRpdmUgYm9yZGVyIGJvcmRlci16aW5jLTcwMCByb3VuZGVkLW1kIHAtMyBiZy16aW5jLTkwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNDAwLzYwIGhvdmVyOmJnLWFtYmVyLTQwMC8xMCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTIgbWQ6Z3JpZCBtZDpncmlkLWNvbHMtW21pbm1heCgwLDNmcilfbWlubWF4KDAsMWZyKV9taW5tYXgoMCwxZnIpX2F1dG9dIG1kOml0ZW1zLWNlbnRlciBtZDpnYXAtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlcj9zZWxlY3Q9JHtjYXRlZ29yeUlkfToke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmxvY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXMgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNDAwIGxpbmUtY2xhbXAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyBtZDp0ZXh0LXNtIHRleHQtemluYy00MDAgbWQ6dGV4dC1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTMwMCBtZDp0ZXh0LXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1lbmQgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy04MDAvNTAgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtNzAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB3aGl0ZXNwYWNlLW5vd3JhcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj17YC9ndW5idWlsZGVyP3NlbGVjdD0ke2NhdGVnb3J5SWR9OiR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJnLWFtYmVyLTQwMCB0ZXh0LWJsYWNrIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1zZW1pYm9sZCBob3ZlcjpiZy1hbWJlci0zMDAgdHJhbnNpdGlvbi1jb2xvcnMgd2hpdGVzcGFjZS1ub3dyYXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgdG8gQnVpbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsIkxpbmsiLCJ1c2VQYXJhbXMiLCJDQVRFR09SSUVTIiwicHJvY2VzcyIsIkFQSV9CQVNFX1VSTCIsImVudiIsIk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCIsIkNBVEVHT1JZX1RPX1BBUlRfUk9MRVMiLCJ1cHBlciIsImJhcnJlbCIsImhhbmRndWFyZCIsImNoYXJnaW5nSGFuZGxlIiwiYnVmZmVyIiwibG93ZXJQYXJ0cyIsInNpZ2h0cyIsIkNhdGVnb3J5UGFnZSIsInBhcmFtcyIsImNhdGVnb3J5SWQiLCJ2aWV3TW9kZSIsInNldFZpZXdNb2RlIiwicGFydHMiLCJzZXRQYXJ0cyIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsImJyYW5kRmlsdGVyIiwic2V0QnJhbmRGaWx0ZXIiLCJzb3J0QnkiLCJzZXRTb3J0QnkiLCJjYXRlZ29yeSIsImZpbmQiLCJjIiwiaWQiLCJjb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwiZmV0Y2hDYXRlZ29yeVBhcnRzIiwicm9sZXMiLCJzZWFyY2giLCJVUkxTZWFyY2hQYXJhbXMiLCJzZXQiLCJmb3JFYWNoIiwiciIsImFwcGVuZCIsInVybCIsImxlbmd0aCIsInRvU3RyaW5nIiwicmVzIiwiZmV0Y2giLCJzaWduYWwiLCJvayIsIkVycm9yIiwic3RhdHVzIiwiZGF0YSIsImpzb24iLCJub3JtYWxpemVkIiwibWFwIiwicCIsIm5hbWUiLCJicmFuZCIsInByaWNlIiwiaW1hZ2VVcmwiLCJtYWluSW1hZ2VVcmwiLCJ1bmRlZmluZWQiLCJidXlVcmwiLCJub3RlcyIsImVyciIsIm1lc3NhZ2UiLCJhYm9ydCIsImF2YWlsYWJsZUJyYW5kcyIsIkFycmF5IiwiZnJvbSIsIlNldCIsImZpbHRlciIsIkJvb2xlYW4iLCJzb3J0IiwiYSIsImIiLCJsb2NhbGVDb21wYXJlIiwiZmlsdGVyZWRQYXJ0cyIsInJlc3VsdCIsIm1haW4iLCJjbGFzc05hbWUiLCJkaXYiLCJoMSIsImhyZWYiLCJoZWFkZXIiLCJzcGFuIiwidG9Mb3dlckNhc2UiLCJidXR0b24iLCJ0eXBlIiwib25DbGljayIsImFyaWEtbGFiZWwiLCJzZWN0aW9uIiwibGFiZWwiLCJodG1sRm9yIiwic2VsZWN0IiwidmFsdWUiLCJvbkNoYW5nZSIsImUiLCJ0YXJnZXQiLCJvcHRpb24iLCJwYXJ0IiwidG9GaXhlZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.385ea9265ba687b2.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.385ea9265ba687b2.hot-update.js new file mode 100644 index 0000000..5523a9e --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.385ea9265ba687b2.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx": +/*!**********************************************!*\ + !*** ./app/gunbuilder/[categoryId]/page.tsx ***! + \**********************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ]\n};\nconst STORAGE_KEY = \"gunbuilder-build-state\";\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // NEW: filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n // NEW: build state for this page, synced with localStorage\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (false) {}\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : {};\n } catch (e) {\n return {};\n }\n });\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n var _CATEGORY_TO_PART_ROLES_categoryId;\n const roles = (_CATEGORY_TO_PART_ROLES_categoryId = CATEGORY_TO_PART_ROLES[categoryId]) !== null && _CATEGORY_TO_PART_ROLES_categoryId !== void 0 ? _CATEGORY_TO_PART_ROLES_categoryId : [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // NEW: persist build to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (false) {}\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n } catch (e) {\n // ignore\n }\n }, [\n build\n ]);\n // NEW: handler to toggle Add / Remove for this category\n const handleTogglePart = (categoryId, partId)=>{\n const isSelected = build[categoryId] === partId;\n if (isSelected) {\n // Remove from build\n setBuild((prev)=>{\n const updated = {\n ...prev\n };\n delete updated[categoryId];\n return updated;\n });\n } else {\n // Add to build and navigate back to main gunbuilder page\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n router.push(\"/gunbuilder\");\n }\n };\n // NEW: available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // NEW: filtered + sorted parts\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 197,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 200,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 196,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 195,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 194,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 217,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 225,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 229,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 228,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 231,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 224,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 238,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 250,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 237,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 223,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 216,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 274,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 278,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 272,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 285,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 297,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 299,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 291,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 284,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 306,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 317,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low β†’ High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 318,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High β†’ Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 319,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A β†’ Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 320,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 309,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 305,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 283,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 271,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 328,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" β€” check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 332,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 336,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"β€” \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 353,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 351,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 356,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 350,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 361,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 349,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 366,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"flex-1 rounded-md px-3 py-2 text-xs font-semibold transition-colors text-center \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 372,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 365,\n columnNumber: 21\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 345,\n columnNumber: 19\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 340,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 392,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 393,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 394,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 395,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 391,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 409,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 413,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 408,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 418,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 421,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 425,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"rounded-md px-3 py-1.5 text-xs font-semibold transition-colors whitespace-nowrap \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 431,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 424,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 407,\n columnNumber: 23\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 403,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 398,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 268,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 214,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 213,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"pJYAu1Vs5wLdusWqq2Thip72pdg=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQzBCO0FBQ0g7SUFpQmxETztBQURGLE1BQU1DLGVBQ0pELENBQUFBLHdDQUFBQSxPQUFPQSxDQUFDRSxHQUFHLENBQUNDLHdCQUF3QixjQUFwQ0gsbURBQUFBLHdDQUF3QztBQUUxQyxNQUFNSSx5QkFBdUQ7SUFDM0RDLE9BQU87UUFBQztLQUFpQjtJQUN6QkMsUUFBUTtRQUFDO0tBQVM7SUFDbEJDLFdBQVc7UUFBQztLQUFZO0lBQ3hCQyxnQkFBZ0I7UUFBQztLQUFrQjtJQUNuQ0MsUUFBUTtRQUFDO0tBQWE7SUFDdEJDLFlBQVk7UUFBQztLQUFrQjtJQUMvQkMsUUFBUTtRQUFDO0tBQVE7QUFDbkI7QUFPQSxNQUFNQyxjQUFjO0FBRUwsU0FBU0M7O0lBQ3RCLE1BQU1DLFNBQVNqQiwwREFBU0E7SUFDeEIsTUFBTWtCLGFBQWFELE9BQU9DLFVBQVU7SUFDcEMsTUFBTUMsU0FBU2xCLDBEQUFTQTtJQUV4QixNQUFNLENBQUNtQixVQUFVQyxZQUFZLEdBQUd2QiwrQ0FBUUEsQ0FBVztJQUNuRCxNQUFNLENBQUN3QixPQUFPQyxTQUFTLEdBQUd6QiwrQ0FBUUEsQ0FBUyxFQUFFO0lBQzdDLE1BQU0sQ0FBQzBCLFNBQVNDLFdBQVcsR0FBRzNCLCtDQUFRQSxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQzRCLE9BQU9DLFNBQVMsR0FBRzdCLCtDQUFRQSxDQUFnQjtJQUVsRCwyQkFBMkI7SUFDM0IsTUFBTSxDQUFDOEIsYUFBYUMsZUFBZSxHQUFHL0IsK0NBQVFBLENBQVM7SUFDdkQsTUFBTSxDQUFDZ0MsUUFBUUMsVUFBVSxHQUFHakMsK0NBQVFBLENBQWE7SUFFakQsMkRBQTJEO0lBQzNELE1BQU0sQ0FBQ2tDLE9BQU9DLFNBQVMsR0FBR25DLCtDQUFRQSxDQUFhO1FBQzdDLElBQUksS0FBNkIsRUFB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RUFDYiw4REFBQ3JHLGlEQUFJQTtnRUFDSHdHLE1BQU0sZUFBNkJpQixPQUFkdEcsWUFBVyxLQUFXLE9BQVJzRyxLQUFLN0UsRUFBRTtnRUFDMUN5RCxXQUFVOzBFQUNYOzs7Ozs7MEVBR0QsOERBQUNPO2dFQUNDQyxNQUFLO2dFQUNMQyxTQUFTLElBQ1A1QixpQkFBaUIvRCxZQUFZc0csS0FBSzdFLEVBQUU7Z0VBRXRDeUQsV0FBVyxvRkFJVixPQUhDakIsYUFDSSx1RUFDQTswRUFHTEEsYUFBYSxzQkFBc0I7Ozs7Ozs7Ozs7Ozs7Ozs7OzsyQ0F0Q3JDcUMsS0FBSzdFLEVBQUU7Ozs7O29DQTRDbEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRaEI7R0E5WndCM0I7O1FBQ1BoQixzREFBU0E7UUFFVEMsc0RBQVNBOzs7S0FIRmUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2d1bmJ1aWxkZXIvW2NhdGVnb3J5SWRdL3BhZ2UudHN4PzhiNWQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBMaW5rIGZyb20gXCJuZXh0L2xpbmtcIjtcbmltcG9ydCB7IHVzZVBhcmFtcywgdXNlUm91dGVyIH0gZnJvbSBcIm5leHQvbmF2aWdhdGlvblwiO1xuaW1wb3J0IHsgQ0FURUdPUklFUyB9IGZyb20gXCJAL2RhdGEvZ3VuYnVpbGRlclBhcnRzXCI7XG5pbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQsIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbnR5cGUgVmlld01vZGUgPSBcImNhcmRcIiB8IFwibGlzdFwiO1xuXG50eXBlIEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaSA9IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBicmFuZDogc3RyaW5nO1xuICBwbGF0Zm9ybTogc3RyaW5nO1xuICBwYXJ0Um9sZTogc3RyaW5nO1xuICBwcmljZTogbnVtYmVyIHwgbnVsbDtcbiAgbWFpbkltYWdlVXJsOiBzdHJpbmcgfCBudWxsO1xuICBidXlVcmw6IHN0cmluZyB8IG51bGw7XG59O1xuXG5jb25zdCBBUElfQkFTRV9VUkwgPVxuICBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwgPz8gXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIjtcblxuY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgdXBwZXI6IFtcInVwcGVyLXJlY2VpdmVyXCJdLFxuICBiYXJyZWw6IFtcImJhcnJlbFwiXSxcbiAgaGFuZGd1YXJkOiBbXCJoYW5kZ3VhcmRcIl0sXG4gIGNoYXJnaW5nSGFuZGxlOiBbXCJjaGFyZ2luZy1oYW5kbGVcIl0sXG4gIGJ1ZmZlcjogW1wiYnVmZmVyLWtpdFwiXSxcbiAgbG93ZXJQYXJ0czogW1wibG93ZXItcGFydHMta2l0XCJdLFxuICBzaWdodHM6IFtcInNpZ2h0XCJdLFxufTtcblxuLy8gTkVXOiBzb3J0IG9wdGlvbnNcbnR5cGUgU29ydE9wdGlvbiA9IFwicmVsZXZhbmNlXCIgfCBcInByaWNlLWFzY1wiIHwgXCJwcmljZS1kZXNjXCIgfCBcImJyYW5kLWFzY1wiO1xuXG4vLyBORVc6IGJ1aWxkIHN0YXRlIHR5cGUgKyBzdG9yYWdlIGtleSAobWF0Y2hlcyAvZ3VuYnVpbGRlcilcbnR5cGUgQnVpbGRTdGF0ZSA9IFBhcnRpYWw8UmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZz4+O1xuY29uc3QgU1RPUkFHRV9LRVkgPSBcImd1bmJ1aWxkZXItYnVpbGQtc3RhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ2F0ZWdvcnlQYWdlKCkge1xuICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXMoKTtcbiAgY29uc3QgY2F0ZWdvcnlJZCA9IHBhcmFtcy5jYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpO1xuXG4gIGNvbnN0IFt2aWV3TW9kZSwgc2V0Vmlld01vZGVdID0gdXNlU3RhdGU8Vmlld01vZGU+KFwibGlzdFwiKTtcbiAgY29uc3QgW3BhcnRzLCBzZXRQYXJ0c10gPSB1c2VTdGF0ZTxQYXJ0W10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gTkVXOiBmaWx0ZXIgKyBzb3J0IHN0YXRlXG4gIGNvbnN0IFticmFuZEZpbHRlciwgc2V0QnJhbmRGaWx0ZXJdID0gdXNlU3RhdGU8c3RyaW5nPihcImFsbFwiKTtcbiAgY29uc3QgW3NvcnRCeSwgc2V0U29ydEJ5XSA9IHVzZVN0YXRlPFNvcnRPcHRpb24+KFwicmVsZXZhbmNlXCIpO1xuXG4gIC8vIE5FVzogYnVpbGQgc3RhdGUgZm9yIHRoaXMgcGFnZSwgc3luY2VkIHdpdGggbG9jYWxTdG9yYWdlXG4gIGNvbnN0IFtidWlsZCwgc2V0QnVpbGRdID0gdXNlU3RhdGU8QnVpbGRTdGF0ZT4oKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4ge307XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWSk7XG4gICAgICByZXR1cm4gc3RvcmVkID8gKEpTT04ucGFyc2Uoc3RvcmVkKSBhcyBCdWlsZFN0YXRlKSA6IHt9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgY2F0ZWdvcnkgPSB1c2VNZW1vKFxuICAgICgpID0+IENBVEVHT1JJRVMuZmluZCgoYykgPT4gYy5pZCA9PT0gY2F0ZWdvcnlJZCksXG4gICAgW2NhdGVnb3J5SWRdLFxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFjYXRlZ29yeUlkKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hDYXRlZ29yeVBhcnRzKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG5cbiAgICAgICAgY29uc3Qgcm9sZXMgPSBDQVRFR09SWV9UT19QQVJUX1JPTEVTW2NhdGVnb3J5SWRdID8/IFtdO1xuXG4gICAgICAgIGNvbnN0IHNlYXJjaCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgICAgc2VhcmNoLnNldChcInBsYXRmb3JtXCIsIFwiQVItMTVcIik7XG4gICAgICAgIHJvbGVzLmZvckVhY2goKHIpID0+IHNlYXJjaC5hcHBlbmQoXCJwYXJ0Um9sZXNcIiwgcikpO1xuXG4gICAgICAgIGNvbnN0IHVybCA9IGAke0FQSV9CQVNFX1VSTH0vYXBpL3Byb2R1Y3RzL2d1bmJ1aWxkZXIke1xuICAgICAgICAgIHJvbGVzLmxlbmd0aCA/IGA/JHtzZWFyY2gudG9TdHJpbmcoKX1gIDogXCJcIlxuICAgICAgICB9YDtcblxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KTtcblxuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHMgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhOiBHdW5idWlsZGVyUHJvZHVjdEZyb21BcGlbXSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZDogUGFydFtdID0gZGF0YS5tYXAoKHApID0+ICh7XG4gICAgICAgICAgaWQ6IHAuaWQsXG4gICAgICAgICAgY2F0ZWdvcnlJZCxcbiAgICAgICAgICBuYW1lOiBwLm5hbWUsXG4gICAgICAgICAgYnJhbmQ6IHAuYnJhbmQsXG4gICAgICAgICAgcHJpY2U6IHAucHJpY2UgPz8gMCxcbiAgICAgICAgICBpbWFnZVVybDogcC5tYWluSW1hZ2VVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIHVybDogcC5idXlVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIG5vdGVzOiB1bmRlZmluZWQsXG4gICAgICAgIH0pKTtcblxuICAgICAgICBzZXRQYXJ0cyhub3JtYWxpemVkKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGlmIChlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHJldHVybjtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBwcm9kdWN0c1wiKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoQ2F0ZWdvcnlQYXJ0cygpO1xuXG4gICAgcmV0dXJuICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfSwgW2NhdGVnb3J5SWRdKTtcblxuICAvLyBORVc6IHBlcnNpc3QgYnVpbGQgdG8gbG9jYWxTdG9yYWdlIHdoZW5ldmVyIGl0IGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KGJ1aWxkKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH0sIFtidWlsZF0pO1xuXG4gIC8vIE5FVzogaGFuZGxlciB0byB0b2dnbGUgQWRkIC8gUmVtb3ZlIGZvciB0aGlzIGNhdGVnb3J5XG4gIGNvbnN0IGhhbmRsZVRvZ2dsZVBhcnQgPSAoY2F0ZWdvcnlJZDogQ2F0ZWdvcnlJZCwgcGFydElkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnRJZDtcblxuICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAvLyBSZW1vdmUgZnJvbSBidWlsZFxuICAgICAgc2V0QnVpbGQoKHByZXYpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZDogQnVpbGRTdGF0ZSA9IHsgLi4ucHJldiB9O1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtjYXRlZ29yeUlkXTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWRkIHRvIGJ1aWxkIGFuZCBuYXZpZ2F0ZSBiYWNrIHRvIG1haW4gZ3VuYnVpbGRlciBwYWdlXG4gICAgICBzZXRCdWlsZCgocHJldikgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgW2NhdGVnb3J5SWRdOiBwYXJ0SWQsXG4gICAgICB9KSk7XG4gICAgICByb3V0ZXIucHVzaChcIi9ndW5idWlsZGVyXCIpO1xuICAgIH1cbiAgfTtcblxuICAvLyBORVc6IGF2YWlsYWJsZSBicmFuZHMgZm9yIGZpbHRlclxuICBjb25zdCBhdmFpbGFibGVCcmFuZHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBBcnJheS5mcm9tKG5ldyBTZXQocGFydHMubWFwKChwKSA9PiBwLmJyYW5kKSkpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgW3BhcnRzXSxcbiAgKTtcblxuICAvLyBORVc6IGZpbHRlcmVkICsgc29ydGVkIHBhcnRzXG4gIGNvbnN0IGZpbHRlcmVkUGFydHMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBsZXQgcmVzdWx0ID0gWy4uLnBhcnRzXTtcblxuICAgIGlmIChicmFuZEZpbHRlciAhPT0gXCJhbGxcIikge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcigocCkgPT4gcC5icmFuZCA9PT0gYnJhbmRGaWx0ZXIpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc29ydEJ5KSB7XG4gICAgICBjYXNlIFwicHJpY2UtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLnByaWNlIC0gYi5wcmljZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInByaWNlLWRlc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGIucHJpY2UgLSBhLnByaWNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYnJhbmQtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLmJyYW5kLmxvY2FsZUNvbXBhcmUoYi5icmFuZCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJyZWxldmFuY2VcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGxlYXZlIGluIGJhY2tlbmQgb3JkZXJcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwgW3BhcnRzLCBicmFuZEZpbHRlciwgc29ydEJ5XSk7XG5cbiAgaWYgKCFjYXRlZ29yeSkge1xuICAgIHJldHVybiAoXG4gICAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwIG1iLTRcIj5cbiAgICAgICAgICAgICAgQ2F0ZWdvcnkgTm90IEZvdW5kXG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDAgaG92ZXI6dGV4dC1hbWJlci0yMDAgdW5kZXJsaW5lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgUmV0dXJuIHRvIEd1bmJ1aWxkZXJcbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21haW4+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02XCI+XG4gICAgICAgICAgPExpbmtcbiAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMCBtYi00IGlubGluZS1ibG9ja1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAg4oaQIEJhY2sgdG8gR3VuYnVpbGRlclxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNoYWRvdyBTdGFuZGFyZFxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgICB7Y2F0ZWdvcnkubmFtZX0gPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDBcIj5QYXJ0czwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgICBCcm93c2UgYWxsIGF2YWlsYWJsZSB7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfSBvcHRpb25zIGZvclxuICAgICAgICAgICAgICAgIHlvdXIgYnVpbGQsIHB1bGxlZCBsaXZlIGZyb20geW91ciBCYWxsaXN0aWMgYmFja2VuZC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTIgYm9yZGVyIGJvcmRlci16aW5jLTgwMCByb3VuZGVkLW1kIHAtMSBiZy16aW5jLTk1MC82MFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJjYXJkXCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImNhcmRcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2FyZCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBDYXJkXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWaWV3TW9kZShcImxpc3RcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGUgPT09IFwibGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy01MFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJMaXN0IHZpZXdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIExpc3RcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICB7LyogUGFydHMgR3JpZC9MaXN0ICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvNjAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgIHsvKiBGaWx0ZXIgKyBzb3J0IHRvb2xiYXIgKi99XG4gICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiBwYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNCBmbGV4IGZsZXgtY29sIGdhcC0zIG1kOmZsZXgtcm93IG1kOml0ZW1zLWNlbnRlciBtZDpqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBTaG93aW5ne1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLmxlbmd0aH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+e1wiIFwifVxuICAgICAgICAgICAgICAgIG9me1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtwYXJ0cy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgPC9zcGFuPntcIiBcIn1cbiAgICAgICAgICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBnYXAtM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBodG1sRm9yPVwiYnJhbmQtZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQnJhbmRcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGlkPVwiYnJhbmQtZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2JyYW5kRmlsdGVyfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldEJyYW5kRmlsdGVyKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQteHMgdGV4dC16aW5jLTIwMCBweC0yIHB5LTEgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMSBmb2N1czpyaW5nLWFtYmVyLTQwMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhbGxcIj5BbGwgYnJhbmRzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIHthdmFpbGFibGVCcmFuZHMubWFwKChiKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e2J9IHZhbHVlPXtifT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtifVxuICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBodG1sRm9yPVwic29ydC1ieVwiIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICBTb3J0XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBpZD1cInNvcnQtYnlcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c29ydEJ5fVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgc2V0U29ydEJ5KGUudGFyZ2V0LnZhbHVlIGFzIFNvcnRPcHRpb24pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQteHMgdGV4dC16aW5jLTIwMCBweC0yIHB5LTEgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMSBmb2N1czpyaW5nLWFtYmVyLTQwMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJyZWxldmFuY2VcIj5SZWxldmFuY2U8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInByaWNlLWFzY1wiPlByaWNlOiBMb3cg4oaSIEhpZ2g8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInByaWNlLWRlc2NcIj5QcmljZTogSGlnaCDihpIgTG93PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJicmFuZC1hc2NcIj5CcmFuZDogQSDihpIgWjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAgTG9hZGluZyB7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfeKAplxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiBlcnJvciA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1yZWQtNDAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAge2Vycm9yfSDigJQgY2hlY2sgdGhhdCB0aGUgQmFsbGlzdGljIEFQSSBpcyBydW5uaW5nLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiBmaWx0ZXJlZFBhcnRzLmxlbmd0aCA9PT0gMCA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIE5vIHBhcnRzIGF2YWlsYWJsZSBmb3IgdGhpcyBjYXRlZ29yeSB5ZXQuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IHZpZXdNb2RlID09PSBcImNhcmRcIiA/IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtMyBtZDpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtM1wiPlxuICAgICAgICAgICAgICB7ZmlsdGVyZWRQYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnQuaWQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBrZXk9e3BhcnQuaWR9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImdyb3VwIHJlbGF0aXZlIGJvcmRlciBib3JkZXItemluYy03MDAgcm91bmRlZC1tZCBwLTMgYmctemluYy05MDAvNTAgaG92ZXI6Ym9yZGVyLWFtYmVyLTQwMC82MCBob3ZlcjpiZy1hbWJlci00MDAvMTAgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGZsZXggZmxleC1jb2xcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBnYXAtMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbm9ybWFsXCI+4oCUIHtwYXJ0Lm5hbWV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3RlcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNDAwIGxpbmUtY2xhbXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIHdoaXRlc3BhY2Utbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTIgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtNzAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGZsZXgtMSByb3VuZGVkLW1kIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhbnNpdGlvbi1jb2xvcnMgdGV4dC1jZW50ZXIgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtMTAwIGJvcmRlciBib3JkZXItemluYy02MDAgaG92ZXI6YmctemluYy03MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJiZy1hbWJlci00MDAgdGV4dC1ibGFjayBob3ZlcjpiZy1hbWJlci0zMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge2lzU2VsZWN0ZWQgPyBcIlJlbW92ZSBmcm9tIEJ1aWxkXCIgOiBcIkFkZCB0byBCdWlsZFwifVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIHsvKiBIZWFkZXIgcm93IGZvciBsaXN0IHZpZXcgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmdyaWQgZ3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBnYXAtNCBweC0zIHBiLTIgdGV4dC1bMC43cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlBhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+QnJhbmQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1yaWdodFwiPlByaWNlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtcmlnaHQgcHItMlwiPkFjdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnQuaWQ7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBrZXk9e3BhcnQuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZ3JvdXAgcmVsYXRpdmUgYm9yZGVyIGJvcmRlci16aW5jLTcwMCByb3VuZGVkLW1kIHAtMyBiZy16aW5jLTkwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNDAwLzYwIGhvdmVyOmJnLWFtYmVyLTQwMC8xMCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG1kOmdyaWQgbWQ6Z3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBtZDppdGVtcy1jZW50ZXIgbWQ6Z2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTQwMCBsaW5lLWNsYW1wLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gdGV4dC16aW5jLTQwMCBtZDp0ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIG1kOnRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJ0LnByaWNlLnRvRml4ZWQoMil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Byb3VuZGVkLW1kIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFuc2l0aW9uLWNvbG9ycyB3aGl0ZXNwYWNlLW5vd3JhcCAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTEwMCBib3JkZXIgYm9yZGVyLXppbmMtNjAwIGhvdmVyOmJnLXppbmMtNzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJnLWFtYmVyLTQwMCB0ZXh0LWJsYWNrIGhvdmVyOmJnLWFtYmVyLTMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aXNTZWxlY3RlZCA/IFwiUmVtb3ZlIGZyb20gQnVpbGRcIiA6IFwiQWRkIHRvIEJ1aWxkXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsIkxpbmsiLCJ1c2VQYXJhbXMiLCJ1c2VSb3V0ZXIiLCJDQVRFR09SSUVTIiwicHJvY2VzcyIsIkFQSV9CQVNFX1VSTCIsImVudiIsIk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCIsIkNBVEVHT1JZX1RPX1BBUlRfUk9MRVMiLCJ1cHBlciIsImJhcnJlbCIsImhhbmRndWFyZCIsImNoYXJnaW5nSGFuZGxlIiwiYnVmZmVyIiwibG93ZXJQYXJ0cyIsInNpZ2h0cyIsIlNUT1JBR0VfS0VZIiwiQ2F0ZWdvcnlQYWdlIiwicGFyYW1zIiwiY2F0ZWdvcnlJZCIsInJvdXRlciIsInZpZXdNb2RlIiwic2V0Vmlld01vZGUiLCJwYXJ0cyIsInNldFBhcnRzIiwibG9hZGluZyIsInNldExvYWRpbmciLCJlcnJvciIsInNldEVycm9yIiwiYnJhbmRGaWx0ZXIiLCJzZXRCcmFuZEZpbHRlciIsInNvcnRCeSIsInNldFNvcnRCeSIsImJ1aWxkIiwic2V0QnVpbGQiLCJzdG9yZWQiLCJ3aW5kb3ciLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwiSlNPTiIsInBhcnNlIiwiY2F0ZWdvcnkiLCJmaW5kIiwiYyIsImlkIiwiY29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsImZldGNoQ2F0ZWdvcnlQYXJ0cyIsInJvbGVzIiwic2VhcmNoIiwiVVJMU2VhcmNoUGFyYW1zIiwic2V0IiwiZm9yRWFjaCIsInIiLCJhcHBlbmQiLCJ1cmwiLCJsZW5ndGgiLCJ0b1N0cmluZyIsInJlcyIsImZldGNoIiwic2lnbmFsIiwib2siLCJFcnJvciIsInN0YXR1cyIsImRhdGEiLCJqc29uIiwibm9ybWFsaXplZCIsIm1hcCIsInAiLCJuYW1lIiwiYnJhbmQiLCJwcmljZSIsImltYWdlVXJsIiwibWFpbkltYWdlVXJsIiwidW5kZWZpbmVkIiwiYnV5VXJsIiwibm90ZXMiLCJlcnIiLCJtZXNzYWdlIiwiYWJvcnQiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwiaGFuZGxlVG9nZ2xlUGFydCIsInBhcnRJZCIsImlzU2VsZWN0ZWQiLCJwcmV2IiwidXBkYXRlZCIsInB1c2giLCJhdmFpbGFibGVCcmFuZHMiLCJBcnJheSIsImZyb20iLCJTZXQiLCJmaWx0ZXIiLCJCb29sZWFuIiwic29ydCIsImEiLCJiIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkUGFydHMiLCJyZXN1bHQiLCJtYWluIiwiY2xhc3NOYW1lIiwiZGl2IiwiaDEiLCJocmVmIiwiaGVhZGVyIiwic3BhbiIsInRvTG93ZXJDYXNlIiwiYnV0dG9uIiwidHlwZSIsIm9uQ2xpY2siLCJhcmlhLWxhYmVsIiwic2VjdGlvbiIsImxhYmVsIiwiaHRtbEZvciIsInNlbGVjdCIsInZhbHVlIiwib25DaGFuZ2UiLCJlIiwidGFyZ2V0Iiwib3B0aW9uIiwicGFydCIsInRvRml4ZWQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.4528b572b2c1fb3a.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.4528b572b2c1fb3a.hot-update.js new file mode 100644 index 0000000..7e31d37 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.4528b572b2c1fb3a.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx": +/*!**********************************************!*\ + !*** ./app/gunbuilder/[categoryId]/page.tsx ***! + \**********************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ]\n};\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // NEW: filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n var _CATEGORY_TO_PART_ROLES_categoryId;\n const roles = (_CATEGORY_TO_PART_ROLES_categoryId = CATEGORY_TO_PART_ROLES[categoryId]) !== null && _CATEGORY_TO_PART_ROLES_categoryId !== void 0 ? _CATEGORY_TO_PART_ROLES_categoryId : [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // NEW: available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // NEW: filtered + sorted parts\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 149,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 152,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 148,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 147,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 146,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 169,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 177,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 181,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 180,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 183,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 176,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 190,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 202,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 189,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 175,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 168,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 226,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 230,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 224,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 237,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 249,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 251,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 243,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 236,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 258,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 272,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low β†’ High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 273,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High β†’ Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 274,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A β†’ Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 275,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 264,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 257,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 235,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 223,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 283,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" β€” check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 287,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 291,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"β€” \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 305,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 303,\n columnNumber: 23\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 308,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 302,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 313,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 301,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 318,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder?select=\".concat(categoryId, \":\").concat(part.id),\n className: \"flex-1 rounded-md bg-amber-400 text-black px-3 py-2 text-xs font-semibold hover:bg-amber-300 transition-colors text-center\",\n children: \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 324,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 317,\n columnNumber: 19\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 297,\n columnNumber: 17\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 295,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 338,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 339,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 340,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 341,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 337,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder?select=\".concat(categoryId, \":\").concat(part.id),\n className: \"block\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 356,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 360,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 352,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 351,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 366,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 369,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 373,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder?select=\".concat(categoryId, \":\").concat(part.id),\n className: \"rounded-md bg-amber-400 text-black px-3 py-1.5 text-xs font-semibold hover:bg-amber-300 transition-colors whitespace-nowrap\",\n children: \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 379,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 372,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 350,\n columnNumber: 21\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 346,\n columnNumber: 19\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 344,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 220,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 166,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 165,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"TCzyDO/Rdq+dZXo2cWnlf+kd3uc=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQ2U7QUFDUTtJQWlCbERNO0FBREYsTUFBTUMsZUFDSkQsQ0FBQUEsd0NBQUFBLE9BQU9BLENBQUNFLEdBQUcsQ0FBQ0Msd0JBQXdCLGNBQXBDSCxtREFBQUEsd0NBQXdDO0FBRTFDLE1BQU1JLHlCQUF1RDtJQUMzREMsT0FBTztRQUFDO0tBQWlCO0lBQ3pCQyxRQUFRO1FBQUM7S0FBUztJQUNsQkMsV0FBVztRQUFDO0tBQVk7SUFDeEJDLGdCQUFnQjtRQUFDO0tBQWtCO0lBQ25DQyxRQUFRO1FBQUM7S0FBYTtJQUN0QkMsWUFBWTtRQUFDO0tBQWtCO0lBQy9CQyxRQUFRO1FBQUM7S0FBUTtBQUNuQjtBQUtlLFNBQVNDOztJQUN0QixNQUFNQyxTQUFTZiwwREFBU0E7SUFDeEIsTUFBTWdCLGFBQWFELE9BQU9DLFVBQVU7SUFDcEMsTUFBTSxDQUFDQyxVQUFVQyxZQUFZLEdBQUdwQiwrQ0FBUUEsQ0FBVztJQUNuRCxNQUFNLENBQUNxQixPQUFPQyxTQUFTLEdBQUd0QiwrQ0FBUUEsQ0FBUyxFQUFFO0lBQzdDLE1BQU0sQ0FBQ3VCLFNBQVNDLFdBQVcsR0FBR3hCLCtDQUFRQSxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQ3lCLE9BQU9DLFNBQVMsR0FBRzFCLCtDQUFRQSxDQUFnQjtJQUVsRCwyQkFBMkI7SUFDM0IsTUFBTSxDQUFDMkIsYUFBYUMsZUFBZSxHQUFHNUIsK0NBQVFBLENBQVM7SUFDdkQsTUFBTSxDQUFDNkIsUUFBUUMsVUFBVSxHQUFHOUIsK0NBQVFBLENBQWE7SUFFakQsTUFBTStCLFdBQVdoQyw4Q0FBT0EsQ0FDdEIsSUFBTUksNkRBQVVBLENBQUM2QixJQUFJLENBQUMsQ0FBQ0MsSUFBTUEsRUFBRUMsRUFBRSxLQUFLaEIsYUFDdEM7UUFBQ0E7S0FBVztJQUdkcEIsZ0RBQVNBLENB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QUFJRCxXQUFVOzswRUFDYiw4REFBQ2xGLGlEQUFJQTtnRUFDSHFGLE1BQU0sZUFBNkJpQixPQUFkckYsWUFBVyxLQUFXLE9BQVJxRixLQUFLckUsRUFBRTtnRUFDMUNpRCxXQUFVOzBFQUNYOzs7Ozs7MEVBR0QsOERBQUNsRixpREFBSUE7Z0VBQ0hxRixNQUFNLHNCQUFvQ2lCLE9BQWRyRixZQUFXLEtBQVcsT0FBUnFGLEtBQUtyRSxFQUFFO2dFQUNqRGlELFdBQVU7MEVBQ1g7Ozs7Ozs7Ozs7Ozs7Ozs7OzsyQ0FuQ0FvQixLQUFLckUsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpRGhDO0dBdFd3QmxCOztRQUNQZCxzREFBU0E7OztLQURGYyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9hcHAvZ3VuYnVpbGRlci9bY2F0ZWdvcnlJZF0vcGFnZS50c3g/OGI1ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHsgdXNlUGFyYW1zIH0gZnJvbSBcIm5leHQvbmF2aWdhdGlvblwiO1xuaW1wb3J0IHsgQ0FURUdPUklFUyB9IGZyb20gXCJAL2RhdGEvZ3VuYnVpbGRlclBhcnRzXCI7XG5pbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQsIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbnR5cGUgVmlld01vZGUgPSBcImNhcmRcIiB8IFwibGlzdFwiO1xuXG50eXBlIEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaSA9IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBicmFuZDogc3RyaW5nO1xuICBwbGF0Zm9ybTogc3RyaW5nO1xuICBwYXJ0Um9sZTogc3RyaW5nO1xuICBwcmljZTogbnVtYmVyIHwgbnVsbDtcbiAgbWFpbkltYWdlVXJsOiBzdHJpbmcgfCBudWxsO1xuICBidXlVcmw6IHN0cmluZyB8IG51bGw7XG59O1xuXG5jb25zdCBBUElfQkFTRV9VUkwgPVxuICBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwgPz8gXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIjtcblxuY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgdXBwZXI6IFtcInVwcGVyLXJlY2VpdmVyXCJdLFxuICBiYXJyZWw6IFtcImJhcnJlbFwiXSxcbiAgaGFuZGd1YXJkOiBbXCJoYW5kZ3VhcmRcIl0sXG4gIGNoYXJnaW5nSGFuZGxlOiBbXCJjaGFyZ2luZy1oYW5kbGVcIl0sXG4gIGJ1ZmZlcjogW1wiYnVmZmVyLWtpdFwiXSxcbiAgbG93ZXJQYXJ0czogW1wibG93ZXItcGFydHMta2l0XCJdLFxuICBzaWdodHM6IFtcInNpZ2h0XCJdLFxufTtcblxuLy8gTkVXOiBzb3J0IG9wdGlvbnNcbnR5cGUgU29ydE9wdGlvbiA9IFwicmVsZXZhbmNlXCIgfCBcInByaWNlLWFzY1wiIHwgXCJwcmljZS1kZXNjXCIgfCBcImJyYW5kLWFzY1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDYXRlZ29yeVBhZ2UoKSB7XG4gIGNvbnN0IHBhcmFtcyA9IHVzZVBhcmFtcygpO1xuICBjb25zdCBjYXRlZ29yeUlkID0gcGFyYW1zLmNhdGVnb3J5SWQgYXMgQ2F0ZWdvcnlJZDtcbiAgY29uc3QgW3ZpZXdNb2RlLCBzZXRWaWV3TW9kZV0gPSB1c2VTdGF0ZTxWaWV3TW9kZT4oXCJsaXN0XCIpO1xuICBjb25zdCBbcGFydHMsIHNldFBhcnRzXSA9IHVzZVN0YXRlPFBhcnRbXT4oW10pO1xuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBORVc6IGZpbHRlciArIHNvcnQgc3RhdGVcbiAgY29uc3QgW2JyYW5kRmlsdGVyLCBzZXRCcmFuZEZpbHRlcl0gPSB1c2VTdGF0ZTxzdHJpbmc+KFwiYWxsXCIpO1xuICBjb25zdCBbc29ydEJ5LCBzZXRTb3J0QnldID0gdXNlU3RhdGU8U29ydE9wdGlvbj4oXCJyZWxldmFuY2VcIik7XG5cbiAgY29uc3QgY2F0ZWdvcnkgPSB1c2VNZW1vKFxuICAgICgpID0+IENBVEVHT1JJRVMuZmluZCgoYykgPT4gYy5pZCA9PT0gY2F0ZWdvcnlJZCksXG4gICAgW2NhdGVnb3J5SWRdLFxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFjYXRlZ29yeUlkKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hDYXRlZ29yeVBhcnRzKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG5cbiAgICAgICAgY29uc3Qgcm9sZXMgPSBDQVRFR09SWV9UT19QQVJUX1JPTEVTW2NhdGVnb3J5SWRdID8/IFtdO1xuXG4gICAgICAgIGNvbnN0IHNlYXJjaCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgICAgc2VhcmNoLnNldChcInBsYXRmb3JtXCIsIFwiQVItMTVcIik7XG4gICAgICAgIHJvbGVzLmZvckVhY2goKHIpID0+IHNlYXJjaC5hcHBlbmQoXCJwYXJ0Um9sZXNcIiwgcikpO1xuXG4gICAgICAgIGNvbnN0IHVybCA9IGAke0FQSV9CQVNFX1VSTH0vYXBpL3Byb2R1Y3RzL2d1bmJ1aWxkZXIke1xuICAgICAgICAgIHJvbGVzLmxlbmd0aCA/IGA/JHtzZWFyY2gudG9TdHJpbmcoKX1gIDogXCJcIlxuICAgICAgICB9YDtcblxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KTtcblxuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHMgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhOiBHdW5idWlsZGVyUHJvZHVjdEZyb21BcGlbXSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZDogUGFydFtdID0gZGF0YS5tYXAoKHApID0+ICh7XG4gICAgICAgICAgaWQ6IHAuaWQsXG4gICAgICAgICAgY2F0ZWdvcnlJZCxcbiAgICAgICAgICBuYW1lOiBwLm5hbWUsXG4gICAgICAgICAgYnJhbmQ6IHAuYnJhbmQsXG4gICAgICAgICAgcHJpY2U6IHAucHJpY2UgPz8gMCxcbiAgICAgICAgICBpbWFnZVVybDogcC5tYWluSW1hZ2VVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIHVybDogcC5idXlVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIG5vdGVzOiB1bmRlZmluZWQsXG4gICAgICAgIH0pKTtcblxuICAgICAgICBzZXRQYXJ0cyhub3JtYWxpemVkKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGlmIChlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHJldHVybjtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBwcm9kdWN0c1wiKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoQ2F0ZWdvcnlQYXJ0cygpO1xuXG4gICAgcmV0dXJuICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfSwgW2NhdGVnb3J5SWRdKTtcblxuICAvLyBORVc6IGF2YWlsYWJsZSBicmFuZHMgZm9yIGZpbHRlclxuICBjb25zdCBhdmFpbGFibGVCcmFuZHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBBcnJheS5mcm9tKG5ldyBTZXQocGFydHMubWFwKChwKSA9PiBwLmJyYW5kKSkpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgW3BhcnRzXSxcbiAgKTtcblxuICAvLyBORVc6IGZpbHRlcmVkICsgc29ydGVkIHBhcnRzXG4gIGNvbnN0IGZpbHRlcmVkUGFydHMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBsZXQgcmVzdWx0ID0gWy4uLnBhcnRzXTtcblxuICAgIGlmIChicmFuZEZpbHRlciAhPT0gXCJhbGxcIikge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcigocCkgPT4gcC5icmFuZCA9PT0gYnJhbmRGaWx0ZXIpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc29ydEJ5KSB7XG4gICAgICBjYXNlIFwicHJpY2UtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLnByaWNlIC0gYi5wcmljZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInByaWNlLWRlc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGIucHJpY2UgLSBhLnByaWNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYnJhbmQtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLmJyYW5kLmxvY2FsZUNvbXBhcmUoYi5icmFuZCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJyZWxldmFuY2VcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGxlYXZlIGluIGJhY2tlbmQgb3JkZXJcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwgW3BhcnRzLCBicmFuZEZpbHRlciwgc29ydEJ5XSk7XG5cbiAgaWYgKCFjYXRlZ29yeSkge1xuICAgIHJldHVybiAoXG4gICAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwIG1iLTRcIj5cbiAgICAgICAgICAgICAgQ2F0ZWdvcnkgTm90IEZvdW5kXG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDAgaG92ZXI6dGV4dC1hbWJlci0yMDAgdW5kZXJsaW5lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgUmV0dXJuIHRvIEd1bmJ1aWxkZXJcbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21haW4+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02XCI+XG4gICAgICAgICAgPExpbmtcbiAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMCBtYi00IGlubGluZS1ibG9ja1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAg4oaQIEJhY2sgdG8gR3VuYnVpbGRlclxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNoYWRvdyBTdGFuZGFyZFxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgICB7Y2F0ZWdvcnkubmFtZX0gPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDBcIj5QYXJ0czwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgICBCcm93c2UgYWxsIGF2YWlsYWJsZSB7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfSBvcHRpb25zIGZvclxuICAgICAgICAgICAgICAgIHlvdXIgYnVpbGQsIHB1bGxlZCBsaXZlIGZyb20geW91ciBCYWxsaXN0aWMgYmFja2VuZC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTIgYm9yZGVyIGJvcmRlci16aW5jLTgwMCByb3VuZGVkLW1kIHAtMSBiZy16aW5jLTk1MC82MFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJjYXJkXCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImNhcmRcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2FyZCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBDYXJkXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWaWV3TW9kZShcImxpc3RcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGUgPT09IFwibGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy01MFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJMaXN0IHZpZXdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIExpc3RcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICB7LyogUGFydHMgR3JpZC9MaXN0ICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvNjAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgIHsvKiBORVc6IGZpbHRlciArIHNvcnQgdG9vbGJhciAqL31cbiAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi00IGZsZXggZmxleC1jb2wgZ2FwLTMgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtY2VudGVyIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNob3dpbmd7XCIgXCJ9XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTIwMCBmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubGVuZ3RofVxuICAgICAgICAgICAgICAgIDwvc3Bhbj57XCIgXCJ9XG4gICAgICAgICAgICAgICAgb2Z7XCIgXCJ9XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTIwMCBmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAge3BhcnRzLmxlbmd0aH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+e1wiIFwifVxuICAgICAgICAgICAgICAgIHBhcnRzXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC13cmFwIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGh0bWxGb3I9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBCcmFuZFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YnJhbmRGaWx0ZXJ9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0QnJhbmRGaWx0ZXIoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsbFwiPkFsbCBicmFuZHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAge2F2YWlsYWJsZUJyYW5kcy5tYXAoKGIpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17Yn0gdmFsdWU9e2J9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2J9XG4gICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGh0bWxGb3I9XCJzb3J0LWJ5XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgU29ydFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJzb3J0LWJ5XCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NvcnRCeX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHNldFNvcnRCeShlLnRhcmdldC52YWx1ZSBhcyBTb3J0T3B0aW9uKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC83MCB0ZXh0LXhzIHRleHQtemluYy0yMDAgcHgtMiBweS0xIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1hbWJlci00MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVsZXZhbmNlXCI+UmVsZXZhbmNlPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwcmljZS1hc2NcIj5QcmljZTogTG93IOKGkiBIaWdoPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwcmljZS1kZXNjXCI+UHJpY2U6IEhpZ2gg4oaSIExvdzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYnJhbmQtYXNjXCI+QnJhbmQ6IEEg4oaSIFo8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIExvYWRpbmcge2NhdGVnb3J5Lm5hbWUudG9Mb3dlckNhc2UoKX3igKZcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogZXJyb3IgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtcmVkLTQwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIHtlcnJvcn0g4oCUIGNoZWNrIHRoYXQgdGhlIEJhbGxpc3RpYyBBUEkgaXMgcnVubmluZy5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogZmlsdGVyZWRQYXJ0cy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICBObyBwYXJ0cyBhdmFpbGFibGUgZm9yIHRoaXMgY2F0ZWdvcnkgeWV0LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiB2aWV3TW9kZSA9PT0gXCJjYXJkXCIgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTMgbWQ6Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTNcIj5cbiAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiAoXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAga2V5PXtwYXJ0LmlkfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZ3JvdXAgcmVsYXRpdmUgYm9yZGVyIGJvcmRlci16aW5jLTcwMCByb3VuZGVkLW1kIHAtMyBiZy16aW5jLTkwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNDAwLzYwIGhvdmVyOmJnLWFtYmVyLTQwMC8xMCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAgZmxleCBmbGV4LWNvbFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgZ2FwLTIgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9e1wiIFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1ub3JtYWxcIj7igJQge3BhcnQubmFtZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXMgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LXhzIHRleHQtemluYy00MDAgbGluZS1jbGFtcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTMwMCB3aGl0ZXNwYWNlLW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICR7cGFydC5wcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0yIGZsZXggZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeUlkfS8ke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4LTEgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtODAwLzUwIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHRleHQtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICAgICAgaHJlZj17YC9ndW5idWlsZGVyP3NlbGVjdD0ke2NhdGVnb3J5SWR9OiR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXgtMSByb3VuZGVkLW1kIGJnLWFtYmVyLTQwMCB0ZXh0LWJsYWNrIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgaG92ZXI6YmctYW1iZXItMzAwIHRyYW5zaXRpb24tY29sb3JzIHRleHQtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIEFkZCB0byBCdWlsZFxuICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgey8qIE5FVzogaGVhZGVyIHJvdyBmb3IgbGlzdCB2aWV3ICovfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImhpZGRlbiBtZDpncmlkIGdyaWQtY29scy1bbWlubWF4KDAsM2ZyKV9taW5tYXgoMCwxZnIpX21pbm1heCgwLDFmcilfYXV0b10gZ2FwLTQgcHgtMyBwYi0yIHRleHQtWzAuN3JlbV0gdXBwZXJjYXNlIHRyYWNraW5nLVswLjE2ZW1dIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5QYXJ0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuPkJyYW5kPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtcmlnaHRcIj5QcmljZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXJpZ2h0IHByLTJcIj5BY3Rpb25zPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMlwiPlxuICAgICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLm1hcCgocGFydCkgPT4gKFxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBrZXk9e3BhcnQuaWR9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImdyb3VwIHJlbGF0aXZlIGJvcmRlciBib3JkZXItemluYy03MDAgcm91bmRlZC1tZCBwLTMgYmctemluYy05MDAvNTAgaG92ZXI6Ym9yZGVyLWFtYmVyLTQwMC82MCBob3ZlcjpiZy1hbWJlci00MDAvMTAgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG1kOmdyaWQgbWQ6Z3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBtZDppdGVtcy1jZW50ZXIgbWQ6Z2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBtaW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXI/c2VsZWN0PSR7Y2F0ZWdvcnlJZH06JHtwYXJ0LmlkfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJsb2NrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTQwMCBsaW5lLWNsYW1wLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgbWQ6dGV4dC1zbSB0ZXh0LXppbmMtNDAwIG1kOnRleHQtbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDAgbWQ6dGV4dC1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJ0LnByaWNlLnRvRml4ZWQoMil9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktZW5kIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeUlkfS8ke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtODAwLzUwIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC16aW5jLTMwMCBob3ZlcjpiZy16aW5jLTcwMCBob3Zlcjpib3JkZXItemluYy02MDAgdHJhbnNpdGlvbi1jb2xvcnMgd2hpdGVzcGFjZS1ub3dyYXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IERldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlcj9zZWxlY3Q9JHtjYXRlZ29yeUlkfToke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBiZy1hbWJlci00MDAgdGV4dC1ibGFjayBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgaG92ZXI6YmctYW1iZXItMzAwIHRyYW5zaXRpb24tY29sb3JzIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIHRvIEJ1aWxkXG4gICAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYWluPlxuICApO1xufSJdLCJuYW1lcyI6WyJ1c2VFZmZlY3QiLCJ1c2VNZW1vIiwidXNlU3RhdGUiLCJMaW5rIiwidXNlUGFyYW1zIiwiQ0FURUdPUklFUyIsInByb2Nlc3MiLCJBUElfQkFTRV9VUkwiLCJlbnYiLCJORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwiLCJDQVRFR09SWV9UT19QQVJUX1JPTEVTIiwidXBwZXIiLCJiYXJyZWwiLCJoYW5kZ3VhcmQiLCJjaGFyZ2luZ0hhbmRsZSIsImJ1ZmZlciIsImxvd2VyUGFydHMiLCJzaWdodHMiLCJDYXRlZ29yeVBhZ2UiLCJwYXJhbXMiLCJjYXRlZ29yeUlkIiwidmlld01vZGUiLCJzZXRWaWV3TW9kZSIsInBhcnRzIiwic2V0UGFydHMiLCJsb2FkaW5nIiwic2V0TG9hZGluZyIsImVycm9yIiwic2V0RXJyb3IiLCJicmFuZEZpbHRlciIsInNldEJyYW5kRmlsdGVyIiwic29ydEJ5Iiwic2V0U29ydEJ5IiwiY2F0ZWdvcnkiLCJmaW5kIiwiYyIsImlkIiwiY29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsImZldGNoQ2F0ZWdvcnlQYXJ0cyIsInJvbGVzIiwic2VhcmNoIiwiVVJMU2VhcmNoUGFyYW1zIiwic2V0IiwiZm9yRWFjaCIsInIiLCJhcHBlbmQiLCJ1cmwiLCJsZW5ndGgiLCJ0b1N0cmluZyIsInJlcyIsImZldGNoIiwic2lnbmFsIiwib2siLCJFcnJvciIsInN0YXR1cyIsImRhdGEiLCJqc29uIiwibm9ybWFsaXplZCIsIm1hcCIsInAiLCJuYW1lIiwiYnJhbmQiLCJwcmljZSIsImltYWdlVXJsIiwibWFpbkltYWdlVXJsIiwidW5kZWZpbmVkIiwiYnV5VXJsIiwibm90ZXMiLCJlcnIiLCJtZXNzYWdlIiwiYWJvcnQiLCJhdmFpbGFibGVCcmFuZHMiLCJBcnJheSIsImZyb20iLCJTZXQiLCJmaWx0ZXIiLCJCb29sZWFuIiwic29ydCIsImEiLCJiIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkUGFydHMiLCJyZXN1bHQiLCJtYWluIiwiY2xhc3NOYW1lIiwiZGl2IiwiaDEiLCJocmVmIiwiaGVhZGVyIiwic3BhbiIsInRvTG93ZXJDYXNlIiwiYnV0dG9uIiwidHlwZSIsIm9uQ2xpY2siLCJhcmlhLWxhYmVsIiwic2VjdGlvbiIsImxhYmVsIiwiaHRtbEZvciIsInNlbGVjdCIsInZhbHVlIiwib25DaGFuZ2UiLCJlIiwidGFyZ2V0Iiwib3B0aW9uIiwicGFydCIsInRvRml4ZWQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.96a4c04f3af3cc7f.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.96a4c04f3af3cc7f.hot-update.js new file mode 100644 index 0000000..3d9b719 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.96a4c04f3af3cc7f.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx": +/*!**********************************************!*\ + !*** ./app/gunbuilder/[categoryId]/page.tsx ***! + \**********************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ]\n};\nconst STORAGE_KEY = \"gunbuilder-build-state\";\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // NEW: filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n // NEW: build state for this page, synced with localStorage\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (false) {}\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : {};\n } catch (e) {\n return {};\n }\n });\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n var _CATEGORY_TO_PART_ROLES_categoryId;\n const roles = (_CATEGORY_TO_PART_ROLES_categoryId = CATEGORY_TO_PART_ROLES[categoryId]) !== null && _CATEGORY_TO_PART_ROLES_categoryId !== void 0 ? _CATEGORY_TO_PART_ROLES_categoryId : [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // NEW: persist build to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (false) {}\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n } catch (e) {\n // ignore\n }\n }, [\n build\n ]);\n // NEW: handler to toggle Add / Remove for this category\n const handleTogglePart = (categoryId, partId)=>{\n setBuild((prev)=>{\n const current = prev[categoryId];\n const updated = {\n ...prev\n };\n if (current === partId) {\n // remove from build\n delete updated[categoryId];\n } else {\n // set / replace part for this category\n updated[categoryId] = partId;\n }\n return updated;\n });\n };\n // NEW: available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // NEW: filtered + sorted parts\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 192,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 195,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 191,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 190,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 189,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 212,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 220,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 224,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 223,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 226,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 219,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 233,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 245,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 232,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 218,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 211,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 269,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 273,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 267,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 280,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 292,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 294,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 286,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 279,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 301,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 312,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low β†’ High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 313,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High β†’ Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 314,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A β†’ Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 315,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 304,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 300,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 278,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 266,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 323,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" β€” check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 327,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 331,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"β€” \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 348,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 346,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 351,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 345,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 356,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 344,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 361,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"flex-1 rounded-md px-3 py-2 text-xs font-semibold transition-colors text-center \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 367,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 360,\n columnNumber: 21\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 340,\n columnNumber: 19\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 335,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 387,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 388,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 389,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 390,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 386,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 404,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 408,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 403,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 413,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 416,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 420,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"rounded-md px-3 py-1.5 text-xs font-semibold transition-colors whitespace-nowrap \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 426,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 419,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 402,\n columnNumber: 23\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 398,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 393,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 263,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 209,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 208,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"EOPplz1dj3EmEofJvq2mRkmFMNM=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQ2U7QUFDUTtJQWlCbERNO0FBREYsTUFBTUMsZUFDSkQsQ0FBQUEsd0NBQUFBLE9BQU9BLENBQUNFLEdBQUcsQ0FBQ0Msd0JBQXdCLGNBQXBDSCxtREFBQUEsd0NBQXdDO0FBRTFDLE1BQU1JLHlCQUF1RDtJQUMzREMsT0FBTztRQUFDO0tBQWlCO0lBQ3pCQyxRQUFRO1FBQUM7S0FBUztJQUNsQkMsV0FBVztRQUFDO0tBQVk7SUFDeEJDLGdCQUFnQjtRQUFDO0tBQWtCO0lBQ25DQyxRQUFRO1FBQUM7S0FBYTtJQUN0QkMsWUFBWTtRQUFDO0tBQWtCO0lBQy9CQyxRQUFRO1FBQUM7S0FBUTtBQUNuQjtBQU9BLE1BQU1DLGNBQWM7QUFFTCxTQUFTQzs7SUFDdEIsTUFBTUMsU0FBU2hCLDBEQUFTQTtJQUN4QixNQUFNaUIsYUFBYUQsT0FBT0MsVUFBVTtJQUVwQyxNQUFNLENBQUNDLFVBQVVDLFlBQVksR0FBR3JCLCtDQUFRQSxDQUFXO0lBQ25ELE1BQU0sQ0FBQ3NCLE9BQU9DLFNBQVMsR0FBR3ZCLCtDQUFRQSxDQUFTLEVBQUU7SUFDN0MsTUFBTSxDQUFDd0IsU0FBU0MsV0FBVyxHQUFHekIsK0NBQVFBLENBQUM7SUFDdkMsTUFBTSxDQUFDMEIsT0FBT0MsU0FBUyxHQUFHM0IsK0NBQVFBLENBQWdCO0lBRWxELDJCQUEyQjtJQUMzQixNQUFNLENBQUM0QixhQUFhQyxlQUFlLEdBQUc3QiwrQ0FBUUEsQ0FBUztJQUN2RCxNQUFNLENBQUM4QixRQUFRQyxVQUFVLEdBQUcvQiwrQ0FBUUEsQ0FBYTtJQUVqRCwyREFBMkQ7SUFDM0QsTUFBTSxDQUFDZ0MsT0FBT0MsU0FBUyxHQUFHakMsK0NBQVFBLENBQWE7UUFDN0MsSUFBSSxLQUE2QixFQUFFLEVBQVU7UUFDN0MsSUFBSTtZQUNGLE1BQU1r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Ozs7OzswRUFHRCw4REFBQ087Z0VBQ0NDLE1BQUs7Z0VBQ0xDLFNBQVMsSUFDUDNCLGlCQUFpQjlELFlBQVlvRyxLQUFLNUUsRUFBRTtnRUFFdEN3RCxXQUFXLG9GQUlWLE9BSENxQixhQUNJLHVFQUNBOzBFQUdMQSxhQUFhLHNCQUFzQjs7Ozs7Ozs7Ozs7Ozs7Ozs7OzJDQXRDckNELEtBQUs1RSxFQUFFOzs7OztvQ0E0Q2xCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUWhCO0dBelp3QjFCOztRQUNQZixzREFBU0E7OztLQURGZSIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9hcHAvZ3VuYnVpbGRlci9bY2F0ZWdvcnlJZF0vcGFnZS50c3g/OGI1ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHsgdXNlUGFyYW1zIH0gZnJvbSBcIm5leHQvbmF2aWdhdGlvblwiO1xuaW1wb3J0IHsgQ0FURUdPUklFUyB9IGZyb20gXCJAL2RhdGEvZ3VuYnVpbGRlclBhcnRzXCI7XG5pbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQsIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbnR5cGUgVmlld01vZGUgPSBcImNhcmRcIiB8IFwibGlzdFwiO1xuXG50eXBlIEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaSA9IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBicmFuZDogc3RyaW5nO1xuICBwbGF0Zm9ybTogc3RyaW5nO1xuICBwYXJ0Um9sZTogc3RyaW5nO1xuICBwcmljZTogbnVtYmVyIHwgbnVsbDtcbiAgbWFpbkltYWdlVXJsOiBzdHJpbmcgfCBudWxsO1xuICBidXlVcmw6IHN0cmluZyB8IG51bGw7XG59O1xuXG5jb25zdCBBUElfQkFTRV9VUkwgPVxuICBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwgPz8gXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIjtcblxuY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgdXBwZXI6IFtcInVwcGVyLXJlY2VpdmVyXCJdLFxuICBiYXJyZWw6IFtcImJhcnJlbFwiXSxcbiAgaGFuZGd1YXJkOiBbXCJoYW5kZ3VhcmRcIl0sXG4gIGNoYXJnaW5nSGFuZGxlOiBbXCJjaGFyZ2luZy1oYW5kbGVcIl0sXG4gIGJ1ZmZlcjogW1wiYnVmZmVyLWtpdFwiXSxcbiAgbG93ZXJQYXJ0czogW1wibG93ZXItcGFydHMta2l0XCJdLFxuICBzaWdodHM6IFtcInNpZ2h0XCJdLFxufTtcblxuLy8gTkVXOiBzb3J0IG9wdGlvbnNcbnR5cGUgU29ydE9wdGlvbiA9IFwicmVsZXZhbmNlXCIgfCBcInByaWNlLWFzY1wiIHwgXCJwcmljZS1kZXNjXCIgfCBcImJyYW5kLWFzY1wiO1xuXG4vLyBORVc6IGJ1aWxkIHN0YXRlIHR5cGUgKyBzdG9yYWdlIGtleSAobWF0Y2hlcyAvZ3VuYnVpbGRlcilcbnR5cGUgQnVpbGRTdGF0ZSA9IFBhcnRpYWw8UmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZz4+O1xuY29uc3QgU1RPUkFHRV9LRVkgPSBcImd1bmJ1aWxkZXItYnVpbGQtc3RhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ2F0ZWdvcnlQYWdlKCkge1xuICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXMoKTtcbiAgY29uc3QgY2F0ZWdvcnlJZCA9IHBhcmFtcy5jYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG5cbiAgY29uc3QgW3ZpZXdNb2RlLCBzZXRWaWV3TW9kZV0gPSB1c2VTdGF0ZTxWaWV3TW9kZT4oXCJsaXN0XCIpO1xuICBjb25zdCBbcGFydHMsIHNldFBhcnRzXSA9IHVzZVN0YXRlPFBhcnRbXT4oW10pO1xuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBORVc6IGZpbHRlciArIHNvcnQgc3RhdGVcbiAgY29uc3QgW2JyYW5kRmlsdGVyLCBzZXRCcmFuZEZpbHRlcl0gPSB1c2VTdGF0ZTxzdHJpbmc+KFwiYWxsXCIpO1xuICBjb25zdCBbc29ydEJ5LCBzZXRTb3J0QnldID0gdXNlU3RhdGU8U29ydE9wdGlvbj4oXCJyZWxldmFuY2VcIik7XG5cbiAgLy8gTkVXOiBidWlsZCBzdGF0ZSBmb3IgdGhpcyBwYWdlLCBzeW5jZWQgd2l0aCBsb2NhbFN0b3JhZ2VcbiAgY29uc3QgW2J1aWxkLCBzZXRCdWlsZF0gPSB1c2VTdGF0ZTxCdWlsZFN0YXRlPigoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiB7fTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgIHJldHVybiBzdG9yZWQgPyAoSlNPTi5wYXJzZShzdG9yZWQpIGFzIEJ1aWxkU3RhdGUpIDoge307XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBjYXRlZ29yeSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gQ0FURUdPUklFUy5maW5kKChjKSA9PiBjLmlkID09PSBjYXRlZ29yeUlkKSxcbiAgICBbY2F0ZWdvcnlJZF0sXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNhdGVnb3J5SWQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaENhdGVnb3J5UGFydHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgICAgICBzZXRFcnJvcihudWxsKTtcblxuICAgICAgICBjb25zdCByb2xlcyA9IENBVEVHT1JZX1RPX1BBUlRfUk9MRVNbY2F0ZWdvcnlJZF0gPz8gW107XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICBzZWFyY2guc2V0KFwicGxhdGZvcm1cIiwgXCJBUi0xNVwiKTtcbiAgICAgICAgcm9sZXMuZm9yRWFjaCgocikgPT4gc2VhcmNoLmFwcGVuZChcInBhcnRSb2xlc1wiLCByKSk7XG5cbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJX0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvZ3VuYnVpbGRlciR7XG4gICAgICAgICAgcm9sZXMubGVuZ3RoID8gYD8ke3NlYXJjaC50b1N0cmluZygpfWAgOiBcIlwiXG4gICAgICAgIH1gO1xuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pO1xuXG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBwcm9kdWN0cyAoJHtyZXMuc3RhdHVzfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGE6IEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaVtdID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgICBjb25zdCBub3JtYWxpemVkOiBQYXJ0W10gPSBkYXRhLm1hcCgocCkgPT4gKHtcbiAgICAgICAgICBpZDogcC5pZCxcbiAgICAgICAgICBjYXRlZ29yeUlkLFxuICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICBicmFuZDogcC5icmFuZCxcbiAgICAgICAgICBwcmljZTogcC5wcmljZSA/PyAwLFxuICAgICAgICAgIGltYWdlVXJsOiBwLm1haW5JbWFnZVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgdXJsOiBwLmJ1eVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgbm90ZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHNldFBhcnRzKG5vcm1hbGl6ZWQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuO1xuICAgICAgICBzZXRFcnJvcihlcnIubWVzc2FnZSA/PyBcIkZhaWxlZCB0byBsb2FkIHByb2R1Y3RzXCIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hDYXRlZ29yeVBhcnRzKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuICB9LCBbY2F0ZWdvcnlJZF0pO1xuXG4gIC8vIE5FVzogcGVyc2lzdCBidWlsZCB0byBsb2NhbFN0b3JhZ2Ugd2hlbmV2ZXIgaXQgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkoYnVpbGQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfSwgW2J1aWxkXSk7XG5cbiAgLy8gTkVXOiBoYW5kbGVyIHRvIHRvZ2dsZSBBZGQgLyBSZW1vdmUgZm9yIHRoaXMgY2F0ZWdvcnlcbiAgY29uc3QgaGFuZGxlVG9nZ2xlUGFydCA9IChjYXRlZ29yeUlkOiBDYXRlZ29yeUlkLCBwYXJ0SWQ6IHN0cmluZykgPT4ge1xuICAgIHNldEJ1aWxkKChwcmV2KSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gcHJldltjYXRlZ29yeUlkXTtcbiAgICAgIGNvbnN0IHVwZGF0ZWQ6IEJ1aWxkU3RhdGUgPSB7IC4uLnByZXYgfTtcblxuICAgICAgaWYgKGN1cnJlbnQgPT09IHBhcnRJZCkge1xuICAgICAgICAvLyByZW1vdmUgZnJvbSBidWlsZFxuICAgICAgICBkZWxldGUgdXBkYXRlZFtjYXRlZ29yeUlkXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNldCAvIHJlcGxhY2UgcGFydCBmb3IgdGhpcyBjYXRlZ29yeVxuICAgICAgICB1cGRhdGVkW2NhdGVnb3J5SWRdID0gcGFydElkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gTkVXOiBhdmFpbGFibGUgYnJhbmRzIGZvciBmaWx0ZXJcbiAgY29uc3QgYXZhaWxhYmxlQnJhbmRzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgQXJyYXkuZnJvbShuZXcgU2V0KHBhcnRzLm1hcCgocCkgPT4gcC5icmFuZCkpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpLFxuICAgIFtwYXJ0c10sXG4gICk7XG5cbiAgLy8gTkVXOiBmaWx0ZXJlZCArIHNvcnRlZCBwYXJ0c1xuICBjb25zdCBmaWx0ZXJlZFBhcnRzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgbGV0IHJlc3VsdCA9IFsuLi5wYXJ0c107XG5cbiAgICBpZiAoYnJhbmRGaWx0ZXIgIT09IFwiYWxsXCIpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoKHApID0+IHAuYnJhbmQgPT09IGJyYW5kRmlsdGVyKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHNvcnRCeSkge1xuICAgICAgY2FzZSBcInByaWNlLWFzY1wiOlxuICAgICAgICByZXN1bHQuc29ydCgoYSwgYikgPT4gYS5wcmljZSAtIGIucHJpY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJwcmljZS1kZXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBiLnByaWNlIC0gYS5wcmljZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImJyYW5kLWFzY1wiOlxuICAgICAgICByZXN1bHQuc29ydCgoYSwgYikgPT4gYS5icmFuZC5sb2NhbGVDb21wYXJlKGIuYnJhbmQpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicmVsZXZhbmNlXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBsZWF2ZSBpbiBiYWNrZW5kIG9yZGVyXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIFtwYXJ0cywgYnJhbmRGaWx0ZXIsIHNvcnRCeV0pO1xuXG4gIGlmICghY2F0ZWdvcnkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LWF1dG8gbWF4LXctNnhsIHB4LTQgcHktNiBsZzpweS0xMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LXNlbWlib2xkIHRleHQtemluYy01MCBtYi00XCI+XG4gICAgICAgICAgICAgIENhdGVnb3J5IE5vdCBGb3VuZFxuICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtYW1iZXItMzAwIGhvdmVyOnRleHQtYW1iZXItMjAwIHVuZGVybGluZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIFJldHVybiB0byBHdW5idWlsZGVyXG4gICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9tYWluPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxtYWluIGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1ibGFjayB0ZXh0LXppbmMtNTBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgIHsvKiBIZWFkZXIgKi99XG4gICAgICAgIDxoZWFkZXIgY2xhc3NOYW1lPVwibWItNlwiPlxuICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICBocmVmPVwiL2d1bmJ1aWxkZXJcIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDAgbWItNCBpbmxpbmUtYmxvY2tcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIOKGkCBCYWNrIHRvIEd1bmJ1aWxkZXJcbiAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlbiBnYXAtNFwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRyYWNraW5nLVswLjJlbV0gdXBwZXJjYXNlIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBTaGFkb3cgU3RhbmRhcmRcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LTJ4bCBtZDp0ZXh0LTN4bCBmb250LXNlbWlib2xkIHRyYWNraW5nLXRpZ2h0XCI+XG4gICAgICAgICAgICAgICAge2NhdGVnb3J5Lm5hbWV9IDxzcGFuIGNsYXNzTmFtZT1cInRleHQtYW1iZXItMzAwXCI+UGFydHM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTIgdGV4dC1zbSB0ZXh0LXppbmMtNDAwIG1heC13LXhsXCI+XG4gICAgICAgICAgICAgICAgQnJvd3NlIGFsbCBhdmFpbGFibGUge2NhdGVnb3J5Lm5hbWUudG9Mb3dlckNhc2UoKX0gb3B0aW9ucyBmb3JcbiAgICAgICAgICAgICAgICB5b3VyIGJ1aWxkLCBwdWxsZWQgbGl2ZSBmcm9tIHlvdXIgQmFsbGlzdGljIGJhY2tlbmQuXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiBwYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGdhcC0yIGJvcmRlciBib3JkZXItemluYy04MDAgcm91bmRlZC1tZCBwLTEgYmctemluYy05NTAvNjBcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFZpZXdNb2RlKFwiY2FyZFwiKX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gcm91bmRlZCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgICB2aWV3TW9kZSA9PT0gXCJjYXJkXCJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTUwXCJcbiAgICAgICAgICAgICAgICAgICAgICA6IFwidGV4dC16aW5jLTQwMCBob3Zlcjp0ZXh0LXppbmMtMzAwXCJcbiAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNhcmQgdmlld1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQ2FyZFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJsaXN0XCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImxpc3RcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiTGlzdCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBMaXN0XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9oZWFkZXI+XG5cbiAgICAgICAgey8qIFBhcnRzIEdyaWQvTGlzdCAqL31cbiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwicm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzYwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICB7LyogRmlsdGVyICsgc29ydCB0b29sYmFyICovfVxuICAgICAgICAgIHshbG9hZGluZyAmJiAhZXJyb3IgJiYgcGFydHMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTQgZmxleCBmbGV4LWNvbCBnYXAtMyBtZDpmbGV4LXJvdyBtZDppdGVtcy1jZW50ZXIgbWQ6anVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgU2hvd2luZ3tcIiBcIn1cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXppbmMtMjAwIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICB7ZmlsdGVyZWRQYXJ0cy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgPC9zcGFuPntcIiBcIn1cbiAgICAgICAgICAgICAgICBvZntcIiBcIn1cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXppbmMtMjAwIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICB7cGFydHMubGVuZ3RofVxuICAgICAgICAgICAgICAgIDwvc3Bhbj57XCIgXCJ9XG4gICAgICAgICAgICAgICAgcGFydHNcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgaHRtbEZvcj1cImJyYW5kLWZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEJyYW5kXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBpZD1cImJyYW5kLWZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXticmFuZEZpbHRlcn1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRCcmFuZEZpbHRlcihlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC83MCB0ZXh0LXhzIHRleHQtemluYy0yMDAgcHgtMiBweS0xIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1hbWJlci00MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYWxsXCI+QWxsIGJyYW5kczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICB7YXZhaWxhYmxlQnJhbmRzLm1hcCgoYikgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ga2V5PXtifSB2YWx1ZT17Yn0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7Yn1cbiAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgaHRtbEZvcj1cInNvcnQtYnlcIiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgU29ydFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJzb3J0LWJ5XCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NvcnRCeX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHNldFNvcnRCeShlLnRhcmdldC52YWx1ZSBhcyBTb3J0T3B0aW9uKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC83MCB0ZXh0LXhzIHRleHQtemluYy0yMDAgcHgtMiBweS0xIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1hbWJlci00MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVsZXZhbmNlXCI+UmVsZXZhbmNlPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwcmljZS1hc2NcIj5QcmljZTogTG93IOKGkiBIaWdoPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwcmljZS1kZXNjXCI+UHJpY2U6IEhpZ2gg4oaSIExvdzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYnJhbmQtYXNjXCI+QnJhbmQ6IEEg4oaSIFo8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIExvYWRpbmcge2NhdGVnb3J5Lm5hbWUudG9Mb3dlckNhc2UoKX3igKZcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogZXJyb3IgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtcmVkLTQwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIHtlcnJvcn0g4oCUIGNoZWNrIHRoYXQgdGhlIEJhbGxpc3RpYyBBUEkgaXMgcnVubmluZy5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogZmlsdGVyZWRQYXJ0cy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICBObyBwYXJ0cyBhdmFpbGFibGUgZm9yIHRoaXMgY2F0ZWdvcnkgeWV0LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiB2aWV3TW9kZSA9PT0gXCJjYXJkXCIgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTMgbWQ6Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTNcIj5cbiAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGJ1aWxkW2NhdGVnb3J5SWRdID09PSBwYXJ0LmlkO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAga2V5PXtwYXJ0LmlkfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJncm91cCByZWxhdGl2ZSBib3JkZXIgYm9yZGVyLXppbmMtNzAwIHJvdW5kZWQtbWQgcC0zIGJnLXppbmMtOTAwLzUwIGhvdmVyOmJvcmRlci1hbWJlci00MDAvNjAgaG92ZXI6YmctYW1iZXItNDAwLzEwIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCBmbGV4IGZsZXgtY29sXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgZ2FwLTIgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9e1wiIFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW5vcm1hbFwiPuKAlCB7cGFydC5uYW1lfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXMgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTQwMCBsaW5lLWNsYW1wLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3Rlc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTMwMCB3aGl0ZXNwYWNlLW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJ0LnByaWNlLnRvRml4ZWQoMil9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTIgZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeUlkfS8ke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXgtMSByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy04MDAvNTAgcHgtMyBweS0yIHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC16aW5jLTMwMCBob3ZlcjpiZy16aW5jLTcwMCBob3Zlcjpib3JkZXItemluYy02MDAgdHJhbnNpdGlvbi1jb2xvcnMgdGV4dC1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZVRvZ2dsZVBhcnQoY2F0ZWdvcnlJZCwgcGFydC5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BmbGV4LTEgcm91bmRlZC1tZCBweC0zIHB5LTIgdGV4dC14cyBmb250LXNlbWlib2xkIHRyYW5zaXRpb24tY29sb3JzIHRleHQtY2VudGVyICR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTEwMCBib3JkZXIgYm9yZGVyLXppbmMtNjAwIGhvdmVyOmJnLXppbmMtNzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiYmctYW1iZXItNDAwIHRleHQtYmxhY2sgaG92ZXI6YmctYW1iZXItMzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtpc1NlbGVjdGVkID8gXCJSZW1vdmUgZnJvbSBCdWlsZFwiIDogXCJBZGQgdG8gQnVpbGRcIn1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICB7LyogSGVhZGVyIHJvdyBmb3IgbGlzdCB2aWV3ICovfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImhpZGRlbiBtZDpncmlkIGdyaWQtY29scy1bbWlubWF4KDAsM2ZyKV9taW5tYXgoMCwxZnIpX21pbm1heCgwLDFmcilfYXV0b10gZ2FwLTQgcHgtMyBwYi0yIHRleHQtWzAuN3JlbV0gdXBwZXJjYXNlIHRyYWNraW5nLVswLjE2ZW1dIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5QYXJ0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuPkJyYW5kPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtcmlnaHRcIj5QcmljZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXJpZ2h0IHByLTJcIj5BY3Rpb25zPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMlwiPlxuICAgICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGJ1aWxkW2NhdGVnb3J5SWRdID09PSBwYXJ0LmlkO1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAga2V5PXtwYXJ0LmlkfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImdyb3VwIHJlbGF0aXZlIGJvcmRlciBib3JkZXItemluYy03MDAgcm91bmRlZC1tZCBwLTMgYmctemluYy05MDAvNTAgaG92ZXI6Ym9yZGVyLWFtYmVyLTQwMC82MCBob3ZlcjpiZy1hbWJlci00MDAvMTAgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMiBtZDpncmlkIG1kOmdyaWQtY29scy1bbWlubWF4KDAsM2ZyKV9taW5tYXgoMCwxZnIpX21pbm1heCgwLDFmcilfYXV0b10gbWQ6aXRlbXMtY2VudGVyIG1kOmdhcC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBtaW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3RlcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LXhzIHRleHQtemluYy00MDAgbGluZS1jbGFtcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3Rlc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyBtZDp0ZXh0LXNtIHRleHQtemluYy00MDAgbWQ6dGV4dC1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0LmJyYW5kfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTMwMCBtZDp0ZXh0LXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICR7cGFydC5wcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1lbmQgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeUlkfS8ke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy04MDAvNTAgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtNzAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB3aGl0ZXNwYWNlLW5vd3JhcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IERldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRvZ2dsZVBhcnQoY2F0ZWdvcnlJZCwgcGFydC5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcm91bmRlZC1tZCBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhbnNpdGlvbi1jb2xvcnMgd2hpdGVzcGFjZS1ub3dyYXAgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy0xMDAgYm9yZGVyIGJvcmRlci16aW5jLTYwMCBob3ZlcjpiZy16aW5jLTcwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJiZy1hbWJlci00MDAgdGV4dC1ibGFjayBob3ZlcjpiZy1hbWJlci0zMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2lzU2VsZWN0ZWQgPyBcIlJlbW92ZSBmcm9tIEJ1aWxkXCIgOiBcIkFkZCB0byBCdWlsZFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYWluPlxuICApO1xufSJdLCJuYW1lcyI6WyJ1c2VFZmZlY3QiLCJ1c2VNZW1vIiwidXNlU3RhdGUiLCJMaW5rIiwidXNlUGFyYW1zIiwiQ0FURUdPUklFUyIsInByb2Nlc3MiLCJBUElfQkFTRV9VUkwiLCJlbnYiLCJORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwiLCJDQVRFR09SWV9UT19QQVJUX1JPTEVTIiwidXBwZXIiLCJiYXJyZWwiLCJoYW5kZ3VhcmQiLCJjaGFyZ2luZ0hhbmRsZSIsImJ1ZmZlciIsImxvd2VyUGFydHMiLCJzaWdodHMiLCJTVE9SQUdFX0tFWSIsIkNhdGVnb3J5UGFnZSIsInBhcmFtcyIsImNhdGVnb3J5SWQiLCJ2aWV3TW9kZSIsInNldFZpZXdNb2RlIiwicGFydHMiLCJzZXRQYXJ0cyIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsImJyYW5kRmlsdGVyIiwic2V0QnJhbmRGaWx0ZXIiLCJzb3J0QnkiLCJzZXRTb3J0QnkiLCJidWlsZCIsInNldEJ1aWxkIiwic3RvcmVkIiwid2luZG93IiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsIkpTT04iLCJwYXJzZSIsImNhdGVnb3J5IiwiZmluZCIsImMiLCJpZCIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJmZXRjaENhdGVnb3J5UGFydHMiLCJyb2xlcyIsInNlYXJjaCIsIlVSTFNlYXJjaFBhcmFtcyIsInNldCIsImZvckVhY2giLCJyIiwiYXBwZW5kIiwidXJsIiwibGVuZ3RoIiwidG9TdHJpbmciLCJyZXMiLCJmZXRjaCIsInNpZ25hbCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsIm5vcm1hbGl6ZWQiLCJtYXAiLCJwIiwibmFtZSIsImJyYW5kIiwicHJpY2UiLCJpbWFnZVVybCIsIm1haW5JbWFnZVVybCIsInVuZGVmaW5lZCIsImJ1eVVybCIsIm5vdGVzIiwiZXJyIiwibWVzc2FnZSIsImFib3J0Iiwic2V0SXRlbSIsInN0cmluZ2lmeSIsImhhbmRsZVRvZ2dsZVBhcnQiLCJwYXJ0SWQiLCJwcmV2IiwiY3VycmVudCIsInVwZGF0ZWQiLCJhdmFpbGFibGVCcmFuZHMiLCJBcnJheSIsImZyb20iLCJTZXQiLCJmaWx0ZXIiLCJCb29sZWFuIiwic29ydCIsImEiLCJiIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkUGFydHMiLCJyZXN1bHQiLCJtYWluIiwiY2xhc3NOYW1lIiwiZGl2IiwiaDEiLCJocmVmIiwiaGVhZGVyIiwic3BhbiIsInRvTG93ZXJDYXNlIiwiYnV0dG9uIiwidHlwZSIsIm9uQ2xpY2siLCJhcmlhLWxhYmVsIiwic2VjdGlvbiIsImxhYmVsIiwiaHRtbEZvciIsInNlbGVjdCIsInZhbHVlIiwib25DaGFuZ2UiLCJlIiwidGFyZ2V0Iiwib3B0aW9uIiwicGFydCIsImlzU2VsZWN0ZWQiLCJ0b0ZpeGVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.a73da2d4cd917396.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.a73da2d4cd917396.hot-update.js new file mode 100644 index 0000000..3419aac --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.a73da2d4cd917396.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx": +/*!**********************************************!*\ + !*** ./app/gunbuilder/[categoryId]/page.tsx ***! + \**********************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ]\n};\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // NEW: filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n var _CATEGORY_TO_PART_ROLES_categoryId;\n const roles = (_CATEGORY_TO_PART_ROLES_categoryId = CATEGORY_TO_PART_ROLES[categoryId]) !== null && _CATEGORY_TO_PART_ROLES_categoryId !== void 0 ? _CATEGORY_TO_PART_ROLES_categoryId : [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // NEW: available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // NEW: filtered + sorted parts\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 149,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 152,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 148,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 147,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 146,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 169,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 177,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 181,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 180,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 183,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 176,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 190,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 202,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 189,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 175,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 168,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 226,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 230,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 224,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 237,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 249,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 251,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 243,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 236,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 258,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 272,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low β†’ High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 273,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High β†’ Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 274,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A β†’ Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 275,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 264,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 257,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 235,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 223,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 283,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" β€” check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 287,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 291,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder?select=\".concat(categoryId, \":\").concat(part.id),\n className: \"flex-1\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"β€” \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 309,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 307,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 312,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 306,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 317,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 305,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 301,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"w-full rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 322,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"absolute inset-0 rounded-md bg-amber-400/10 opacity-0 group-hover:opacity-100 transition-opacity duration-200 pointer-events-none flex items-center justify-center\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-200 tracking-wide\",\n children: \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 329,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 328,\n columnNumber: 19\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 297,\n columnNumber: 17\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 295,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 340,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 341,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 342,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"View\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 343,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 339,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder?select=\".concat(categoryId, \":\").concat(part.id),\n className: \"block\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 358,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 362,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 354,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 353,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 368,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 371,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 375,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 374,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 352,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"absolute inset-0 rounded-md bg-amber-400/10 opacity-0 group-hover:opacity-100 transition-opacity duration-200 pointer-events-none flex items-center justify-center\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-200 tracking-wide\",\n children: \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 384,\n columnNumber: 23\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 383,\n columnNumber: 21\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 348,\n columnNumber: 19\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 346,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 220,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 166,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 165,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"TCzyDO/Rdq+dZXo2cWnlf+kd3uc=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQ2U7QUFDUTtJQWlCbERNO0FBREYsTUFBTUMsZUFDSkQsQ0FBQUEsd0NBQUFBLE9BQU9BLENBQUNFLEdBQUcsQ0FBQ0Msd0JBQXdCLGNBQXBDSCxtREFBQUEsd0NBQXdDO0FBRTFDLE1BQU1JLHlCQUF1RDtJQUMzREMsT0FBTztRQUFDO0tBQWlCO0lBQ3pCQyxRQUFRO1FBQUM7S0FBUztJQUNsQkMsV0FBVztRQUFDO0tBQVk7SUFDeEJDLGdCQUFnQjtRQUFDO0tBQWtCO0lBQ25DQyxRQUFRO1FBQUM7S0FBYTtJQUN0QkMsWUFBWTtRQUFDO0tBQWtCO0lBQy9CQyxRQUFRO1FBQUM7S0FBUTtBQUNuQjtBQUtlLFNBQVNDOztJQUN0QixNQUFNQyxTQUFTZiwwREFBU0E7SUFDeEIsTUFBTWdCLGFBQWFELE9BQU9DLFVBQVU7SUFDcEMsTUFBTSxDQUFDQyxVQUFVQyxZQUFZLEdBQUdwQiwrQ0FBUUEsQ0FBVztJQUNuRCxNQUFNLENBQUNxQixPQUFPQyxTQUFTLEdBQUd0QiwrQ0FBUUEsQ0FBUyxFQUFFO0lBQzdDLE1BQU0sQ0FBQ3VCLFNBQVNDLFdBQVcsR0FBR3hCLCtDQUFRQSxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQ3lCLE9BQU9DLFNBQVMsR0FBRzFCLCtDQUFRQSxDQUFnQjtJQUVsRCwyQkFBMkI7SUFDM0IsTUFBTSxDQUFDMkIsYUFBYUMsZUFBZSxHQUFHNUIsK0NBQVFBLENBQVM7SUFDdkQsTUFBTSxDQUFDNkIsUUFBUUMsVUFBVSxHQUFHOUIsK0NBQVFBLENBQWE7SUFFakQsTUFBTStCLFdBQVdoQyw4Q0FBT0EsQ0FDdEIsSUFBTUksNkRBQVVBLENBQUM2QixJQUFJLENBQUMsQ0FBQ0MsSUFBTUEsRUFBRUMsRUFBRSxLQUFLaEIsYUFDdEM7UUFBQ0E7S0FBVztJQUdkcEIsZ0RBQVNBLENB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TyxDQUFDOzs7Ozs7O3NFQUV2Qiw4REFBQ3BCOzREQUFJRCxXQUFVO3NFQUNiLDRFQUFDbEYsaURBQUlBO2dFQUNIcUYsTUFBTSxlQUE2QmlCLE9BQWRyRixZQUFXLEtBQVcsT0FBUnFGLEtBQUtyRSxFQUFFO2dFQUMxQ2lELFdBQVU7MEVBQ1g7Ozs7Ozs7Ozs7Ozs7Ozs7OzhEQUtMLDhEQUFDQztvREFBSUQsV0FBVTs4REFDYiw0RUFBQ0M7d0RBQUlELFdBQVU7a0VBQXFEOzs7Ozs7Ozs7Ozs7MkNBbkNqRW9CLEtBQUtyRSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdEaEM7R0F2V3dCbEI7O1FBQ1BkLHNEQUFTQTs7O0tBREZjIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeD84YjVkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgTGluayBmcm9tIFwibmV4dC9saW5rXCI7XG5pbXBvcnQgeyB1c2VQYXJhbXMgfSBmcm9tIFwibmV4dC9uYXZpZ2F0aW9uXCI7XG5pbXBvcnQgeyBDQVRFR09SSUVTIH0gZnJvbSBcIkAvZGF0YS9ndW5idWlsZGVyUGFydHNcIjtcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcnlJZCwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxudHlwZSBWaWV3TW9kZSA9IFwiY2FyZFwiIHwgXCJsaXN0XCI7XG5cbnR5cGUgR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpID0ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGJyYW5kOiBzdHJpbmc7XG4gIHBsYXRmb3JtOiBzdHJpbmc7XG4gIHBhcnRSb2xlOiBzdHJpbmc7XG4gIHByaWNlOiBudW1iZXIgfCBudWxsO1xuICBtYWluSW1hZ2VVcmw6IHN0cmluZyB8IG51bGw7XG4gIGJ1eVVybDogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9XG4gIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCA/PyBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiO1xuXG5jb25zdCBDQVRFR09SWV9UT19QQVJUX1JPTEVTOiBSZWNvcmQ8Q2F0ZWdvcnlJZCwgc3RyaW5nW10+ID0ge1xuICB1cHBlcjogW1widXBwZXItcmVjZWl2ZXJcIl0sXG4gIGJhcnJlbDogW1wiYmFycmVsXCJdLFxuICBoYW5kZ3VhcmQ6IFtcImhhbmRndWFyZFwiXSxcbiAgY2hhcmdpbmdIYW5kbGU6IFtcImNoYXJnaW5nLWhhbmRsZVwiXSxcbiAgYnVmZmVyOiBbXCJidWZmZXIta2l0XCJdLFxuICBsb3dlclBhcnRzOiBbXCJsb3dlci1wYXJ0cy1raXRcIl0sXG4gIHNpZ2h0czogW1wic2lnaHRcIl0sXG59O1xuXG4vLyBORVc6IHNvcnQgb3B0aW9uc1xudHlwZSBTb3J0T3B0aW9uID0gXCJyZWxldmFuY2VcIiB8IFwicHJpY2UtYXNjXCIgfCBcInByaWNlLWRlc2NcIiB8IFwiYnJhbmQtYXNjXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENhdGVnb3J5UGFnZSgpIHtcbiAgY29uc3QgcGFyYW1zID0gdXNlUGFyYW1zKCk7XG4gIGNvbnN0IGNhdGVnb3J5SWQgPSBwYXJhbXMuY2F0ZWdvcnlJZCBhcyBDYXRlZ29yeUlkO1xuICBjb25zdCBbdmlld01vZGUsIHNldFZpZXdNb2RlXSA9IHVzZVN0YXRlPFZpZXdNb2RlPihcImxpc3RcIik7XG4gIGNvbnN0IFtwYXJ0cywgc2V0UGFydHNdID0gdXNlU3RhdGU8UGFydFtdPihbXSk7XG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpO1xuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIE5FVzogZmlsdGVyICsgc29ydCBzdGF0ZVxuICBjb25zdCBbYnJhbmRGaWx0ZXIsIHNldEJyYW5kRmlsdGVyXSA9IHVzZVN0YXRlPHN0cmluZz4oXCJhbGxcIik7XG4gIGNvbnN0IFtzb3J0QnksIHNldFNvcnRCeV0gPSB1c2VTdGF0ZTxTb3J0T3B0aW9uPihcInJlbGV2YW5jZVwiKTtcblxuICBjb25zdCBjYXRlZ29yeSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gQ0FURUdPUklFUy5maW5kKChjKSA9PiBjLmlkID09PSBjYXRlZ29yeUlkKSxcbiAgICBbY2F0ZWdvcnlJZF0sXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNhdGVnb3J5SWQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaENhdGVnb3J5UGFydHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgICAgICBzZXRFcnJvcihudWxsKTtcblxuICAgICAgICBjb25zdCByb2xlcyA9IENBVEVHT1JZX1RPX1BBUlRfUk9MRVNbY2F0ZWdvcnlJZF0gPz8gW107XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICBzZWFyY2guc2V0KFwicGxhdGZvcm1cIiwgXCJBUi0xNVwiKTtcbiAgICAgICAgcm9sZXMuZm9yRWFjaCgocikgPT4gc2VhcmNoLmFwcGVuZChcInBhcnRSb2xlc1wiLCByKSk7XG5cbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJX0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvZ3VuYnVpbGRlciR7XG4gICAgICAgICAgcm9sZXMubGVuZ3RoID8gYD8ke3NlYXJjaC50b1N0cmluZygpfWAgOiBcIlwiXG4gICAgICAgIH1gO1xuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pO1xuXG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBwcm9kdWN0cyAoJHtyZXMuc3RhdHVzfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGE6IEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaVtdID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgICBjb25zdCBub3JtYWxpemVkOiBQYXJ0W10gPSBkYXRhLm1hcCgocCkgPT4gKHtcbiAgICAgICAgICBpZDogcC5pZCxcbiAgICAgICAgICBjYXRlZ29yeUlkLFxuICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICBicmFuZDogcC5icmFuZCxcbiAgICAgICAgICBwcmljZTogcC5wcmljZSA/PyAwLFxuICAgICAgICAgIGltYWdlVXJsOiBwLm1haW5JbWFnZVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgdXJsOiBwLmJ1eVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgbm90ZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHNldFBhcnRzKG5vcm1hbGl6ZWQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuO1xuICAgICAgICBzZXRFcnJvcihlcnIubWVzc2FnZSA/PyBcIkZhaWxlZCB0byBsb2FkIHByb2R1Y3RzXCIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hDYXRlZ29yeVBhcnRzKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuICB9LCBbY2F0ZWdvcnlJZF0pO1xuXG4gIC8vIE5FVzogYXZhaWxhYmxlIGJyYW5kcyBmb3IgZmlsdGVyXG4gIGNvbnN0IGF2YWlsYWJsZUJyYW5kcyA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIEFycmF5LmZyb20obmV3IFNldChwYXJ0cy5tYXAoKHApID0+IHAuYnJhbmQpKSlcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSxcbiAgICBbcGFydHNdLFxuICApO1xuXG4gIC8vIE5FVzogZmlsdGVyZWQgKyBzb3J0ZWQgcGFydHNcbiAgY29uc3QgZmlsdGVyZWRQYXJ0cyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGxldCByZXN1bHQgPSBbLi4ucGFydHNdO1xuXG4gICAgaWYgKGJyYW5kRmlsdGVyICE9PSBcImFsbFwiKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmJyYW5kID09PSBicmFuZEZpbHRlcik7XG4gICAgfVxuXG4gICAgc3dpdGNoIChzb3J0QnkpIHtcbiAgICAgIGNhc2UgXCJwcmljZS1hc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGEucHJpY2UgLSBiLnByaWNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicHJpY2UtZGVzY1wiOlxuICAgICAgICByZXN1bHQuc29ydCgoYSwgYikgPT4gYi5wcmljZSAtIGEucHJpY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJicmFuZC1hc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGEuYnJhbmQubG9jYWxlQ29tcGFyZShiLmJyYW5kKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInJlbGV2YW5jZVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gbGVhdmUgaW4gYmFja2VuZCBvcmRlclxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCBbcGFydHMsIGJyYW5kRmlsdGVyLCBzb3J0QnldKTtcblxuICBpZiAoIWNhdGVnb3J5KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxtYWluIGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1ibGFjayB0ZXh0LXppbmMtNTBcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtNTAgbWItNFwiPlxuICAgICAgICAgICAgICBDYXRlZ29yeSBOb3QgRm91bmRcbiAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICBocmVmPVwiL2d1bmJ1aWxkZXJcIlxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LWFtYmVyLTMwMCBob3Zlcjp0ZXh0LWFtYmVyLTIwMCB1bmRlcmxpbmVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBSZXR1cm4gdG8gR3VuYnVpbGRlclxuICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbWFpbj5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LWF1dG8gbWF4LXctNnhsIHB4LTQgcHktNiBsZzpweS0xMFwiPlxuICAgICAgICB7LyogSGVhZGVyICovfVxuICAgICAgICA8aGVhZGVyIGNsYXNzTmFtZT1cIm1iLTZcIj5cbiAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTQwMCBob3Zlcjp0ZXh0LXppbmMtMzAwIG1iLTQgaW5saW5lLWJsb2NrXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICDihpAgQmFjayB0byBHdW5idWlsZGVyXG4gICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1zdGFydCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTRcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFja2luZy1bMC4yZW1dIHVwcGVyY2FzZSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgU2hhZG93IFN0YW5kYXJkXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cIm10LTEgdGV4dC0yeGwgbWQ6dGV4dC0zeGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodFwiPlxuICAgICAgICAgICAgICAgIHtjYXRlZ29yeS5uYW1lfSA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWFtYmVyLTMwMFwiPlBhcnRzPC9zcGFuPlxuICAgICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0yIHRleHQtc20gdGV4dC16aW5jLTQwMCBtYXgtdy14bFwiPlxuICAgICAgICAgICAgICAgIEJyb3dzZSBhbGwgYXZhaWxhYmxlIHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl9IG9wdGlvbnMgZm9yXG4gICAgICAgICAgICAgICAgeW91ciBidWlsZCwgcHVsbGVkIGxpdmUgZnJvbSB5b3VyIEJhbGxpc3RpYyBiYWNrZW5kLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIHshbG9hZGluZyAmJiAhZXJyb3IgJiYgcGFydHMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBnYXAtMiBib3JkZXIgYm9yZGVyLXppbmMtODAwIHJvdW5kZWQtbWQgcC0xIGJnLXppbmMtOTUwLzYwXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWaWV3TW9kZShcImNhcmRcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGUgPT09IFwiY2FyZFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy01MFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDYXJkIHZpZXdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIENhcmRcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFZpZXdNb2RlKFwibGlzdFwiKX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gcm91bmRlZCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgICB2aWV3TW9kZSA9PT0gXCJsaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTUwXCJcbiAgICAgICAgICAgICAgICAgICAgICA6IFwidGV4dC16aW5jLTQwMCBob3Zlcjp0ZXh0LXppbmMtMzAwXCJcbiAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkxpc3Qgdmlld1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgTGlzdFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaGVhZGVyPlxuXG4gICAgICAgIHsvKiBQYXJ0cyBHcmlkL0xpc3QgKi99XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC82MCBwLTMgbWQ6cC00XCI+XG4gICAgICAgICAgey8qIE5FVzogZmlsdGVyICsgc29ydCB0b29sYmFyICovfVxuICAgICAgICAgIHshbG9hZGluZyAmJiAhZXJyb3IgJiYgcGFydHMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTQgZmxleCBmbGV4LWNvbCBnYXAtMyBtZDpmbGV4LXJvdyBtZDppdGVtcy1jZW50ZXIgbWQ6anVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgU2hvd2luZ3tcIiBcIn1cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXppbmMtMjAwIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICB7ZmlsdGVyZWRQYXJ0cy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgPC9zcGFuPntcIiBcIn1cbiAgICAgICAgICAgICAgICBvZntcIiBcIn1cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXppbmMtMjAwIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICB7cGFydHMubGVuZ3RofVxuICAgICAgICAgICAgICAgIDwvc3Bhbj57XCIgXCJ9XG4gICAgICAgICAgICAgICAgcGFydHNcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgaHRtbEZvcj1cImJyYW5kLWZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEJyYW5kXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBpZD1cImJyYW5kLWZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXticmFuZEZpbHRlcn1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRCcmFuZEZpbHRlcihlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC83MCB0ZXh0LXhzIHRleHQtemluYy0yMDAgcHgtMiBweS0xIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1hbWJlci00MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYWxsXCI+QWxsIGJyYW5kczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICB7YXZhaWxhYmxlQnJhbmRzLm1hcCgoYikgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ga2V5PXtifSB2YWx1ZT17Yn0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7Yn1cbiAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgaHRtbEZvcj1cInNvcnQtYnlcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBTb3J0XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBpZD1cInNvcnQtYnlcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c29ydEJ5fVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgc2V0U29ydEJ5KGUudGFyZ2V0LnZhbHVlIGFzIFNvcnRPcHRpb24pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQteHMgdGV4dC16aW5jLTIwMCBweC0yIHB5LTEgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMSBmb2N1czpyaW5nLWFtYmVyLTQwMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJyZWxldmFuY2VcIj5SZWxldmFuY2U8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInByaWNlLWFzY1wiPlByaWNlOiBMb3cg4oaSIEhpZ2g8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInByaWNlLWRlc2NcIj5QcmljZTogSGlnaCDihpIgTG93PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJicmFuZC1hc2NcIj5CcmFuZDogQSDihpIgWjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAgTG9hZGluZyB7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfeKAplxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiBlcnJvciA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1yZWQtNDAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAge2Vycm9yfSDigJQgY2hlY2sgdGhhdCB0aGUgQmFsbGlzdGljIEFQSSBpcyBydW5uaW5nLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiBmaWx0ZXJlZFBhcnRzLmxlbmd0aCA9PT0gMCA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIE5vIHBhcnRzIGF2YWlsYWJsZSBmb3IgdGhpcyBjYXRlZ29yeSB5ZXQuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IHZpZXdNb2RlID09PSBcImNhcmRcIiA/IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtMyBtZDpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtM1wiPlxuICAgICAgICAgICAgICB7ZmlsdGVyZWRQYXJ0cy5tYXAoKHBhcnQpID0+IChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBrZXk9e3BhcnQuaWR9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJncm91cCByZWxhdGl2ZSBib3JkZXIgYm9yZGVyLXppbmMtNzAwIHJvdW5kZWQtbWQgcC0zIGJnLXppbmMtOTAwLzUwIGhvdmVyOmJvcmRlci1hbWJlci00MDAvNjAgaG92ZXI6YmctYW1iZXItNDAwLzEwIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCBmbGV4IGZsZXgtY29sXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXI/c2VsZWN0PSR7Y2F0ZWdvcnlJZH06JHtwYXJ0LmlkfWB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXgtMVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIGdhcC0yIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0LmJyYW5kfXtcIiBcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1ub3JtYWxcIj7igJQge3BhcnQubmFtZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LXhzIHRleHQtemluYy00MDAgbGluZS1jbGFtcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDAgd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7cGFydC5wcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtODAwLzUwIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHRleHQtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgVmlldyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LTAgcm91bmRlZC1tZCBiZy1hbWJlci00MDAvMTAgb3BhY2l0eS0wIGdyb3VwLWhvdmVyOm9wYWNpdHktMTAwIHRyYW5zaXRpb24tb3BhY2l0eSBkdXJhdGlvbi0yMDAgcG9pbnRlci1ldmVudHMtbm9uZSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTIwMCB0cmFja2luZy13aWRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQWRkIHRvIEJ1aWxkXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIHsvKiBORVc6IGhlYWRlciByb3cgZm9yIGxpc3QgdmlldyAqL31cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoaWRkZW4gbWQ6Z3JpZCBncmlkLWNvbHMtW21pbm1heCgwLDNmcilfbWlubWF4KDAsMWZyKV9taW5tYXgoMCwxZnIpX2F1dG9dIGdhcC00IHB4LTMgcGItMiB0ZXh0LVswLjdyZW1dIHVwcGVyY2FzZSB0cmFja2luZy1bMC4xNmVtXSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+UGFydDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5CcmFuZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXJpZ2h0XCI+UHJpY2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1yaWdodCBwci0yXCI+Vmlldzwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAgICB7ZmlsdGVyZWRQYXJ0cy5tYXAoKHBhcnQpID0+IChcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAga2V5PXtwYXJ0LmlkfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJncm91cCByZWxhdGl2ZSBib3JkZXIgYm9yZGVyLXppbmMtNzAwIHJvdW5kZWQtbWQgcC0zIGJnLXppbmMtOTAwLzUwIGhvdmVyOmJvcmRlci1hbWJlci00MDAvNjAgaG92ZXI6YmctYW1iZXItNDAwLzEwIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMiBtZDpncmlkIG1kOmdyaWQtY29scy1bbWlubWF4KDAsM2ZyKV9taW5tYXgoMCwxZnIpX21pbm1heCgwLDFmcilfYXV0b10gbWQ6aXRlbXMtY2VudGVyIG1kOmdhcC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj17YC9ndW5idWlsZGVyP3NlbGVjdD0ke2NhdGVnb3J5SWR9OiR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJibG9ja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3RlcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LXhzIHRleHQtemluYy00MDAgbGluZS1jbGFtcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3Rlc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gdGV4dC16aW5jLTQwMCBtZDp0ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0LmJyYW5kfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIG1kOnRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7cGFydC5wcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj17YC9ndW5idWlsZGVyLyR7Y2F0ZWdvcnlJZH0vJHtwYXJ0LmlkfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LTAgcm91bmRlZC1tZCBiZy1hbWJlci00MDAvMTAgb3BhY2l0eS0wIGdyb3VwLWhvdmVyOm9wYWNpdHktMTAwIHRyYW5zaXRpb24tb3BhY2l0eSBkdXJhdGlvbi0yMDAgcG9pbnRlci1ldmVudHMtbm9uZSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMjAwIHRyYWNraW5nLXdpZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEFkZCB0byBCdWlsZFxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWFpbj5cbiAgKTtcbn0iXSwibmFtZXMiOlsidXNlRWZmZWN0IiwidXNlTWVtbyIsInVzZVN0YXRlIiwiTGluayIsInVzZVBhcmFtcyIsIkNBVEVHT1JJRVMiLCJwcm9jZXNzIiwiQVBJX0JBU0VfVVJMIiwiZW52IiwiTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMIiwiQ0FURUdPUllfVE9fUEFSVF9ST0xFUyIsInVwcGVyIiwiYmFycmVsIiwiaGFuZGd1YXJkIiwiY2hhcmdpbmdIYW5kbGUiLCJidWZmZXIiLCJsb3dlclBhcnRzIiwic2lnaHRzIiwiQ2F0ZWdvcnlQYWdlIiwicGFyYW1zIiwiY2F0ZWdvcnlJZCIsInZpZXdNb2RlIiwic2V0Vmlld01vZGUiLCJwYXJ0cyIsInNldFBhcnRzIiwibG9hZGluZyIsInNldExvYWRpbmciLCJlcnJvciIsInNldEVycm9yIiwiYnJhbmRGaWx0ZXIiLCJzZXRCcmFuZEZpbHRlciIsInNvcnRCeSIsInNldFNvcnRCeSIsImNhdGVnb3J5IiwiZmluZCIsImMiLCJpZCIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJmZXRjaENhdGVnb3J5UGFydHMiLCJyb2xlcyIsInNlYXJjaCIsIlVSTFNlYXJjaFBhcmFtcyIsInNldCIsImZvckVhY2giLCJyIiwiYXBwZW5kIiwidXJsIiwibGVuZ3RoIiwidG9TdHJpbmciLCJyZXMiLCJmZXRjaCIsInNpZ25hbCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsIm5vcm1hbGl6ZWQiLCJtYXAiLCJwIiwibmFtZSIsImJyYW5kIiwicHJpY2UiLCJpbWFnZVVybCIsIm1haW5JbWFnZVVybCIsInVuZGVmaW5lZCIsImJ1eVVybCIsIm5vdGVzIiwiZXJyIiwibWVzc2FnZSIsImFib3J0IiwiYXZhaWxhYmxlQnJhbmRzIiwiQXJyYXkiLCJmcm9tIiwiU2V0IiwiZmlsdGVyIiwiQm9vbGVhbiIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJmaWx0ZXJlZFBhcnRzIiwicmVzdWx0IiwibWFpbiIsImNsYXNzTmFtZSIsImRpdiIsImgxIiwiaHJlZiIsImhlYWRlciIsInNwYW4iLCJ0b0xvd2VyQ2FzZSIsImJ1dHRvbiIsInR5cGUiLCJvbkNsaWNrIiwiYXJpYS1sYWJlbCIsInNlY3Rpb24iLCJsYWJlbCIsImh0bWxGb3IiLCJzZWxlY3QiLCJ2YWx1ZSIsIm9uQ2hhbmdlIiwiZSIsInRhcmdldCIsIm9wdGlvbiIsInBhcnQiLCJ0b0ZpeGVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.cd76be92af930a77.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.cd76be92af930a77.hot-update.js new file mode 100644 index 0000000..1c26b3e --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.cd76be92af930a77.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx": +/*!**********************************************!*\ + !*** ./app/gunbuilder/[categoryId]/page.tsx ***! + \**********************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ]\n};\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // NEW: filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n var _CATEGORY_TO_PART_ROLES_categoryId;\n const roles = (_CATEGORY_TO_PART_ROLES_categoryId = CATEGORY_TO_PART_ROLES[categoryId]) !== null && _CATEGORY_TO_PART_ROLES_categoryId !== void 0 ? _CATEGORY_TO_PART_ROLES_categoryId : [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // NEW: available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // NEW: filtered + sorted parts\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 149,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 152,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 148,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 147,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 146,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 169,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 177,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 181,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 180,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 183,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 176,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 190,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 202,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 189,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 175,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 168,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 226,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 230,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 224,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 237,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 249,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 251,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 243,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 236,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 258,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 272,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low β†’ High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 273,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High β†’ Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 274,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A β†’ Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 275,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 264,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 257,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 235,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 223,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 283,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" β€” check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 287,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 291,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder?select=\".concat(categoryId, \":\").concat(part.id),\n className: \"flex-1\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"β€” \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 309,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 307,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 312,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 306,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 317,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 305,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 301,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"w-full rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 322,\n columnNumber: 19\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 297,\n columnNumber: 17\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 295,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 335,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 336,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 337,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 338,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 334,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative border border-zinc-700 rounded-md p-3 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10 transition-all duration-200\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder?select=\".concat(categoryId, \":\").concat(part.id),\n className: \"block\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 353,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 357,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 349,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 348,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 363,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 366,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder?select=\".concat(categoryId, \":\").concat(part.id),\n className: \"rounded-md bg-amber-400 text-black px-3 py-1.5 text-xs font-semibold hover:bg-amber-300 transition-colors whitespace-nowrap\",\n children: \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 370,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 376,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 369,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 347,\n columnNumber: 21\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 343,\n columnNumber: 19\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 341,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 220,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 166,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 165,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"TCzyDO/Rdq+dZXo2cWnlf+kd3uc=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQ2U7QUFDUTtJQWlCbERNO0FBREYsTUFBTUMsZUFDSkQsQ0FBQUEsd0NBQUFBLE9BQU9BLENBQUNFLEdBQUcsQ0FBQ0Msd0JBQXdCLGNBQXBDSCxtREFBQUEsd0NBQXdDO0FBRTFDLE1BQU1JLHlCQUF1RDtJQUMzREMsT0FBTztRQUFDO0tBQWlCO0lBQ3pCQyxRQUFRO1FBQUM7S0FBUztJQUNsQkMsV0FBVztRQUFDO0tBQVk7SUFDeEJDLGdCQUFnQjtRQUFDO0tBQWtCO0lBQ25DQyxRQUFRO1FBQUM7S0FBYTtJQUN0QkMsWUFBWTtRQUFDO0tBQWtCO0lBQy9CQyxRQUFRO1FBQUM7S0FBUTtBQUNuQjtBQUtlLFNBQVNDOztJQUN0QixNQUFNQyxTQUFTZiwwREFBU0E7SUFDeEIsTUFBTWdCLGFBQWFELE9BQU9DLFVBQVU7SUFDcEMsTUFBTSxDQUFDQyxVQUFVQyxZQUFZLEdBQUdwQiwrQ0FBUUEsQ0FBVztJQUNuRCxNQUFNLENBQUNxQixPQUFPQyxTQUFTLEdBQUd0QiwrQ0FBUUEsQ0FBUyxFQUFFO0lBQzdDLE1BQU0sQ0FBQ3VCLFNBQVNDLFdBQVcsR0FBR3hCLCtDQUFRQSxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQ3lCLE9BQU9DLFNBQVMsR0FBRzFCLCtDQUFRQSxDQUFnQjtJQUVsRCwyQkFBMkI7SUFDM0IsTUFBTSxDQUFDMkIsYUFBYUMsZUFBZSxHQUFHNUIsK0NBQVFBLENBQVM7SUFDdkQsTUFBTSxDQUFDNkIsUUFBUUMsVUFBVSxHQUFHOUIsK0NBQVFBLENBQWE7SUFFakQsTUFBTStCLFdBQVdoQyw4Q0FBT0EsQ0FDdEIsSUFBTUksNkRBQVVBLENBQUM2QixJQUFJLENBQUMsQ0FBQ0MsSUFBTUEsRUFBRUMsRUFBRSxLQUFLaEIsYUFDdEM7UUFBQ0E7S0FBVztJQUdkcEIsZ0RBQVNBLENB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LE1BQU0sc0JBQW9DaUIsT0FBZHJGLFlBQVcsS0FBVyxPQUFScUYsS0FBS3JFLEVBQUU7Z0VBQ2pEaUQsV0FBVTswRUFDWDs7Ozs7OzBFQUdELDhEQUFDbEYsaURBQUlBO2dFQUNIcUYsTUFBTSxlQUE2QmlCLE9BQWRyRixZQUFXLEtBQVcsT0FBUnFGLEtBQUtyRSxFQUFFO2dFQUMxQ2lELFdBQVU7MEVBQ1g7Ozs7Ozs7Ozs7Ozs7Ozs7OzsyQ0FuQ0FvQixLQUFLckUsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpRGhDO0dBbld3QmxCOztRQUNQZCxzREFBU0E7OztLQURGYyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9hcHAvZ3VuYnVpbGRlci9bY2F0ZWdvcnlJZF0vcGFnZS50c3g/OGI1ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHsgdXNlUGFyYW1zIH0gZnJvbSBcIm5leHQvbmF2aWdhdGlvblwiO1xuaW1wb3J0IHsgQ0FURUdPUklFUyB9IGZyb20gXCJAL2RhdGEvZ3VuYnVpbGRlclBhcnRzXCI7XG5pbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQsIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbnR5cGUgVmlld01vZGUgPSBcImNhcmRcIiB8IFwibGlzdFwiO1xuXG50eXBlIEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaSA9IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBicmFuZDogc3RyaW5nO1xuICBwbGF0Zm9ybTogc3RyaW5nO1xuICBwYXJ0Um9sZTogc3RyaW5nO1xuICBwcmljZTogbnVtYmVyIHwgbnVsbDtcbiAgbWFpbkltYWdlVXJsOiBzdHJpbmcgfCBudWxsO1xuICBidXlVcmw6IHN0cmluZyB8IG51bGw7XG59O1xuXG5jb25zdCBBUElfQkFTRV9VUkwgPVxuICBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwgPz8gXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIjtcblxuY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgdXBwZXI6IFtcInVwcGVyLXJlY2VpdmVyXCJdLFxuICBiYXJyZWw6IFtcImJhcnJlbFwiXSxcbiAgaGFuZGd1YXJkOiBbXCJoYW5kZ3VhcmRcIl0sXG4gIGNoYXJnaW5nSGFuZGxlOiBbXCJjaGFyZ2luZy1oYW5kbGVcIl0sXG4gIGJ1ZmZlcjogW1wiYnVmZmVyLWtpdFwiXSxcbiAgbG93ZXJQYXJ0czogW1wibG93ZXItcGFydHMta2l0XCJdLFxuICBzaWdodHM6IFtcInNpZ2h0XCJdLFxufTtcblxuLy8gTkVXOiBzb3J0IG9wdGlvbnNcbnR5cGUgU29ydE9wdGlvbiA9IFwicmVsZXZhbmNlXCIgfCBcInByaWNlLWFzY1wiIHwgXCJwcmljZS1kZXNjXCIgfCBcImJyYW5kLWFzY1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDYXRlZ29yeVBhZ2UoKSB7XG4gIGNvbnN0IHBhcmFtcyA9IHVzZVBhcmFtcygpO1xuICBjb25zdCBjYXRlZ29yeUlkID0gcGFyYW1zLmNhdGVnb3J5SWQgYXMgQ2F0ZWdvcnlJZDtcbiAgY29uc3QgW3ZpZXdNb2RlLCBzZXRWaWV3TW9kZV0gPSB1c2VTdGF0ZTxWaWV3TW9kZT4oXCJsaXN0XCIpO1xuICBjb25zdCBbcGFydHMsIHNldFBhcnRzXSA9IHVzZVN0YXRlPFBhcnRbXT4oW10pO1xuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBORVc6IGZpbHRlciArIHNvcnQgc3RhdGVcbiAgY29uc3QgW2JyYW5kRmlsdGVyLCBzZXRCcmFuZEZpbHRlcl0gPSB1c2VTdGF0ZTxzdHJpbmc+KFwiYWxsXCIpO1xuICBjb25zdCBbc29ydEJ5LCBzZXRTb3J0QnldID0gdXNlU3RhdGU8U29ydE9wdGlvbj4oXCJyZWxldmFuY2VcIik7XG5cbiAgY29uc3QgY2F0ZWdvcnkgPSB1c2VNZW1vKFxuICAgICgpID0+IENBVEVHT1JJRVMuZmluZCgoYykgPT4gYy5pZCA9PT0gY2F0ZWdvcnlJZCksXG4gICAgW2NhdGVnb3J5SWRdLFxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFjYXRlZ29yeUlkKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hDYXRlZ29yeVBhcnRzKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG5cbiAgICAgICAgY29uc3Qgcm9sZXMgPSBDQVRFR09SWV9UT19QQVJUX1JPTEVTW2NhdGVnb3J5SWRdID8/IFtdO1xuXG4gICAgICAgIGNvbnN0IHNlYXJjaCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgICAgc2VhcmNoLnNldChcInBsYXRmb3JtXCIsIFwiQVItMTVcIik7XG4gICAgICAgIHJvbGVzLmZvckVhY2goKHIpID0+IHNlYXJjaC5hcHBlbmQoXCJwYXJ0Um9sZXNcIiwgcikpO1xuXG4gICAgICAgIGNvbnN0IHVybCA9IGAke0FQSV9CQVNFX1VSTH0vYXBpL3Byb2R1Y3RzL2d1bmJ1aWxkZXIke1xuICAgICAgICAgIHJvbGVzLmxlbmd0aCA/IGA/JHtzZWFyY2gudG9TdHJpbmcoKX1gIDogXCJcIlxuICAgICAgICB9YDtcblxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KTtcblxuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHMgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhOiBHdW5idWlsZGVyUHJvZHVjdEZyb21BcGlbXSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZDogUGFydFtdID0gZGF0YS5tYXAoKHApID0+ICh7XG4gICAgICAgICAgaWQ6IHAuaWQsXG4gICAgICAgICAgY2F0ZWdvcnlJZCxcbiAgICAgICAgICBuYW1lOiBwLm5hbWUsXG4gICAgICAgICAgYnJhbmQ6IHAuYnJhbmQsXG4gICAgICAgICAgcHJpY2U6IHAucHJpY2UgPz8gMCxcbiAgICAgICAgICBpbWFnZVVybDogcC5tYWluSW1hZ2VVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIHVybDogcC5idXlVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIG5vdGVzOiB1bmRlZmluZWQsXG4gICAgICAgIH0pKTtcblxuICAgICAgICBzZXRQYXJ0cyhub3JtYWxpemVkKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGlmIChlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHJldHVybjtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBwcm9kdWN0c1wiKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoQ2F0ZWdvcnlQYXJ0cygpO1xuXG4gICAgcmV0dXJuICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfSwgW2NhdGVnb3J5SWRdKTtcblxuICAvLyBORVc6IGF2YWlsYWJsZSBicmFuZHMgZm9yIGZpbHRlclxuICBjb25zdCBhdmFpbGFibGVCcmFuZHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBBcnJheS5mcm9tKG5ldyBTZXQocGFydHMubWFwKChwKSA9PiBwLmJyYW5kKSkpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgW3BhcnRzXSxcbiAgKTtcblxuICAvLyBORVc6IGZpbHRlcmVkICsgc29ydGVkIHBhcnRzXG4gIGNvbnN0IGZpbHRlcmVkUGFydHMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBsZXQgcmVzdWx0ID0gWy4uLnBhcnRzXTtcblxuICAgIGlmIChicmFuZEZpbHRlciAhPT0gXCJhbGxcIikge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcigocCkgPT4gcC5icmFuZCA9PT0gYnJhbmRGaWx0ZXIpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc29ydEJ5KSB7XG4gICAgICBjYXNlIFwicHJpY2UtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLnByaWNlIC0gYi5wcmljZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInByaWNlLWRlc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGIucHJpY2UgLSBhLnByaWNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYnJhbmQtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLmJyYW5kLmxvY2FsZUNvbXBhcmUoYi5icmFuZCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJyZWxldmFuY2VcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGxlYXZlIGluIGJhY2tlbmQgb3JkZXJcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwgW3BhcnRzLCBicmFuZEZpbHRlciwgc29ydEJ5XSk7XG5cbiAgaWYgKCFjYXRlZ29yeSkge1xuICAgIHJldHVybiAoXG4gICAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwIG1iLTRcIj5cbiAgICAgICAgICAgICAgQ2F0ZWdvcnkgTm90IEZvdW5kXG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDAgaG92ZXI6dGV4dC1hbWJlci0yMDAgdW5kZXJsaW5lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgUmV0dXJuIHRvIEd1bmJ1aWxkZXJcbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21haW4+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02XCI+XG4gICAgICAgICAgPExpbmtcbiAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMCBtYi00IGlubGluZS1ibG9ja1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAg4oaQIEJhY2sgdG8gR3VuYnVpbGRlclxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNoYWRvdyBTdGFuZGFyZFxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgICB7Y2F0ZWdvcnkubmFtZX0gPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDBcIj5QYXJ0czwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgICBCcm93c2UgYWxsIGF2YWlsYWJsZSB7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfSBvcHRpb25zIGZvclxuICAgICAgICAgICAgICAgIHlvdXIgYnVpbGQsIHB1bGxlZCBsaXZlIGZyb20geW91ciBCYWxsaXN0aWMgYmFja2VuZC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTIgYm9yZGVyIGJvcmRlci16aW5jLTgwMCByb3VuZGVkLW1kIHAtMSBiZy16aW5jLTk1MC82MFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJjYXJkXCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImNhcmRcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2FyZCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBDYXJkXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWaWV3TW9kZShcImxpc3RcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGUgPT09IFwibGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy01MFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJMaXN0IHZpZXdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIExpc3RcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICB7LyogUGFydHMgR3JpZC9MaXN0ICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvNjAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgIHsvKiBORVc6IGZpbHRlciArIHNvcnQgdG9vbGJhciAqL31cbiAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi00IGZsZXggZmxleC1jb2wgZ2FwLTMgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtY2VudGVyIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNob3dpbmd7XCIgXCJ9XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTIwMCBmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubGVuZ3RofVxuICAgICAgICAgICAgICAgIDwvc3Bhbj57XCIgXCJ9XG4gICAgICAgICAgICAgICAgb2Z7XCIgXCJ9XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTIwMCBmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAge3BhcnRzLmxlbmd0aH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+e1wiIFwifVxuICAgICAgICAgICAgICAgIHBhcnRzXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC13cmFwIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGh0bWxGb3I9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBCcmFuZFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YnJhbmRGaWx0ZXJ9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0QnJhbmRGaWx0ZXIoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsbFwiPkFsbCBicmFuZHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAge2F2YWlsYWJsZUJyYW5kcy5tYXAoKGIpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17Yn0gdmFsdWU9e2J9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2J9XG4gICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGh0bWxGb3I9XCJzb3J0LWJ5XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgU29ydFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJzb3J0LWJ5XCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NvcnRCeX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHNldFNvcnRCeShlLnRhcmdldC52YWx1ZSBhcyBTb3J0T3B0aW9uKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC83MCB0ZXh0LXhzIHRleHQtemluYy0yMDAgcHgtMiBweS0xIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1hbWJlci00MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVsZXZhbmNlXCI+UmVsZXZhbmNlPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwcmljZS1hc2NcIj5QcmljZTogTG93IOKGkiBIaWdoPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwcmljZS1kZXNjXCI+UHJpY2U6IEhpZ2gg4oaSIExvdzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYnJhbmQtYXNjXCI+QnJhbmQ6IEEg4oaSIFo8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIExvYWRpbmcge2NhdGVnb3J5Lm5hbWUudG9Mb3dlckNhc2UoKX3igKZcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogZXJyb3IgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtcmVkLTQwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIHtlcnJvcn0g4oCUIGNoZWNrIHRoYXQgdGhlIEJhbGxpc3RpYyBBUEkgaXMgcnVubmluZy5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogZmlsdGVyZWRQYXJ0cy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICBObyBwYXJ0cyBhdmFpbGFibGUgZm9yIHRoaXMgY2F0ZWdvcnkgeWV0LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiB2aWV3TW9kZSA9PT0gXCJjYXJkXCIgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTMgbWQ6Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTNcIj5cbiAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiAoXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAga2V5PXtwYXJ0LmlkfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZ3JvdXAgcmVsYXRpdmUgYm9yZGVyIGJvcmRlci16aW5jLTcwMCByb3VuZGVkLW1kIHAtMyBiZy16aW5jLTkwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNDAwLzYwIGhvdmVyOmJnLWFtYmVyLTQwMC8xMCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAgZmxleCBmbGV4LWNvbFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgaHJlZj17YC9ndW5idWlsZGVyP3NlbGVjdD0ke2NhdGVnb3J5SWR9OiR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4LTFcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBnYXAtMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbm9ybWFsXCI+4oCUIHtwYXJ0Lm5hbWV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3RlcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNDAwIGxpbmUtY2xhbXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIHdoaXRlc3BhY2Utbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeUlkfS8ke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTIgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtNzAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICB7LyogTkVXOiBoZWFkZXIgcm93IGZvciBsaXN0IHZpZXcgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmdyaWQgZ3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBnYXAtNCBweC0zIHBiLTIgdGV4dC1bMC43cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlBhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+QnJhbmQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1yaWdodFwiPlByaWNlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtcmlnaHQgcHItMlwiPkFjdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGtleT17cGFydC5pZH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZ3JvdXAgcmVsYXRpdmUgYm9yZGVyIGJvcmRlci16aW5jLTcwMCByb3VuZGVkLW1kIHAtMyBiZy16aW5jLTkwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNDAwLzYwIGhvdmVyOmJnLWFtYmVyLTQwMC8xMCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTIgbWQ6Z3JpZCBtZDpncmlkLWNvbHMtW21pbm1heCgwLDNmcilfbWlubWF4KDAsMWZyKV9taW5tYXgoMCwxZnIpX2F1dG9dIG1kOml0ZW1zLWNlbnRlciBtZDpnYXAtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlcj9zZWxlY3Q9JHtjYXRlZ29yeUlkfToke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmxvY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXMgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNDAwIGxpbmUtY2xhbXAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyBtZDp0ZXh0LXNtIHRleHQtemluYy00MDAgbWQ6dGV4dC1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTMwMCBtZDp0ZXh0LXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1lbmQgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlcj9zZWxlY3Q9JHtjYXRlZ29yeUlkfToke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBiZy1hbWJlci00MDAgdGV4dC1ibGFjayBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgaG92ZXI6YmctYW1iZXItMzAwIHRyYW5zaXRpb24tY29sb3JzIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIHRvIEJ1aWxkXG4gICAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeUlkfS8ke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtODAwLzUwIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC16aW5jLTMwMCBob3ZlcjpiZy16aW5jLTcwMCBob3Zlcjpib3JkZXItemluYy02MDAgdHJhbnNpdGlvbi1jb2xvcnMgd2hpdGVzcGFjZS1ub3dyYXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IERldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsIkxpbmsiLCJ1c2VQYXJhbXMiLCJDQVRFR09SSUVTIiwicHJvY2VzcyIsIkFQSV9CQVNFX1VSTCIsImVudiIsIk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCIsIkNBVEVHT1JZX1RPX1BBUlRfUk9MRVMiLCJ1cHBlciIsImJhcnJlbCIsImhhbmRndWFyZCIsImNoYXJnaW5nSGFuZGxlIiwiYnVmZmVyIiwibG93ZXJQYXJ0cyIsInNpZ2h0cyIsIkNhdGVnb3J5UGFnZSIsInBhcmFtcyIsImNhdGVnb3J5SWQiLCJ2aWV3TW9kZSIsInNldFZpZXdNb2RlIiwicGFydHMiLCJzZXRQYXJ0cyIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsImJyYW5kRmlsdGVyIiwic2V0QnJhbmRGaWx0ZXIiLCJzb3J0QnkiLCJzZXRTb3J0QnkiLCJjYXRlZ29yeSIsImZpbmQiLCJjIiwiaWQiLCJjb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwiZmV0Y2hDYXRlZ29yeVBhcnRzIiwicm9sZXMiLCJzZWFyY2giLCJVUkxTZWFyY2hQYXJhbXMiLCJzZXQiLCJmb3JFYWNoIiwiciIsImFwcGVuZCIsInVybCIsImxlbmd0aCIsInRvU3RyaW5nIiwicmVzIiwiZmV0Y2giLCJzaWduYWwiLCJvayIsIkVycm9yIiwic3RhdHVzIiwiZGF0YSIsImpzb24iLCJub3JtYWxpemVkIiwibWFwIiwicCIsIm5hbWUiLCJicmFuZCIsInByaWNlIiwiaW1hZ2VVcmwiLCJtYWluSW1hZ2VVcmwiLCJ1bmRlZmluZWQiLCJidXlVcmwiLCJub3RlcyIsImVyciIsIm1lc3NhZ2UiLCJhYm9ydCIsImF2YWlsYWJsZUJyYW5kcyIsIkFycmF5IiwiZnJvbSIsIlNldCIsImZpbHRlciIsIkJvb2xlYW4iLCJzb3J0IiwiYSIsImIiLCJsb2NhbGVDb21wYXJlIiwiZmlsdGVyZWRQYXJ0cyIsInJlc3VsdCIsIm1haW4iLCJjbGFzc05hbWUiLCJkaXYiLCJoMSIsImhyZWYiLCJoZWFkZXIiLCJzcGFuIiwidG9Mb3dlckNhc2UiLCJidXR0b24iLCJ0eXBlIiwib25DbGljayIsImFyaWEtbGFiZWwiLCJzZWN0aW9uIiwibGFiZWwiLCJodG1sRm9yIiwic2VsZWN0IiwidmFsdWUiLCJvbkNoYW5nZSIsImUiLCJ0YXJnZXQiLCJvcHRpb24iLCJwYXJ0IiwidG9GaXhlZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.32693299354f3264.hot-update.js b/.next/static/webpack/app/layout.32693299354f3264.hot-update.js new file mode 100644 index 0000000..44cfe34 --- /dev/null +++ b/.next/static/webpack/app/layout.32693299354f3264.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"654967be10be\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCI2NTQ5NjdiZTEwYmVcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.385ea9265ba687b2.hot-update.js b/.next/static/webpack/app/layout.385ea9265ba687b2.hot-update.js new file mode 100644 index 0000000..412f36e --- /dev/null +++ b/.next/static/webpack/app/layout.385ea9265ba687b2.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"5589102c78c1\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCI1NTg5MTAyYzc4YzFcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.4528b572b2c1fb3a.hot-update.js b/.next/static/webpack/app/layout.4528b572b2c1fb3a.hot-update.js new file mode 100644 index 0000000..7bf7317 --- /dev/null +++ b/.next/static/webpack/app/layout.4528b572b2c1fb3a.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"8eda1647e112\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCI4ZWRhMTY0N2UxMTJcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.96a4c04f3af3cc7f.hot-update.js b/.next/static/webpack/app/layout.96a4c04f3af3cc7f.hot-update.js new file mode 100644 index 0000000..f26ad11 --- /dev/null +++ b/.next/static/webpack/app/layout.96a4c04f3af3cc7f.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"b291b7e5c3b7\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJiMjkxYjdlNWMzYjdcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.a73da2d4cd917396.hot-update.js b/.next/static/webpack/app/layout.a73da2d4cd917396.hot-update.js new file mode 100644 index 0000000..cb3c246 --- /dev/null +++ b/.next/static/webpack/app/layout.a73da2d4cd917396.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"8a86f3a0370b\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCI4YTg2ZjNhMDM3MGJcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.cd76be92af930a77.hot-update.js b/.next/static/webpack/app/layout.cd76be92af930a77.hot-update.js new file mode 100644 index 0000000..d287ea0 --- /dev/null +++ b/.next/static/webpack/app/layout.cd76be92af930a77.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"9d6d63dc9b6d\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCI5ZDZkNjNkYzliNmRcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/cd76be92af930a77.webpack.hot-update.json b/.next/static/webpack/cd76be92af930a77.webpack.hot-update.json new file mode 100644 index 0000000..6a4f8ba --- /dev/null +++ b/.next/static/webpack/cd76be92af930a77.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/[categoryId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/webpack.32693299354f3264.hot-update.js b/.next/static/webpack/webpack.32693299354f3264.hot-update.js new file mode 100644 index 0000000..e19f7d6 --- /dev/null +++ b/.next/static/webpack/webpack.32693299354f3264.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "4528b572b2c1fb3a"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.385ea9265ba687b2.hot-update.js b/.next/static/webpack/webpack.385ea9265ba687b2.hot-update.js new file mode 100644 index 0000000..87db603 --- /dev/null +++ b/.next/static/webpack/webpack.385ea9265ba687b2.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "b05ead14ffc790b9"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.4528b572b2c1fb3a.hot-update.js b/.next/static/webpack/webpack.4528b572b2c1fb3a.hot-update.js new file mode 100644 index 0000000..a34c4b1 --- /dev/null +++ b/.next/static/webpack/webpack.4528b572b2c1fb3a.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "96a4c04f3af3cc7f"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.96a4c04f3af3cc7f.hot-update.js b/.next/static/webpack/webpack.96a4c04f3af3cc7f.hot-update.js new file mode 100644 index 0000000..c6b5350 --- /dev/null +++ b/.next/static/webpack/webpack.96a4c04f3af3cc7f.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "385ea9265ba687b2"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.a73da2d4cd917396.hot-update.js b/.next/static/webpack/webpack.a73da2d4cd917396.hot-update.js new file mode 100644 index 0000000..6dc0b73 --- /dev/null +++ b/.next/static/webpack/webpack.a73da2d4cd917396.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "cd76be92af930a77"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.cd76be92af930a77.hot-update.js b/.next/static/webpack/webpack.cd76be92af930a77.hot-update.js new file mode 100644 index 0000000..27f74b8 --- /dev/null +++ b/.next/static/webpack/webpack.cd76be92af930a77.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "32693299354f3264"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/trace b/.next/trace index 564ea3b..dd69773 100644 --- a/.next/trace +++ b/.next/trace @@ -17,3 +17,9 @@ [{"name":"client-success","duration":2,"timestamp":921722289191,"id":1054,"parentId":3,"tags":{},"startTime":1764554365918,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":11270,"timestamp":921722291099,"id":1055,"tags":{"url":"/gunbuilder?_rsc=1kvbu","isTurbopack":false},"startTime":1764554365920,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":0,"timestamp":921722302389,"id":1056,"parentId":1055,"tags":{"url":"/gunbuilder?_rsc=1kvbu","memory.rss":"443039744","memory.heapUsed":"152288144","memory.heapTotal":"191119360"},"startTime":1764554365932,"traceId":"45f4427c68eca367"},{"name":"client-hmr-latency","duration":114000,"timestamp":921722192895,"id":1057,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder","isPageHidden":true},"startTime":1764554365936,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":40407,"timestamp":921772075319,"id":1065,"parentId":1062,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764554415704,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":40413,"timestamp":921772075324,"id":1066,"parentId":1062,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764554415704,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":41448,"timestamp":921772075170,"id":1063,"parentId":1062,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764554415704,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":64867,"timestamp":921772075306,"id":1064,"parentId":1062,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764554415704,"traceId":"45f4427c68eca367"},{"name":"make","duration":77230,"timestamp":921772070463,"id":1062,"parentId":1061,"tags":{},"startTime":1764554415700,"traceId":"45f4427c68eca367"},{"name":"chunk-graph","duration":1145,"timestamp":921772148890,"id":1081,"parentId":1080,"tags":{},"startTime":1764554415778,"traceId":"45f4427c68eca367"},{"name":"optimize-modules","duration":4,"timestamp":921772150046,"id":1083,"parentId":1080,"tags":{},"startTime":1764554415779,"traceId":"45f4427c68eca367"},{"name":"optimize-chunks","duration":936,"timestamp":921772150060,"id":1084,"parentId":1080,"tags":{},"startTime":1764554415779,"traceId":"45f4427c68eca367"},{"name":"optimize-tree","duration":9,"timestamp":921772151005,"id":1085,"parentId":1080,"tags":{},"startTime":1764554415780,"traceId":"45f4427c68eca367"},{"name":"optimize-chunk-modules","duration":2,"timestamp":921772151035,"id":1086,"parentId":1080,"tags":{},"startTime":1764554415780,"traceId":"45f4427c68eca367"},{"name":"optimize","duration":1258,"timestamp":921772150044,"id":1082,"parentId":1080,"tags":{},"startTime":1764554415779,"traceId":"45f4427c68eca367"},{"name":"module-hash","duration":265,"timestamp":921772151834,"id":1087,"parentId":1080,"tags":{},"startTime":1764554415781,"traceId":"45f4427c68eca367"},{"name":"code-generation","duration":460,"timestamp":921772152103,"id":1088,"parentId":1080,"tags":{},"startTime":1764554415781,"traceId":"45f4427c68eca367"},{"name":"hash","duration":735,"timestamp":921772153523,"id":1089,"parentId":1080,"tags":{},"startTime":1764554415783,"traceId":"45f4427c68eca367"},{"name":"code-generation-jobs","duration":53,"timestamp":921772154259,"id":1090,"parentId":1080,"tags":{},"startTime":1764554415783,"traceId":"45f4427c68eca367"},{"name":"module-assets","duration":22,"timestamp":921772154305,"id":1091,"parentId":1080,"tags":{},"startTime":1764554415783,"traceId":"45f4427c68eca367"},{"name":"create-chunk-assets","duration":156,"timestamp":921772154329,"id":1092,"parentId":1080,"tags":{},"startTime":1764554415784,"traceId":"45f4427c68eca367"},{"name":"seal","duration":6504,"timestamp":921772148666,"id":1080,"parentId":1061,"tags":{},"startTime":1764554415778,"traceId":"45f4427c68eca367"},{"name":"webpack-compilation","duration":86627,"timestamp":921772069613,"id":1061,"parentId":1059,"tags":{"name":"server"},"startTime":1764554415699,"traceId":"45f4427c68eca367"},{"name":"emit","duration":1182,"timestamp":921772156253,"id":1093,"parentId":1059,"tags":{},"startTime":1764554415785,"traceId":"45f4427c68eca367"},{"name":"webpack-invalidated-server","duration":96071,"timestamp":921772061620,"id":1059,"parentId":3,"tags":{"trigger":"manual"},"startTime":1764554415691,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":2491,"timestamp":921772163018,"id":1102,"parentId":1095,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764554415792,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":2725,"timestamp":921772162974,"id":1096,"parentId":1095,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764554415792,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":3500,"timestamp":921772163016,"id":1101,"parentId":1095,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764554415792,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":3508,"timestamp":921772163012,"id":1099,"parentId":1095,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764554415792,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":4495,"timestamp":921772163013,"id":1100,"parentId":1095,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764554415792,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":5813,"timestamp":921772163006,"id":1097,"parentId":1095,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764554415792,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":5813,"timestamp":921772163009,"id":1098,"parentId":1095,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764554415792,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":10301,"timestamp":921772163020,"id":1103,"parentId":1095,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764554415792,"traceId":"45f4427c68eca367"},{"name":"make","duration":14692,"timestamp":921772158638,"id":1095,"parentId":1094,"tags":{},"startTime":1764554415788,"traceId":"45f4427c68eca367"},{"name":"chunk-graph","duration":919,"timestamp":921772174311,"id":1105,"parentId":1104,"tags":{},"startTime":1764554415803,"traceId":"45f4427c68eca367"},{"name":"optimize-modules","duration":2,"timestamp":921772175245,"id":1107,"parentId":1104,"tags":{},"startTime":1764554415804,"traceId":"45f4427c68eca367"},{"name":"optimize-chunks","duration":15,"timestamp":921772175255,"id":1108,"parentId":1104,"tags":{},"startTime":1764554415804,"traceId":"45f4427c68eca367"},{"name":"optimize-tree","duration":2,"timestamp":921772175281,"id":1109,"parentId":1104,"tags":{},"startTime":1764554415804,"traceId":"45f4427c68eca367"},{"name":"optimize-chunk-modules","duration":5,"timestamp":921772175290,"id":1110,"parentId":1104,"tags":{},"startTime":1764554415804,"traceId":"45f4427c68eca367"},{"name":"optimize","duration":347,"timestamp":921772175241,"id":1106,"parentId":1104,"tags":{},"startTime":1764554415804,"traceId":"45f4427c68eca367"},{"name":"module-hash","duration":231,"timestamp":921772176085,"id":1111,"parentId":1104,"tags":{},"startTime":1764554415805,"traceId":"45f4427c68eca367"},{"name":"code-generation","duration":557,"timestamp":921772176321,"id":1112,"parentId":1104,"tags":{},"startTime":1764554415805,"traceId":"45f4427c68eca367"},{"name":"hash","duration":1850,"timestamp":921772177690,"id":1113,"parentId":1104,"tags":{},"startTime":1764554415807,"traceId":"45f4427c68eca367"},{"name":"code-generation-jobs","duration":74,"timestamp":921772179540,"id":1114,"parentId":1104,"tags":{},"startTime":1764554415809,"traceId":"45f4427c68eca367"},{"name":"module-assets","duration":26,"timestamp":921772179610,"id":1115,"parentId":1104,"tags":{},"startTime":1764554415809,"traceId":"45f4427c68eca367"},{"name":"create-chunk-assets","duration":1198,"timestamp":921772179639,"id":1116,"parentId":1104,"tags":{},"startTime":1764554415809,"traceId":"45f4427c68eca367"},{"name":"NextJsBuildManifest-generateClientManifest","duration":78,"timestamp":921772181357,"id":1118,"parentId":1094,"tags":{},"startTime":1764554415811,"traceId":"45f4427c68eca367"},{"name":"NextJsBuildManifest-createassets","duration":138,"timestamp":921772181300,"id":1117,"parentId":1094,"tags":{},"startTime":1764554415810,"traceId":"45f4427c68eca367"},{"name":"seal","duration":8313,"timestamp":921772174024,"id":1104,"parentId":1094,"tags":{},"startTime":1764554415803,"traceId":"45f4427c68eca367"},{"name":"webpack-compilation","duration":23910,"timestamp":921772158438,"id":1094,"parentId":1079,"tags":{"name":"client"},"startTime":1764554415788,"traceId":"45f4427c68eca367"},{"name":"emit","duration":6132,"timestamp":921772182388,"id":1119,"parentId":1079,"tags":{},"startTime":1764554415812,"traceId":"45f4427c68eca367"},{"name":"compile-path","duration":126765,"timestamp":921772062119,"id":1060,"tags":{"trigger":"/gunbuilder/build","isTurbopack":false},"startTime":1764554415691,"traceId":"45f4427c68eca367"},{"name":"webpack-invalidated-client","duration":48072,"timestamp":921772141179,"id":1079,"parentId":3,"tags":{"trigger":"manual"},"startTime":1764554415770,"traceId":"45f4427c68eca367"}] [{"name":"client-success","duration":4,"timestamp":921772190092,"id":1120,"parentId":3,"tags":{},"startTime":1764554415819,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":145907,"timestamp":921772054669,"id":1058,"tags":{"url":"/gunbuilder/build?_rsc=1acsq","isTurbopack":false},"startTime":1764554415684,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":0,"timestamp":921772200598,"id":1121,"parentId":1058,"tags":{"url":"/gunbuilder/build?_rsc=1acsq","memory.rss":"436060160","memory.heapUsed":"157140336","memory.heapTotal":"180273152"},"startTime":1764554415830,"traceId":"45f4427c68eca367"},{"name":"client-hmr-latency","duration":64000,"timestamp":921772141968,"id":1122,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder","isPageHidden":false},"startTime":1764554415835,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":4790,"timestamp":921772206072,"id":1123,"tags":{"url":"/gunbuilder/build?_rsc=1bjq3","isTurbopack":false},"startTime":1764554415835,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":0,"timestamp":921772210873,"id":1124,"parentId":1123,"tags":{"url":"/gunbuilder/build?_rsc=1bjq3","memory.rss":"436060160","memory.heapUsed":"158024792","memory.heapTotal":"180535296"},"startTime":1764554415840,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":17404,"timestamp":922051752034,"id":1130,"parentId":1128,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764554695381,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":17400,"timestamp":922051752060,"id":1132,"parentId":1128,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764554695381,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":18518,"timestamp":922051751929,"id":1129,"parentId":1128,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764554695381,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":2248,"timestamp":922051768559,"id":1135,"parentId":1134,"tags":{},"startTime":1764554695397,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":2424,"timestamp":922051768386,"id":1134,"parentId":1133,"tags":{},"startTime":1764554695397,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":6746,"timestamp":922051767937,"id":1133,"parentId":1127,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/build/page.tsx","layer":"rsc"},"startTime":1764554695397,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":23259,"timestamp":922051752051,"id":1131,"parentId":1128,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764554695381,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":4617,"timestamp":922051777982,"id":1150,"parentId":1149,"tags":{},"startTime":1764554695407,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":4701,"timestamp":922051777903,"id":1149,"parentId":1148,"tags":{},"startTime":1764554695407,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":16200,"timestamp":922051777820,"id":1148,"parentId":1127,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/build/page.tsx","layer":"ssr"},"startTime":1764554695407,"traceId":"45f4427c68eca367"},{"name":"make","duration":47297,"timestamp":922051747423,"id":1128,"parentId":1127,"tags":{},"startTime":1764554695376,"traceId":"45f4427c68eca367"},{"name":"chunk-graph","duration":1355,"timestamp":922051818225,"id":1152,"parentId":1151,"tags":{},"startTime":1764554695447,"traceId":"45f4427c68eca367"},{"name":"optimize-modules","duration":16,"timestamp":922051819594,"id":1154,"parentId":1151,"tags":{},"startTime":1764554695448,"traceId":"45f4427c68eca367"},{"name":"optimize-chunks","duration":1269,"timestamp":922051819648,"id":1155,"parentId":1151,"tags":{},"startTime":1764554695448,"traceId":"45f4427c68eca367"},{"name":"optimize-tree","duration":4,"timestamp":922051820949,"id":1156,"parentId":1151,"tags":{},"startTime":1764554695450,"traceId":"45f4427c68eca367"},{"name":"optimize-chunk-modules","duration":4,"timestamp":922051820979,"id":1157,"parentId":1151,"tags":{},"startTime":1764554695450,"traceId":"45f4427c68eca367"},{"name":"optimize","duration":1628,"timestamp":922051819591,"id":1153,"parentId":1151,"tags":{},"startTime":1764554695448,"traceId":"45f4427c68eca367"},{"name":"module-hash","duration":249,"timestamp":922051821737,"id":1158,"parentId":1151,"tags":{},"startTime":1764554695450,"traceId":"45f4427c68eca367"},{"name":"code-generation","duration":1253,"timestamp":922051821991,"id":1159,"parentId":1151,"tags":{},"startTime":1764554695451,"traceId":"45f4427c68eca367"},{"name":"hash","duration":1574,"timestamp":922051823873,"id":1160,"parentId":1151,"tags":{},"startTime":1764554695453,"traceId":"45f4427c68eca367"},{"name":"code-generation-jobs","duration":84,"timestamp":922051825446,"id":1161,"parentId":1151,"tags":{},"startTime":1764554695454,"traceId":"45f4427c68eca367"},{"name":"module-assets","duration":31,"timestamp":922051825526,"id":1162,"parentId":1151,"tags":{},"startTime":1764554695454,"traceId":"45f4427c68eca367"},{"name":"create-chunk-assets","duration":2012,"timestamp":922051825559,"id":1163,"parentId":1151,"tags":{},"startTime":1764554695454,"traceId":"45f4427c68eca367"},{"name":"seal","duration":10500,"timestamp":922051818017,"id":1151,"parentId":1127,"tags":{},"startTime":1764554695447,"traceId":"45f4427c68eca367"},{"name":"webpack-compilation","duration":83446,"timestamp":922051746396,"id":1127,"parentId":1125,"tags":{"name":"server"},"startTime":1764554695375,"traceId":"45f4427c68eca367"},{"name":"emit","duration":1416,"timestamp":922051829856,"id":1164,"parentId":1125,"tags":{},"startTime":1764554695459,"traceId":"45f4427c68eca367"},{"name":"webpack-invalidated-server","duration":97041,"timestamp":922051734551,"id":1125,"parentId":3,"tags":{"trigger":"app/gunbuilder/build/page.tsx"},"startTime":1764554695363,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":2569,"timestamp":922051837050,"id":1173,"parentId":1166,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764554695466,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":2807,"timestamp":922051837006,"id":1167,"parentId":1166,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764554695466,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":3319,"timestamp":922051837048,"id":1172,"parentId":1166,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764554695466,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":4961,"timestamp":922051837045,"id":1171,"parentId":1166,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764554695466,"traceId":"45f4427c68eca367"},{"name":"read-resource","duration":1468,"timestamp":922051840572,"id":1180,"parentId":1179,"tags":{},"startTime":1764554695469,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":6819,"timestamp":922051839058,"id":1178,"parentId":1177,"tags":{},"startTime":1764554695468,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":6888,"timestamp":922051838990,"id":1177,"parentId":1176,"tags":{},"startTime":1764554695468,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":12933,"timestamp":922051838932,"id":1176,"parentId":1165,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/build/page.tsx","layer":"app-pages-browser"},"startTime":1764554695468,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":15038,"timestamp":922051837038,"id":1168,"parentId":1166,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764554695466,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":15036,"timestamp":922051837042,"id":1169,"parentId":1166,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764554695466,"traceId":"45f4427c68eca367"},{"name":"postcss-process","duration":25698,"timestamp":922051842083,"id":1182,"parentId":1181,"tags":{},"startTime":1764554695471,"traceId":"45f4427c68eca367"},{"name":"postcss-loader","duration":26071,"timestamp":922051842066,"id":1181,"parentId":1179,"tags":{},"startTime":1764554695471,"traceId":"45f4427c68eca367"},{"name":"css-loader","duration":3893,"timestamp":922051868162,"id":1183,"parentId":1179,"tags":{"astUsed":"true"},"startTime":1764554695497,"traceId":"45f4427c68eca367"},{"name":"build-module-css","duration":32936,"timestamp":922051840447,"id":1179,"parentId":1175,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764554695469,"traceId":"45f4427c68eca367"},{"name":"build-module-css","duration":44998,"timestamp":922051838385,"id":1175,"parentId":1165,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764554695467,"traceId":"45f4427c68eca367"},{"name":"build-module","duration":31,"timestamp":922051883543,"id":1184,"parentId":1175,"tags":{},"startTime":1764554695512,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":46630,"timestamp":922051837044,"id":1170,"parentId":1166,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764554695466,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":47830,"timestamp":922051837052,"id":1174,"parentId":1166,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764554695466,"traceId":"45f4427c68eca367"},{"name":"make","duration":51779,"timestamp":922051833109,"id":1166,"parentId":1165,"tags":{},"startTime":1764554695462,"traceId":"45f4427c68eca367"},{"name":"chunk-graph","duration":645,"timestamp":922051885685,"id":1186,"parentId":1185,"tags":{},"startTime":1764554695514,"traceId":"45f4427c68eca367"},{"name":"optimize-modules","duration":2,"timestamp":922051886337,"id":1188,"parentId":1185,"tags":{},"startTime":1764554695515,"traceId":"45f4427c68eca367"},{"name":"optimize-chunks","duration":19,"timestamp":922051886363,"id":1189,"parentId":1185,"tags":{},"startTime":1764554695515,"traceId":"45f4427c68eca367"},{"name":"optimize-tree","duration":3,"timestamp":922051886387,"id":1190,"parentId":1185,"tags":{},"startTime":1764554695515,"traceId":"45f4427c68eca367"},{"name":"optimize-chunk-modules","duration":1,"timestamp":922051886394,"id":1191,"parentId":1185,"tags":{},"startTime":1764554695515,"traceId":"45f4427c68eca367"},{"name":"optimize","duration":309,"timestamp":922051886334,"id":1187,"parentId":1185,"tags":{},"startTime":1764554695515,"traceId":"45f4427c68eca367"},{"name":"module-hash","duration":177,"timestamp":922051887015,"id":1192,"parentId":1185,"tags":{},"startTime":1764554695516,"traceId":"45f4427c68eca367"},{"name":"code-generation","duration":853,"timestamp":922051887196,"id":1193,"parentId":1185,"tags":{},"startTime":1764554695516,"traceId":"45f4427c68eca367"},{"name":"hash","duration":1922,"timestamp":922051888650,"id":1194,"parentId":1185,"tags":{},"startTime":1764554695517,"traceId":"45f4427c68eca367"},{"name":"code-generation-jobs","duration":80,"timestamp":922051890572,"id":1195,"parentId":1185,"tags":{},"startTime":1764554695519,"traceId":"45f4427c68eca367"},{"name":"module-assets","duration":34,"timestamp":922051890638,"id":1196,"parentId":1185,"tags":{},"startTime":1764554695519,"traceId":"45f4427c68eca367"},{"name":"create-chunk-assets","duration":2598,"timestamp":922051890674,"id":1197,"parentId":1185,"tags":{},"startTime":1764554695519,"traceId":"45f4427c68eca367"},{"name":"NextJsBuildManifest-generateClientManifest","duration":171,"timestamp":922051893944,"id":1199,"parentId":1165,"tags":{},"startTime":1764554695523,"traceId":"45f4427c68eca367"},{"name":"NextJsBuildManifest-createassets","duration":255,"timestamp":922051893864,"id":1198,"parentId":1165,"tags":{},"startTime":1764554695523,"traceId":"45f4427c68eca367"},{"name":"seal","duration":9316,"timestamp":922051885505,"id":1185,"parentId":1165,"tags":{},"startTime":1764554695514,"traceId":"45f4427c68eca367"},{"name":"webpack-compilation","duration":62257,"timestamp":922051832574,"id":1165,"parentId":1126,"tags":{"name":"client"},"startTime":1764554695461,"traceId":"45f4427c68eca367"},{"name":"emit","duration":2939,"timestamp":922051894840,"id":1200,"parentId":1126,"tags":{},"startTime":1764554695524,"traceId":"45f4427c68eca367"},{"name":"webpack-invalidated-client","duration":163872,"timestamp":922051734838,"id":1126,"parentId":3,"tags":{"trigger":"app/gunbuilder/build/page.tsx"},"startTime":1764554695364,"traceId":"45f4427c68eca367"}] [{"name":"client-success","duration":2,"timestamp":922051899975,"id":1201,"parentId":3,"tags":{},"startTime":1764554695529,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":15770,"timestamp":922051901913,"id":1202,"tags":{"url":"/gunbuilder?_rsc=1kvbu","isTurbopack":false},"startTime":1764554695531,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":0,"timestamp":922051917698,"id":1203,"parentId":1202,"tags":{"url":"/gunbuilder?_rsc=1kvbu","memory.rss":"440303616","memory.heapUsed":"153234448","memory.heapTotal":"180649984"},"startTime":1764554695546,"traceId":"45f4427c68eca367"},{"name":"client-hmr-latency","duration":197000,"timestamp":922051735217,"id":1204,"parentId":3,"tags":{"updatedModules":["[project]/node_modules/next/dist/build/polyfills/process.js","[project]/app/gunbuilder/[categoryId]/page.tsx","[project]/app/gunbuilder/[categoryId]/[partId]/data.ts","[project]/app/gunbuilder/[categoryId]/[partId]/page.tsx","[project]/app/gunbuilder/page.tsx","[project]/node_modules/next/dist/compiled/process/browser.js","[project]/app/gunbuilder/build/page.tsx"],"page":"/gunbuilder","isPageHidden":true},"startTime":1764554695561,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":17874,"timestamp":922073323369,"id":1205,"tags":{"url":"/gunbuilder/build?_rsc=1acsq","isTurbopack":false},"startTime":1764554716952,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":1,"timestamp":922073341327,"id":1206,"parentId":1205,"tags":{"url":"/gunbuilder/build?_rsc=1acsq","memory.rss":"439795712","memory.heapUsed":"154955832","memory.heapTotal":"181075968"},"startTime":1764554716970,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":8570,"timestamp":922080321918,"id":1207,"tags":{"url":"/gunbuilder?_rsc=4yi2l","isTurbopack":false},"startTime":1764554723951,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":1,"timestamp":922080330565,"id":1208,"parentId":1207,"tags":{"url":"/gunbuilder?_rsc=4yi2l","memory.rss":"439795712","memory.heapUsed":"155573984","memory.heapTotal":"181075968"},"startTime":1764554723959,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":18568,"timestamp":922090549654,"id":1209,"tags":{"url":"/gunbuilder/barrel?_rsc=1jn8g","isTurbopack":false},"startTime":1764554734178,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":1,"timestamp":922090568300,"id":1210,"parentId":1209,"tags":{"url":"/gunbuilder/barrel?_rsc=1jn8g","memory.rss":"439549952","memory.heapUsed":"157087008","memory.heapTotal":"181567488"},"startTime":1764554734197,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":7898,"timestamp":922092491877,"id":1211,"tags":{"url":"/gunbuilder?select=barrel%3A27&_rsc=2t5kv","isTurbopack":false},"startTime":1764554736121,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":2,"timestamp":922092499819,"id":1212,"parentId":1211,"tags":{"url":"/gunbuilder?select=barrel%3A27&_rsc=2t5kv","memory.rss":"439549952","memory.heapUsed":"157736392","memory.heapTotal":"181567488"},"startTime":1764554736129,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":8992,"timestamp":922092502717,"id":1213,"tags":{"url":"/gunbuilder?select=barrel%3A27&_rsc=1ligc","isTurbopack":false},"startTime":1764554736131,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":2,"timestamp":922092511765,"id":1214,"parentId":1213,"tags":{"url":"/gunbuilder?select=barrel%3A27&_rsc=1ligc","memory.rss":"439713792","memory.heapUsed":"158400264","memory.heapTotal":"181567488"},"startTime":1764554736140,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":9911,"timestamp":922103098941,"id":1215,"tags":{"url":"/gunbuilder?select=barrel%3A192&_rsc=2t5kv","isTurbopack":false},"startTime":1764554746728,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":2,"timestamp":922103108916,"id":1216,"parentId":1215,"tags":{"url":"/gunbuilder?select=barrel%3A192&_rsc=2t5kv","memory.rss":"437501952","memory.heapUsed":"159038744","memory.heapTotal":"182353920"},"startTime":1764554746738,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":9551,"timestamp":922103111570,"id":1217,"tags":{"url":"/gunbuilder?select=barrel%3A192&_rsc=syxlg","isTurbopack":false},"startTime":1764554746740,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":3,"timestamp":922103121173,"id":1218,"parentId":1217,"tags":{"url":"/gunbuilder?select=barrel%3A192&_rsc=syxlg","memory.rss":"438140928","memory.heapUsed":"159690696","memory.heapTotal":"182878208"},"startTime":1764554746750,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":14009,"timestamp":922104706156,"id":1219,"tags":{"url":"/gunbuilder/build?_rsc=1a0sa","isTurbopack":false},"startTime":1764554748335,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":1,"timestamp":922104720210,"id":1220,"parentId":1219,"tags":{"url":"/gunbuilder/build?_rsc=1a0sa","memory.rss":"439615488","memory.heapUsed":"151581600","memory.heapTotal":"185139200"},"startTime":1764554748349,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":10450,"timestamp":922138340276,"id":1231,"parentId":1224,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764554781969,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":11490,"timestamp":922138339983,"id":1225,"parentId":1224,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764554781969,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":13410,"timestamp":922138340266,"id":1230,"parentId":1224,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764554781969,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":15937,"timestamp":922138340250,"id":1229,"parentId":1224,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764554781969,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":16065,"timestamp":922138340190,"id":1227,"parentId":1224,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764554781969,"traceId":"45f4427c68eca367"},{"name":"read-resource","duration":2145,"timestamp":922138354125,"id":1238,"parentId":1237,"tags":{},"startTime":1764554781983,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":12153,"timestamp":922138349095,"id":1236,"parentId":1235,"tags":{},"startTime":1764554781978,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":12382,"timestamp":922138348871,"id":1235,"parentId":1234,"tags":{},"startTime":1764554781977,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":22820,"timestamp":922138348661,"id":1234,"parentId":1223,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/build/page.tsx","layer":"app-pages-browser"},"startTime":1764554781977,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":32111,"timestamp":922138340109,"id":1226,"parentId":1224,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764554781969,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":32968,"timestamp":922138340286,"id":1232,"parentId":1224,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764554781969,"traceId":"45f4427c68eca367"},{"name":"postcss-process","duration":34794,"timestamp":922138356320,"id":1240,"parentId":1239,"tags":{},"startTime":1764554781985,"traceId":"45f4427c68eca367"},{"name":"postcss-loader","duration":35240,"timestamp":922138356298,"id":1239,"parentId":1237,"tags":{},"startTime":1764554781985,"traceId":"45f4427c68eca367"},{"name":"css-loader","duration":4936,"timestamp":922138391559,"id":1241,"parentId":1237,"tags":{"astUsed":"true"},"startTime":1764554782020,"traceId":"45f4427c68eca367"},{"name":"build-module-css","duration":43168,"timestamp":922138353990,"id":1237,"parentId":1233,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764554781983,"traceId":"45f4427c68eca367"},{"name":"build-module-css","duration":50755,"timestamp":922138348137,"id":1233,"parentId":1223,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764554781977,"traceId":"45f4427c68eca367"},{"name":"build-module","duration":20,"timestamp":922138398991,"id":1242,"parentId":1233,"tags":{},"startTime":1764554782028,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":58799,"timestamp":922138340234,"id":1228,"parentId":1224,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764554781969,"traceId":"45f4427c68eca367"},{"name":"make","duration":59538,"timestamp":922138339506,"id":1224,"parentId":1223,"tags":{},"startTime":1764554781968,"traceId":"45f4427c68eca367"},{"name":"chunk-graph","duration":1214,"timestamp":922138408715,"id":1244,"parentId":1243,"tags":{},"startTime":1764554782037,"traceId":"45f4427c68eca367"},{"name":"optimize-modules","duration":9,"timestamp":922138409964,"id":1246,"parentId":1243,"tags":{},"startTime":1764554782039,"traceId":"45f4427c68eca367"},{"name":"optimize-chunks","duration":36,"timestamp":922138409986,"id":1247,"parentId":1243,"tags":{},"startTime":1764554782039,"traceId":"45f4427c68eca367"},{"name":"optimize-tree","duration":5,"timestamp":922138410038,"id":1248,"parentId":1243,"tags":{},"startTime":1764554782039,"traceId":"45f4427c68eca367"},{"name":"optimize-chunk-modules","duration":3,"timestamp":922138410056,"id":1249,"parentId":1243,"tags":{},"startTime":1764554782039,"traceId":"45f4427c68eca367"},{"name":"optimize","duration":387,"timestamp":922138409956,"id":1245,"parentId":1243,"tags":{},"startTime":1764554782039,"traceId":"45f4427c68eca367"},{"name":"module-hash","duration":306,"timestamp":922138410882,"id":1250,"parentId":1243,"tags":{},"startTime":1764554782039,"traceId":"45f4427c68eca367"},{"name":"code-generation","duration":1359,"timestamp":922138411194,"id":1251,"parentId":1243,"tags":{},"startTime":1764554782040,"traceId":"45f4427c68eca367"},{"name":"hash","duration":2037,"timestamp":922138413471,"id":1252,"parentId":1243,"tags":{},"startTime":1764554782042,"traceId":"45f4427c68eca367"},{"name":"code-generation-jobs","duration":90,"timestamp":922138415507,"id":1253,"parentId":1243,"tags":{},"startTime":1764554782044,"traceId":"45f4427c68eca367"},{"name":"module-assets","duration":36,"timestamp":922138415591,"id":1254,"parentId":1243,"tags":{},"startTime":1764554782044,"traceId":"45f4427c68eca367"},{"name":"create-chunk-assets","duration":3287,"timestamp":922138415630,"id":1255,"parentId":1243,"tags":{},"startTime":1764554782044,"traceId":"45f4427c68eca367"},{"name":"NextJsBuildManifest-generateClientManifest","duration":53,"timestamp":922138419431,"id":1257,"parentId":1223,"tags":{},"startTime":1764554782048,"traceId":"45f4427c68eca367"},{"name":"NextJsBuildManifest-createassets","duration":94,"timestamp":922138419395,"id":1256,"parentId":1223,"tags":{},"startTime":1764554782048,"traceId":"45f4427c68eca367"},{"name":"seal","duration":17985,"timestamp":922138408449,"id":1243,"parentId":1223,"tags":{},"startTime":1764554782037,"traceId":"45f4427c68eca367"},{"name":"webpack-compilation","duration":87548,"timestamp":922138338908,"id":1223,"parentId":1221,"tags":{"name":"client"},"startTime":1764554781968,"traceId":"45f4427c68eca367"},{"name":"emit","duration":2932,"timestamp":922138426474,"id":1258,"parentId":1221,"tags":{},"startTime":1764554782055,"traceId":"45f4427c68eca367"},{"name":"webpack-invalidated-client","duration":99462,"timestamp":922138330369,"id":1221,"parentId":3,"tags":{"trigger":"app/gunbuilder/build/page.tsx"},"startTime":1764554781959,"traceId":"45f4427c68eca367"},{"name":"client-success","duration":1,"timestamp":922138432399,"id":1261,"parentId":3,"tags":{},"startTime":1764554782061,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":4041,"timestamp":922138434084,"id":1263,"parentId":1260,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764554782063,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":4044,"timestamp":922138434087,"id":1264,"parentId":1260,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764554782063,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":4043,"timestamp":922138434092,"id":1265,"parentId":1260,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764554782063,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":1069,"timestamp":922138437725,"id":1268,"parentId":1267,"tags":{},"startTime":1764554782066,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":1133,"timestamp":922138437663,"id":1267,"parentId":1266,"tags":{},"startTime":1764554782066,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":2058,"timestamp":922138437482,"id":1266,"parentId":1259,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/build/page.tsx","layer":"rsc"},"startTime":1764554782066,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":5818,"timestamp":922138434045,"id":1262,"parentId":1260,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764554782063,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":2631,"timestamp":922138441343,"id":1283,"parentId":1282,"tags":{},"startTime":1764554782070,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":2685,"timestamp":922138441295,"id":1282,"parentId":1281,"tags":{},"startTime":1764554782070,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":5907,"timestamp":922138441212,"id":1281,"parentId":1259,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/build/page.tsx","layer":"ssr"},"startTime":1764554782070,"traceId":"45f4427c68eca367"},{"name":"client-hmr-latency","duration":115000,"timestamp":922138331546,"id":1284,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/build/page.tsx"],"page":"/gunbuilder/build","isPageHidden":true},"startTime":1764554782076,"traceId":"45f4427c68eca367"},{"name":"make","duration":15886,"timestamp":922138431788,"id":1260,"parentId":1259,"tags":{},"startTime":1764554782060,"traceId":"45f4427c68eca367"},{"name":"chunk-graph","duration":1330,"timestamp":922138452467,"id":1286,"parentId":1285,"tags":{},"startTime":1764554782081,"traceId":"45f4427c68eca367"},{"name":"optimize-modules","duration":2,"timestamp":922138453812,"id":1288,"parentId":1285,"tags":{},"startTime":1764554782082,"traceId":"45f4427c68eca367"},{"name":"optimize-chunks","duration":1001,"timestamp":922138453824,"id":1289,"parentId":1285,"tags":{},"startTime":1764554782082,"traceId":"45f4427c68eca367"},{"name":"optimize-tree","duration":3,"timestamp":922138454836,"id":1290,"parentId":1285,"tags":{},"startTime":1764554782083,"traceId":"45f4427c68eca367"},{"name":"optimize-chunk-modules","duration":2,"timestamp":922138454847,"id":1291,"parentId":1285,"tags":{},"startTime":1764554782083,"traceId":"45f4427c68eca367"},{"name":"optimize","duration":1233,"timestamp":922138453808,"id":1287,"parentId":1285,"tags":{},"startTime":1764554782082,"traceId":"45f4427c68eca367"},{"name":"module-hash","duration":233,"timestamp":922138455497,"id":1292,"parentId":1285,"tags":{},"startTime":1764554782084,"traceId":"45f4427c68eca367"},{"name":"code-generation","duration":896,"timestamp":922138455736,"id":1293,"parentId":1285,"tags":{},"startTime":1764554782084,"traceId":"45f4427c68eca367"},{"name":"hash","duration":593,"timestamp":922138457112,"id":1294,"parentId":1285,"tags":{},"startTime":1764554782086,"traceId":"45f4427c68eca367"},{"name":"code-generation-jobs","duration":57,"timestamp":922138457705,"id":1295,"parentId":1285,"tags":{},"startTime":1764554782086,"traceId":"45f4427c68eca367"},{"name":"module-assets","duration":20,"timestamp":922138457758,"id":1296,"parentId":1285,"tags":{},"startTime":1764554782086,"traceId":"45f4427c68eca367"},{"name":"create-chunk-assets","duration":1493,"timestamp":922138457781,"id":1297,"parentId":1285,"tags":{},"startTime":1764554782086,"traceId":"45f4427c68eca367"},{"name":"seal","duration":7940,"timestamp":922138452249,"id":1285,"parentId":1259,"tags":{},"startTime":1764554782081,"traceId":"45f4427c68eca367"},{"name":"webpack-compilation","duration":30158,"timestamp":922138431480,"id":1259,"parentId":1222,"tags":{"name":"server"},"startTime":1764554782060,"traceId":"45f4427c68eca367"},{"name":"emit","duration":1697,"timestamp":922138461665,"id":1298,"parentId":1222,"tags":{},"startTime":1764554782090,"traceId":"45f4427c68eca367"},{"name":"webpack-invalidated-server","duration":132994,"timestamp":922138330844,"id":1222,"parentId":3,"tags":{"trigger":"app/gunbuilder/build/page.tsx"},"startTime":1764554781959,"traceId":"45f4427c68eca367"}] +[{"name":"handle-request","duration":10472,"timestamp":922138473444,"id":1299,"tags":{"url":"/gunbuilder/build?_rsc=1ure6","isTurbopack":false},"startTime":1764554782102,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":0,"timestamp":922138483933,"id":1300,"parentId":1299,"tags":{"url":"/gunbuilder/build?_rsc=1ure6","memory.rss":"461176832","memory.heapUsed":"155655192","memory.heapTotal":"193069056"},"startTime":1764554782113,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":22239,"timestamp":922173591287,"id":1301,"tags":{"url":"/gunbuilder?_rsc=x5p1f","isTurbopack":false},"startTime":1764554817220,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":2,"timestamp":922173613592,"id":1302,"parentId":1301,"tags":{"url":"/gunbuilder?_rsc=x5p1f","memory.rss":"400752640","memory.heapUsed":"140156136","memory.heapTotal":"146210816"},"startTime":1764554817242,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":20819,"timestamp":922174973263,"id":1303,"tags":{"url":"/gunbuilder/upper?_rsc=1jn8g","isTurbopack":false},"startTime":1764554818602,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":1,"timestamp":922174994162,"id":1304,"parentId":1303,"tags":{"url":"/gunbuilder/upper?_rsc=1jn8g","memory.rss":"402096128","memory.heapUsed":"140835560","memory.heapTotal":"147226624"},"startTime":1764554818623,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":15541,"timestamp":922472342537,"id":1310,"parentId":1308,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555115975,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":15549,"timestamp":922472342548,"id":1311,"parentId":1308,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555115975,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":15550,"timestamp":922472342556,"id":1312,"parentId":1308,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555115975,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":2060,"timestamp":922472357197,"id":1315,"parentId":1314,"tags":{},"startTime":1764555115989,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":2223,"timestamp":922472357039,"id":1314,"parentId":1313,"tags":{},"startTime":1764555115989,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":5600,"timestamp":922472356576,"id":1313,"parentId":1307,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"rsc"},"startTime":1764555115989,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":51635,"timestamp":922472342429,"id":1309,"parentId":1308,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555115975,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":2733,"timestamp":922472408252,"id":1330,"parentId":1329,"tags":{},"startTime":1764555116040,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":2863,"timestamp":922472408133,"id":1329,"parentId":1328,"tags":{},"startTime":1764555116040,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":10867,"timestamp":922472407958,"id":1328,"parentId":1307,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"ssr"},"startTime":1764555116040,"traceId":"45f4427c68eca367"},{"name":"make","duration":80588,"timestamp":922472339131,"id":1308,"parentId":1307,"tags":{},"startTime":1764555115971,"traceId":"45f4427c68eca367"},{"name":"chunk-graph","duration":1597,"timestamp":922472421032,"id":1332,"parentId":1331,"tags":{},"startTime":1764555116053,"traceId":"45f4427c68eca367"},{"name":"optimize-modules","duration":3,"timestamp":922472422645,"id":1334,"parentId":1331,"tags":{},"startTime":1764555116055,"traceId":"45f4427c68eca367"},{"name":"optimize-chunks","duration":947,"timestamp":922472422687,"id":1335,"parentId":1331,"tags":{},"startTime":1764555116055,"traceId":"45f4427c68eca367"},{"name":"optimize-tree","duration":5,"timestamp":922472423672,"id":1336,"parentId":1331,"tags":{},"startTime":1764555116056,"traceId":"45f4427c68eca367"},{"name":"optimize-chunk-modules","duration":2,"timestamp":922472423703,"id":1337,"parentId":1331,"tags":{},"startTime":1764555116056,"traceId":"45f4427c68eca367"},{"name":"optimize","duration":1251,"timestamp":922472422642,"id":1333,"parentId":1331,"tags":{},"startTime":1764555116055,"traceId":"45f4427c68eca367"},{"name":"module-hash","duration":209,"timestamp":922472424267,"id":1338,"parentId":1331,"tags":{},"startTime":1764555116056,"traceId":"45f4427c68eca367"},{"name":"code-generation","duration":1057,"timestamp":922472424480,"id":1339,"parentId":1331,"tags":{},"startTime":1764555116057,"traceId":"45f4427c68eca367"},{"name":"hash","duration":908,"timestamp":922472426114,"id":1340,"parentId":1331,"tags":{},"startTime":1764555116058,"traceId":"45f4427c68eca367"},{"name":"code-generation-jobs","duration":74,"timestamp":922472427022,"id":1341,"parentId":1331,"tags":{},"startTime":1764555116059,"traceId":"45f4427c68eca367"},{"name":"module-assets","duration":27,"timestamp":922472427090,"id":1342,"parentId":1331,"tags":{},"startTime":1764555116059,"traceId":"45f4427c68eca367"},{"name":"create-chunk-assets","duration":2032,"timestamp":922472427119,"id":1343,"parentId":1331,"tags":{},"startTime":1764555116059,"traceId":"45f4427c68eca367"},{"name":"seal","duration":9271,"timestamp":922472420851,"id":1331,"parentId":1307,"tags":{},"startTime":1764555116053,"traceId":"45f4427c68eca367"},{"name":"webpack-compilation","duration":93762,"timestamp":922472337721,"id":1307,"parentId":1305,"tags":{"name":"server"},"startTime":1764555115970,"traceId":"45f4427c68eca367"},{"name":"emit","duration":1476,"timestamp":922472431494,"id":1344,"parentId":1305,"tags":{},"startTime":1764555116064,"traceId":"45f4427c68eca367"},{"name":"webpack-invalidated-server","duration":106621,"timestamp":922472326665,"id":1305,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764555115959,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":2446,"timestamp":922472438949,"id":1354,"parentId":1346,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555116071,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":2659,"timestamp":922472438913,"id":1347,"parentId":1346,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764555116071,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":3258,"timestamp":922472438945,"id":1352,"parentId":1346,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555116071,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":4193,"timestamp":922472438943,"id":1351,"parentId":1346,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555116071,"traceId":"45f4427c68eca367"},{"name":"read-resource","duration":752,"timestamp":922472442399,"id":1360,"parentId":1359,"tags":{},"startTime":1764555116075,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":7845,"timestamp":922472438936,"id":1348,"parentId":1346,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764555116071,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":7846,"timestamp":922472438939,"id":1349,"parentId":1346,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555116071,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":6032,"timestamp":922472440894,"id":1358,"parentId":1357,"tags":{},"startTime":1764555116073,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":6094,"timestamp":922472440832,"id":1357,"parentId":1356,"tags":{},"startTime":1764555116073,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":12625,"timestamp":922472440768,"id":1356,"parentId":1345,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"app-pages-browser"},"startTime":1764555116073,"traceId":"45f4427c68eca367"},{"name":"postcss-process","duration":29464,"timestamp":922472443187,"id":1362,"parentId":1361,"tags":{},"startTime":1764555116075,"traceId":"45f4427c68eca367"},{"name":"postcss-loader","duration":29815,"timestamp":922472443173,"id":1361,"parentId":1359,"tags":{},"startTime":1764555116075,"traceId":"45f4427c68eca367"},{"name":"css-loader","duration":4078,"timestamp":922472473014,"id":1363,"parentId":1359,"tags":{"astUsed":"true"},"startTime":1764555116105,"traceId":"45f4427c68eca367"},{"name":"build-module-css","duration":35912,"timestamp":922472442280,"id":1359,"parentId":1355,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764555116074,"traceId":"45f4427c68eca367"},{"name":"build-module-css","duration":45763,"timestamp":922472440253,"id":1355,"parentId":1345,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764555116072,"traceId":"45f4427c68eca367"},{"name":"build-module","duration":39,"timestamp":922472489032,"id":1364,"parentId":1355,"tags":{},"startTime":1764555116121,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":50538,"timestamp":922472438941,"id":1350,"parentId":1346,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555116071,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":56090,"timestamp":922472438947,"id":1353,"parentId":1346,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555116071,"traceId":"45f4427c68eca367"},{"name":"make","duration":60216,"timestamp":922472434833,"id":1346,"parentId":1345,"tags":{},"startTime":1764555116067,"traceId":"45f4427c68eca367"},{"name":"chunk-graph","duration":1006,"timestamp":922472496144,"id":1366,"parentId":1365,"tags":{},"startTime":1764555116128,"traceId":"45f4427c68eca367"},{"name":"optimize-modules","duration":3,"timestamp":922472497162,"id":1368,"parentId":1365,"tags":{},"startTime":1764555116129,"traceId":"45f4427c68eca367"},{"name":"optimize-chunks","duration":29,"timestamp":922472497203,"id":1369,"parentId":1365,"tags":{},"startTime":1764555116129,"traceId":"45f4427c68eca367"},{"name":"optimize-tree","duration":4,"timestamp":922472497243,"id":1370,"parentId":1365,"tags":{},"startTime":1764555116129,"traceId":"45f4427c68eca367"},{"name":"optimize-chunk-modules","duration":3,"timestamp":922472497261,"id":1371,"parentId":1365,"tags":{},"startTime":1764555116129,"traceId":"45f4427c68eca367"},{"name":"optimize","duration":368,"timestamp":922472497159,"id":1367,"parentId":1365,"tags":{},"startTime":1764555116129,"traceId":"45f4427c68eca367"},{"name":"module-hash","duration":315,"timestamp":922472498072,"id":1372,"parentId":1365,"tags":{},"startTime":1764555116130,"traceId":"45f4427c68eca367"},{"name":"code-generation","duration":1314,"timestamp":922472498392,"id":1373,"parentId":1365,"tags":{},"startTime":1764555116131,"traceId":"45f4427c68eca367"},{"name":"hash","duration":2316,"timestamp":922472500559,"id":1374,"parentId":1365,"tags":{},"startTime":1764555116133,"traceId":"45f4427c68eca367"},{"name":"code-generation-jobs","duration":75,"timestamp":922472502875,"id":1375,"parentId":1365,"tags":{},"startTime":1764555116135,"traceId":"45f4427c68eca367"},{"name":"module-assets","duration":29,"timestamp":922472502944,"id":1376,"parentId":1365,"tags":{},"startTime":1764555116135,"traceId":"45f4427c68eca367"},{"name":"create-chunk-assets","duration":7368,"timestamp":922472502976,"id":1377,"parentId":1365,"tags":{},"startTime":1764555116135,"traceId":"45f4427c68eca367"},{"name":"NextJsBuildManifest-generateClientManifest","duration":203,"timestamp":922472511173,"id":1379,"parentId":1345,"tags":{},"startTime":1764555116143,"traceId":"45f4427c68eca367"},{"name":"NextJsBuildManifest-createassets","duration":280,"timestamp":922472511100,"id":1378,"parentId":1345,"tags":{},"startTime":1764555116143,"traceId":"45f4427c68eca367"},{"name":"seal","duration":16211,"timestamp":922472495913,"id":1365,"parentId":1345,"tags":{},"startTime":1764555116128,"traceId":"45f4427c68eca367"},{"name":"webpack-compilation","duration":77843,"timestamp":922472434295,"id":1345,"parentId":1306,"tags":{"name":"client"},"startTime":1764555116066,"traceId":"45f4427c68eca367"},{"name":"emit","duration":2608,"timestamp":922472512149,"id":1380,"parentId":1306,"tags":{},"startTime":1764555116144,"traceId":"45f4427c68eca367"},{"name":"webpack-invalidated-client","duration":188910,"timestamp":922472326823,"id":1306,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764555115959,"traceId":"45f4427c68eca367"}] +[{"name":"client-success","duration":3,"timestamp":922472516237,"id":1381,"parentId":3,"tags":{},"startTime":1764555116148,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":17746,"timestamp":922472518984,"id":1382,"tags":{"url":"/gunbuilder/upper?_rsc=5ur2j","isTurbopack":false},"startTime":1764555116151,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":0,"timestamp":922472536745,"id":1383,"parentId":1382,"tags":{"url":"/gunbuilder/upper?_rsc=5ur2j","memory.rss":"447086592","memory.heapUsed":"160278944","memory.heapTotal":"184254464"},"startTime":1764555116169,"traceId":"45f4427c68eca367"},{"name":"client-hmr-latency","duration":221000,"timestamp":922472327158,"id":1384,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/[categoryId]/page.tsx"],"page":"/gunbuilder/upper","isPageHidden":false},"startTime":1764555116180,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":12444,"timestamp":922572339147,"id":1396,"parentId":1388,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555215971,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":13148,"timestamp":922572339033,"id":1389,"parentId":1388,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764555215971,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":17451,"timestamp":922572339139,"id":1394,"parentId":1388,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555215971,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":9321,"timestamp":922572349877,"id":1400,"parentId":1399,"tags":{},"startTime":1764555215982,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":9612,"timestamp":922572349592,"id":1399,"parentId":1398,"tags":{},"startTime":1764555215982,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":19931,"timestamp":922572349345,"id":1398,"parentId":1387,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"app-pages-browser"},"startTime":1764555215981,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":31318,"timestamp":922572339133,"id":1393,"parentId":1388,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555215971,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":31886,"timestamp":922572339124,"id":1391,"parentId":1388,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555215971,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":31869,"timestamp":922572339143,"id":1395,"parentId":1388,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555215971,"traceId":"45f4427c68eca367"},{"name":"read-resource","duration":13573,"timestamp":922572357457,"id":1402,"parentId":1401,"tags":{},"startTime":1764555215990,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":36621,"timestamp":922572339116,"id":1390,"parentId":1388,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764555215971,"traceId":"45f4427c68eca367"},{"name":"postcss-process","duration":17168,"timestamp":922572371074,"id":1404,"parentId":1403,"tags":{},"startTime":1764555216003,"traceId":"45f4427c68eca367"},{"name":"postcss-loader","duration":17549,"timestamp":922572371055,"id":1403,"parentId":1401,"tags":{},"startTime":1764555216003,"traceId":"45f4427c68eca367"},{"name":"css-loader","duration":3772,"timestamp":922572388631,"id":1405,"parentId":1401,"tags":{"astUsed":"true"},"startTime":1764555216021,"traceId":"45f4427c68eca367"},{"name":"build-module-css","duration":36809,"timestamp":922572357024,"id":1401,"parentId":1397,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764555215989,"traceId":"45f4427c68eca367"},{"name":"build-module-css","duration":49020,"timestamp":922572347267,"id":1397,"parentId":1387,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764555215979,"traceId":"45f4427c68eca367"},{"name":"build-module","duration":31,"timestamp":922572396407,"id":1406,"parentId":1397,"tags":{},"startTime":1764555216029,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":57330,"timestamp":922572339129,"id":1392,"parentId":1388,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555215971,"traceId":"45f4427c68eca367"},{"name":"make","duration":57994,"timestamp":922572338473,"id":1388,"parentId":1387,"tags":{},"startTime":1764555215971,"traceId":"45f4427c68eca367"},{"name":"chunk-graph","duration":947,"timestamp":922572402820,"id":1408,"parentId":1407,"tags":{},"startTime":1764555216035,"traceId":"45f4427c68eca367"},{"name":"optimize-modules","duration":4,"timestamp":922572403780,"id":1410,"parentId":1407,"tags":{},"startTime":1764555216036,"traceId":"45f4427c68eca367"},{"name":"optimize-chunks","duration":31,"timestamp":922572403817,"id":1411,"parentId":1407,"tags":{},"startTime":1764555216036,"traceId":"45f4427c68eca367"},{"name":"optimize-tree","duration":5,"timestamp":922572403871,"id":1412,"parentId":1407,"tags":{},"startTime":1764555216036,"traceId":"45f4427c68eca367"},{"name":"optimize-chunk-modules","duration":3,"timestamp":922572403896,"id":1413,"parentId":1407,"tags":{},"startTime":1764555216036,"traceId":"45f4427c68eca367"},{"name":"optimize","duration":366,"timestamp":922572403776,"id":1409,"parentId":1407,"tags":{},"startTime":1764555216036,"traceId":"45f4427c68eca367"},{"name":"module-hash","duration":334,"timestamp":922572416417,"id":1414,"parentId":1407,"tags":{},"startTime":1764555216049,"traceId":"45f4427c68eca367"},{"name":"code-generation","duration":1290,"timestamp":922572416763,"id":1415,"parentId":1407,"tags":{},"startTime":1764555216049,"traceId":"45f4427c68eca367"},{"name":"hash","duration":2163,"timestamp":922572418894,"id":1416,"parentId":1407,"tags":{},"startTime":1764555216051,"traceId":"45f4427c68eca367"},{"name":"code-generation-jobs","duration":97,"timestamp":922572421057,"id":1417,"parentId":1407,"tags":{},"startTime":1764555216053,"traceId":"45f4427c68eca367"},{"name":"module-assets","duration":39,"timestamp":922572421146,"id":1418,"parentId":1407,"tags":{},"startTime":1764555216053,"traceId":"45f4427c68eca367"},{"name":"create-chunk-assets","duration":2796,"timestamp":922572421187,"id":1419,"parentId":1407,"tags":{},"startTime":1764555216053,"traceId":"45f4427c68eca367"},{"name":"NextJsBuildManifest-generateClientManifest","duration":185,"timestamp":922572424748,"id":1421,"parentId":1387,"tags":{},"startTime":1764555216057,"traceId":"45f4427c68eca367"},{"name":"NextJsBuildManifest-createassets","duration":266,"timestamp":922572424670,"id":1420,"parentId":1387,"tags":{},"startTime":1764555216057,"traceId":"45f4427c68eca367"},{"name":"seal","duration":23172,"timestamp":922572402560,"id":1407,"parentId":1387,"tags":{},"startTime":1764555216035,"traceId":"45f4427c68eca367"},{"name":"webpack-compilation","duration":88984,"timestamp":922572336766,"id":1387,"parentId":1385,"tags":{"name":"client"},"startTime":1764555215969,"traceId":"45f4427c68eca367"},{"name":"emit","duration":2977,"timestamp":922572425760,"id":1422,"parentId":1385,"tags":{},"startTime":1764555216058,"traceId":"45f4427c68eca367"},{"name":"webpack-invalidated-client","duration":102175,"timestamp":922572327112,"id":1385,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764555215959,"traceId":"45f4427c68eca367"},{"name":"client-success","duration":1,"timestamp":922572431352,"id":1425,"parentId":3,"tags":{},"startTime":1764555216063,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":4692,"timestamp":922572433321,"id":1427,"parentId":1424,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555216065,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":4701,"timestamp":922572433324,"id":1428,"parentId":1424,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555216065,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":4699,"timestamp":922572433330,"id":1429,"parentId":1424,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555216065,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":1875,"timestamp":922572437431,"id":1432,"parentId":1431,"tags":{},"startTime":1764555216070,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":1990,"timestamp":922572437320,"id":1431,"parentId":1430,"tags":{},"startTime":1764555216069,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":3364,"timestamp":922572437088,"id":1430,"parentId":1423,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"rsc"},"startTime":1764555216069,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":7775,"timestamp":922572433282,"id":1426,"parentId":1424,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555216065,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":2982,"timestamp":922572442524,"id":1447,"parentId":1446,"tags":{},"startTime":1764555216075,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":3048,"timestamp":922572442466,"id":1446,"parentId":1445,"tags":{},"startTime":1764555216075,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":7909,"timestamp":922572442350,"id":1445,"parentId":1423,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"ssr"},"startTime":1764555216074,"traceId":"45f4427c68eca367"},{"name":"make","duration":20120,"timestamp":922572430750,"id":1424,"parentId":1423,"tags":{},"startTime":1764555216063,"traceId":"45f4427c68eca367"},{"name":"client-hmr-latency","duration":123000,"timestamp":922572327655,"id":1448,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/[categoryId]/page.tsx"],"page":"/gunbuilder/upper","isPageHidden":false},"startTime":1764555216084,"traceId":"45f4427c68eca367"},{"name":"chunk-graph","duration":1417,"timestamp":922572456808,"id":1450,"parentId":1449,"tags":{},"startTime":1764555216089,"traceId":"45f4427c68eca367"},{"name":"optimize-modules","duration":8,"timestamp":922572458239,"id":1452,"parentId":1449,"tags":{},"startTime":1764555216090,"traceId":"45f4427c68eca367"},{"name":"optimize-chunks","duration":1234,"timestamp":922572458313,"id":1453,"parentId":1449,"tags":{},"startTime":1764555216090,"traceId":"45f4427c68eca367"},{"name":"optimize-tree","duration":3,"timestamp":922572459562,"id":1454,"parentId":1449,"tags":{},"startTime":1764555216092,"traceId":"45f4427c68eca367"},{"name":"optimize-chunk-modules","duration":2,"timestamp":922572459573,"id":1455,"parentId":1449,"tags":{},"startTime":1764555216092,"traceId":"45f4427c68eca367"},{"name":"optimize","duration":1558,"timestamp":922572458235,"id":1451,"parentId":1449,"tags":{},"startTime":1764555216090,"traceId":"45f4427c68eca367"},{"name":"module-hash","duration":275,"timestamp":922572460344,"id":1456,"parentId":1449,"tags":{},"startTime":1764555216092,"traceId":"45f4427c68eca367"},{"name":"code-generation","duration":1234,"timestamp":922572460624,"id":1457,"parentId":1449,"tags":{},"startTime":1764555216093,"traceId":"45f4427c68eca367"},{"name":"hash","duration":1047,"timestamp":922572462448,"id":1458,"parentId":1449,"tags":{},"startTime":1764555216095,"traceId":"45f4427c68eca367"},{"name":"code-generation-jobs","duration":85,"timestamp":922572463495,"id":1459,"parentId":1449,"tags":{},"startTime":1764555216096,"traceId":"45f4427c68eca367"},{"name":"module-assets","duration":32,"timestamp":922572463576,"id":1460,"parentId":1449,"tags":{},"startTime":1764555216096,"traceId":"45f4427c68eca367"},{"name":"create-chunk-assets","duration":1572,"timestamp":922572463611,"id":1461,"parentId":1449,"tags":{},"startTime":1764555216096,"traceId":"45f4427c68eca367"},{"name":"seal","duration":9747,"timestamp":922572456592,"id":1449,"parentId":1423,"tags":{},"startTime":1764555216089,"traceId":"45f4427c68eca367"},{"name":"webpack-compilation","duration":37359,"timestamp":922572430480,"id":1423,"parentId":1386,"tags":{"name":"server"},"startTime":1764555216063,"traceId":"45f4427c68eca367"},{"name":"emit","duration":11619,"timestamp":922572467863,"id":1462,"parentId":1386,"tags":{},"startTime":1764555216100,"traceId":"45f4427c68eca367"},{"name":"webpack-invalidated-server","duration":152729,"timestamp":922572327851,"id":1386,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764555215960,"traceId":"45f4427c68eca367"}] +[{"name":"handle-request","duration":21699,"timestamp":922572484831,"id":1463,"tags":{"url":"/gunbuilder/upper?_rsc=igmto","isTurbopack":false},"startTime":1764555216117,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":1,"timestamp":922572506554,"id":1464,"parentId":1463,"tags":{"url":"/gunbuilder/upper?_rsc=igmto","memory.rss":"451002368","memory.heapUsed":"157332208","memory.heapTotal":"181747712"},"startTime":1764555216139,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":13322,"timestamp":922607947225,"id":1470,"parentId":1468,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555251579,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":13326,"timestamp":922607947239,"id":1471,"parentId":1468,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555251579,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":13326,"timestamp":922607947249,"id":1472,"parentId":1468,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555251579,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":2230,"timestamp":922607959596,"id":1475,"parentId":1474,"tags":{},"startTime":1764555251592,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":2419,"timestamp":922607959414,"id":1474,"parentId":1473,"tags":{},"startTime":1764555251592,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":4562,"timestamp":922607958933,"id":1473,"parentId":1467,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"rsc"},"startTime":1764555251591,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":16983,"timestamp":922607947102,"id":1469,"parentId":1468,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555251579,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":6007,"timestamp":922607967329,"id":1490,"parentId":1489,"tags":{},"startTime":1764555251599,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":6175,"timestamp":922607967167,"id":1489,"parentId":1488,"tags":{},"startTime":1764555251599,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":10469,"timestamp":922607966918,"id":1488,"parentId":1467,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"ssr"},"startTime":1764555251599,"traceId":"45f4427c68eca367"},{"name":"make","duration":36096,"timestamp":922607944083,"id":1468,"parentId":1467,"tags":{},"startTime":1764555251576,"traceId":"45f4427c68eca367"},{"name":"chunk-graph","duration":1381,"timestamp":922607981478,"id":1492,"parentId":1491,"tags":{},"startTime":1764555251614,"traceId":"45f4427c68eca367"},{"name":"optimize-modules","duration":8,"timestamp":922607982881,"id":1494,"parentId":1491,"tags":{},"startTime":1764555251615,"traceId":"45f4427c68eca367"},{"name":"optimize-chunks","duration":1058,"timestamp":922607982902,"id":1495,"parentId":1491,"tags":{},"startTime":1764555251615,"traceId":"45f4427c68eca367"},{"name":"optimize-tree","duration":5,"timestamp":922607983975,"id":1496,"parentId":1491,"tags":{},"startTime":1764555251616,"traceId":"45f4427c68eca367"},{"name":"optimize-chunk-modules","duration":2,"timestamp":922607983989,"id":1497,"parentId":1491,"tags":{},"startTime":1764555251616,"traceId":"45f4427c68eca367"},{"name":"optimize","duration":1247,"timestamp":922607982873,"id":1493,"parentId":1491,"tags":{},"startTime":1764555251615,"traceId":"45f4427c68eca367"},{"name":"module-hash","duration":255,"timestamp":922607984596,"id":1498,"parentId":1491,"tags":{},"startTime":1764555251617,"traceId":"45f4427c68eca367"},{"name":"code-generation","duration":1089,"timestamp":922607984856,"id":1499,"parentId":1491,"tags":{},"startTime":1764555251617,"traceId":"45f4427c68eca367"},{"name":"hash","duration":1413,"timestamp":922607986842,"id":1500,"parentId":1491,"tags":{},"startTime":1764555251619,"traceId":"45f4427c68eca367"},{"name":"code-generation-jobs","duration":112,"timestamp":922607988254,"id":1501,"parentId":1491,"tags":{},"startTime":1764555251620,"traceId":"45f4427c68eca367"},{"name":"module-assets","duration":44,"timestamp":922607988357,"id":1502,"parentId":1491,"tags":{},"startTime":1764555251620,"traceId":"45f4427c68eca367"},{"name":"create-chunk-assets","duration":2246,"timestamp":922607988405,"id":1503,"parentId":1491,"tags":{},"startTime":1764555251621,"traceId":"45f4427c68eca367"},{"name":"seal","duration":10423,"timestamp":922607981277,"id":1491,"parentId":1467,"tags":{},"startTime":1764555251613,"traceId":"45f4427c68eca367"},{"name":"webpack-compilation","duration":49740,"timestamp":922607943401,"id":1467,"parentId":1465,"tags":{"name":"server"},"startTime":1764555251576,"traceId":"45f4427c68eca367"},{"name":"emit","duration":1646,"timestamp":922607993161,"id":1504,"parentId":1465,"tags":{},"startTime":1764555251625,"traceId":"45f4427c68eca367"},{"name":"webpack-invalidated-server","duration":62995,"timestamp":922607931996,"id":1465,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764555251564,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":7209,"timestamp":922608000151,"id":1514,"parentId":1506,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555251632,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":7485,"timestamp":922608000100,"id":1507,"parentId":1506,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764555251632,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":8072,"timestamp":922608000144,"id":1512,"parentId":1506,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555251632,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":8882,"timestamp":922608000141,"id":1511,"parentId":1506,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555251632,"traceId":"45f4427c68eca367"},{"name":"read-resource","duration":684,"timestamp":922608008347,"id":1520,"parentId":1519,"tags":{},"startTime":1764555251640,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":11217,"timestamp":922608000131,"id":1508,"parentId":1506,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764555251632,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":11218,"timestamp":922608000135,"id":1509,"parentId":1506,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555251632,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":4755,"timestamp":922608006735,"id":1518,"parentId":1517,"tags":{},"startTime":1764555251639,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":4858,"timestamp":922608006634,"id":1517,"parentId":1516,"tags":{},"startTime":1764555251639,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":9206,"timestamp":922608006554,"id":1516,"parentId":1505,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"app-pages-browser"},"startTime":1764555251639,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":16593,"timestamp":922608000149,"id":1513,"parentId":1506,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555251632,"traceId":"45f4427c68eca367"},{"name":"postcss-process","duration":19746,"timestamp":922608009053,"id":1522,"parentId":1521,"tags":{},"startTime":1764555251641,"traceId":"45f4427c68eca367"},{"name":"postcss-loader","duration":20055,"timestamp":922608009044,"id":1521,"parentId":1519,"tags":{},"startTime":1764555251641,"traceId":"45f4427c68eca367"},{"name":"css-loader","duration":2917,"timestamp":922608029122,"id":1523,"parentId":1519,"tags":{"astUsed":"true"},"startTime":1764555251661,"traceId":"45f4427c68eca367"},{"name":"build-module-css","duration":24355,"timestamp":922608008288,"id":1519,"parentId":1515,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764555251640,"traceId":"45f4427c68eca367"},{"name":"build-module-css","duration":28882,"timestamp":922608006333,"id":1515,"parentId":1505,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764555251638,"traceId":"45f4427c68eca367"},{"name":"build-module","duration":16,"timestamp":922608035361,"id":1524,"parentId":1515,"tags":{},"startTime":1764555251667,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":35259,"timestamp":922608000138,"id":1510,"parentId":1506,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555251632,"traceId":"45f4427c68eca367"},{"name":"make","duration":39337,"timestamp":922607996096,"id":1506,"parentId":1505,"tags":{},"startTime":1764555251628,"traceId":"45f4427c68eca367"},{"name":"chunk-graph","duration":629,"timestamp":922608036401,"id":1526,"parentId":1525,"tags":{},"startTime":1764555251669,"traceId":"45f4427c68eca367"},{"name":"optimize-modules","duration":2,"timestamp":922608037040,"id":1528,"parentId":1525,"tags":{},"startTime":1764555251669,"traceId":"45f4427c68eca367"},{"name":"optimize-chunks","duration":24,"timestamp":922608037052,"id":1529,"parentId":1525,"tags":{},"startTime":1764555251669,"traceId":"45f4427c68eca367"},{"name":"optimize-tree","duration":2,"timestamp":922608037084,"id":1530,"parentId":1525,"tags":{},"startTime":1764555251669,"traceId":"45f4427c68eca367"},{"name":"optimize-chunk-modules","duration":1,"timestamp":922608037094,"id":1531,"parentId":1525,"tags":{},"startTime":1764555251669,"traceId":"45f4427c68eca367"},{"name":"optimize","duration":301,"timestamp":922608037037,"id":1527,"parentId":1525,"tags":{},"startTime":1764555251669,"traceId":"45f4427c68eca367"},{"name":"module-hash","duration":193,"timestamp":922608037732,"id":1532,"parentId":1525,"tags":{},"startTime":1764555251670,"traceId":"45f4427c68eca367"},{"name":"code-generation","duration":710,"timestamp":922608037929,"id":1533,"parentId":1525,"tags":{},"startTime":1764555251670,"traceId":"45f4427c68eca367"},{"name":"hash","duration":1511,"timestamp":922608039163,"id":1534,"parentId":1525,"tags":{},"startTime":1764555251671,"traceId":"45f4427c68eca367"},{"name":"code-generation-jobs","duration":67,"timestamp":922608040674,"id":1535,"parentId":1525,"tags":{},"startTime":1764555251673,"traceId":"45f4427c68eca367"},{"name":"module-assets","duration":31,"timestamp":922608040738,"id":1536,"parentId":1525,"tags":{},"startTime":1764555251673,"traceId":"45f4427c68eca367"},{"name":"create-chunk-assets","duration":1920,"timestamp":922608040771,"id":1537,"parentId":1525,"tags":{},"startTime":1764555251673,"traceId":"45f4427c68eca367"},{"name":"NextJsBuildManifest-generateClientManifest","duration":44,"timestamp":922608043073,"id":1539,"parentId":1505,"tags":{},"startTime":1764555251675,"traceId":"45f4427c68eca367"},{"name":"NextJsBuildManifest-createassets","duration":78,"timestamp":922608043042,"id":1538,"parentId":1505,"tags":{},"startTime":1764555251675,"traceId":"45f4427c68eca367"},{"name":"seal","duration":7604,"timestamp":922608036131,"id":1525,"parentId":1505,"tags":{},"startTime":1764555251668,"traceId":"45f4427c68eca367"},{"name":"webpack-compilation","duration":47865,"timestamp":922607995883,"id":1505,"parentId":1466,"tags":{"name":"client"},"startTime":1764555251628,"traceId":"45f4427c68eca367"},{"name":"emit","duration":2309,"timestamp":922608043759,"id":1540,"parentId":1466,"tags":{},"startTime":1764555251676,"traceId":"45f4427c68eca367"},{"name":"webpack-invalidated-client","duration":114492,"timestamp":922607932123,"id":1466,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764555251564,"traceId":"45f4427c68eca367"}] +[{"name":"client-success","duration":3,"timestamp":922608047949,"id":1541,"parentId":3,"tags":{},"startTime":1764555251680,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":10821,"timestamp":922608050681,"id":1542,"tags":{"url":"/gunbuilder/upper?_rsc=igmto","isTurbopack":false},"startTime":1764555251683,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":0,"timestamp":922608061517,"id":1543,"parentId":1542,"tags":{"url":"/gunbuilder/upper?_rsc=igmto","memory.rss":"457179136","memory.heapUsed":"161721456","memory.heapTotal":"197951488"},"startTime":1764555251694,"traceId":"45f4427c68eca367"},{"name":"client-hmr-latency","duration":140000,"timestamp":922607933111,"id":1544,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/[categoryId]/page.tsx"],"page":"/gunbuilder/upper","isPageHidden":false},"startTime":1764555251705,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":15115,"timestamp":922724781495,"id":1556,"parentId":1548,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555368414,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":15916,"timestamp":922724781282,"id":1549,"parentId":1548,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764555368413,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":18580,"timestamp":922724781475,"id":1554,"parentId":1548,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555368414,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":7699,"timestamp":922724795073,"id":1560,"parentId":1559,"tags":{},"startTime":1764555368427,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":8007,"timestamp":922724794774,"id":1559,"parentId":1558,"tags":{},"startTime":1764555368427,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":19299,"timestamp":922724794576,"id":1558,"parentId":1547,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"app-pages-browser"},"startTime":1764555368427,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":32832,"timestamp":922724781463,"id":1553,"parentId":1548,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555368414,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":32963,"timestamp":922724781434,"id":1551,"parentId":1548,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555368413,"traceId":"45f4427c68eca367"},{"name":"read-resource","duration":13840,"timestamp":922724800565,"id":1562,"parentId":1561,"tags":{},"startTime":1764555368433,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":36051,"timestamp":922724781485,"id":1555,"parentId":1548,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555368414,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":36283,"timestamp":922724781417,"id":1550,"parentId":1548,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764555368413,"traceId":"45f4427c68eca367"},{"name":"postcss-process","duration":16478,"timestamp":922724814435,"id":1564,"parentId":1563,"tags":{},"startTime":1764555368446,"traceId":"45f4427c68eca367"},{"name":"postcss-loader","duration":16766,"timestamp":922724814421,"id":1563,"parentId":1561,"tags":{},"startTime":1764555368446,"traceId":"45f4427c68eca367"},{"name":"css-loader","duration":3244,"timestamp":922724831205,"id":1565,"parentId":1561,"tags":{"astUsed":"true"},"startTime":1764555368463,"traceId":"45f4427c68eca367"},{"name":"build-module-css","duration":35918,"timestamp":922724800395,"id":1561,"parentId":1557,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764555368432,"traceId":"45f4427c68eca367"},{"name":"build-module-css","duration":43963,"timestamp":922724794066,"id":1557,"parentId":1547,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764555368426,"traceId":"45f4427c68eca367"},{"name":"build-module","duration":22,"timestamp":922724838127,"id":1566,"parentId":1557,"tags":{},"startTime":1764555368470,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":56720,"timestamp":922724781452,"id":1552,"parentId":1548,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555368413,"traceId":"45f4427c68eca367"},{"name":"make","duration":57995,"timestamp":922724780187,"id":1548,"parentId":1547,"tags":{},"startTime":1764555368412,"traceId":"45f4427c68eca367"},{"name":"chunk-graph","duration":1131,"timestamp":922724860511,"id":1568,"parentId":1567,"tags":{},"startTime":1764555368493,"traceId":"45f4427c68eca367"},{"name":"optimize-modules","duration":3,"timestamp":922724861657,"id":1570,"parentId":1567,"tags":{},"startTime":1764555368494,"traceId":"45f4427c68eca367"},{"name":"optimize-chunks","duration":33,"timestamp":922724861695,"id":1571,"parentId":1567,"tags":{},"startTime":1764555368494,"traceId":"45f4427c68eca367"},{"name":"optimize-tree","duration":4,"timestamp":922724861755,"id":1572,"parentId":1567,"tags":{},"startTime":1764555368494,"traceId":"45f4427c68eca367"},{"name":"optimize-chunk-modules","duration":2,"timestamp":922724861781,"id":1573,"parentId":1567,"tags":{},"startTime":1764555368494,"traceId":"45f4427c68eca367"},{"name":"optimize","duration":361,"timestamp":922724861654,"id":1569,"parentId":1567,"tags":{},"startTime":1764555368494,"traceId":"45f4427c68eca367"},{"name":"module-hash","duration":263,"timestamp":922724862483,"id":1574,"parentId":1567,"tags":{},"startTime":1764555368495,"traceId":"45f4427c68eca367"},{"name":"code-generation","duration":1167,"timestamp":922724862752,"id":1575,"parentId":1567,"tags":{},"startTime":1764555368495,"traceId":"45f4427c68eca367"},{"name":"hash","duration":1959,"timestamp":922724864629,"id":1576,"parentId":1567,"tags":{},"startTime":1764555368497,"traceId":"45f4427c68eca367"},{"name":"code-generation-jobs","duration":80,"timestamp":922724866588,"id":1577,"parentId":1567,"tags":{},"startTime":1764555368499,"traceId":"45f4427c68eca367"},{"name":"module-assets","duration":35,"timestamp":922724866664,"id":1578,"parentId":1567,"tags":{},"startTime":1764555368499,"traceId":"45f4427c68eca367"},{"name":"create-chunk-assets","duration":4531,"timestamp":922724866701,"id":1579,"parentId":1567,"tags":{},"startTime":1764555368499,"traceId":"45f4427c68eca367"},{"name":"NextJsBuildManifest-generateClientManifest","duration":219,"timestamp":922724872300,"id":1581,"parentId":1547,"tags":{},"startTime":1764555368504,"traceId":"45f4427c68eca367"},{"name":"NextJsBuildManifest-createassets","duration":325,"timestamp":922724872199,"id":1580,"parentId":1547,"tags":{},"startTime":1764555368504,"traceId":"45f4427c68eca367"},{"name":"seal","duration":13324,"timestamp":922724860265,"id":1567,"parentId":1547,"tags":{},"startTime":1764555368492,"traceId":"45f4427c68eca367"},{"name":"webpack-compilation","duration":95162,"timestamp":922724778471,"id":1547,"parentId":1545,"tags":{"name":"client"},"startTime":1764555368411,"traceId":"45f4427c68eca367"},{"name":"emit","duration":2739,"timestamp":922724873657,"id":1582,"parentId":1545,"tags":{},"startTime":1764555368506,"traceId":"45f4427c68eca367"},{"name":"webpack-invalidated-client","duration":109268,"timestamp":922724767896,"id":1545,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764555368400,"traceId":"45f4427c68eca367"},{"name":"client-success","duration":1,"timestamp":922724880237,"id":1585,"parentId":3,"tags":{},"startTime":1764555368512,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":5547,"timestamp":922724882223,"id":1587,"parentId":1584,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555368514,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":5554,"timestamp":922724882226,"id":1588,"parentId":1584,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555368514,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":5557,"timestamp":922724882228,"id":1589,"parentId":1584,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555368514,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":1207,"timestamp":922724887291,"id":1592,"parentId":1591,"tags":{},"startTime":1764555368519,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":1289,"timestamp":922724887212,"id":1591,"parentId":1590,"tags":{},"startTime":1764555368519,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":2767,"timestamp":922724887018,"id":1590,"parentId":1583,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"rsc"},"startTime":1764555368519,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":8016,"timestamp":922724882185,"id":1586,"parentId":1584,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555368514,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":2710,"timestamp":922724891965,"id":1607,"parentId":1606,"tags":{},"startTime":1764555368524,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":2779,"timestamp":922724891901,"id":1606,"parentId":1605,"tags":{},"startTime":1764555368524,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":7997,"timestamp":922724891778,"id":1605,"parentId":1583,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"ssr"},"startTime":1764555368524,"traceId":"45f4427c68eca367"},{"name":"client-hmr-latency","duration":130000,"timestamp":922724768373,"id":1608,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/[categoryId]/page.tsx"],"page":"/gunbuilder/upper","isPageHidden":false},"startTime":1764555368532,"traceId":"45f4427c68eca367"},{"name":"make","duration":21286,"timestamp":922724879358,"id":1584,"parentId":1583,"tags":{},"startTime":1764555368511,"traceId":"45f4427c68eca367"},{"name":"chunk-graph","duration":1484,"timestamp":922724906759,"id":1610,"parentId":1609,"tags":{},"startTime":1764555368539,"traceId":"45f4427c68eca367"},{"name":"optimize-modules","duration":4,"timestamp":922724908261,"id":1612,"parentId":1609,"tags":{},"startTime":1764555368540,"traceId":"45f4427c68eca367"},{"name":"optimize-chunks","duration":1386,"timestamp":922724908341,"id":1613,"parentId":1609,"tags":{},"startTime":1764555368540,"traceId":"45f4427c68eca367"},{"name":"optimize-tree","duration":4,"timestamp":922724909748,"id":1614,"parentId":1609,"tags":{},"startTime":1764555368542,"traceId":"45f4427c68eca367"},{"name":"optimize-chunk-modules","duration":2,"timestamp":922724909764,"id":1615,"parentId":1609,"tags":{},"startTime":1764555368542,"traceId":"45f4427c68eca367"},{"name":"optimize","duration":1755,"timestamp":922724908255,"id":1611,"parentId":1609,"tags":{},"startTime":1764555368540,"traceId":"45f4427c68eca367"},{"name":"module-hash","duration":332,"timestamp":922724910662,"id":1616,"parentId":1609,"tags":{},"startTime":1764555368543,"traceId":"45f4427c68eca367"},{"name":"code-generation","duration":1259,"timestamp":922724910999,"id":1617,"parentId":1609,"tags":{},"startTime":1764555368543,"traceId":"45f4427c68eca367"},{"name":"hash","duration":1105,"timestamp":922724912969,"id":1618,"parentId":1609,"tags":{},"startTime":1764555368545,"traceId":"45f4427c68eca367"},{"name":"code-generation-jobs","duration":83,"timestamp":922724914074,"id":1619,"parentId":1609,"tags":{},"startTime":1764555368546,"traceId":"45f4427c68eca367"},{"name":"module-assets","duration":32,"timestamp":922724914152,"id":1620,"parentId":1609,"tags":{},"startTime":1764555368546,"traceId":"45f4427c68eca367"},{"name":"create-chunk-assets","duration":1669,"timestamp":922724914190,"id":1621,"parentId":1609,"tags":{},"startTime":1764555368546,"traceId":"45f4427c68eca367"},{"name":"seal","duration":10779,"timestamp":922724906513,"id":1609,"parentId":1583,"tags":{},"startTime":1764555368539,"traceId":"45f4427c68eca367"},{"name":"webpack-compilation","duration":40076,"timestamp":922724878899,"id":1583,"parentId":1546,"tags":{"name":"server"},"startTime":1764555368511,"traceId":"45f4427c68eca367"},{"name":"emit","duration":10422,"timestamp":922724919000,"id":1622,"parentId":1546,"tags":{},"startTime":1764555368551,"traceId":"45f4427c68eca367"},{"name":"webpack-invalidated-server","duration":162359,"timestamp":922724768215,"id":1546,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764555368400,"traceId":"45f4427c68eca367"}] +[{"name":"handle-request","duration":22423,"timestamp":922724935085,"id":1623,"tags":{"url":"/gunbuilder/upper?_rsc=igmto","isTurbopack":false},"startTime":1764555368567,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":0,"timestamp":922724957527,"id":1624,"parentId":1623,"tags":{"url":"/gunbuilder/upper?_rsc=igmto","memory.rss":"444268544","memory.heapUsed":"157317536","memory.heapTotal":"178077696"},"startTime":1764555368590,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":19645,"timestamp":922737183257,"id":1625,"tags":{"url":"/gunbuilder?select=upper%3A165&_rsc=dn2bc","isTurbopack":false},"startTime":1764555380815,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":1,"timestamp":922737202997,"id":1626,"parentId":1625,"tags":{"url":"/gunbuilder?select=upper%3A165&_rsc=dn2bc","memory.rss":"444547072","memory.heapUsed":"159022728","memory.heapTotal":"178585600"},"startTime":1764555380835,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":9136,"timestamp":922737206840,"id":1627,"tags":{"url":"/gunbuilder?select=upper%3A165&_rsc=fecig","isTurbopack":false},"startTime":1764555380839,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":2,"timestamp":922737216032,"id":1628,"parentId":1627,"tags":{"url":"/gunbuilder?select=upper%3A165&_rsc=fecig","memory.rss":"444547072","memory.heapUsed":"159684024","memory.heapTotal":"178585600"},"startTime":1764555380848,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":7368,"timestamp":922737232153,"id":1629,"tags":{"url":"/gunbuilder?_rsc=d74dl","isTurbopack":false},"startTime":1764555380864,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":1,"timestamp":922737239560,"id":1630,"parentId":1629,"tags":{"url":"/gunbuilder?_rsc=d74dl","memory.rss":"444547072","memory.heapUsed":"160254304","memory.heapTotal":"178847744"},"startTime":1764555380872,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":13064,"timestamp":922740288895,"id":1631,"tags":{"url":"/gunbuilder/upper?_rsc=1jn8g","isTurbopack":false},"startTime":1764555383921,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":2,"timestamp":922740302030,"id":1632,"parentId":1631,"tags":{"url":"/gunbuilder/upper?_rsc=1jn8g","memory.rss":"439779328","memory.heapUsed":"161085224","memory.heapTotal":"179634176"},"startTime":1764555383934,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":14521,"timestamp":923018503955,"id":1638,"parentId":1636,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555662136,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":14528,"timestamp":923018503966,"id":1639,"parentId":1636,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555662136,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":14530,"timestamp":923018503974,"id":1640,"parentId":1636,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555662136,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":2479,"timestamp":923018517698,"id":1643,"parentId":1642,"tags":{},"startTime":1764555662150,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":2654,"timestamp":923018517529,"id":1642,"parentId":1641,"tags":{},"startTime":1764555662149,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":5285,"timestamp":923018517085,"id":1641,"parentId":1635,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"rsc"},"startTime":1764555662149,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":19623,"timestamp":923018503856,"id":1637,"parentId":1636,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555662136,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":3789,"timestamp":923018526183,"id":1658,"parentId":1657,"tags":{},"startTime":1764555662158,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":3940,"timestamp":923018526036,"id":1657,"parentId":1656,"tags":{},"startTime":1764555662158,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":11852,"timestamp":923018525844,"id":1656,"parentId":1635,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"ssr"},"startTime":1764555662158,"traceId":"45f4427c68eca367"},{"name":"make","duration":39911,"timestamp":923018498511,"id":1636,"parentId":1635,"tags":{},"startTime":1764555662130,"traceId":"45f4427c68eca367"},{"name":"chunk-graph","duration":1170,"timestamp":923018562002,"id":1660,"parentId":1659,"tags":{},"startTime":1764555662194,"traceId":"45f4427c68eca367"},{"name":"optimize-modules","duration":3,"timestamp":923018563189,"id":1662,"parentId":1659,"tags":{},"startTime":1764555662195,"traceId":"45f4427c68eca367"},{"name":"optimize-chunks","duration":1097,"timestamp":923018563202,"id":1663,"parentId":1659,"tags":{},"startTime":1764555662195,"traceId":"45f4427c68eca367"},{"name":"optimize-tree","duration":4,"timestamp":923018564319,"id":1664,"parentId":1659,"tags":{},"startTime":1764555662196,"traceId":"45f4427c68eca367"},{"name":"optimize-chunk-modules","duration":2,"timestamp":923018564335,"id":1665,"parentId":1659,"tags":{},"startTime":1764555662196,"traceId":"45f4427c68eca367"},{"name":"optimize","duration":1355,"timestamp":923018563185,"id":1661,"parentId":1659,"tags":{},"startTime":1764555662195,"traceId":"45f4427c68eca367"},{"name":"module-hash","duration":265,"timestamp":923018565033,"id":1666,"parentId":1659,"tags":{},"startTime":1764555662197,"traceId":"45f4427c68eca367"},{"name":"code-generation","duration":875,"timestamp":923018565304,"id":1667,"parentId":1659,"tags":{},"startTime":1764555662197,"traceId":"45f4427c68eca367"},{"name":"hash","duration":875,"timestamp":923018566635,"id":1668,"parentId":1659,"tags":{},"startTime":1764555662199,"traceId":"45f4427c68eca367"},{"name":"code-generation-jobs","duration":57,"timestamp":923018567510,"id":1669,"parentId":1659,"tags":{},"startTime":1764555662199,"traceId":"45f4427c68eca367"},{"name":"module-assets","duration":27,"timestamp":923018567562,"id":1670,"parentId":1659,"tags":{},"startTime":1764555662199,"traceId":"45f4427c68eca367"},{"name":"create-chunk-assets","duration":1762,"timestamp":923018567591,"id":1671,"parentId":1659,"tags":{},"startTime":1764555662199,"traceId":"45f4427c68eca367"},{"name":"seal","duration":8612,"timestamp":923018561814,"id":1659,"parentId":1635,"tags":{},"startTime":1764555662194,"traceId":"45f4427c68eca367"},{"name":"webpack-compilation","duration":73905,"timestamp":923018497801,"id":1635,"parentId":1633,"tags":{"name":"server"},"startTime":1764555662130,"traceId":"45f4427c68eca367"},{"name":"emit","duration":1611,"timestamp":923018571719,"id":1672,"parentId":1633,"tags":{},"startTime":1764555662204,"traceId":"45f4427c68eca367"},{"name":"webpack-invalidated-server","duration":86922,"timestamp":923018486665,"id":1633,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764555662119,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":2936,"timestamp":923018577575,"id":1682,"parentId":1674,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555662209,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":3163,"timestamp":923018577524,"id":1675,"parentId":1674,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764555662209,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":3705,"timestamp":923018577571,"id":1680,"parentId":1674,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555662209,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":4465,"timestamp":923018577568,"id":1679,"parentId":1674,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555662209,"traceId":"45f4427c68eca367"},{"name":"read-resource","duration":651,"timestamp":923018581390,"id":1688,"parentId":1687,"tags":{},"startTime":1764555662213,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":7285,"timestamp":923018577561,"id":1676,"parentId":1674,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764555662209,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":7284,"timestamp":923018577565,"id":1677,"parentId":1674,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555662209,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":5044,"timestamp":923018579934,"id":1686,"parentId":1685,"tags":{},"startTime":1764555662212,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":5120,"timestamp":923018579859,"id":1685,"parentId":1684,"tags":{},"startTime":1764555662212,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":9725,"timestamp":923018579781,"id":1684,"parentId":1673,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"app-pages-browser"},"startTime":1764555662212,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":12687,"timestamp":923018577574,"id":1681,"parentId":1674,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555662209,"traceId":"45f4427c68eca367"},{"name":"postcss-process","duration":20323,"timestamp":923018582060,"id":1690,"parentId":1689,"tags":{},"startTime":1764555662214,"traceId":"45f4427c68eca367"},{"name":"postcss-loader","duration":20583,"timestamp":923018582052,"id":1689,"parentId":1687,"tags":{},"startTime":1764555662214,"traceId":"45f4427c68eca367"},{"name":"css-loader","duration":2514,"timestamp":923018602647,"id":1691,"parentId":1687,"tags":{"astUsed":"true"},"startTime":1764555662235,"traceId":"45f4427c68eca367"},{"name":"build-module-css","duration":24317,"timestamp":923018581342,"id":1687,"parentId":1683,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764555662213,"traceId":"45f4427c68eca367"},{"name":"build-module-css","duration":27616,"timestamp":923018579586,"id":1683,"parentId":1673,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764555662211,"traceId":"45f4427c68eca367"},{"name":"build-module","duration":13,"timestamp":923018607282,"id":1692,"parentId":1683,"tags":{},"startTime":1764555662239,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":29748,"timestamp":923018577567,"id":1678,"parentId":1674,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555662209,"traceId":"45f4427c68eca367"},{"name":"make","duration":32907,"timestamp":923018574420,"id":1674,"parentId":1673,"tags":{},"startTime":1764555662206,"traceId":"45f4427c68eca367"},{"name":"chunk-graph","duration":738,"timestamp":923018613039,"id":1694,"parentId":1693,"tags":{},"startTime":1764555662245,"traceId":"45f4427c68eca367"},{"name":"optimize-modules","duration":2,"timestamp":923018613787,"id":1696,"parentId":1693,"tags":{},"startTime":1764555662246,"traceId":"45f4427c68eca367"},{"name":"optimize-chunks","duration":22,"timestamp":923018613800,"id":1697,"parentId":1693,"tags":{},"startTime":1764555662246,"traceId":"45f4427c68eca367"},{"name":"optimize-tree","duration":3,"timestamp":923018613832,"id":1698,"parentId":1693,"tags":{},"startTime":1764555662246,"traceId":"45f4427c68eca367"},{"name":"optimize-chunk-modules","duration":2,"timestamp":923018613842,"id":1699,"parentId":1693,"tags":{},"startTime":1764555662246,"traceId":"45f4427c68eca367"},{"name":"optimize","duration":289,"timestamp":923018613784,"id":1695,"parentId":1693,"tags":{},"startTime":1764555662246,"traceId":"45f4427c68eca367"},{"name":"module-hash","duration":240,"timestamp":923018614514,"id":1700,"parentId":1693,"tags":{},"startTime":1764555662246,"traceId":"45f4427c68eca367"},{"name":"code-generation","duration":956,"timestamp":923018614759,"id":1701,"parentId":1693,"tags":{},"startTime":1764555662247,"traceId":"45f4427c68eca367"},{"name":"hash","duration":1698,"timestamp":923018616287,"id":1702,"parentId":1693,"tags":{},"startTime":1764555662248,"traceId":"45f4427c68eca367"},{"name":"code-generation-jobs","duration":97,"timestamp":923018617985,"id":1703,"parentId":1693,"tags":{},"startTime":1764555662250,"traceId":"45f4427c68eca367"},{"name":"module-assets","duration":54,"timestamp":923018618050,"id":1704,"parentId":1693,"tags":{},"startTime":1764555662250,"traceId":"45f4427c68eca367"},{"name":"create-chunk-assets","duration":3096,"timestamp":923018618108,"id":1705,"parentId":1693,"tags":{},"startTime":1764555662250,"traceId":"45f4427c68eca367"},{"name":"NextJsBuildManifest-generateClientManifest","duration":46,"timestamp":923018621662,"id":1707,"parentId":1673,"tags":{},"startTime":1764555662254,"traceId":"45f4427c68eca367"},{"name":"NextJsBuildManifest-createassets","duration":80,"timestamp":923018621632,"id":1706,"parentId":1673,"tags":{},"startTime":1764555662254,"traceId":"45f4427c68eca367"},{"name":"seal","duration":9802,"timestamp":923018612805,"id":1693,"parentId":1673,"tags":{},"startTime":1764555662245,"traceId":"45f4427c68eca367"},{"name":"webpack-compilation","duration":48385,"timestamp":923018574238,"id":1673,"parentId":1634,"tags":{"name":"client"},"startTime":1764555662206,"traceId":"45f4427c68eca367"},{"name":"emit","duration":5801,"timestamp":923018622632,"id":1708,"parentId":1634,"tags":{},"startTime":1764555662255,"traceId":"45f4427c68eca367"},{"name":"webpack-invalidated-client","duration":142201,"timestamp":923018486786,"id":1634,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764555662119,"traceId":"45f4427c68eca367"}] +[{"name":"client-success","duration":5,"timestamp":923018629903,"id":1709,"parentId":3,"tags":{},"startTime":1764555662262,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":9161,"timestamp":923018633082,"id":1710,"tags":{"url":"/gunbuilder/upper?_rsc=5ur2j","isTurbopack":false},"startTime":1764555662265,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":0,"timestamp":923018642260,"id":1711,"parentId":1710,"tags":{"url":"/gunbuilder/upper?_rsc=5ur2j","memory.rss":"449380352","memory.heapUsed":"157388648","memory.heapTotal":"185155584"},"startTime":1764555662274,"traceId":"45f4427c68eca367"},{"name":"client-hmr-latency","duration":168000,"timestamp":923018487280,"id":1712,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/[categoryId]/page.tsx"],"page":"/gunbuilder/upper","isPageHidden":false},"startTime":1764555662287,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":14653,"timestamp":923035502135,"id":1713,"tags":{"url":"/gunbuilder?_rsc=x5p1f","isTurbopack":false},"startTime":1764555679134,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":1,"timestamp":923035516887,"id":1714,"parentId":1713,"tags":{"url":"/gunbuilder?_rsc=x5p1f","memory.rss":"449478656","memory.heapUsed":"158988544","memory.heapTotal":"185401344"},"startTime":1764555679149,"traceId":"45f4427c68eca367"},{"name":"handle-request","duration":17095,"timestamp":923037804401,"id":1715,"tags":{"url":"/gunbuilder/handguard?_rsc=1jn8g","isTurbopack":false},"startTime":1764555681436,"traceId":"45f4427c68eca367"},{"name":"memory-usage","duration":1,"timestamp":923037821569,"id":1716,"parentId":1715,"tags":{"url":"/gunbuilder/handguard?_rsc=1jn8g","memory.rss":"449495040","memory.heapUsed":"159875992","memory.heapTotal":"185663488"},"startTime":1764555681453,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":12845,"timestamp":923124512535,"id":1728,"parentId":1720,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555768144,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":14539,"timestamp":923124512290,"id":1721,"parentId":1720,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764555768144,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":16354,"timestamp":923124512526,"id":1726,"parentId":1720,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555768144,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":19589,"timestamp":923124512494,"id":1725,"parentId":1720,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555768144,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":8665,"timestamp":923124523695,"id":1732,"parentId":1731,"tags":{},"startTime":1764555768156,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":8899,"timestamp":923124523464,"id":1731,"parentId":1730,"tags":{},"startTime":1764555768155,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":20068,"timestamp":923124523216,"id":1730,"parentId":1719,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"app-pages-browser"},"startTime":1764555768155,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":31161,"timestamp":923124512483,"id":1723,"parentId":1720,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555768144,"traceId":"45f4427c68eca367"},{"name":"read-resource","duration":14375,"timestamp":923124529284,"id":1734,"parentId":1733,"tags":{},"startTime":1764555768161,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":34760,"timestamp":923124512469,"id":1722,"parentId":1720,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764555768144,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":34704,"timestamp":923124512531,"id":1727,"parentId":1720,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555768144,"traceId":"45f4427c68eca367"},{"name":"postcss-process","duration":14743,"timestamp":923124543686,"id":1736,"parentId":1735,"tags":{},"startTime":1764555768176,"traceId":"45f4427c68eca367"},{"name":"postcss-loader","duration":15030,"timestamp":923124543672,"id":1735,"parentId":1733,"tags":{},"startTime":1764555768176,"traceId":"45f4427c68eca367"},{"name":"css-loader","duration":3066,"timestamp":923124558721,"id":1737,"parentId":1733,"tags":{"astUsed":"true"},"startTime":1764555768191,"traceId":"45f4427c68eca367"},{"name":"build-module-css","duration":33222,"timestamp":923124529136,"id":1733,"parentId":1729,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764555768161,"traceId":"45f4427c68eca367"},{"name":"build-module-css","duration":41282,"timestamp":923124522596,"id":1729,"parentId":1719,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764555768154,"traceId":"45f4427c68eca367"},{"name":"build-module","duration":16,"timestamp":923124563983,"id":1738,"parentId":1729,"tags":{},"startTime":1764555768196,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":51539,"timestamp":923124512488,"id":1724,"parentId":1720,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764555768144,"traceId":"45f4427c68eca367"},{"name":"make","duration":52428,"timestamp":923124511617,"id":1720,"parentId":1719,"tags":{},"startTime":1764555768143,"traceId":"45f4427c68eca367"},{"name":"chunk-graph","duration":716,"timestamp":923124586708,"id":1740,"parentId":1739,"tags":{},"startTime":1764555768219,"traceId":"45f4427c68eca367"},{"name":"optimize-modules","duration":3,"timestamp":923124587439,"id":1742,"parentId":1739,"tags":{},"startTime":1764555768219,"traceId":"45f4427c68eca367"},{"name":"optimize-chunks","duration":57,"timestamp":923124587449,"id":1743,"parentId":1739,"tags":{},"startTime":1764555768219,"traceId":"45f4427c68eca367"},{"name":"optimize-tree","duration":7,"timestamp":923124587517,"id":1744,"parentId":1739,"tags":{},"startTime":1764555768219,"traceId":"45f4427c68eca367"},{"name":"optimize-chunk-modules","duration":1,"timestamp":923124587532,"id":1745,"parentId":1739,"tags":{},"startTime":1764555768219,"traceId":"45f4427c68eca367"},{"name":"optimize","duration":365,"timestamp":923124587435,"id":1741,"parentId":1739,"tags":{},"startTime":1764555768219,"traceId":"45f4427c68eca367"},{"name":"module-hash","duration":229,"timestamp":923124588183,"id":1746,"parentId":1739,"tags":{},"startTime":1764555768220,"traceId":"45f4427c68eca367"},{"name":"code-generation","duration":825,"timestamp":923124588416,"id":1747,"parentId":1739,"tags":{},"startTime":1764555768220,"traceId":"45f4427c68eca367"},{"name":"hash","duration":1675,"timestamp":923124589860,"id":1748,"parentId":1739,"tags":{},"startTime":1764555768222,"traceId":"45f4427c68eca367"},{"name":"code-generation-jobs","duration":78,"timestamp":923124591534,"id":1749,"parentId":1739,"tags":{},"startTime":1764555768223,"traceId":"45f4427c68eca367"},{"name":"module-assets","duration":47,"timestamp":923124591607,"id":1750,"parentId":1739,"tags":{},"startTime":1764555768223,"traceId":"45f4427c68eca367"},{"name":"create-chunk-assets","duration":3066,"timestamp":923124591657,"id":1751,"parentId":1739,"tags":{},"startTime":1764555768224,"traceId":"45f4427c68eca367"},{"name":"NextJsBuildManifest-generateClientManifest","duration":44,"timestamp":923124595095,"id":1753,"parentId":1719,"tags":{},"startTime":1764555768227,"traceId":"45f4427c68eca367"},{"name":"NextJsBuildManifest-createassets","duration":79,"timestamp":923124595064,"id":1752,"parentId":1719,"tags":{},"startTime":1764555768227,"traceId":"45f4427c68eca367"},{"name":"seal","duration":9382,"timestamp":923124586483,"id":1739,"parentId":1719,"tags":{},"startTime":1764555768218,"traceId":"45f4427c68eca367"},{"name":"webpack-compilation","duration":84662,"timestamp":923124511217,"id":1719,"parentId":1717,"tags":{"name":"client"},"startTime":1764555768143,"traceId":"45f4427c68eca367"},{"name":"emit","duration":2477,"timestamp":923124595893,"id":1754,"parentId":1717,"tags":{},"startTime":1764555768228,"traceId":"45f4427c68eca367"},{"name":"webpack-invalidated-client","duration":96283,"timestamp":923124502482,"id":1717,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764555768134,"traceId":"45f4427c68eca367"},{"name":"client-success","duration":0,"timestamp":923124600387,"id":1757,"parentId":3,"tags":{},"startTime":1764555768232,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":5206,"timestamp":923124601253,"id":1759,"parentId":1756,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555768233,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":5209,"timestamp":923124601256,"id":1760,"parentId":1756,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555768233,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":5211,"timestamp":923124601258,"id":1761,"parentId":1756,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555768233,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":1232,"timestamp":923124605934,"id":1764,"parentId":1763,"tags":{},"startTime":1764555768238,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":1317,"timestamp":923124605849,"id":1763,"parentId":1762,"tags":{},"startTime":1764555768238,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":2048,"timestamp":923124605667,"id":1762,"parentId":1755,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"rsc"},"startTime":1764555768238,"traceId":"45f4427c68eca367"},{"name":"add-entry","duration":6792,"timestamp":923124601219,"id":1758,"parentId":1756,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764555768233,"traceId":"45f4427c68eca367"},{"name":"next-swc-transform","duration":3033,"timestamp":923124609388,"id":1779,"parentId":1778,"tags":{},"startTime":1764555768241,"traceId":"45f4427c68eca367"},{"name":"next-swc-loader","duration":3088,"timestamp":923124609341,"id":1778,"parentId":1777,"tags":{},"startTime":1764555768241,"traceId":"45f4427c68eca367"},{"name":"build-module-tsx","duration":6647,"timestamp":923124609243,"id":1777,"parentId":1755,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"ssr"},"startTime":1764555768241,"traceId":"45f4427c68eca367"},{"name":"client-hmr-latency","duration":111000,"timestamp":923124503445,"id":1780,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/[categoryId]/page.tsx"],"page":"/gunbuilder/handguard","isPageHidden":false},"startTime":1764555768248,"traceId":"45f4427c68eca367"},{"name":"make","duration":16757,"timestamp":923124599868,"id":1756,"parentId":1755,"tags":{},"startTime":1764555768232,"traceId":"45f4427c68eca367"},{"name":"chunk-graph","duration":1399,"timestamp":923124621720,"id":1782,"parentId":1781,"tags":{},"startTime":1764555768254,"traceId":"45f4427c68eca367"},{"name":"optimize-modules","duration":3,"timestamp":923124623139,"id":1784,"parentId":1781,"tags":{},"startTime":1764555768255,"traceId":"45f4427c68eca367"},{"name":"optimize-chunks","duration":1040,"timestamp":923124623155,"id":1785,"parentId":1781,"tags":{},"startTime":1764555768255,"traceId":"45f4427c68eca367"},{"name":"optimize-tree","duration":3,"timestamp":923124624209,"id":1786,"parentId":1781,"tags":{},"startTime":1764555768256,"traceId":"45f4427c68eca367"},{"name":"optimize-chunk-modules","duration":2,"timestamp":923124624221,"id":1787,"parentId":1781,"tags":{},"startTime":1764555768256,"traceId":"45f4427c68eca367"},{"name":"optimize","duration":1288,"timestamp":923124623132,"id":1783,"parentId":1781,"tags":{},"startTime":1764555768255,"traceId":"45f4427c68eca367"},{"name":"module-hash","duration":235,"timestamp":923124624907,"id":1788,"parentId":1781,"tags":{},"startTime":1764555768257,"traceId":"45f4427c68eca367"},{"name":"code-generation","duration":999,"timestamp":923124625147,"id":1789,"parentId":1781,"tags":{},"startTime":1764555768257,"traceId":"45f4427c68eca367"},{"name":"hash","duration":777,"timestamp":923124626592,"id":1790,"parentId":1781,"tags":{},"startTime":1764555768258,"traceId":"45f4427c68eca367"},{"name":"code-generation-jobs","duration":61,"timestamp":923124627368,"id":1791,"parentId":1781,"tags":{},"startTime":1764555768259,"traceId":"45f4427c68eca367"},{"name":"module-assets","duration":28,"timestamp":923124627425,"id":1792,"parentId":1781,"tags":{},"startTime":1764555768259,"traceId":"45f4427c68eca367"},{"name":"create-chunk-assets","duration":1693,"timestamp":923124627456,"id":1793,"parentId":1781,"tags":{},"startTime":1764555768259,"traceId":"45f4427c68eca367"},{"name":"seal","duration":8675,"timestamp":923124621531,"id":1781,"parentId":1755,"tags":{},"startTime":1764555768253,"traceId":"45f4427c68eca367"},{"name":"webpack-compilation","duration":31848,"timestamp":923124599699,"id":1755,"parentId":1718,"tags":{"name":"server"},"startTime":1764555768232,"traceId":"45f4427c68eca367"},{"name":"emit","duration":11208,"timestamp":923124631567,"id":1794,"parentId":1718,"tags":{},"startTime":1764555768263,"traceId":"45f4427c68eca367"},{"name":"webpack-invalidated-server","duration":139501,"timestamp":923124503777,"id":1718,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764555768136,"traceId":"45f4427c68eca367"}] diff --git a/app/gunbuilder/[categoryId]/page.tsx b/app/gunbuilder/[categoryId]/page.tsx index 60ae0d5..2645611 100644 --- a/app/gunbuilder/[categoryId]/page.tsx +++ b/app/gunbuilder/[categoryId]/page.tsx @@ -2,16 +2,16 @@ import { useEffect, useMemo, useState } from "react"; import Link from "next/link"; -import { useParams } from "next/navigation"; +import { useParams, useRouter } from "next/navigation"; import { CATEGORIES } from "@/data/gunbuilderParts"; import type { CategoryId, Part } from "@/types/gunbuilder"; type ViewMode = "card" | "list"; type GunbuilderProductFromApi = { - id: string; // backend UUID as string + id: string; name: string; - brand: string; // backend brand field + brand: string; platform: string; partRole: string; price: number | null; @@ -22,10 +22,6 @@ type GunbuilderProductFromApi = { const API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL ?? "http://localhost:8080"; -/** - * Map from category id -> Ballistic partRole(s) - * Keep this in sync with whatever you’re using on the main /gunbuilder page. - */ const CATEGORY_TO_PART_ROLES: Record = { upper: ["upper-receiver"], barrel: ["barrel"], @@ -36,14 +32,38 @@ const CATEGORY_TO_PART_ROLES: Record = { sights: ["sight"], }; +// NEW: sort options +type SortOption = "relevance" | "price-asc" | "price-desc" | "brand-asc"; + +// NEW: build state type + storage key (matches /gunbuilder) +type BuildState = Partial>; +const STORAGE_KEY = "gunbuilder-build-state"; + export default function CategoryPage() { const params = useParams(); const categoryId = params.categoryId as CategoryId; + const router = useRouter(); + const [viewMode, setViewMode] = useState("list"); const [parts, setParts] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); + // NEW: filter + sort state + const [brandFilter, setBrandFilter] = useState("all"); + const [sortBy, setSortBy] = useState("relevance"); + + // NEW: build state for this page, synced with localStorage + const [build, setBuild] = useState(() => { + if (typeof window === "undefined") return {}; + try { + const stored = window.localStorage.getItem(STORAGE_KEY); + return stored ? (JSON.parse(stored) as BuildState) : {}; + } catch { + return {}; + } + }); + const category = useMemo( () => CATEGORIES.find((c) => c.id === categoryId), [categoryId], @@ -77,12 +97,11 @@ export default function CategoryPage() { const data: GunbuilderProductFromApi[] = await res.json(); - // πŸ”‘ Normalize into your Part type using *id* and *brand* const normalized: Part[] = data.map((p) => ({ - id: p.id, // βœ… backend id (UUID string) + id: p.id, categoryId, name: p.name, - brand: p.brand, // βœ… backend brand + brand: p.brand, price: p.price ?? 0, imageUrl: p.mainImageUrl ?? undefined, url: p.buyUrl ?? undefined, @@ -103,6 +122,73 @@ export default function CategoryPage() { return () => controller.abort(); }, [categoryId]); + // NEW: persist build to localStorage whenever it changes + useEffect(() => { + if (typeof window === "undefined") return; + try { + window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build)); + } catch { + // ignore + } + }, [build]); + + // NEW: handler to toggle Add / Remove for this category + const handleTogglePart = (categoryId: CategoryId, partId: string) => { + const isSelected = build[categoryId] === partId; + + if (isSelected) { + // Remove from build + setBuild((prev) => { + const updated: BuildState = { ...prev }; + delete updated[categoryId]; + return updated; + }); + } else { + // Add to build and navigate back to main gunbuilder page + setBuild((prev) => ({ + ...prev, + [categoryId]: partId, + })); + router.push("/gunbuilder"); + } + }; + + // NEW: available brands for filter + const availableBrands = useMemo( + () => + Array.from(new Set(parts.map((p) => p.brand))) + .filter(Boolean) + .sort((a, b) => a.localeCompare(b)), + [parts], + ); + + // NEW: filtered + sorted parts + const filteredParts = useMemo(() => { + let result = [...parts]; + + if (brandFilter !== "all") { + result = result.filter((p) => p.brand === brandFilter); + } + + switch (sortBy) { + case "price-asc": + result.sort((a, b) => a.price - b.price); + break; + case "price-desc": + result.sort((a, b) => b.price - a.price); + break; + case "brand-asc": + result.sort((a, b) => a.brand.localeCompare(b.brand)); + break; + case "relevance": + default: + // leave in backend order + break; + } + + return result; + }, [parts, brandFilter, sortBy]); + if (!category) { return (
@@ -180,6 +266,64 @@ export default function CategoryPage() { {/* Parts Grid/List */}
+ {/* Filter + sort toolbar */} + {!loading && !error && parts.length > 0 && ( +
+
+ Showing{" "} + + {filteredParts.length} + {" "} + of{" "} + + {parts.length} + {" "} + parts +
+
+
+ + +
+
+ + +
+
+
+ )} + {loading ? (

Loading {category.name.toLowerCase()}… @@ -188,20 +332,19 @@ export default function CategoryPage() {

{error} β€” check that the Ballistic API is running.

- ) : parts.length === 0 ? ( + ) : filteredParts.length === 0 ? (

No parts available for this category yet.

) : viewMode === "card" ? (
- {parts.map((part) => ( -
- { + const isSelected = build[categoryId] === part.id; + + return ( +
@@ -219,67 +362,92 @@ export default function CategoryPage() { ${part.price.toFixed(2)}
- - - View Details - - {/* Hover Overlay */} -
-
- Add to Build -
-
-
- ))} -
- ) : ( -
- {parts.map((part) => ( -
-
-
- -
- {part.brand}{" "} - β€” {part.name} -
- {part.notes && ( -

- {part.notes} -

- )} - -
-
-
- ${part.price.toFixed(2)} -
+
View Details +
- {/* Hover Overlay */} -
-
- Add to Build -
-
-
- ))} + ); + })}
+ ) : ( + <> + {/* Header row for list view */} +
+ Part + Brand + Price + Actions +
+ +
+ {filteredParts.map((part) => { + const isSelected = build[categoryId] === part.id; + + return ( +
+
+
+
+ {part.name} +
+ {part.notes && ( +

+ {part.notes} +

+ )} +
+
+ {part.brand} +
+
+ ${part.price.toFixed(2)} +
+
+ + View Details + + +
+
+
+ ); + })} +
+ )}