@ohif/app 3.12.0-beta.98 → 3.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/{1403.bundle.3735409c5ee10bad1b58.js → 1403.bundle.1c9ce804d1e88033e276.js} +4 -2
  2. package/dist/{147.bundle.205350dc3d21478277b1.js → 147.bundle.37d627289453cb6c3937.js} +6 -15
  3. package/dist/{1608.bundle.f855c4bdb7f00eb66fca.js → 1608.bundle.0687c661f1c9edfb3b8a.js} +4 -4
  4. package/dist/{1730.bundle.69d51c8fd41cca9480e9.js → 1730.bundle.66a5e554ab20dab97b11.js} +7 -5
  5. package/dist/{1927.bundle.019331c266d306772371.js → 1927.bundle.3050588e95f43cf57cdd.js} +1 -1
  6. package/dist/{1933.bundle.a6092b5dc308587f7e9f.js → 1933.bundle.682f142e3217d4c7fbf7.js} +7 -3
  7. package/dist/{2018.bundle.9edfbe64e426c42945d3.js → 2018.bundle.c06693143228cc034cb9.js} +47 -47
  8. package/dist/{213.bundle.d45e5272c3ead34527d9.js → 213.bundle.c2d4d7370c26b0823880.js} +2 -2
  9. package/dist/{2424.bundle.90cb57b13d0eb58bf9ea.js → 2424.bundle.c1e287e752f352b76543.js} +2 -2
  10. package/dist/{2701.bundle.aca0d4f24a6f2094c3c3.js → 2701.bundle.12bd01a80a9f8ea4cd94.js} +4 -4
  11. package/dist/{2842.bundle.7852a204d3510fca8b27.js → 2842.bundle.860b9f10fcdd9656947a.js} +330 -123
  12. package/dist/{1903.bundle.b2d00c41d30d9dee2235.js → 3081.bundle.41838985e0472851eadb.js} +644 -322
  13. package/dist/{3343.bundle.f8fe9316b0ff68d087f7.js → 3343.bundle.d7578ce8f75d158c0bab.js} +2 -0
  14. package/dist/{3461.bundle.fa6d8be868e17123ff37.js → 3461.bundle.a8fcefd1c6e389d905fc.js} +21 -17
  15. package/dist/{3584.bundle.839a16d349815b3f7c97.js → 3584.bundle.8cc0750425513433e9cc.js} +15 -17
  16. package/dist/{4019.bundle.01f63d5dd5b96ded0c00.js → 4019.bundle.83a604779f7da0101ced.js} +196 -366
  17. package/dist/{4202.bundle.790706560c6edb303476.js → 4202.bundle.5a0f8e4004c5d8a68548.js} +2 -2
  18. package/dist/{5448.bundle.9a36e001169ea3bfeb6c.js → 4410.bundle.c5224cd7d6238a7d4660.js} +313 -57
  19. package/dist/{4775.bundle.31f05d287dee80955ac8.js → 4775.bundle.70bc407db26afaa4331a.js} +24 -16
  20. package/dist/{4819.bundle.5dbd25ed97d60cbef3ed.js → 4819.bundle.47e7aa44747ddab3a39a.js} +8 -6
  21. package/dist/{5028.bundle.46c429226b0d3850bec6.js → 5028.bundle.274945a9ae69c6b6ad51.js} +6 -6
  22. package/dist/{5462.bundle.a81a691eeef782ab95b9.js → 5462.bundle.21beddaca145b7465c72.js} +2 -0
  23. package/dist/{5485.bundle.9800ceb06b364d3b27f5.js → 5485.bundle.4e0ec03c61ec5cadd9bb.js} +3 -3
  24. package/dist/{5802.bundle.28ab859d9b48a5b2c31c.js → 5802.bundle.3bf5e6b3ab330a594a47.js} +6 -12
  25. package/dist/{6163.bundle.c2ea625c42d12160225c.js → 6163.bundle.ca93a4e6501880901f94.js} +4 -2
  26. package/dist/{3353.bundle.a0f1654c642395bbbbbc.js → 6347.bundle.784c48912700f281de1d.js} +323 -179
  27. package/dist/{5400.bundle.de97508611da1c00d58a.js → 6409.bundle.b36048896cb11c8571fb.js} +450 -79
  28. package/dist/{7412.bundle.aec4834a71fc27c4ce06.js → 7412.bundle.fab1742191b7fe937330.js} +251 -197
  29. package/dist/{7431.bundle.999b2b65d4973bc56218.js → 7431.bundle.b01791d10e6cf9f503b0.js} +10 -4
  30. package/dist/{7639.bundle.1fa23b3995e153f7173a.js → 7639.bundle.32152cacb059089ed7d7.js} +24 -20
  31. package/dist/{8305.bundle.f3c535c1a73ab7f616f1.js → 8305.bundle.2ede68ba3c075928c9f4.js} +47 -29
  32. package/dist/{8558.bundle.215c129b8285e7100e9f.js → 8558.bundle.3e84c4ba2c7ec6fce52c.js} +33 -3
  33. package/dist/{8583.bundle.f55a6843d8a64b56def5.js → 8583.bundle.2908eee785e7e4595d14.js} +28 -23
  34. package/dist/{9195.bundle.892af745c4b465dc458d.js → 9195.bundle.606ca286a0fed8a43f58.js} +151 -78
  35. package/dist/{9845.bundle.31aec3fe7a5cdc247f4e.js → 9845.bundle.255e7c7f7a88193b4e47.js} +16 -8
  36. package/dist/{9862.bundle.3ca0ad5f54db87ccf91e.js → 9862.bundle.3a8958a82c572015d25d.js} +2 -2
  37. package/dist/{9927.bundle.f459d6c6282f24377a9a.js → 9927.bundle.e798a347dfe1f241578f.js} +16 -16
  38. package/dist/{5549.bundle.d5def6a3124a3a481b7c.js → 997.bundle.822b33e561263084e18c.js} +961 -290
  39. package/dist/{app.bundle.f5ecd8673a5dc4323740.js → app.bundle.26b7eafdf05b5445414b.js} +6000 -2284
  40. package/dist/app.bundle.css +1 -1
  41. package/dist/{compute.bundle.fdee4a0f193ee2e1b6da.js → compute.bundle.64280c7af19ff567465f.js} +3 -3
  42. package/dist/dicom-microscopy-viewer/dicomMicroscopyViewer.min.js +3254 -1792
  43. package/dist/dicom-microscopy-viewer/dicomMicroscopyViewer.min.js.map +1 -1
  44. package/dist/index.html +1 -1
  45. package/dist/{polySeg.bundle.11f9746cd60c9811a412.js → polySeg.bundle.a5aa9130b4191253c410.js} +3 -3
  46. package/dist/sw.js +1 -1
  47. package/package.json +24 -24
  48. /package/dist/{1459.bundle.3a7ac3457326eff48547.js → 1459.bundle.e8802999a4d7f7edf628.js} +0 -0
  49. /package/dist/{5457.bundle.9d64aa81cc3f52968f3c.js → 5457.bundle.f7de73bcfe1012a73b9f.js} +0 -0
  50. /package/dist/{5858.bundle.d5f4bf849aaeebf5025c.js → 5858.bundle.ff6b340cf7457db76a1a.js} +0 -0
  51. /package/dist/{6027.bundle.57cd87592e825389ec2a.js → 6027.bundle.2b12862684b0cb3af4b4.js} +0 -0
  52. /package/dist/{85.bundle.1c671081e8c662c66b7a.js → 85.bundle.05591d5a14d74a502dfe.js} +0 -0
@@ -8,7 +8,7 @@
8
8
  /* harmony export */ A: () => (/* binding */ MoreDropdownMenu)
9
9
  /* harmony export */ });
10
10
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(86326);
11
- /* harmony import */ var _ohif_ui_next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1246);
11
+ /* harmony import */ var _ohif_ui_next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(12517);
12
12
  /* harmony import */ var _ohif_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(42356);
13
13
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
14
14
 
@@ -123,8 +123,8 @@ __webpack_require__.d(__webpack_exports__, {
123
123
 
124
124
  // EXTERNAL MODULE: ../../../node_modules/react/index.js
125
125
  var react = __webpack_require__(86326);
126
- // EXTERNAL MODULE: ../../ui-next/src/index.ts + 3073 modules
127
- var src = __webpack_require__(1246);
126
+ // EXTERNAL MODULE: ../../ui-next/src/index.ts + 3075 modules
127
+ var src = __webpack_require__(12517);
128
128
  // EXTERNAL MODULE: ../../core/src/index.ts + 69 modules
129
129
  var core_src = __webpack_require__(42356);
130
130
  // EXTERNAL MODULE: ../../../node_modules/react-router-dom/dist/index.js
@@ -622,7 +622,7 @@ function _findTabAndStudyOfDisplaySet(displaySetInstanceUID, tabs, currentTabNam
622
622
  /* harmony export */ T: () => (/* binding */ PanelStudyBrowserHeader)
623
623
  /* harmony export */ });
624
624
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(86326);
625
- /* harmony import */ var _ohif_ui_next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1246);
625
+ /* harmony import */ var _ohif_ui_next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(12517);
626
626
 
627
627
 
628
628
 
@@ -3701,8 +3701,8 @@ var react = __webpack_require__(86326);
3701
3701
  // EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
3702
3702
  var prop_types = __webpack_require__(97598);
3703
3703
  var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
3704
- // EXTERNAL MODULE: ../../ui-next/src/index.ts + 3073 modules
3705
- var ui_next_src = __webpack_require__(1246);
3704
+ // EXTERNAL MODULE: ../../ui-next/src/index.ts + 3075 modules
3705
+ var ui_next_src = __webpack_require__(12517);
3706
3706
  // EXTERNAL MODULE: ./state/index.js + 1 modules
3707
3707
  var state = __webpack_require__(45981);
3708
3708
  // EXTERNAL MODULE: ../../../node_modules/react-router-dom/dist/index.js
@@ -4775,8 +4775,8 @@ function getPanelModule({
4775
4775
  }];
4776
4776
  }
4777
4777
  /* harmony default export */ const src_getPanelModule = (getPanelModule);
4778
- // EXTERNAL MODULE: ../../i18n/src/index.js + 210 modules
4779
- var i18n_src = __webpack_require__(68523);
4778
+ // EXTERNAL MODULE: ../../i18n/src/index.js + 286 modules
4779
+ var i18n_src = __webpack_require__(89010);
4780
4780
  ;// ../../../extensions/default/package.json
4781
4781
  const package_namespaceObject = /*#__PURE__*/JSON.parse('{"UU":"@ohif/extension-default"}');
4782
4782
  ;// ../../../extensions/default/src/id.js
@@ -4939,6 +4939,9 @@ function areAllImageSpacingEqual(instances, messages) {
4939
4939
  return;
4940
4940
  }
4941
4941
  const lastIpp = (0,utils_toNumber/* default */.A)(instances[instances.length - 1].ImagePositionPatient);
4942
+ if (!lastIpp) {
4943
+ return;
4944
+ }
4942
4945
  const averageSpacingBetweenFrames = (0,isDisplaySetReconstructable/* _getPerpendicularDistance */.jj)(firstImagePositionPatient, lastIpp) / (instances.length - 1);
4943
4946
  let previousImagePositionPatient = firstImagePositionPatient;
4944
4947
  const issuesFound = [];
@@ -5168,6 +5171,8 @@ const chartHandler = {
5168
5171
  }
5169
5172
  };
5170
5173
 
5174
+ // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 1 modules
5175
+ var dist_esm = __webpack_require__(15327);
5171
5176
  ;// ../../../extensions/default/src/getSopClassHandlerModule.js
5172
5177
 
5173
5178
 
@@ -5175,6 +5180,7 @@ const chartHandler = {
5175
5180
 
5176
5181
 
5177
5182
 
5183
+
5178
5184
  const {
5179
5185
  isImage,
5180
5186
  sortStudyInstances,
@@ -5221,10 +5227,15 @@ function getDisplaySetInfo(instances) {
5221
5227
  if (isDynamicVolume) {
5222
5228
  const timePoint = timePoints[0];
5223
5229
  const instancesMap = new Map();
5224
-
5225
- // O(n) to convert it into a map and O(1) to find each instance
5226
- instances.forEach(instance => instancesMap.set(instance.imageId, instance));
5227
- const firstTimePointInstances = timePoint.map(imageId => instancesMap.get(imageId));
5230
+ let firstTimePointInstances;
5231
+ if (instances[0].NumberOfFrames > 1 && timePoints.length > 1) {
5232
+ // handle multiframe dynamic volume
5233
+ firstTimePointInstances = timePoints[0].map(imageId => dist_esm.metaData.get('instance', imageId));
5234
+ } else {
5235
+ // O(n) to convert it into a map and O(1) to find each instance
5236
+ instances.forEach(instance => instancesMap.set(instance.imageId, instance));
5237
+ firstTimePointInstances = timePoint.map(imageId => instancesMap.get(imageId));
5238
+ }
5228
5239
  displaySetInfo = getSopClassHandlerModule_isDisplaySetReconstructable(firstTimePointInstances, appConfig);
5229
5240
  } else {
5230
5241
  displaySetInfo = getSopClassHandlerModule_isDisplaySetReconstructable(instances, appConfig);
@@ -5235,7 +5246,7 @@ function getDisplaySetInfo(instances) {
5235
5246
  dynamicVolumeInfo
5236
5247
  };
5237
5248
  }
5238
- const makeDisplaySet = instances => {
5249
+ const makeDisplaySet = (instances, index) => {
5239
5250
  // Need to sort the instances in order to get a consistent instance/thumbnail
5240
5251
  sortStudyInstances(instances);
5241
5252
  const instance = instances[0];
@@ -5349,14 +5360,14 @@ function getDisplaySetsFromSeries(instances) {
5349
5360
  // into their own specific display sets. Place the rest of each
5350
5361
  // series into another display set.
5351
5362
  const stackableInstances = [];
5352
- instances.forEach(instance => {
5363
+ instances.forEach((instance, instanceIndex) => {
5353
5364
  // All imaging modalities must have a valid value for sopClassUid (x00080016) or rows (x00280010)
5354
5365
  if (!isImage(instance.SOPClassUID) && !instance.Rows) {
5355
5366
  return;
5356
5367
  }
5357
5368
  let displaySet;
5358
5369
  if (isMultiFrame(instance)) {
5359
- displaySet = makeDisplaySet([instance]);
5370
+ displaySet = makeDisplaySet([instance], instanceIndex);
5360
5371
  displaySet.setAttributes({
5361
5372
  sopClassUids,
5362
5373
  numImageFrames: instance.NumberOfFrames,
@@ -5365,7 +5376,7 @@ function getDisplaySetsFromSeries(instances) {
5365
5376
  });
5366
5377
  displaySets.push(displaySet);
5367
5378
  } else if (isSingleImageModality(instance.Modality)) {
5368
- displaySet = makeDisplaySet([instance]);
5379
+ displaySet = makeDisplaySet([instance], instanceIndex);
5369
5380
  displaySet.setAttributes({
5370
5381
  sopClassUids,
5371
5382
  instanceNumber: instance.InstanceNumber,
@@ -5377,7 +5388,7 @@ function getDisplaySetsFromSeries(instances) {
5377
5388
  }
5378
5389
  });
5379
5390
  if (stackableInstances.length) {
5380
- const displaySet = makeDisplaySet(stackableInstances);
5391
+ const displaySet = makeDisplaySet(stackableInstances, displaySets.length);
5381
5392
  displaySet.setAttribute('studyInstanceUid', instances[0].StudyInstanceUID);
5382
5393
  displaySet.setAttributes({
5383
5394
  sopClassUids
@@ -6077,7 +6088,7 @@ function adaptItem(item, subProps) {
6077
6088
  return newItem;
6078
6089
  }
6079
6090
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/index.js
6080
- var dist_esm = __webpack_require__(4667);
6091
+ var tools_dist_esm = __webpack_require__(4667);
6081
6092
  ;// ../../../extensions/default/src/CustomizableContextMenu/ContextMenuController.tsx
6082
6093
  var _ContextMenuController;
6083
6094
 
@@ -6131,7 +6142,7 @@ class ContextMenuController {
6131
6142
  const {
6132
6143
  locking,
6133
6144
  visibility
6134
- } = dist_esm.annotation;
6145
+ } = tools_dist_esm.annotation;
6135
6146
  const targetAnnotationId = selectorProps?.nearbyToolData?.annotationUID;
6136
6147
  if (targetAnnotationId) {
6137
6148
  const isLocked = locking.isAnnotationLocked(targetAnnotationId);
@@ -6795,6 +6806,9 @@ function getSortedTags(metadata) {
6795
6806
  function getRows(metadata, depth = 0) {
6796
6807
  // Tag, Type, Value, Keyword
6797
6808
 
6809
+ if (!metadata) {
6810
+ return [];
6811
+ }
6798
6812
  const keywords = Object.keys(metadata);
6799
6813
  const rows = [];
6800
6814
  for (let i = 0; i < keywords.length; i++) {
@@ -8777,6 +8791,7 @@ const hpMN8 = {
8777
8791
  };
8778
8792
  /* harmony default export */ const hpMNGrid = ((/* unused pure expression or super */ null && (hpMN)));
8779
8793
  ;// ../../../extensions/default/src/hangingprotocols/hpCompare.ts
8794
+
8780
8795
  const defaultDisplaySetSelector = {
8781
8796
  studyMatchingRules: [{
8782
8797
  // The priorInstance is a study counter that indicates what position this study is in
@@ -8879,8 +8894,8 @@ const priorViewport1 = {
8879
8894
  */
8880
8895
  const hpMNCompare = {
8881
8896
  id: '@ohif/hpCompare',
8882
- description: 'Compare two studies in various layouts',
8883
- name: 'Compare Two Studies',
8897
+ description: i18next/* default */.A.t('Hps:Compare two studies in various layouts'),
8898
+ name: i18next/* default */.A.t('Hps:Compare Two Studies'),
8884
8899
  numberOfPriorsReferenced: 1,
8885
8900
  protocolMatchingRules: [{
8886
8901
  id: 'Two Studies',
@@ -9123,6 +9138,7 @@ const LMLOPrior = {
9123
9138
 
9124
9139
  ;// ../../../extensions/default/src/hangingprotocols/hpMammo.ts
9125
9140
 
9141
+
9126
9142
  const rightDisplayArea = {
9127
9143
  storeAsInitialCamera: true,
9128
9144
  imageArea: [0.8, 0.8],
@@ -9142,7 +9158,7 @@ const leftDisplayArea = {
9142
9158
  const hpMammography = {
9143
9159
  id: '@ohif/hpMammo',
9144
9160
  hasUpdatedPriorsInformation: false,
9145
- name: 'Mammography Breast Screening',
9161
+ name: i18next/* default */.A.t('Hps:Mammography Breast Screening'),
9146
9162
  protocolMatchingRules: [{
9147
9163
  id: 'Mammography',
9148
9164
  weight: 150,
@@ -9880,7 +9896,6 @@ const {
9880
9896
 
9881
9897
 
9882
9898
 
9883
-
9884
9899
  function ItemListComponent({
9885
9900
  itemLabel,
9886
9901
  itemList,
@@ -9902,36 +9917,42 @@ function ItemListComponent({
9902
9917
  }, /*#__PURE__*/react.createElement("div", {
9903
9918
  className: "flex items-center justify-between"
9904
9919
  }, /*#__PURE__*/react.createElement("div", {
9905
- className: "text-primary-light text-[20px]"
9906
- }, t(`Select ${itemLabel}`)), /*#__PURE__*/react.createElement(ui_src/* InputFilterText */.Cv, {
9920
+ className: "text-highlight text-xl"
9921
+ }, t(`Select ${itemLabel}`)), /*#__PURE__*/react.createElement(ui_next_src/* InputFilter */.zbB, {
9907
9922
  className: "max-w-[40%] grow",
9908
- value: filterValue,
9909
- onDebounceChange: setFilterValue,
9910
- placeholder: t(`Search ${itemLabel} list`)
9911
- })), /*#__PURE__*/react.createElement("div", {
9923
+ onChange: setFilterValue
9924
+ }, /*#__PURE__*/react.createElement(ui_next_src/* InputFilter */.zbB.SearchIcon, null), /*#__PURE__*/react.createElement(ui_next_src/* InputFilter */.zbB.Input, {
9925
+ placeholder: t(`Search ${itemLabel} list`),
9926
+ className: "pl-8 pr-9"
9927
+ }), /*#__PURE__*/react.createElement(ui_next_src/* InputFilter */.zbB.ClearButton, {
9928
+ className: "text-primary mr-0.5 p-0.5"
9929
+ }))), /*#__PURE__*/react.createElement("div", {
9912
9930
  className: "relative flex min-h-[1px] grow flex-col bg-black text-[14px]"
9913
9931
  }, itemList == null ? /*#__PURE__*/react.createElement(LoadingIndicatorProgress, {
9914
9932
  className: 'h-full w-full'
9915
9933
  }) : itemList.length === 0 ? /*#__PURE__*/react.createElement("div", {
9916
- className: "text-primary-light flex h-full flex-col items-center justify-center px-6 py-4"
9934
+ className: "text-highlight flex h-full flex-col items-center justify-center px-6 py-4"
9917
9935
  }, /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI1.ToolMagnify, {
9918
9936
  className: "mb-4"
9919
9937
  }), /*#__PURE__*/react.createElement("span", null, t(`No ${itemLabel} available`))) : /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement("div", {
9920
- className: "bg-secondary-dark px-3 py-1.5 text-white"
9938
+ className: "bg-popover text-foreground px-3 py-1.5"
9921
9939
  }, t(itemLabel)), /*#__PURE__*/react.createElement("div", {
9922
9940
  className: "ohif-scrollbar overflow-auto"
9923
9941
  }, itemList.filter(item => !filterValue || item.name.toLowerCase().includes(filterValue.toLowerCase())).map(item => {
9924
- const border = 'rounded border-transparent border-b-secondary-light border-[1px] hover:border-primary-light';
9942
+ const border = 'rounded border-transparent border-b-input border-[1px]';
9925
9943
  return /*#__PURE__*/react.createElement("div", {
9926
- className: classnames_default()('hover:text-primary-light hover:bg-primary-dark group mx-2 flex items-center justify-between px-6 py-2', border),
9944
+ className: classnames_default()('hover:text-highlight hover:bg-muted group mx-2 flex items-center justify-between px-6 py-2', border),
9927
9945
  key: item.id
9928
- }, /*#__PURE__*/react.createElement("div", null, item.name), /*#__PURE__*/react.createElement(ui_src/* Button */.$n, {
9946
+ }, /*#__PURE__*/react.createElement("div", {
9947
+ className: "text-muted-foreground"
9948
+ }, item.name), /*#__PURE__*/react.createElement(ui_next_src/* Button */.$nd, {
9929
9949
  onClick: () => onItemClicked(item),
9930
9950
  className: "invisible group-hover:visible",
9931
- endIcon: /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI1.ByName, {
9932
- name: "arrow-left"
9933
- })
9934
- }, t('Select')));
9951
+ variant: "default",
9952
+ size: "sm"
9953
+ }, t('Select'), /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI1.ChevronRight, {
9954
+ className: "ml-2 h-3 w-3"
9955
+ })));
9935
9956
  })))));
9936
9957
  }
9937
9958
  /* harmony default export */ const Components_ItemListComponent = (ItemListComponent);
@@ -10076,11 +10097,7 @@ function DataSourceConfigurationComponent({
10076
10097
  if (!activeDataSourceDef?.configuration?.configurationAPI) {
10077
10098
  return;
10078
10099
  }
10079
- const {
10080
- factory: configurationAPIFactory
10081
- } = customizationService.getCustomization(activeDataSourceDef.configuration.configurationAPI) ?? {
10082
- factory: () => null
10083
- };
10100
+ const configurationAPIFactory = customizationService.getCustomization(activeDataSourceDef.configuration.configurationAPI) ?? (() => null);
10084
10101
  if (!configurationAPIFactory) {
10085
10102
  return;
10086
10103
  }
@@ -10106,6 +10123,7 @@ function DataSourceConfigurationComponent({
10106
10123
  show({
10107
10124
  content: Components_DataSourceConfigurationModalComponent,
10108
10125
  title: t('Configure Data Source'),
10126
+ containerClassName: 'max-w-3xl',
10109
10127
  contentProps: {
10110
10128
  configurationAPI,
10111
10129
  configuredItems,
@@ -10393,23 +10411,27 @@ var browser_detect_es5 = __webpack_require__(88123);
10393
10411
 
10394
10412
 
10395
10413
 
10414
+
10396
10415
  function AboutModalDefault() {
10416
+ const {
10417
+ t
10418
+ } = (0,es/* useTranslation */.Bd)('AboutModal');
10397
10419
  const {
10398
10420
  os,
10399
10421
  version,
10400
10422
  name
10401
10423
  } = (0,browser_detect_es5/* default */.A)();
10402
10424
  const browser = `${name[0].toUpperCase()}${name.substr(1)} ${version}`;
10403
- const versionNumber = "3.12.0-beta.98";
10404
- const commitHash = "6566354986583e5d7db01c8734e282faf7a072b9";
10425
+ const versionNumber = "3.12.0";
10426
+ const commitHash = "27b1afe040061c6afc15bf131e28cdff3a5f0ec7";
10405
10427
  const [main, beta] = versionNumber.split('-');
10406
10428
  return /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU, {
10407
10429
  className: "w-[400px]"
10408
10430
  }, /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU.ProductName, null, "OHIF Viewer"), /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU.ProductVersion, null, main), beta && /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU.ProductBeta, null, beta), /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU.Body, null, /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU.DetailItem, {
10409
- label: "Commit Hash",
10431
+ label: t('Commit Hash'),
10410
10432
  value: commitHash
10411
10433
  }), /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU.DetailItem, {
10412
- label: "Current Browser & OS",
10434
+ label: t('Current Browser & OS'),
10413
10435
  value: `${browser}, ${os}`
10414
10436
  }), /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU.SocialItem, {
10415
10437
  icon: "SocialGithub",
@@ -10439,15 +10461,27 @@ function UserPreferencesModalDefault({
10439
10461
  hotkeysManager
10440
10462
  } = (0,src/* useSystem */.Jg)();
10441
10463
  const {
10442
- t
10464
+ t,
10465
+ i18n: i18nextInstance
10443
10466
  } = (0,es/* useTranslation */.Bd)('UserPreferencesModal');
10444
10467
  const {
10445
10468
  hotkeyDefinitions = {},
10446
10469
  hotkeyDefaults = {}
10447
10470
  } = hotkeysManager;
10471
+ const fallbackHotkeyDefinitions = (0,react.useMemo)(() => hotkeysManager.getValidHotkeyDefinitions(src/* hotkeys */.ot.defaults.hotkeyBindings), [hotkeysManager]);
10472
+ (0,react.useEffect)(() => {
10473
+ if (!Object.keys(hotkeyDefaults).length) {
10474
+ hotkeysManager.setDefaultHotKeys(src/* hotkeys */.ot.defaults.hotkeyBindings);
10475
+ }
10476
+ if (!Object.keys(hotkeyDefinitions).length) {
10477
+ hotkeysManager.setHotkeys(fallbackHotkeyDefinitions);
10478
+ }
10479
+ }, [hotkeysManager, hotkeyDefaults, hotkeyDefinitions, fallbackHotkeyDefinitions]);
10480
+ const resolvedHotkeyDefaults = Object.keys(hotkeyDefaults).length ? hotkeyDefaults : fallbackHotkeyDefinitions;
10481
+ const initialHotkeyDefinitions = Object.keys(hotkeyDefinitions).length ? hotkeyDefinitions : resolvedHotkeyDefaults;
10448
10482
  const currentLanguage = currentLanguageFn();
10449
10483
  const [state, setState] = (0,react.useState)({
10450
- hotkeyDefinitions: hotkeyDefinitions,
10484
+ hotkeyDefinitions: initialHotkeyDefinitions,
10451
10485
  languageValue: currentLanguage.value
10452
10486
  });
10453
10487
  const onLanguageChangeHandler = value => {
@@ -10472,10 +10506,45 @@ function UserPreferencesModalDefault({
10472
10506
  setState(state => ({
10473
10507
  ...state,
10474
10508
  languageValue: defaultLanguage.value,
10475
- hotkeyDefinitions: hotkeyDefaults
10509
+ hotkeyDefinitions: resolvedHotkeyDefaults
10476
10510
  }));
10477
10511
  hotkeysManager.restoreDefaultBindings();
10478
10512
  };
10513
+ const displayNames = react.useMemo(() => {
10514
+ if (typeof Intl === 'undefined' || typeof Intl.DisplayNames !== 'function') {
10515
+ return null;
10516
+ }
10517
+ const locales = [state.languageValue, currentLanguage.value, i18nextInstance.language, 'en'];
10518
+ const uniqueLocales = Array.from(new Set(locales.filter(Boolean)));
10519
+ try {
10520
+ return new Intl.DisplayNames(uniqueLocales, {
10521
+ type: 'language',
10522
+ fallback: 'none'
10523
+ });
10524
+ } catch (error) {
10525
+ console.warn('Intl.DisplayNames not supported for locales', uniqueLocales, error);
10526
+ }
10527
+ return null;
10528
+ }, [state.languageValue, currentLanguage.value, i18nextInstance.language]);
10529
+ const getLanguageLabel = react.useCallback((languageValue, fallbackLabel) => {
10530
+ const translationKey = `LanguageName.${languageValue}`;
10531
+ if (i18nextInstance.exists(translationKey, {
10532
+ ns: 'UserPreferencesModal'
10533
+ })) {
10534
+ return t(translationKey);
10535
+ }
10536
+ if (displayNames) {
10537
+ try {
10538
+ const localized = displayNames.of(languageValue);
10539
+ if (localized && localized.toLowerCase() !== languageValue.toLowerCase()) {
10540
+ return localized.charAt(0).toUpperCase() + localized.slice(1);
10541
+ }
10542
+ } catch (error) {
10543
+ console.debug(`Unable to resolve display name for ${languageValue}`, error);
10544
+ }
10545
+ }
10546
+ return fallbackLabel;
10547
+ }, [displayNames, i18nextInstance, t]);
10479
10548
  return /*#__PURE__*/react.createElement(ui_next_src/* UserPreferencesModal */.xMy, null, /*#__PURE__*/react.createElement(ui_next_src/* UserPreferencesModal */.xMy.Body, null, /*#__PURE__*/react.createElement("div", {
10480
10549
  className: "mb-3 flex items-center space-x-14"
10481
10550
  }, /*#__PURE__*/react.createElement(ui_next_src/* UserPreferencesModal */.xMy.SubHeading, null, t('Language')), /*#__PURE__*/react.createElement(ui_next_src/* Select */.l6P, {
@@ -10489,7 +10558,7 @@ function UserPreferencesModalDefault({
10489
10558
  })), /*#__PURE__*/react.createElement(ui_next_src/* SelectContent */.gCo, null, availableLanguages.map(lang => /*#__PURE__*/react.createElement(ui_next_src/* SelectItem */.ebT, {
10490
10559
  key: lang.value,
10491
10560
  value: lang.value
10492
- }, lang.label))))), /*#__PURE__*/react.createElement(ui_next_src/* UserPreferencesModal */.xMy.SubHeading, null, t('Hotkeys')), /*#__PURE__*/react.createElement(ui_next_src/* UserPreferencesModal */.xMy.HotkeysGrid, null, Object.entries(state.hotkeyDefinitions).map(([id, definition]) => /*#__PURE__*/react.createElement(ui_next_src/* UserPreferencesModal */.xMy.Hotkey, {
10561
+ }, getLanguageLabel(lang.value, lang.label)))))), /*#__PURE__*/react.createElement(ui_next_src/* UserPreferencesModal */.xMy.SubHeading, null, t('Hotkeys')), /*#__PURE__*/react.createElement(ui_next_src/* UserPreferencesModal */.xMy.HotkeysGrid, null, Object.entries(state.hotkeyDefinitions).map(([id, definition]) => /*#__PURE__*/react.createElement(ui_next_src/* UserPreferencesModal */.xMy.Hotkey, {
10493
10562
  key: id,
10494
10563
  label: t(definition.label),
10495
10564
  value: definition.keys,
@@ -10508,6 +10577,9 @@ function UserPreferencesModalDefault({
10508
10577
  onClick: () => {
10509
10578
  if (state.languageValue !== currentLanguage.value) {
10510
10579
  i18n_src/* default */.A.changeLanguage(state.languageValue);
10580
+ // Force page reload after language change to ensure all translations are applied
10581
+ window.location.reload();
10582
+ return; // Exit early since we're reloading
10511
10583
  }
10512
10584
  hotkeysManager.setHotkeys(state.hotkeyDefinitions);
10513
10585
  src/* hotkeys */.ot.stopRecord();
@@ -10649,6 +10721,7 @@ function ReportDialog({
10649
10721
  'ohif.hotkeyBindings': src/* defaults */.NT.hotkeyBindings
10650
10722
  });
10651
10723
  ;// ../../../extensions/default/src/customizations/onboardingCustomization.ts
10724
+
10652
10725
  function waitForElement(selector, maxAttempts = 20, interval = 25) {
10653
10726
  return new Promise(resolve => {
10654
10727
  let attempts = 0;
@@ -10668,8 +10741,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10668
10741
  route: '/viewer',
10669
10742
  steps: [{
10670
10743
  id: 'scroll',
10671
- title: 'Scrolling Through Images',
10672
- text: 'You can scroll through the images using the mouse wheel or scrollbar.',
10744
+ title: i18n_src/* default */.A.t('Onboarding:Scrolling Through Images'),
10745
+ text: i18n_src/* default */.A.t('Onboarding:You can scroll through the images using the mouse wheel or scrollbar.'),
10673
10746
  attachTo: {
10674
10747
  element: '.viewport-element',
10675
10748
  on: 'top'
@@ -10681,8 +10754,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10681
10754
  beforeShowPromise: () => waitForElement('.viewport-element')
10682
10755
  }, {
10683
10756
  id: 'zoom',
10684
- title: 'Zooming In and Out',
10685
- text: 'You can zoom the images using the right click.',
10757
+ title: i18n_src/* default */.A.t('Onboarding:Zooming In and Out'),
10758
+ text: i18n_src/* default */.A.t('Onboarding:You can zoom the images using the right click.'),
10686
10759
  attachTo: {
10687
10760
  element: '.viewport-element',
10688
10761
  on: 'left'
@@ -10694,8 +10767,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10694
10767
  beforeShowPromise: () => waitForElement('.viewport-element')
10695
10768
  }, {
10696
10769
  id: 'pan',
10697
- title: 'Panning the Image',
10698
- text: 'You can pan the images using the middle click.',
10770
+ title: i18n_src/* default */.A.t('Onboarding:Panning the Image'),
10771
+ text: i18n_src/* default */.A.t('Onboarding:You can pan the images using the middle click.'),
10699
10772
  attachTo: {
10700
10773
  element: '.viewport-element',
10701
10774
  on: 'top'
@@ -10707,8 +10780,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10707
10780
  beforeShowPromise: () => waitForElement('.viewport-element')
10708
10781
  }, {
10709
10782
  id: 'windowing',
10710
- title: 'Adjusting Window Level',
10711
- text: 'You can modify the window level using the left click.',
10783
+ title: i18n_src/* default */.A.t('Onboarding:Adjusting Window Level'),
10784
+ text: i18n_src/* default */.A.t('Onboarding:You can modify the window level using the left click.'),
10712
10785
  attachTo: {
10713
10786
  element: '.viewport-element',
10714
10787
  on: 'left'
@@ -10720,8 +10793,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10720
10793
  beforeShowPromise: () => waitForElement('.viewport-element')
10721
10794
  }, {
10722
10795
  id: 'length',
10723
- title: 'Using the Measurement Tools',
10724
- text: 'You can measure the length of a region using the Length tool.',
10796
+ title: i18n_src/* default */.A.t('Onboarding:Using the Measurement Tools'),
10797
+ text: i18n_src/* default */.A.t('Onboarding:You can measure the length of a region using the Length tool.'),
10725
10798
  attachTo: {
10726
10799
  element: '[data-cy="MeasurementTools-split-button-primary"]',
10727
10800
  on: 'bottom'
@@ -10730,11 +10803,11 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10730
10803
  selector: '[data-cy="MeasurementTools-split-button-primary"]',
10731
10804
  event: 'click'
10732
10805
  },
10733
- beforeShowPromise: () => waitForElement('[data-cy="MeasurementTools-split-button-primary]')
10806
+ beforeShowPromise: () => waitForElement('[data-cy="MeasurementTools-split-button-primary"]')
10734
10807
  }, {
10735
10808
  id: 'drawAnnotation',
10736
- title: 'Drawing Length Annotations',
10737
- text: 'Use the length tool on the viewport to measure the length of a region.',
10809
+ title: i18n_src/* default */.A.t('Onboarding:Drawing Length Annotations'),
10810
+ text: i18n_src/* default */.A.t('Onboarding:Use the length tool on the viewport to measure the length of a region.'),
10738
10811
  attachTo: {
10739
10812
  element: '.viewport-element',
10740
10813
  on: 'right'
@@ -10746,8 +10819,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10746
10819
  beforeShowPromise: () => waitForElement('.viewport-element')
10747
10820
  }, {
10748
10821
  id: 'trackMeasurement',
10749
- title: 'Tracking Measurements in the Panel',
10750
- text: 'Click yes to track the measurements in the measurement panel.',
10822
+ title: i18n_src/* default */.A.t('Onboarding:Tracking Measurements in the Panel'),
10823
+ text: i18n_src/* default */.A.t('Onboarding:Click yes to track the measurements in the measurement panel.'),
10751
10824
  attachTo: {
10752
10825
  element: '[data-cy="prompt-begin-tracking-yes-btn"]',
10753
10826
  on: 'bottom'
@@ -10759,8 +10832,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10759
10832
  beforeShowPromise: () => waitForElement('[data-cy="prompt-begin-tracking-yes-btn"]')
10760
10833
  }, {
10761
10834
  id: 'openMeasurementPanel',
10762
- title: 'Opening the Measurements Panel',
10763
- text: 'Click the measurements button to open the measurements panel.',
10835
+ title: i18n_src/* default */.A.t('Onboarding:Opening the Measurements Panel'),
10836
+ text: i18n_src/* default */.A.t('Onboarding:Click the measurements button to open the measurements panel.'),
10764
10837
  attachTo: {
10765
10838
  element: '#trackedMeasurements-btn',
10766
10839
  on: 'left-start'
@@ -10772,8 +10845,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10772
10845
  beforeShowPromise: () => waitForElement('#trackedMeasurements-btn')
10773
10846
  }, {
10774
10847
  id: 'scrollAwayFromMeasurement',
10775
- title: 'Scrolling Away from a Measurement',
10776
- text: 'Scroll the images using the mouse wheel away from the measurement.',
10848
+ title: i18n_src/* default */.A.t('Onboarding:Scrolling Away from a Measurement'),
10849
+ text: i18n_src/* default */.A.t('Onboarding:Scroll the images using the mouse wheel away from the measurement.'),
10777
10850
  attachTo: {
10778
10851
  element: '.viewport-element',
10779
10852
  on: 'left'
@@ -10785,8 +10858,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10785
10858
  beforeShowPromise: () => waitForElement('.viewport-element')
10786
10859
  }, {
10787
10860
  id: 'jumpToMeasurement',
10788
- title: 'Jumping to Measurements in the Panel',
10789
- text: 'Click the measurement in the measurement panel to jump to it.',
10861
+ title: i18n_src/* default */.A.t('Onboarding:Jumping to Measurements in the Panel'),
10862
+ text: i18n_src/* default */.A.t('Onboarding:Click the measurement in the measurement panel to jump to it.'),
10790
10863
  attachTo: {
10791
10864
  element: '[data-cy="data-row"]',
10792
10865
  on: 'left-start'
@@ -10798,8 +10871,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10798
10871
  beforeShowPromise: () => waitForElement('[data-cy="data-row"]')
10799
10872
  }, {
10800
10873
  id: 'changeLayout',
10801
- title: 'Changing Layout',
10802
- text: 'You can change the layout of the viewer using the layout button.',
10874
+ title: i18n_src/* default */.A.t('Onboarding:Changing Layout'),
10875
+ text: i18n_src/* default */.A.t('Onboarding:You can change the layout of the viewer using the layout button.'),
10803
10876
  attachTo: {
10804
10877
  element: '[data-cy="Layout"]',
10805
10878
  on: 'bottom'
@@ -10811,8 +10884,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10811
10884
  beforeShowPromise: () => waitForElement('[data-cy="Layout"]')
10812
10885
  }, {
10813
10886
  id: 'selectLayout',
10814
- title: 'Selecting the MPR Layout',
10815
- text: 'Select the MPR layout to view the images in MPR mode.',
10887
+ title: i18n_src/* default */.A.t('Onboarding:Selecting the MPR Layout'),
10888
+ text: i18n_src/* default */.A.t('Onboarding:Select the MPR layout to view the images in MPR mode.'),
10816
10889
  attachTo: {
10817
10890
  element: '[data-cy="MPR"]',
10818
10891
  on: 'left-start'
@@ -10827,7 +10900,7 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10827
10900
  useModalOverlay: true,
10828
10901
  defaultStepOptions: {
10829
10902
  buttons: [{
10830
- text: 'Skip all',
10903
+ text: i18n_src/* default */.A.t('Onboarding:Skip all'),
10831
10904
  action() {
10832
10905
  this.complete();
10833
10906
  },
@@ -11433,7 +11506,7 @@ async function callInputDialogAutoComplete({
11433
11506
  const labellingDoneCallback = newValue => {
11434
11507
  uiDialogService.hide('select-annotation');
11435
11508
  if (measurement && typeof newValue === 'string') {
11436
- const sourceAnnotation = dist_esm.annotation.state.getAnnotation(measurement.uid);
11509
+ const sourceAnnotation = tools_dist_esm.annotation.state.getAnnotation(measurement.uid);
11437
11510
  (0,utilities.setAnnotationLabel)(sourceAnnotation, element, newValue);
11438
11511
  }
11439
11512
  resolve(newValue);
@@ -14,8 +14,8 @@ __webpack_require__.d(__webpack_exports__, {
14
14
 
15
15
  // EXTERNAL MODULE: ../../../node_modules/react/index.js
16
16
  var react = __webpack_require__(86326);
17
- // EXTERNAL MODULE: ../../ui-next/src/index.ts + 3073 modules
18
- var src = __webpack_require__(1246);
17
+ // EXTERNAL MODULE: ../../ui-next/src/index.ts + 3075 modules
18
+ var src = __webpack_require__(12517);
19
19
  ;// ../../../extensions/cornerstone-dicom-seg/src/utils/initSEGToolGroup.ts
20
20
  function createSEGToolGroupAndAddTools({
21
21
  commandsManager,
@@ -30,8 +30,8 @@ function createSEGToolGroupAndAddTools({
30
30
  return toolGroupService.createToolGroupAndAddTools(toolGroupId, updatedTools);
31
31
  }
32
32
  /* harmony default export */ const initSEGToolGroup = (createSEGToolGroupAndAddTools);
33
- // EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx + 192 modules
34
- var cornerstone_src = __webpack_require__(71903);
33
+ // EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx + 193 modules
34
+ var cornerstone_src = __webpack_require__(63081);
35
35
  ;// ../../../extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts
36
36
 
37
37
  function promptHydrateSEG({
@@ -121,12 +121,20 @@ function OHIFCornerstoneSEGViewport(props) {
121
121
  // In such cases, we attempt to handle this scenario gracefully by
122
122
  // invoking a custom handler. Ideally, if a user tries to launch a series that isn't viewable,
123
123
  // (eg.: we can prompt them with an explanation and provide a link to the full study).
124
+
125
+ // Additional guard: If no customization handler is registered for missing
126
+ // referenced display sets, skip SEG rendering to avoid a viewport crash.
124
127
  if (!referencedDisplaySetInstanceUID) {
125
128
  const missingReferenceDisplaySetHandler = customizationService.getCustomization('missingReferenceDisplaySetHandler');
126
- const {
127
- handled
128
- } = missingReferenceDisplaySetHandler();
129
- if (handled) {
129
+ if (typeof missingReferenceDisplaySetHandler === 'function') {
130
+ const {
131
+ handled
132
+ } = missingReferenceDisplaySetHandler();
133
+ if (handled) {
134
+ return;
135
+ }
136
+ } else {
137
+ console.log("No customization 'missingReferenceDisplaySetHandler' registered. Skipping SEG rendering.");
130
138
  return;
131
139
  }
132
140
  }
@@ -11,8 +11,8 @@ __webpack_require__.r(__webpack_exports__);
11
11
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(86326);
12
12
  /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(97598);
13
13
  /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
14
- /* harmony import */ var _ohif_ui_next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1246);
15
- /* harmony import */ var _ohif_extension_cornerstone__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(71903);
14
+ /* harmony import */ var _ohif_ui_next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(12517);
15
+ /* harmony import */ var _ohif_extension_cornerstone__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(63081);
16
16
  /* harmony import */ var _cornerstonejs_tools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(4667);
17
17
  /* harmony import */ var _getContextModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(55844);
18
18
  /* harmony import */ var _cornerstonejs_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(15327);