@powerhousedao/powerhouse-vetra-packages 6.2.2-dev.42 → 6.2.2-dev.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/browser/assets/{entry-Db_lIhQq.js → entry-CcSqsfaf.js} +2 -2
  2. package/dist/browser/assets/{projection-entry-DqgHaUSy.js → projection-entry-qnPqxpN3.js} +3 -3
  3. package/dist/browser/{linting-_AQWr8aE.js → button-CuO8Gh3v.js} +17 -4
  4. package/dist/browser/button-CuO8Gh3v.js.map +1 -0
  5. package/dist/browser/{connect-BUnNjGUW.js → connect-Cs9_OfUW.js} +49 -7
  6. package/dist/browser/{connect-BUnNjGUW.js.map → connect-Cs9_OfUW.js.map} +1 -1
  7. package/dist/browser/{dist-BatmWBzA.js → dist-Cw08sCbR.js} +150 -25
  8. package/dist/browser/dist-Cw08sCbR.js.map +1 -0
  9. package/dist/browser/{document-drive-D3Z9vXTQ.js → document-drive-CLF3V3yq.js} +22 -6
  10. package/dist/browser/document-drive-CLF3V3yq.js.map +1 -0
  11. package/dist/browser/document-models/index.js +1 -1
  12. package/dist/browser/{editor-Bn6uXvxG.js → editor-CRj28xcj.js} +668 -101
  13. package/dist/browser/editor-CRj28xcj.js.map +1 -0
  14. package/dist/browser/{editor-BLeFoOh6.js → editor-Clf15hps.js} +5 -5
  15. package/dist/browser/{editor-BLeFoOh6.js.map → editor-Clf15hps.js.map} +1 -1
  16. package/dist/browser/editors/document-model-editor/module.js +1 -1
  17. package/dist/browser/editors/generic-drive-explorer/index.js +4 -4
  18. package/dist/browser/editors/generic-drive-explorer/module.js +1 -1
  19. package/dist/browser/{folder-view-DNzFnfW2.js → folder-view-Zc--316o.js} +29 -10
  20. package/dist/browser/folder-view-Zc--316o.js.map +1 -0
  21. package/dist/browser/{graphql-editor-DWo8N_z4.js → graphql-editor-BYiN6EYX.js} +3 -3
  22. package/dist/browser/{graphql-editor-DWo8N_z4.js.map → graphql-editor-BYiN6EYX.js.map} +1 -1
  23. package/dist/browser/index.js +2 -2
  24. package/dist/browser/{json-editor-CEugjpFj.js → json-editor-BCQBDkoV.js} +3 -3
  25. package/dist/browser/{json-editor-CEugjpFj.js.map → json-editor-BCQBDkoV.js.map} +1 -1
  26. package/dist/browser/{lib-CiaHsAaR.js → lib-CZf9FJ-n.js} +2 -2
  27. package/dist/browser/lib-CZf9FJ-n.js.map +1 -0
  28. package/dist/browser/{state-schemas-VrticHe4.js → state-schemas-Co7oWTVF.js} +5 -15
  29. package/dist/browser/state-schemas-Co7oWTVF.js.map +1 -0
  30. package/dist/node/{linting-BjvRPjCY.mjs → button-Da7CxMn7.mjs} +17 -4
  31. package/dist/node/button-Da7CxMn7.mjs.map +1 -0
  32. package/dist/node/{connect-wMkkAckX.mjs → connect-DtLHLVuq.mjs} +49 -7
  33. package/dist/node/{connect-wMkkAckX.mjs.map → connect-DtLHLVuq.mjs.map} +1 -1
  34. package/dist/node/{dist-CUHBOv3P.mjs → dist-Co6sAUR3.mjs} +150 -25
  35. package/dist/node/dist-Co6sAUR3.mjs.map +1 -0
  36. package/dist/node/{document-drive-CI0J7nMj.mjs → document-drive-CPxMz8lW.mjs} +22 -6
  37. package/dist/node/document-drive-CPxMz8lW.mjs.map +1 -0
  38. package/dist/node/document-models/index.mjs +1 -1
  39. package/dist/node/{editor-aIeTo2EE.mjs → editor-CNTEyfKg.mjs} +5 -5
  40. package/dist/node/{editor-aIeTo2EE.mjs.map → editor-CNTEyfKg.mjs.map} +1 -1
  41. package/dist/node/{editor-Cr-mNQca.mjs → editor-Dl-takGb.mjs} +670 -103
  42. package/dist/node/editor-Dl-takGb.mjs.map +1 -0
  43. package/dist/node/editors/document-model-editor/module.mjs +1 -1
  44. package/dist/node/editors/generic-drive-explorer/index.mjs +4 -4
  45. package/dist/node/editors/generic-drive-explorer/module.mjs +1 -1
  46. package/dist/node/{folder-view-_x1OBYZN.mjs → folder-view-B2qOsImy.mjs} +29 -10
  47. package/dist/node/folder-view-B2qOsImy.mjs.map +1 -0
  48. package/dist/node/{graphql-editor-Dd2_z5QJ.mjs → graphql-editor-DsX64AUl.mjs} +3 -3
  49. package/dist/node/{graphql-editor-Dd2_z5QJ.mjs.map → graphql-editor-DsX64AUl.mjs.map} +1 -1
  50. package/dist/node/index.mjs +2 -2
  51. package/dist/node/{json-editor-Dphg6ZeL.mjs → json-editor-H15UPuqD.mjs} +3 -3
  52. package/dist/node/{json-editor-Dphg6ZeL.mjs.map → json-editor-H15UPuqD.mjs.map} +1 -1
  53. package/dist/node/{main-Db0ei9wX.mjs → main-7-PK1gTO.mjs} +2 -2
  54. package/dist/node/main-7-PK1gTO.mjs.map +1 -0
  55. package/dist/node/{state-schemas-BSLgTw2O.mjs → state-schemas-BEbd8zYo.mjs} +6 -16
  56. package/dist/{browser/state-schemas-VrticHe4.js.map → node/state-schemas-BEbd8zYo.mjs.map} +1 -1
  57. package/package.json +6 -6
  58. package/dist/browser/dist-BatmWBzA.js.map +0 -1
  59. package/dist/browser/document-drive-D3Z9vXTQ.js.map +0 -1
  60. package/dist/browser/editor-Bn6uXvxG.js.map +0 -1
  61. package/dist/browser/folder-view-DNzFnfW2.js.map +0 -1
  62. package/dist/browser/lib-CiaHsAaR.js.map +0 -1
  63. package/dist/browser/linting-_AQWr8aE.js.map +0 -1
  64. package/dist/node/dist-CUHBOv3P.mjs.map +0 -1
  65. package/dist/node/document-drive-CI0J7nMj.mjs.map +0 -1
  66. package/dist/node/editor-Cr-mNQca.mjs.map +0 -1
  67. package/dist/node/folder-view-_x1OBYZN.mjs.map +0 -1
  68. package/dist/node/linting-BjvRPjCY.mjs.map +0 -1
  69. package/dist/node/main-Db0ei9wX.mjs.map +0 -1
  70. package/dist/node/state-schemas-BSLgTw2O.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { A as __toESM, D as __commonJSMin, t as capitalCase } from "./dist-B4FWbuEM.js";
2
- import { $ as generateId, P as replayDocumentVersioned, Q as validateStateSchemaName, S as createPresignedHeader, T as createZip, U as setName, X as validateInitialState, Z as validateModules, a as handleTargetNameCollisions, b as baseSaveToFileHandle, f as logger, g as assertAuthPreservedOnDuplicate, i as generateNodesCopy, l as moveNode, n as copyNode, o as isFileNode, s as isFolderNode, t as addFolder, u as updateNode, v as baseLoadFromInput, x as buildSignedAction, y as baseLoadFromInputVersioned } from "./document-drive-D3Z9vXTQ.js";
3
- import { a as SyncStatus, o as DriveCollectionId, s as ModuleNotFoundError, t as gql } from "./lib-CiaHsAaR.js";
2
+ import { $ as validateStateSchemaName, F as replayDocumentVersioned, Q as validateModules, S as createPresignedHeader, T as createZip, W as setName, Z as validateInitialState, a as handleTargetNameCollisions, b as baseSaveToFileHandle, et as generateId, f as logger, g as assertAuthPreservedOnDuplicate, i as generateNodesCopy, l as moveNode, n as copyNode, o as isFileNode, s as isFolderNode, t as addFolder, u as updateNode, v as baseLoadFromInput, x as buildSignedAction, y as baseLoadFromInputVersioned } from "./document-drive-CLF3V3yq.js";
3
+ import { a as SyncStatus, o as DriveCollectionId, s as ModuleNotFoundError, t as gql } from "./lib-CZf9FJ-n.js";
4
4
  import "./parser-CkF6Qt8V.js";
5
5
  import "./printer-CEYr4JOg.js";
6
6
  import { createContext, use, useCallback, useContext, useEffect, useMemo, useState, useSyncExternalStore } from "react";
@@ -53,7 +53,7 @@ function makePHEventFunctions(key) {
53
53
  };
54
54
  }
55
55
  //#endregion
56
- //#region ../reactor-browser/dist/document-by-id-BPj6Gd7n.js
56
+ //#region ../reactor-browser/dist/document-by-id-DWEQI7wn.js
57
57
  async function queueActions(document, actionOrActions) {
58
58
  if (!document) throw new Error("No document provided");
59
59
  if (!actionOrActions) throw new Error("No actions provided");
@@ -104,7 +104,7 @@ async function signAction(action, document) {
104
104
  if (!action.context?.signer) return action;
105
105
  const reactorClient = window.ph?.reactorClientModule?.client;
106
106
  if (!reactorClient) return action;
107
- const reducer = (await reactorClient.getDocumentModelModule(document.header.documentType)).reducer;
107
+ const reducer = (await reactorClient.getDocumentModelModuleForDocument(document)).reducer;
108
108
  const actionSigner = action.context.signer;
109
109
  return await buildSignedAction(action, reducer, document, actionSigner, renown.crypto.sign);
110
110
  }
@@ -1742,7 +1742,7 @@ slug.setLocale = function(locale) {
1742
1742
  defaultLocale = locales[locale] || {};
1743
1743
  };
1744
1744
  //#endregion
1745
- //#region ../reactor-browser/dist/document-operations-DvhxGXqI.js
1745
+ //#region ../reactor-browser/dist/document-operations-D81QJKqH.js
1746
1746
  var DocumentModelNotFoundError = class extends Error {
1747
1747
  documentType;
1748
1748
  name = "DocumentModelNotFoundError";
@@ -1764,6 +1764,22 @@ var NoSelectedDocumentError = class extends Error {
1764
1764
  super("There is no selected document. Did you mean to call 'useSelectedDocumentSafe' instead?");
1765
1765
  }
1766
1766
  };
1767
+ const modalEventFunctions = makePHEventFunctions("modal");
1768
+ modalEventFunctions.useValue;
1769
+ /** Sets the current modal */
1770
+ const setPHModal = modalEventFunctions.setValue;
1771
+ modalEventFunctions.addEventHandler;
1772
+ /** Shows a modal */
1773
+ function showPHModal(modal) {
1774
+ setPHModal(modal);
1775
+ }
1776
+ /** Shows the delete node modal */
1777
+ function showDeleteNodeModal(nodeOrId) {
1778
+ setPHModal({
1779
+ type: "deleteItem",
1780
+ id: typeof nodeOrId === "string" ? nodeOrId : nodeOrId.id
1781
+ });
1782
+ }
1767
1783
  function getUserPermissions() {
1768
1784
  const user = window.ph?.renown?.user;
1769
1785
  const allowList = window.ph?.allowList;
@@ -1839,6 +1855,67 @@ function extractInitialState(documentScopeOps) {
1839
1855
  function filterDomainOperations(operations) {
1840
1856
  return Object.fromEntries(Object.entries(operations).filter(([scope]) => !NON_DOMAIN_SCOPES.has(scope)));
1841
1857
  }
1858
+ function countOperations(operations) {
1859
+ let total = 0;
1860
+ for (const ops of Object.values(operations)) total += ops?.length ?? 0;
1861
+ return total;
1862
+ }
1863
+ /**
1864
+ * Split an imported document's domain operations at its mid-history upgrade
1865
+ * boundaries, so the caller can re-dispatch each upgrade between segments.
1866
+ *
1867
+ * The seed's CREATE_DOCUMENT and 0 -> N upgrade are replayed by the creation
1868
+ * path and must not be repeated. A later upgrade must be: it is where the
1869
+ * reducer version changes, and dropping it replays everything after it through
1870
+ * the module the document was created with.
1871
+ */
1872
+ function splitAtUpgradeBoundaries(operations) {
1873
+ const upgrades = (operations.document ?? []).filter((op) => op.action.type === "UPGRADE_DOCUMENT").filter((op) => op.action.input.fromVersion > 0).sort((a, b) => a.index - b.index);
1874
+ const domain = filterDomainOperations(operations);
1875
+ if (upgrades.length === 0) return [{ operations: domain }];
1876
+ const segments = [];
1877
+ const consumed = /* @__PURE__ */ new Map();
1878
+ const take = (until) => {
1879
+ const slice = {};
1880
+ for (const [scope, ops] of Object.entries(domain)) {
1881
+ if (!ops) continue;
1882
+ const from = consumed.get(scope) ?? 0;
1883
+ const stop = Math.max(from, until(scope, ops));
1884
+ const chunk = ops.slice(from, stop);
1885
+ if (chunk.length > 0) slice[scope] = chunk;
1886
+ consumed.set(scope, stop);
1887
+ }
1888
+ return slice;
1889
+ };
1890
+ for (const upgrade of upgrades) {
1891
+ const input = upgrade.action.input;
1892
+ const slice = take((scope, ops) => boundary(upgrade, scope, ops));
1893
+ segments.push({
1894
+ operations: slice,
1895
+ upgradeTo: input.toVersion
1896
+ });
1897
+ }
1898
+ const tail = take((_scope, ops) => ops.length);
1899
+ if (countOperations(tail) > 0) segments.push({ operations: tail });
1900
+ return segments;
1901
+ }
1902
+ /**
1903
+ * How many of a scope's operations precede an upgrade. Must stay identical to
1904
+ * the boundary computation in `replayDocumentVersioned` — snapshots compare
1905
+ * against operation indices, not array positions, and the timestamp fallback
1906
+ * excludes the upgrade's own instant.
1907
+ */
1908
+ function boundary(upgrade, scope, ops) {
1909
+ const snapshot = upgrade.action.input.revision;
1910
+ if (snapshot !== void 0) {
1911
+ const revision = snapshot[scope] ?? 0;
1912
+ let count = 0;
1913
+ for (let i = 0; i < ops.length; i++) if (ops[i].index < revision) count = i + 1;
1914
+ return count;
1915
+ }
1916
+ for (let i = 0; i < ops.length; i++) if (ops[i].timestampUtcMs >= upgrade.timestampUtcMs) return i;
1917
+ return ops.length;
1918
+ }
1842
1919
  async function exportFile(document, suggestedName) {
1843
1920
  const reactorClient = window.ph?.reactorClient;
1844
1921
  if (!reactorClient) throw new Error("ReactorClient not initialized");
@@ -1886,13 +1963,20 @@ async function loadFile(path) {
1886
1963
  upgradeManifest
1887
1964
  });
1888
1965
  }
1889
- async function addDocument(driveId, name, documentType, parentFolder, document, id, preferredEditor) {
1966
+ async function addDocument(driveId, name, documentType, parentFolder, document, id, preferredEditor, documentModelVersion) {
1890
1967
  const { isAllowedToCreateDocuments } = getUserPermissions();
1891
1968
  if (!isAllowedToCreateDocuments) throw new Error("User is not allowed to create documents");
1892
1969
  const reactorClient = window.ph?.reactorClientModule?.client;
1893
1970
  if (!reactorClient) throw new Error("ReactorClient not initialized");
1894
- const documentModelModule = await reactorClient.getDocumentModelModule(documentType);
1971
+ let documentModelModule;
1972
+ if (documentModelVersion !== void 0) {
1973
+ const { results: documentModelModules } = await reactorClient.getDocumentModelModules();
1974
+ const module = documentModelModules.find((m) => m.documentModel.global.id === documentType && (m.version ?? 1) === documentModelVersion);
1975
+ if (!module) throw new Error(`Document model not found for type: ${documentType} with version: ${documentModelVersion}`);
1976
+ documentModelModule = module;
1977
+ } else documentModelModule = await reactorClient.getDocumentModelModule(documentType);
1895
1978
  const newDocument = document ?? documentModelModule.utils.createDocument();
1979
+ if (!document) newDocument.state.document.version = documentModelModule.version ?? 1;
1896
1980
  newDocument.header.name = name;
1897
1981
  if (preferredEditor) newDocument.header.meta = {
1898
1982
  ...newDocument.header.meta,
@@ -1940,7 +2024,10 @@ async function addFile(file, driveId, name, parentFolder) {
1940
2024
  }, {})
1941
2025
  };
1942
2026
  await addDocument(driveId, name || document.header.name, document.header.documentType, parentFolder, initialDocument, documentId, document.header.meta?.preferredEditor);
1943
- await uploadOperations(documentId, filterDomainOperations(document.operations), queueOperations);
2027
+ for (const segment of splitAtUpgradeBoundaries(document.operations)) {
2028
+ await uploadOperations(documentId, segment.operations, queueOperations);
2029
+ if (segment.upgradeTo !== void 0) await upgradeDocument(documentId, segment.upgradeTo);
2030
+ }
1944
2031
  }
1945
2032
  async function addFolder$1(driveId, name, parentFolder) {
1946
2033
  const { isAllowedToCreateDocuments } = getUserPermissions();
@@ -2069,21 +2156,14 @@ async function copyNode$1(driveId, src, target) {
2069
2156
  }
2070
2157
  return await queueActions(drive, copyNodesInput.map((copyNodeInput) => copyNode(copyNodeInput)));
2071
2158
  }
2072
- const modalEventFunctions = makePHEventFunctions("modal");
2073
- modalEventFunctions.useValue;
2074
- /** Sets the current modal */
2075
- const setPHModal = modalEventFunctions.setValue;
2076
- modalEventFunctions.addEventHandler;
2077
- /** Shows a modal */
2078
- function showPHModal(modal) {
2079
- setPHModal(modal);
2080
- }
2081
- /** Shows the delete node modal */
2082
- function showDeleteNodeModal(nodeOrId) {
2083
- setPHModal({
2084
- type: "deleteItem",
2085
- id: typeof nodeOrId === "string" ? nodeOrId : nodeOrId.id
2086
- });
2159
+ /**
2160
+ * Upgrades a document to a newer document model version. Defaults to the
2161
+ * latest registered version for the document's type.
2162
+ */
2163
+ async function upgradeDocument(documentId, toVersion) {
2164
+ const reactorClient = window.ph?.reactorClientModule?.client;
2165
+ if (!reactorClient) throw new Error("ReactorClient not initialized");
2166
+ return reactorClient.upgradeDocument(documentId, toVersion);
2087
2167
  }
2088
2168
  gql`
2089
2169
  mutation MutateDocumentWithOperations(
@@ -2690,6 +2770,7 @@ const useSync = () => useReactorClientModule()?.reactorModule?.syncModule?.syncM
2690
2770
  const useSyncList = () => {
2691
2771
  return useSync()?.list() ?? [];
2692
2772
  };
2773
+ const useModelRegistry = () => useReactorClientModule()?.reactorModule?.documentModelRegistry;
2693
2774
  const revisionHistoryEventFunctions = makePHEventFunctions("revisionHistoryVisible");
2694
2775
  revisionHistoryEventFunctions.useValue;
2695
2776
  /** Sets revision history visibility */
@@ -3544,6 +3625,50 @@ function useDocumentOfType(documentId, documentType) {
3544
3625
  if (document.header.documentType !== documentType) throw new DocumentTypeMismatchError(documentId, documentType, document.header.documentType);
3545
3626
  return [document, dispatch];
3546
3627
  }
3628
+ /**
3629
+ * Classifies a document's model version against the installed module
3630
+ * versions. Pure logic, extracted for testing.
3631
+ */
3632
+ function getDocumentVersionStatus(documentVersion, availableVersions, hasUpgradePath) {
3633
+ if (availableVersions.length === 0) return;
3634
+ const sorted = [...availableVersions].sort((a, b) => a - b);
3635
+ const latestVersion = sorted[sorted.length - 1];
3636
+ if (documentVersion > latestVersion) return {
3637
+ kind: "unsupported",
3638
+ documentVersion,
3639
+ availableVersions: sorted
3640
+ };
3641
+ if (documentVersion === latestVersion) return {
3642
+ kind: "current",
3643
+ documentVersion
3644
+ };
3645
+ return {
3646
+ kind: "upgrade-available",
3647
+ documentVersion,
3648
+ latestVersion,
3649
+ canUpgrade: hasUpgradePath(documentVersion, latestVersion)
3650
+ };
3651
+ }
3652
+ /**
3653
+ * Compares the given document's model version against the versions available
3654
+ * from installed Vetra packages. Returns undefined while packages load or
3655
+ * when the document type has no installed modules.
3656
+ */
3657
+ function useDocumentVersionStatus(document) {
3658
+ const modules = useDocumentModelModules();
3659
+ const registry = useModelRegistry();
3660
+ if (!document || !modules) return;
3661
+ const documentType = document.header.documentType;
3662
+ return getDocumentVersionStatus(document.state.document.version || 1, modules.filter((m) => m.documentModel.global.id === documentType).map((m) => m.version ?? 1), (fromVersion, toVersion) => {
3663
+ if (!registry) return false;
3664
+ try {
3665
+ registry.computeUpgradePath(documentType, fromVersion, toVersion);
3666
+ return true;
3667
+ } catch {
3668
+ return false;
3669
+ }
3670
+ });
3671
+ }
3547
3672
  const validateDocument = (document) => {
3548
3673
  const errors = [];
3549
3674
  if (document.header.documentType !== "powerhouse/document-model") return errors;
@@ -3971,6 +4096,6 @@ function createDebouncedRefreshReactorDataClient(debounceDelayMs = DEFAULT_DEBOU
3971
4096
  createDebouncedRefreshReactorData();
3972
4097
  createDebouncedRefreshReactorDataClient();
3973
4098
  //#endregion
3974
- export { useDragNode as A, isFileNodeKind as C, showDeleteNodeModal as D, setSelectedNode as E, e$1 as F, e$4 as I, t$2 as L, usePHToast as M, useSelectedDriveId as N, showRevisionHistory as O, useSelectedDriveSafe as P, t$5 as R, addFolder$1 as S, setSelectedDrive as T, useSetPHAppConfig as _, useEditorModules as a, useUserPermissions as b, useNodeActions as c, useNodesInSelectedDriveOrFolder as d, useParentFolderForSelectedNode as f, useSelectedNodePath as g, useSelectedFolder as h, useDownloadDocument as i, useDropNode as j, useDisabledEditors as k, useNodeById as l, useSelectedDocumentSafe as m, preloadEditorModule as n, useEditorModulesForDocumentType as o, useSelectedDocumentOfType as p, useAllowedDocumentModelModules as r, useGetSwitchboardLink as s, getSyncStatusSync as t, useNodeParentFolderById as u, useSetPHDocumentEditorConfig as v, isFolderNodeKind as w, addDocument as x, useTheme as y, useDocumentById as z };
4099
+ export { showRevisionHistory as A, t$2 as B, addFolder$1 as C, setSelectedNode as D, setSelectedDrive as E, useSelectedDriveId as F, useDocumentById as H, useSelectedDriveSafe as I, useStudioMode as L, useDragNode as M, useDropNode as N, showDeleteNodeModal as O, usePHToast as P, e$1 as R, addDocument as S, isFolderNodeKind as T, t$5 as V, useSelectedNodePath as _, useDownloadDocument as a, useTheme as b, useGetSwitchboardLink as c, useNodeParentFolderById as d, useNodesInSelectedDriveOrFolder as f, useSelectedFolder as g, useSelectedDocumentSafe as h, useDocumentVersionStatus as i, useDisabledEditors as j, showPHModal as k, useNodeActions as l, useSelectedDocumentOfType as m, preloadEditorModule as n, useEditorModules as o, useParentFolderForSelectedNode as p, useAllowedDocumentModelModules as r, useEditorModulesForDocumentType as s, getSyncStatusSync as t, useNodeById as u, useSetPHAppConfig as v, isFileNodeKind as w, useUserPermissions as x, useSetPHDocumentEditorConfig as y, e$4 as z };
3975
4100
 
3976
- //# sourceMappingURL=dist-BatmWBzA.js.map
4101
+ //# sourceMappingURL=dist-Cw08sCbR.js.map