+
{studyDate}
@@ -125,19 +127,21 @@ const ViewportActionBar = ({
)}
-
+ {showPatientInfoIcon && (
+
+ )}
);
};
@@ -148,6 +152,7 @@ ViewportActionBar.propTypes = {
showCine: PropTypes.bool,
cineProps: PropTypes.object,
showPatientInfo: PropTypes.bool,
+ showPatientInfoIcon: PropTypes.bool,
studyData: PropTypes.shape({
//
useAltStyling: PropTypes.bool,
@@ -175,6 +180,7 @@ ViewportActionBar.defaultProps = {
showStatus: true,
showNavArrows: true,
showPatientInfo: false,
+ showPatientInfoIcon: true,
};
export default ViewportActionBar;
diff --git a/platform/ui/src/components/ViewportPane/ViewportPane.tsx b/platform/ui/src/components/ViewportPane/ViewportPane.tsx
index 842997e1e94..b888081073b 100644
--- a/platform/ui/src/components/ViewportPane/ViewportPane.tsx
+++ b/platform/ui/src/components/ViewportPane/ViewportPane.tsx
@@ -59,6 +59,7 @@ function ViewportPane({
// https://reactjs.org/docs/events.html#mouse-events
// https://stackoverflow.com/questions/8378243/catch-scrolling-event-on-overflowhidden-element
onMouseDown={onInteractionHandler}
+ onTouchStart={onInteractionHandler}
onDoubleClick={onDoubleClick}
onClick={onInteractionHandler}
onScroll={onInteractionHandler}
@@ -66,8 +67,10 @@ function ViewportPane({
className={classnames(
'w-full h-full rounded-md overflow-hidden hover:border-primary-light transition duration-300 group',
{
- 'border-2 border-primary-light': isActive,
- 'border-2 border-transparent': !isActive,
+ 'border-2 border-primary-light':
+ isActive && !customStyle?.ohifDisableBorder,
+ 'border-2 border-transparent':
+ !isActive && !customStyle?.ohifDisableBorder,
},
className
)}
@@ -79,8 +82,10 @@ function ViewportPane({
className={classnames(
'rounded-md w-full h-full overflow-hidden group-hover:border-transparent',
{
- 'border border-transparent': isActive,
- 'border border-secondary-light': !isActive,
+ 'border border-transparent':
+ isActive && !customStyle?.ohifDisableBorder,
+ 'border border-secondary-light':
+ !isActive && !customStyle?.ohifDisableBorder,
},
className
)}
@@ -108,7 +113,7 @@ ViewportPane.propTypes = {
onDoubleClick: PropTypes.func,
};
-const noop = () => {};
+const noop = () => { };
ViewportPane.defaultProps = {
onInteraction: noop,
diff --git a/platform/viewer-static/LICENSE b/platform/viewer-static/LICENSE
new file mode 100644
index 00000000000..8b0905575ef
--- /dev/null
+++ b/platform/viewer-static/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Open Health Imaging Foundation
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/platform/viewer-static/README.md b/platform/viewer-static/README.md
new file mode 100644
index 00000000000..f4d26aa6a60
--- /dev/null
+++ b/platform/viewer-static/README.md
@@ -0,0 +1,49 @@
+# ohif-viewer-static
+
+@ischemaview/ohif-viewer built and bundled into static assets
+
+
+## Build
+### Prerequisite
+yarn install run on ````root```` project or ````platform/viewer````
+> NOTE: yarn@^1.18.0 required with workspaces-experimental=true. required. See [README of ohif-monorepo](https://github.com/ischemaview/rapid-dicom-viewer#to-develop)
+### Build
+````bash
+# From within the platform/viewer-static directory
+yarn build
+
+OR
+
+npm run build
+````
+
+## Publish
+````bash
+# From within the platform/viewer-static directory
+npm publish
+
+OR
+
+yarn publish
+````
+> NOTE: Nexus repository authentication required
+
+## Installation
+````
+npm install @ischemaview/ohif-static-assets
+````
+
+### Copy via postinstall script (optional)
+````bash
+snippet of consuming projects package.json:
+
+{
+ ...
+ "scripts": {
+ "postinstall": "./node_modules/@ischemaview/ohif-viewer-static/scripts/copy-folder-recursive-cli ./node_modules/@ischemaview/ohif-viewer--static/dist
"
+ },
+ ....
+}
+
+# Where is the desired location for static assets
+````
diff --git a/platform/viewer-static/dist/205.bundle.89155e0eacfb8efa042a.js b/platform/viewer-static/dist/205.bundle.89155e0eacfb8efa042a.js
new file mode 100644
index 00000000000..6c512f9444d
--- /dev/null
+++ b/platform/viewer-static/dist/205.bundle.89155e0eacfb8efa042a.js
@@ -0,0 +1,3 @@
+/*! For license information please see 205.bundle.89155e0eacfb8efa042a.js.LICENSE.txt */
+"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[205],{36205:function(t,r,e){e.r(r);var n=e(32735),o=e(60216),i=e.n(o);function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function c(){c=function(){return t};var t={},r=Object.prototype,e=r.hasOwnProperty,n="function"==typeof Symbol?Symbol:{},o=n.iterator||"@@iterator",i=n.asyncIterator||"@@asyncIterator",u=n.toStringTag||"@@toStringTag";function l(t,r,e){return Object.defineProperty(t,r,{value:e,enumerable:!0,configurable:!0,writable:!0}),t[r]}try{l({},"")}catch(t){l=function(t,r,e){return t[r]=e}}function f(t,r,e,n){var o=r&&r.prototype instanceof p?r:p,i=Object.create(o.prototype),a=new O(n||[]);return i._invoke=function(t,r,e){var n="suspendedStart";return function(o,i){if("executing"===n)throw new Error("Generator is already running");if("completed"===n){if("throw"===o)throw i;return _()}for(e.method=o,e.arg=i;;){var a=e.delegate;if(a){var c=E(a,e);if(c){if(c===h)continue;return c}}if("next"===e.method)e.sent=e._sent=e.arg;else if("throw"===e.method){if("suspendedStart"===n)throw n="completed",e.arg;e.dispatchException(e.arg)}else"return"===e.method&&e.abrupt("return",e.arg);n="executing";var u=s(t,r,e);if("normal"===u.type){if(n=e.done?"completed":"suspendedYield",u.arg===h)continue;return{value:u.arg,done:e.done}}"throw"===u.type&&(n="completed",e.method="throw",e.arg=u.arg)}}}(t,e,a),i}function s(t,r,e){try{return{type:"normal",arg:t.call(r,e)}}catch(t){return{type:"throw",arg:t}}}t.wrap=f;var h={};function p(){}function y(){}function d(){}var v={};l(v,o,(function(){return this}));var m=Object.getPrototypeOf,g=m&&m(m(j([])));g&&g!==r&&e.call(g,o)&&(v=g);var w=d.prototype=p.prototype=Object.create(v);function b(t){["next","throw","return"].forEach((function(r){l(t,r,(function(t){return this._invoke(r,t)}))}))}function x(t,r){function n(o,i,c,u){var l=s(t[o],t,i);if("throw"!==l.type){var f=l.arg,h=f.value;return h&&"object"==a(h)&&e.call(h,"__await")?r.resolve(h.__await).then((function(t){n("next",t,c,u)}),(function(t){n("throw",t,c,u)})):r.resolve(h).then((function(t){f.value=t,c(f)}),(function(t){return n("throw",t,c,u)}))}u(l.arg)}var o;this._invoke=function(t,e){function i(){return new r((function(r,o){n(t,e,r,o)}))}return o=o?o.then(i,i):i()}}function E(t,r){var e=t.iterator[r.method];if(void 0===e){if(r.delegate=null,"throw"===r.method){if(t.iterator.return&&(r.method="return",r.arg=void 0,E(t,r),"throw"===r.method))return h;r.method="throw",r.arg=new TypeError("The iterator does not provide a 'throw' method")}return h}var n=s(e,t.iterator,r.arg);if("throw"===n.type)return r.method="throw",r.arg=n.arg,r.delegate=null,h;var o=n.arg;return o?o.done?(r[t.resultName]=o.value,r.next=t.nextLoc,"return"!==r.method&&(r.method="next",r.arg=void 0),r.delegate=null,h):o:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,h)}function L(t){var r={tryLoc:t[0]};1 in t&&(r.catchLoc=t[1]),2 in t&&(r.finallyLoc=t[2],r.afterLoc=t[3]),this.tryEntries.push(r)}function S(t){var r=t.completion||{};r.type="normal",delete r.arg,t.completion=r}function O(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(L,this),this.reset(!0)}function j(t){if(t){var r=t[o];if(r)return r.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,i=function r(){for(;++n=0;--o){var i=this.tryEntries[o],a=i.completion;if("root"===i.tryLoc)return n("end");if(i.tryLoc<=this.prev){var c=e.call(i,"catchLoc"),u=e.call(i,"finallyLoc");if(c&&u){if(this.prev=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&e.call(o,"finallyLoc")&&this.prev=0;--r){var e=this.tryEntries[r];if(e.finallyLoc===t)return this.complete(e.completion,e.afterLoc),S(e),h}},catch:function(t){for(var r=this.tryEntries.length-1;r>=0;--r){var e=this.tryEntries[r];if(e.tryLoc===t){var n=e.completion;if("throw"===n.type){var o=n.arg;S(e)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,r,e){return this.delegate={iterator:j(t),resultName:r,nextLoc:e},"next"===this.method&&(this.arg=void 0),h}},t}function u(t,r,e,n,o,i,a){try{var c=t[i](a),u=c.value}catch(t){return void e(t)}c.done?r(u):Promise.resolve(u).then(n,o)}function l(t,r){return function(t){if(Array.isArray(t))return t}(t)||function(t,r){var e=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null==e)return;var n,o,i=[],a=!0,c=!1;try{for(e=e.call(t);!(a=(n=e.next()).done)&&(i.push(n.value),!r||i.length!==r);a=!0);}catch(t){c=!0,o=t}finally{try{a||null==e.return||e.return()}finally{if(c)throw o}}return i}(t,r)||function(t,r){if(!t)return;if("string"==typeof t)return f(t,r);var e=Object.prototype.toString.call(t).slice(8,-1);"Object"===e&&t.constructor&&(e=t.constructor.name);if("Map"===e||"Set"===e)return Array.from(t);if("Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e))return f(t,r)}(t,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function f(t,r){(null==r||r>t.length)&&(r=t.length);for(var e=0,n=new Array(r);e1)throw new Error("OHIFCornerstoneVideoViewport: only one display set is supported for dicom video right now");var e=r[0].videoUrl,o="video/mp4",i=l((0,n.useState)(null),2),a=i[0],f=i[1];return(0,n.useEffect)((function(){var t=function(){var t,r=(t=c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,e;case 2:f(e);case 3:case"end":return t.stop()}}),t)})),function(){var r=this,e=arguments;return new Promise((function(n,o){var i=t.apply(r,e);function a(t){u(i,n,o,a,c,"next",t)}function c(t){u(i,n,o,a,c,"throw",t)}a(void 0)}))});return function(){return r.apply(this,arguments)}}();t()}),[e]),n.createElement("div",{className:"bg-primary-black w-full h-full"},n.createElement("video",{src:a,controls:!0,controlsList:"nodownload",preload:"auto",className:"w-full h-full"},n.createElement("source",{src:a,type:o}),n.createElement("source",{src:a,type:o}),"Video src/type not supported:"," ",n.createElement("a",{href:a},a," of type ",o)))}s.propTypes={displaySets:i().arrayOf(i().object).isRequired},r.default=s}}]);
+//# sourceMappingURL=205.bundle.89155e0eacfb8efa042a.js.map
\ No newline at end of file
diff --git a/platform/viewer-static/dist/205.bundle.89155e0eacfb8efa042a.js.LICENSE.txt b/platform/viewer-static/dist/205.bundle.89155e0eacfb8efa042a.js.LICENSE.txt
new file mode 100644
index 00000000000..ae386fb79c9
--- /dev/null
+++ b/platform/viewer-static/dist/205.bundle.89155e0eacfb8efa042a.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
diff --git a/platform/viewer-static/dist/205.bundle.89155e0eacfb8efa042a.js.map b/platform/viewer-static/dist/205.bundle.89155e0eacfb8efa042a.js.map
new file mode 100644
index 00000000000..d1d36091b54
--- /dev/null
+++ b/platform/viewer-static/dist/205.bundle.89155e0eacfb8efa042a.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"205.bundle.89155e0eacfb8efa042a.js","mappings":";uXACA,4gGAAAA,GAAA,wBAAAA,EAAA,sBAAAA,GAAA,iBAAAA,GAAA,0oDAAAA,EAAA,yBAAAA,GAAA,IAAAA,EAAA,uBAAAA,GAAA,4bAAAA,EAAA,yBAAAA,GAAA,IAAAA,EAAA,uBAAAA,GAAA,yhBAAAA,EAAA,yBAAAA,GAAA,IAAAA,EAAA,uBAAAA,GAAA,qGAAAA,EAAA,yBAAAA,GAAA,IAAAA,EAAA,uBAAAA,GAAA,+0CAEA,SAASC,EAAT,GAAuD,IAAfC,EAAe,EAAfA,YACtC,GAAIA,GAAeA,EAAYC,OAAS,EACtC,MAAM,IAAIC,MACR,6FAIJ,IAAQC,EAAaH,EAAY,GAAzBG,SACFC,EAAW,YACjB,KAAsBC,EAAAA,EAAAA,UAAS,MAA/B,GAAOC,EAAP,KAAYC,EAAZ,KAYA,OAVAC,EAAAA,EAAAA,YAAU,WACR,IAAMC,EAAI,gCAAG,8FACLN,EADK,OAEXI,EAAOJ,GAFI,yNAAH,qDAKVM,MACC,CAACN,IAIF,uBAAKO,UAAU,kCACb,yBACEC,IAAKL,EACLM,UAAQ,EACRC,aAAa,aACbC,QAAQ,OACRJ,UAAU,iBAEV,0BAAQC,IAAKL,EAAKS,KAAMX,IACxB,0BAAQO,IAAKL,EAAKS,KAAMX,IAR1B,gCASgC,IAC9B,qBAAGY,KAAMV,GACNA,EADH,YACiBF,KAOzBL,EAA6BkB,UAAY,CACvCjB,YAAakB,IAAAA,QAAkBA,IAAAA,QAAkBC,YAGnD","sources":["file:////Users/HemantP/Documents/RapidAI/RapidOHIFViewer/extensions/dicom-video/src/viewports/OHIFCornerstoneVideoViewport.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\n\nfunction OHIFCornerstoneVideoViewport({ displaySets }) {\n if (displaySets && displaySets.length > 1) {\n throw new Error(\n 'OHIFCornerstoneVideoViewport: only one display set is supported for dicom video right now'\n );\n }\n\n const { videoUrl } = displaySets[0];\n const mimeType = 'video/mp4';\n const [url, setUrl] = useState(null);\n\n useEffect(() => {\n const load = async () => {\n await videoUrl;\n setUrl(videoUrl);\n };\n\n load();\n }, [videoUrl]);\n\n // Need to copies of the source to fix a firefox bug\n return (\n \n );\n}\n\nOHIFCornerstoneVideoViewport.propTypes = {\n displaySets: PropTypes.arrayOf(PropTypes.object).isRequired,\n};\n\nexport default OHIFCornerstoneVideoViewport;\n"],"names":["i","OHIFCornerstoneVideoViewport","displaySets","length","Error","videoUrl","mimeType","useState","url","setUrl","useEffect","load","className","src","controls","controlsList","preload","type","href","propTypes","PropTypes","isRequired"],"sourceRoot":""}
\ No newline at end of file
diff --git a/platform/viewer-static/dist/295.bundle.e0f1160b465b6ccc903c.js b/platform/viewer-static/dist/295.bundle.e0f1160b465b6ccc903c.js
new file mode 100644
index 00000000000..f42c2e7a085
--- /dev/null
+++ b/platform/viewer-static/dist/295.bundle.e0f1160b465b6ccc903c.js
@@ -0,0 +1,3 @@
+/*! For license information please see 295.bundle.e0f1160b465b6ccc903c.js.LICENSE.txt */
+"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[295],{56295:function(t,r,e){e.r(r);var n=e(32735),o=e(60216),i=e.n(o);function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function c(){c=function(){return t};var t={},r=Object.prototype,e=r.hasOwnProperty,n="function"==typeof Symbol?Symbol:{},o=n.iterator||"@@iterator",i=n.asyncIterator||"@@asyncIterator",u=n.toStringTag||"@@toStringTag";function l(t,r,e){return Object.defineProperty(t,r,{value:e,enumerable:!0,configurable:!0,writable:!0}),t[r]}try{l({},"")}catch(t){l=function(t,r,e){return t[r]=e}}function f(t,r,e,n){var o=r&&r.prototype instanceof p?r:p,i=Object.create(o.prototype),a=new j(n||[]);return i._invoke=function(t,r,e){var n="suspendedStart";return function(o,i){if("executing"===n)throw new Error("Generator is already running");if("completed"===n){if("throw"===o)throw i;return _()}for(e.method=o,e.arg=i;;){var a=e.delegate;if(a){var c=E(a,e);if(c){if(c===h)continue;return c}}if("next"===e.method)e.sent=e._sent=e.arg;else if("throw"===e.method){if("suspendedStart"===n)throw n="completed",e.arg;e.dispatchException(e.arg)}else"return"===e.method&&e.abrupt("return",e.arg);n="executing";var u=s(t,r,e);if("normal"===u.type){if(n=e.done?"completed":"suspendedYield",u.arg===h)continue;return{value:u.arg,done:e.done}}"throw"===u.type&&(n="completed",e.method="throw",e.arg=u.arg)}}}(t,e,a),i}function s(t,r,e){try{return{type:"normal",arg:t.call(r,e)}}catch(t){return{type:"throw",arg:t}}}t.wrap=f;var h={};function p(){}function y(){}function v(){}var d={};l(d,o,(function(){return this}));var m=Object.getPrototypeOf,g=m&&m(m(O([])));g&&g!==r&&e.call(g,o)&&(d=g);var w=v.prototype=p.prototype=Object.create(d);function b(t){["next","throw","return"].forEach((function(r){l(t,r,(function(t){return this._invoke(r,t)}))}))}function x(t,r){function n(o,i,c,u){var l=s(t[o],t,i);if("throw"!==l.type){var f=l.arg,h=f.value;return h&&"object"==a(h)&&e.call(h,"__await")?r.resolve(h.__await).then((function(t){n("next",t,c,u)}),(function(t){n("throw",t,c,u)})):r.resolve(h).then((function(t){f.value=t,c(f)}),(function(t){return n("throw",t,c,u)}))}u(l.arg)}var o;this._invoke=function(t,e){function i(){return new r((function(r,o){n(t,e,r,o)}))}return o=o?o.then(i,i):i()}}function E(t,r){var e=t.iterator[r.method];if(void 0===e){if(r.delegate=null,"throw"===r.method){if(t.iterator.return&&(r.method="return",r.arg=void 0,E(t,r),"throw"===r.method))return h;r.method="throw",r.arg=new TypeError("The iterator does not provide a 'throw' method")}return h}var n=s(e,t.iterator,r.arg);if("throw"===n.type)return r.method="throw",r.arg=n.arg,r.delegate=null,h;var o=n.arg;return o?o.done?(r[t.resultName]=o.value,r.next=t.nextLoc,"return"!==r.method&&(r.method="next",r.arg=void 0),r.delegate=null,h):o:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,h)}function L(t){var r={tryLoc:t[0]};1 in t&&(r.catchLoc=t[1]),2 in t&&(r.finallyLoc=t[2],r.afterLoc=t[3]),this.tryEntries.push(r)}function S(t){var r=t.completion||{};r.type="normal",delete r.arg,t.completion=r}function j(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(L,this),this.reset(!0)}function O(t){if(t){var r=t[o];if(r)return r.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,i=function r(){for(;++n=0;--o){var i=this.tryEntries[o],a=i.completion;if("root"===i.tryLoc)return n("end");if(i.tryLoc<=this.prev){var c=e.call(i,"catchLoc"),u=e.call(i,"finallyLoc");if(c&&u){if(this.prev=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&e.call(o,"finallyLoc")&&this.prev=0;--r){var e=this.tryEntries[r];if(e.finallyLoc===t)return this.complete(e.completion,e.afterLoc),S(e),h}},catch:function(t){for(var r=this.tryEntries.length-1;r>=0;--r){var e=this.tryEntries[r];if(e.tryLoc===t){var n=e.completion;if("throw"===n.type){var o=n.arg;S(e)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,r,e){return this.delegate={iterator:O(t),resultName:r,nextLoc:e},"next"===this.method&&(this.arg=void 0),h}},t}function u(t,r,e,n,o,i,a){try{var c=t[i](a),u=c.value}catch(t){return void e(t)}c.done?r(u):Promise.resolve(u).then(n,o)}function l(t,r){return function(t){if(Array.isArray(t))return t}(t)||function(t,r){var e=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null==e)return;var n,o,i=[],a=!0,c=!1;try{for(e=e.call(t);!(a=(n=e.next()).done)&&(i.push(n.value),!r||i.length!==r);a=!0);}catch(t){c=!0,o=t}finally{try{a||null==e.return||e.return()}finally{if(c)throw o}}return i}(t,r)||function(t,r){if(!t)return;if("string"==typeof t)return f(t,r);var e=Object.prototype.toString.call(t).slice(8,-1);"Object"===e&&t.constructor&&(e=t.constructor.name);if("Map"===e||"Set"===e)return Array.from(t);if("Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e))return f(t,r)}(t,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function f(t,r){(null==r||r>t.length)&&(r=t.length);for(var e=0,n=new Array(r);e1)throw new Error("OHIFCornerstonePdfViewport: only one display set is supported for dicom pdf right now");var a=r[0].pdfUrl;return(0,n.useEffect)((function(){var t=function(){var t,r=(t=c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,a;case 2:i(a);case 3:case"end":return t.stop()}}),t)})),function(){var r=this,e=arguments;return new Promise((function(n,o){var i=t.apply(r,e);function a(t){u(i,n,o,a,c,"next",t)}function c(t){u(i,n,o,a,c,"throw",t)}a(void 0)}))});return function(){return r.apply(this,arguments)}}();t()}),[a]),n.createElement("div",{className:"bg-primary-black w-full h-full"},n.createElement("object",{data:o,type:"application/pdf",className:"w-full h-full"},n.createElement("div",null,"No online PDF viewer installed")))}s.propTypes={displaySets:i().arrayOf(i().object).isRequired},r.default=s}}]);
+//# sourceMappingURL=295.bundle.e0f1160b465b6ccc903c.js.map
\ No newline at end of file
diff --git a/platform/viewer-static/dist/295.bundle.e0f1160b465b6ccc903c.js.LICENSE.txt b/platform/viewer-static/dist/295.bundle.e0f1160b465b6ccc903c.js.LICENSE.txt
new file mode 100644
index 00000000000..ae386fb79c9
--- /dev/null
+++ b/platform/viewer-static/dist/295.bundle.e0f1160b465b6ccc903c.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
diff --git a/platform/viewer-static/dist/295.bundle.e0f1160b465b6ccc903c.js.map b/platform/viewer-static/dist/295.bundle.e0f1160b465b6ccc903c.js.map
new file mode 100644
index 00000000000..8d05771d9f7
--- /dev/null
+++ b/platform/viewer-static/dist/295.bundle.e0f1160b465b6ccc903c.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"295.bundle.e0f1160b465b6ccc903c.js","mappings":";uXACA,4gGAAAA,GAAA,wBAAAA,EAAA,sBAAAA,GAAA,iBAAAA,GAAA,0oDAAAA,EAAA,yBAAAA,GAAA,IAAAA,EAAA,uBAAAA,GAAA,4bAAAA,EAAA,yBAAAA,GAAA,IAAAA,EAAA,uBAAAA,GAAA,yhBAAAA,EAAA,yBAAAA,GAAA,IAAAA,EAAA,uBAAAA,GAAA,qGAAAA,EAAA,yBAAAA,GAAA,IAAAA,EAAA,uBAAAA,GAAA,+0CAEA,SAASC,EAAT,GAAqD,IAAfC,EAAe,EAAfA,YACpC,KAAsBC,EAAAA,EAAAA,UAAS,MAA/B,GAAOC,EAAP,KAAYC,EAAZ,KAEA,GAAIH,GAAeA,EAAYI,OAAS,EACtC,MAAM,IAAIC,MACR,yFAIJ,IAAQC,EAAWN,EAAY,GAAvBM,OAWR,OATAC,EAAAA,EAAAA,YAAU,WACR,IAAMC,EAAI,gCAAG,8FACLF,EADK,OAEXH,EAAOG,GAFI,yNAAH,qDAKVE,MACC,CAACF,IAGF,uBAAKG,UAAU,kCACb,0BAAQC,KAAMR,EAAKS,KAAK,kBAAkBF,UAAU,iBAClD,+DAMRV,EAA2Ba,UAAY,CACrCZ,YAAaa,IAAAA,QAAkBA,IAAAA,QAAkBC,YAGnD","sources":["file:////Users/HemantP/Documents/RapidAI/RapidOHIFViewer/extensions/dicom-pdf/src/viewports/OHIFCornerstonePdfViewport.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\n\nfunction OHIFCornerstonePdfViewport({ displaySets }) {\n const [url, setUrl] = useState(null);\n\n if (displaySets && displaySets.length > 1) {\n throw new Error(\n 'OHIFCornerstonePdfViewport: only one display set is supported for dicom pdf right now'\n );\n }\n\n const { pdfUrl } = displaySets[0];\n\n useEffect(() => {\n const load = async () => {\n await pdfUrl;\n setUrl(pdfUrl);\n };\n\n load();\n }, [pdfUrl]);\n\n return (\n \n
\n No online PDF viewer installed
\n \n
\n );\n}\n\nOHIFCornerstonePdfViewport.propTypes = {\n displaySets: PropTypes.arrayOf(PropTypes.object).isRequired,\n};\n\nexport default OHIFCornerstonePdfViewport;\n"],"names":["i","OHIFCornerstonePdfViewport","displaySets","useState","url","setUrl","length","Error","pdfUrl","useEffect","load","className","data","type","propTypes","PropTypes","isRequired"],"sourceRoot":""}
\ No newline at end of file
diff --git a/platform/viewer-static/dist/365.bundle.19b2f551ebb505a4a54d.js b/platform/viewer-static/dist/365.bundle.19b2f551ebb505a4a54d.js
new file mode 100644
index 00000000000..78592bb950b
--- /dev/null
+++ b/platform/viewer-static/dist/365.bundle.19b2f551ebb505a4a54d.js
@@ -0,0 +1,3 @@
+/*! For license information please see 365.bundle.19b2f551ebb505a4a54d.js.LICENSE.txt */
+"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[365],{68365:function(e,t,r){r.r(t),r.d(t,{default:function(){return Ke}});var n=r(32735),i=r(12788),o=function(e,t){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},o(e,t)};function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}o(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}function u(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(n=Object.getOwnPropertySymbols(e);i=t||r<0||f&&e-c>=o}function h(){var e=H();if(m(e))return y(e);u=setTimeout(h,function(e){var r=t-(e-l);return f?F(r,o-(e-c)):r}(e))}function y(e){return u=void 0,p&&n?d(e):(n=i=void 0,a)}function g(){var e=H(),r=m(e);if(n=arguments,i=this,l=e,r){if(void 0===u)return v(l);if(f)return clearTimeout(u),u=setTimeout(h,t),d(l)}return void 0===u&&(u=setTimeout(h,t)),a}return t=G(t)||0,Z(r)&&(s=!!r.leading,o=(f="maxWait"in r)?U(G(r.maxWait)||0,t):o,p="trailing"in r?!!r.trailing:p),g.cancel=function(){void 0!==u&&clearTimeout(u),c=0,n=l=i=u=void 0},g.flush=function(){return void 0===u?a:y(H())},g},z=W,B=c;var q=function(e,t,r){var n=!0,i=!0;if("function"!=typeof e)throw new TypeError("Expected a function");return B(r)&&(n="leading"in r?!!r.leading:n,i="trailing"in r?!!r.trailing:i),z(e,t,{leading:n,maxWait:t,trailing:i})},K=function(e,t,r,n){switch(t){case"debounce":return W(e,r,n);case"throttle":return q(e,r,n);default:return e}},$=function(e){return"function"==typeof e},Y=function(){return"undefined"==typeof window},J=function(e){return e instanceof Element||e instanceof HTMLDocument},Q=function(e,t,r,n){return function(i){var o=i.width,a=i.height;t((function(t){return t.width===o&&t.height===a||t.width===o&&!n||t.height===a&&!r?t:(e&&$(e)&&e(o,a),{width:o,height:a})}))}},X=function(e){function t(t){var r=e.call(this,t)||this;r.cancelHandler=function(){r.resizeHandler&&r.resizeHandler.cancel&&(r.resizeHandler.cancel(),r.resizeHandler=null)},r.attachObserver=function(){var e=r.props,t=e.targetRef,n=e.observerOptions;if(!Y()){t&&t.current&&(r.targetRef.current=t.current);var i=r.getElement();i&&(r.observableElement&&r.observableElement===i||(r.observableElement=i,r.resizeObserver.observe(i,n)))}},r.getElement=function(){var e=r.props,t=e.querySelector,n=e.targetDomEl;if(Y())return null;if(t)return document.querySelector(t);if(n&&J(n))return n;if(r.targetRef&&J(r.targetRef.current))return r.targetRef.current;var o=(0,i.findDOMNode)(r);if(!o)return null;switch(r.getRenderType()){case"renderProp":case"childFunction":case"child":case"childArray":return o;default:return o.parentElement}},r.createResizeHandler=function(e){var t=r.props,n=t.handleWidth,i=void 0===n||n,o=t.handleHeight,a=void 0===o||o,u=t.onResize;if(i||a){var l=Q(u,r.setState.bind(r),i,a);e.forEach((function(e){var t=e&&e.contentRect||{},n=t.width,i=t.height;!r.skipOnMount&&!Y()&&l({width:n,height:i}),r.skipOnMount=!1}))}},r.getRenderType=function(){var e=r.props,t=e.render,i=e.children;return $(t)?"renderProp":$(i)?"childFunction":(0,n.isValidElement)(i)?"child":Array.isArray(i)?"childArray":"parent"};var o=t.skipOnMount,a=t.refreshMode,u=t.refreshRate,l=void 0===u?1e3:u,c=t.refreshOptions;return r.state={width:void 0,height:void 0},r.skipOnMount=o,r.targetRef=(0,n.createRef)(),r.observableElement=null,Y()||(r.resizeHandler=K(r.createResizeHandler,a,l,c),r.resizeObserver=new window.ResizeObserver(r.resizeHandler)),r}return a(t,e),t.prototype.componentDidMount=function(){this.attachObserver()},t.prototype.componentDidUpdate=function(){this.attachObserver()},t.prototype.componentWillUnmount=function(){Y()||(this.resizeObserver.disconnect(),this.cancelHandler())},t.prototype.render=function(){var e,t=this.props,r=t.render,i=t.children,o=t.nodeType,a=void 0===o?"div":o,l=this.state,c={width:l.width,height:l.height,targetRef:this.targetRef};switch(this.getRenderType()){case"renderProp":return r&&r(c);case"childFunction":return(e=i)(c);case"child":if((e=i).type&&"string"==typeof e.type){var s=u(c,["targetRef"]);return(0,n.cloneElement)(e,s)}return(0,n.cloneElement)(e,c);case"childArray":return(e=i).map((function(e){return!!e&&(0,n.cloneElement)(e,c)}));default:return n.createElement(a,null)}},t}(n.PureComponent);Y()?n.useEffect:n.useLayoutEffect;var ee=r(60216),te=r.n(ee),re=r(16132),ne=r(38402),ie=r(41841),oe=r(80808),ae=r(33932),ue=r(66782),le=r(72682),ce=r(7283),se=r(21922),fe=r(33318),pe=r(70369),de=r(67013);function ve(e){var t=e.viewportData,r=e.viewportIndex,i=e.element,o=e.imageSliceData,a=e.setImageSliceData,u=e.scrollbarHeight,l=e.servicesManager.services,c=l.CineService,s=l.CornerstoneViewportService;return(0,n.useEffect)((function(){if(t){var e=s.getCornerstoneViewportByIndex(r);if(e)if(t.viewportType!==pe.Z.STACK){if(t.viewportType===pe.Z.ORTHOGRAPHIC){var n=fe.Z(e);if(!n)return;var i=n.imageIndex,o=n.numberOfSlices;a({imageIndex:i,numberOfSlices:o})}}else{var u=e.getCurrentImageIdIndex();a({imageIndex:u,numberOfSlices:t.data.imageIds.length})}}}),[r,t]),(0,n.useEffect)((function(){if((null==t?void 0:t.viewportType)===pe.Z.STACK){var e=function(e){var r=e.detail.newImageIdIndex;a({imageIndex:r,numberOfSlices:t.data.imageIds.length})};return i.addEventListener(le.Z.STACK_VIEWPORT_SCROLL,e),function(){i.removeEventListener(le.Z.STACK_VIEWPORT_SCROLL,e)}}}),[t,i]),(0,n.useEffect)((function(){if((null==t?void 0:t.viewportType)===pe.Z.ORTHOGRAPHIC){var e=function(e){var t=e.detail,r=t.imageIndex,n=t.numberOfSlices;a({imageIndex:r,numberOfSlices:n})};return i.addEventListener(le.Z.VOLUME_NEW_IMAGE,e),function(){i.removeEventListener(le.Z.VOLUME_NEW_IMAGE,e)}}}),[t,i]),n.createElement(de.Ln,{onChange:function(e){return function(e,t){var r=s.getViewportInfoByIndex(t).getViewportId(),n=s.getCornerstoneViewport(r);c.getState().isCineEnabled&&(c.stopClip(i),c.setCine({id:t,isPlaying:!1})),re.Z(n.element,{imageIndex:e,debounceLoading:!0})}(e,r)},max:o.numberOfSlices?o.numberOfSlices-1:0,height:u,value:o.imageIndex})}ve.propTypes={viewportData:te().object,viewportIndex:te().number.isRequired,element:te().instanceOf(Element),scrollbarHeight:te().string,imageSliceData:te().object.isRequired,setImageSliceData:te().func.isRequired};var me=ve,he=r(6807),ye=r(27306),ge=r(19384);function we(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,i,o=[],a=!0,u=!1;try{for(r=r.call(e);!(a=(n=r.next()).done)&&(o.push(n.value),!t||o.length!==t);a=!0);}catch(e){u=!0,i=e}finally{try{a||null==r.return||r.return()}finally{if(u)throw i}}return o}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return be(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return be(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function be(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r1)return;var o=i[0],a=o.direction,u=o.imageIds,l=n.getCornerstoneViewportByIndex(r);if(!l)return;var c=l.getCamera().viewPlaneNormal,s=a.slice(6,9),f=he.cross(he.create(),c,s);if(he.length(f)e.length)&&(t=e.length);for(var r=0,n=new Array(t);re.length)&&(t=e.length);for(var r=0,n=new Array(t);re.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0;--i){var o=this.tryEntries[i],a=o.completion;if("root"===o.tryLoc)return n("end");if(o.tryLoc<=this.prev){var u=r.call(o,"catchLoc"),l=r.call(o,"finallyLoc");if(u&&l){if(this.prev=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),I(r),s}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var i=n.arg;I(r)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){return this.delegate={iterator:O(e),resultName:t,nextLoc:r},"next"===this.method&&(this.arg=void 0),s}},e}function He(e,t,r,n,i,o,a){try{var u=e[o](a),l=u.value}catch(e){return void r(e)}u.done?t(l):Promise.resolve(l).then(n,i)}function Ge(e){return function(){var t=this,r=arguments;return new Promise((function(n,i){var o=e.apply(t,r);function a(e){He(o,n,i,a,u,"next",e)}function u(e){He(o,n,i,a,u,"throw",e)}a(void 0)}))}}function Ue(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,i,o=[],a=!0,u=!1;try{for(r=r.call(e);!(a=(n=r.next()).done)&&(o.push(n.value),!t||o.length!==t);a=!0);}catch(e){u=!0,i=e}finally{try{a||null==r.return||r.return()}finally{if(u)throw i}}return o}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Fe(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Fe(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Fe(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\n\nfunction isObject$3(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nvar isObject_1 = isObject$3;/** Detect free variable `global` from Node.js. */\n\nvar freeGlobal$1 = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;\n\nvar _freeGlobal = freeGlobal$1;var freeGlobal = _freeGlobal;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root$2 = freeGlobal || freeSelf || Function('return this')();\n\nvar _root = root$2;var root$1 = _root;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now$1 = function() {\n return root$1.Date.now();\n};\n\nvar now_1 = now$1;/** Used to match a single whitespace character. */\n\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex$1(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nvar _trimmedEndIndex = trimmedEndIndex$1;var trimmedEndIndex = _trimmedEndIndex;\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim$1(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nvar _baseTrim = baseTrim$1;var root = _root;\n\n/** Built-in value references. */\nvar Symbol$2 = root.Symbol;\n\nvar _Symbol = Symbol$2;var Symbol$1 = _Symbol;\n\n/** Used for built-in method references. */\nvar objectProto$1 = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto$1.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString$1 = objectProto$1.toString;\n\n/** Built-in value references. */\nvar symToStringTag$1 = Symbol$1 ? Symbol$1.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag$1(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag$1),\n tag = value[symToStringTag$1];\n\n try {\n value[symToStringTag$1] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString$1.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag$1] = tag;\n } else {\n delete value[symToStringTag$1];\n }\n }\n return result;\n}\n\nvar _getRawTag = getRawTag$1;/** Used for built-in method references. */\n\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString$1(value) {\n return nativeObjectToString.call(value);\n}\n\nvar _objectToString = objectToString$1;var Symbol = _Symbol,\n getRawTag = _getRawTag,\n objectToString = _objectToString;\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag$1(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nvar _baseGetTag = baseGetTag$1;/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\n\nfunction isObjectLike$1(value) {\n return value != null && typeof value == 'object';\n}\n\nvar isObjectLike_1 = isObjectLike$1;var baseGetTag = _baseGetTag,\n isObjectLike = isObjectLike_1;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol$1(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nvar isSymbol_1 = isSymbol$1;var baseTrim = _baseTrim,\n isObject$2 = isObject_1,\n isSymbol = isSymbol_1;\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber$1(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject$2(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject$2(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nvar toNumber_1 = toNumber$1;var isObject$1 = isObject_1,\n now = now_1,\n toNumber = toNumber_1;\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT$1 = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce$1(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT$1);\n }\n wait = toNumber(wait) || 0;\n if (isObject$1(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nvar debounce_1 = debounce$1;var debounce = debounce_1,\n isObject = isObject_1;\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\nvar throttle_1 = throttle;var patchResizeHandler = function (resizeCallback, refreshMode, refreshRate, refreshOptions) {\r\n switch (refreshMode) {\r\n case 'debounce':\r\n return debounce_1(resizeCallback, refreshRate, refreshOptions);\r\n case 'throttle':\r\n return throttle_1(resizeCallback, refreshRate, refreshOptions);\r\n default:\r\n return resizeCallback;\r\n }\r\n};\r\nvar isFunction = function (fn) { return typeof fn === 'function'; };\r\nvar isSSR = function () { return typeof window === 'undefined'; };\r\nvar isDOMElement = function (element) { return element instanceof Element || element instanceof HTMLDocument; };\r\nvar createNotifier = function (onResize, setSize, handleWidth, handleHeight) {\r\n return function (_a) {\r\n var width = _a.width, height = _a.height;\r\n setSize(function (prev) {\r\n if (prev.width === width && prev.height === height) {\r\n // skip if dimensions haven't changed\r\n return prev;\r\n }\r\n if ((prev.width === width && !handleHeight) || (prev.height === height && !handleWidth)) {\r\n // process `handleHeight/handleWidth` props\r\n return prev;\r\n }\r\n if (onResize && isFunction(onResize)) {\r\n onResize(width, height);\r\n }\r\n return { width: width, height: height };\r\n });\r\n };\r\n};var ResizeDetector = /** @class */ (function (_super) {\r\n __extends(ResizeDetector, _super);\r\n function ResizeDetector(props) {\r\n var _this = _super.call(this, props) || this;\r\n _this.cancelHandler = function () {\r\n if (_this.resizeHandler && _this.resizeHandler.cancel) {\r\n // cancel debounced handler\r\n _this.resizeHandler.cancel();\r\n _this.resizeHandler = null;\r\n }\r\n };\r\n _this.attachObserver = function () {\r\n var _a = _this.props, targetRef = _a.targetRef, observerOptions = _a.observerOptions;\r\n if (isSSR()) {\r\n return;\r\n }\r\n if (targetRef && targetRef.current) {\r\n _this.targetRef.current = targetRef.current;\r\n }\r\n var element = _this.getElement();\r\n if (!element) {\r\n // can't find element to observe\r\n return;\r\n }\r\n if (_this.observableElement && _this.observableElement === element) {\r\n // element is already observed\r\n return;\r\n }\r\n _this.observableElement = element;\r\n _this.resizeObserver.observe(element, observerOptions);\r\n };\r\n _this.getElement = function () {\r\n var _a = _this.props, querySelector = _a.querySelector, targetDomEl = _a.targetDomEl;\r\n if (isSSR())\r\n return null;\r\n // in case we pass a querySelector\r\n if (querySelector)\r\n return document.querySelector(querySelector);\r\n // in case we pass a DOM element\r\n if (targetDomEl && isDOMElement(targetDomEl))\r\n return targetDomEl;\r\n // in case we pass a React ref using React.createRef()\r\n if (_this.targetRef && isDOMElement(_this.targetRef.current))\r\n return _this.targetRef.current;\r\n // the worse case when we don't receive any information from the parent and the library doesn't add any wrappers\r\n // we have to use a deprecated `findDOMNode` method in order to find a DOM element to attach to\r\n var currentElement = findDOMNode(_this);\r\n if (!currentElement)\r\n return null;\r\n var renderType = _this.getRenderType();\r\n switch (renderType) {\r\n case 'renderProp':\r\n return currentElement;\r\n case 'childFunction':\r\n return currentElement;\r\n case 'child':\r\n return currentElement;\r\n case 'childArray':\r\n return currentElement;\r\n default:\r\n return currentElement.parentElement;\r\n }\r\n };\r\n _this.createResizeHandler = function (entries) {\r\n var _a = _this.props, _b = _a.handleWidth, handleWidth = _b === void 0 ? true : _b, _c = _a.handleHeight, handleHeight = _c === void 0 ? true : _c, onResize = _a.onResize;\r\n if (!handleWidth && !handleHeight)\r\n return;\r\n var notifyResize = createNotifier(onResize, _this.setState.bind(_this), handleWidth, handleHeight);\r\n entries.forEach(function (entry) {\r\n var _a = (entry && entry.contentRect) || {}, width = _a.width, height = _a.height;\r\n var shouldSetSize = !_this.skipOnMount && !isSSR();\r\n if (shouldSetSize) {\r\n notifyResize({ width: width, height: height });\r\n }\r\n _this.skipOnMount = false;\r\n });\r\n };\r\n _this.getRenderType = function () {\r\n var _a = _this.props, render = _a.render, children = _a.children;\r\n if (isFunction(render)) {\r\n // DEPRECATED. Use `Child Function Pattern` instead\r\n return 'renderProp';\r\n }\r\n if (isFunction(children)) {\r\n return 'childFunction';\r\n }\r\n if (isValidElement(children)) {\r\n return 'child';\r\n }\r\n if (Array.isArray(children)) {\r\n // DEPRECATED. Wrap children with a single parent\r\n return 'childArray';\r\n }\r\n // DEPRECATED. Use `Child Function Pattern` instead\r\n return 'parent';\r\n };\r\n var skipOnMount = props.skipOnMount, refreshMode = props.refreshMode, _a = props.refreshRate, refreshRate = _a === void 0 ? 1000 : _a, refreshOptions = props.refreshOptions;\r\n _this.state = {\r\n width: undefined,\r\n height: undefined\r\n };\r\n _this.skipOnMount = skipOnMount;\r\n _this.targetRef = createRef();\r\n _this.observableElement = null;\r\n if (isSSR()) {\r\n return _this;\r\n }\r\n _this.resizeHandler = patchResizeHandler(_this.createResizeHandler, refreshMode, refreshRate, refreshOptions);\r\n _this.resizeObserver = new window.ResizeObserver(_this.resizeHandler);\r\n return _this;\r\n }\r\n ResizeDetector.prototype.componentDidMount = function () {\r\n this.attachObserver();\r\n };\r\n ResizeDetector.prototype.componentDidUpdate = function () {\r\n this.attachObserver();\r\n };\r\n ResizeDetector.prototype.componentWillUnmount = function () {\r\n if (isSSR()) {\r\n return;\r\n }\r\n this.resizeObserver.disconnect();\r\n this.cancelHandler();\r\n };\r\n ResizeDetector.prototype.render = function () {\r\n var _a = this.props, render = _a.render, children = _a.children, _b = _a.nodeType, WrapperTag = _b === void 0 ? 'div' : _b;\r\n var _c = this.state, width = _c.width, height = _c.height;\r\n var childProps = { width: width, height: height, targetRef: this.targetRef };\r\n var renderType = this.getRenderType();\r\n var typedChildren;\r\n switch (renderType) {\r\n case 'renderProp':\r\n return render && render(childProps);\r\n case 'childFunction':\r\n typedChildren = children;\r\n return typedChildren(childProps);\r\n case 'child':\r\n // @TODO bug prone logic\r\n typedChildren = children;\r\n if (typedChildren.type && typeof typedChildren.type === 'string') {\r\n // child is a native DOM elements such as div, span etc\r\n childProps.targetRef; var nativeProps = __rest(childProps, [\"targetRef\"]);\r\n return cloneElement(typedChildren, nativeProps);\r\n }\r\n // class or functional component otherwise\r\n return cloneElement(typedChildren, childProps);\r\n case 'childArray':\r\n typedChildren = children;\r\n return typedChildren.map(function (el) { return !!el && cloneElement(el, childProps); });\r\n default:\r\n return React.createElement(WrapperTag, null);\r\n }\r\n };\r\n return ResizeDetector;\r\n}(PureComponent));function withResizeDetector(ComponentInner, options) {\r\n if (options === void 0) { options = {}; }\r\n var ResizeDetectorHOC = /** @class */ (function (_super) {\r\n __extends(ResizeDetectorHOC, _super);\r\n function ResizeDetectorHOC() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.ref = createRef();\r\n return _this;\r\n }\r\n ResizeDetectorHOC.prototype.render = function () {\r\n var _a = this.props, forwardedRef = _a.forwardedRef, rest = __rest(_a, [\"forwardedRef\"]);\r\n var targetRef = forwardedRef !== null && forwardedRef !== void 0 ? forwardedRef : this.ref;\r\n return (React.createElement(ResizeDetector, __assign({}, options, { targetRef: targetRef }),\r\n React.createElement(ComponentInner, __assign({ targetRef: targetRef }, rest))));\r\n };\r\n return ResizeDetectorHOC;\r\n }(Component));\r\n function forwardRefWrapper(props, ref) {\r\n return React.createElement(ResizeDetectorHOC, __assign({}, props, { forwardedRef: ref }));\r\n }\r\n var name = ComponentInner.displayName || ComponentInner.name;\r\n forwardRefWrapper.displayName = \"withResizeDetector(\".concat(name, \")\");\r\n return forwardRef(forwardRefWrapper);\r\n}var useEnhancedEffect = isSSR() ? useEffect : useLayoutEffect;\r\nfunction useResizeDetector(props) {\r\n if (props === void 0) { props = {}; }\r\n var _a = props.skipOnMount, skipOnMount = _a === void 0 ? false : _a, refreshMode = props.refreshMode, _b = props.refreshRate, refreshRate = _b === void 0 ? 1000 : _b, refreshOptions = props.refreshOptions, _c = props.handleWidth, handleWidth = _c === void 0 ? true : _c, _d = props.handleHeight, handleHeight = _d === void 0 ? true : _d, targetRef = props.targetRef, observerOptions = props.observerOptions, onResize = props.onResize;\r\n var skipResize = useRef(skipOnMount);\r\n var localRef = useRef(null);\r\n var ref = (targetRef !== null && targetRef !== void 0 ? targetRef : localRef);\r\n var resizeHandler = useRef();\r\n var _e = useState({\r\n width: undefined,\r\n height: undefined\r\n }), size = _e[0], setSize = _e[1];\r\n useEnhancedEffect(function () {\r\n if (isSSR()) {\r\n return;\r\n }\r\n var notifyResize = createNotifier(onResize, setSize, handleWidth, handleHeight);\r\n var resizeCallback = function (entries) {\r\n if (!handleWidth && !handleHeight)\r\n return;\r\n entries.forEach(function (entry) {\r\n var _a = (entry && entry.contentRect) || {}, width = _a.width, height = _a.height;\r\n var shouldSetSize = !skipResize.current && !isSSR();\r\n if (shouldSetSize) {\r\n notifyResize({ width: width, height: height });\r\n }\r\n skipResize.current = false;\r\n });\r\n };\r\n resizeHandler.current = patchResizeHandler(resizeCallback, refreshMode, refreshRate, refreshOptions);\r\n var resizeObserver = new window.ResizeObserver(resizeHandler.current);\r\n if (ref.current) {\r\n // Something wrong with typings here...\r\n resizeObserver.observe(ref.current, observerOptions);\r\n }\r\n return function () {\r\n resizeObserver.disconnect();\r\n var patchedResizeHandler = resizeHandler.current;\r\n if (patchedResizeHandler && patchedResizeHandler.cancel) {\r\n patchedResizeHandler.cancel();\r\n }\r\n };\r\n }, [refreshMode, refreshRate, refreshOptions, handleWidth, handleHeight, onResize, observerOptions, ref.current]);\r\n return __assign({ ref: ref }, size);\r\n}export{ResizeDetector as default,useResizeDetector,withResizeDetector};//# sourceMappingURL=index.esm.js.map\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { Enums, Types, utilities } from '@cornerstonejs/core';\nimport { utilities as csToolsUtils } from '@cornerstonejs/tools';\nimport { ImageScrollbar } from '@ohif/ui';\n\nfunction CornerstoneImageScrollbar({\n viewportData,\n viewportIndex,\n element,\n imageSliceData,\n setImageSliceData,\n scrollbarHeight,\n servicesManager,\n}) {\n const { CineService, CornerstoneViewportService } = servicesManager.services;\n\n const onImageScrollbarChange = (imageIndex, viewportIndex) => {\n const viewportInfo = CornerstoneViewportService.getViewportInfoByIndex(\n viewportIndex\n );\n\n const viewportId = viewportInfo.getViewportId();\n const viewport = CornerstoneViewportService.getCornerstoneViewport(\n viewportId\n );\n\n const { isCineEnabled } = CineService.getState();\n\n if (isCineEnabled) {\n // on image scrollbar change, stop the CINE if it is playing\n CineService.stopClip(element);\n CineService.setCine({ id: viewportIndex, isPlaying: false });\n }\n\n csToolsUtils.jumpToSlice(viewport.element, {\n imageIndex,\n debounceLoading: true,\n });\n };\n\n useEffect(() => {\n if (!viewportData) {\n return;\n }\n\n const viewport = CornerstoneViewportService.getCornerstoneViewportByIndex(\n viewportIndex\n );\n\n if (!viewport) {\n return;\n }\n\n if (viewportData.viewportType === Enums.ViewportType.STACK) {\n const imageIndex = viewport.getCurrentImageIdIndex();\n\n setImageSliceData({\n imageIndex: imageIndex,\n numberOfSlices: viewportData.data.imageIds.length,\n });\n\n return;\n }\n\n if (viewportData.viewportType === Enums.ViewportType.ORTHOGRAPHIC) {\n const sliceData = utilities.getImageSliceDataForVolumeViewport(\n viewport as Types.IVolumeViewport\n );\n\n if (!sliceData) {\n return;\n }\n\n const { imageIndex, numberOfSlices } = sliceData;\n setImageSliceData({ imageIndex, numberOfSlices });\n }\n }, [viewportIndex, viewportData]);\n\n useEffect(() => {\n if (viewportData?.viewportType !== Enums.ViewportType.STACK) {\n return;\n }\n\n const updateStackIndex = event => {\n const { newImageIdIndex } = event.detail;\n // find the index of imageId in the imageIds\n setImageSliceData({\n imageIndex: newImageIdIndex,\n numberOfSlices: viewportData.data.imageIds.length,\n });\n };\n\n element.addEventListener(\n Enums.Events.STACK_VIEWPORT_SCROLL,\n updateStackIndex\n );\n\n return () => {\n element.removeEventListener(\n Enums.Events.STACK_VIEWPORT_SCROLL,\n updateStackIndex\n );\n };\n }, [viewportData, element]);\n\n useEffect(() => {\n if (viewportData?.viewportType !== Enums.ViewportType.ORTHOGRAPHIC) {\n return;\n }\n\n const updateVolumeIndex = event => {\n const { imageIndex, numberOfSlices } = event.detail;\n // find the index of imageId in the imageIds\n setImageSliceData({ imageIndex, numberOfSlices });\n };\n\n element.addEventListener(Enums.Events.VOLUME_NEW_IMAGE, updateVolumeIndex);\n\n return () => {\n element.removeEventListener(\n Enums.Events.VOLUME_NEW_IMAGE,\n updateVolumeIndex\n );\n };\n }, [viewportData, element]);\n\n return (\n onImageScrollbarChange(evt, viewportIndex)}\n max={\n imageSliceData.numberOfSlices ? imageSliceData.numberOfSlices - 1 : 0\n }\n height={scrollbarHeight}\n value={imageSliceData.imageIndex}\n />\n );\n}\n\nCornerstoneImageScrollbar.propTypes = {\n viewportData: PropTypes.object,\n viewportIndex: PropTypes.number.isRequired,\n element: PropTypes.instanceOf(Element),\n scrollbarHeight: PropTypes.string,\n imageSliceData: PropTypes.object.isRequired,\n setImageSliceData: PropTypes.func.isRequired,\n};\n\nexport default CornerstoneImageScrollbar;\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { vec3 } from 'gl-matrix';\nimport PropTypes from 'prop-types';\nimport { metaData, Enums, utilities } from '@cornerstonejs/core';\nimport { ViewportOverlay } from '@ohif/ui';\n\nconst EPSILON = 1e-4;\n\nfunction CornerstoneViewportOverlay({\n element,\n viewportData,\n imageSliceData,\n viewportIndex,\n servicesManager,\n}) {\n const {\n CornerstoneViewportService,\n ToolBarService,\n } = servicesManager.services;\n const [voi, setVOI] = useState({ windowCenter: null, windowWidth: null });\n const [scale, setScale] = useState(1);\n const [activeTools, setActiveTools] = useState([]);\n\n /**\n * Initial toolbar state\n */\n useEffect(() => {\n setActiveTools(ToolBarService.getActiveTools());\n }, []);\n\n useEffect(() => {\n let isMounted = true;\n const { unsubscribe } = ToolBarService.subscribe(\n ToolBarService.EVENTS.TOOL_BAR_STATE_MODIFIED,\n () => {\n if (!isMounted) {\n return;\n }\n\n setActiveTools(ToolBarService.getActiveTools());\n }\n );\n\n return () => {\n isMounted = false;\n unsubscribe();\n };\n }, []);\n\n /**\n * Updating the VOI when the viewport changes its voi\n */\n useEffect(() => {\n const updateVOI = eventDetail => {\n const { range } = eventDetail.detail;\n\n if (!range) {\n return;\n }\n\n const { lower, upper } = range;\n const { windowWidth, windowCenter } = utilities.windowLevel.toWindowLevel(\n lower,\n upper\n );\n\n setVOI({ windowCenter, windowWidth });\n };\n\n element.addEventListener(Enums.Events.VOI_MODIFIED, updateVOI);\n\n return () => {\n element.removeEventListener(Enums.Events.VOI_MODIFIED, updateVOI);\n };\n }, [viewportIndex, viewportData, voi, element]);\n\n /**\n * Updating the scale when the viewport changes its zoom\n */\n useEffect(() => {\n const updateScale = eventDetail => {\n const { previousCamera, camera } = eventDetail.detail;\n\n if (\n previousCamera.parallelScale !== camera.parallelScale ||\n previousCamera.scale !== camera.scale\n ) {\n const viewport = CornerstoneViewportService.getCornerstoneViewportByIndex(\n viewportIndex\n );\n\n if (!viewport) {\n return;\n }\n\n const imageData = viewport.getImageData();\n\n if (!imageData) {\n return;\n }\n\n if (camera.scale) {\n setScale(camera.scale);\n return;\n }\n\n const { spacing } = imageData;\n // convert parallel scale to scale\n const scale =\n (element.clientHeight * spacing[0] * 0.5) / camera.parallelScale;\n setScale(scale);\n }\n };\n\n element.addEventListener(Enums.Events.CAMERA_MODIFIED, updateScale);\n\n return () => {\n element.removeEventListener(Enums.Events.CAMERA_MODIFIED, updateScale);\n };\n }, [viewportIndex, viewportData]);\n\n const getTopLeftContent = useCallback(() => {\n const { windowWidth, windowCenter } = voi;\n\n if (activeTools.includes('WindowLevel')) {\n if (typeof windowCenter !== 'number' || typeof windowWidth !== 'number') {\n return null;\n }\n\n return (\n \n W: \n {windowWidth.toFixed(0)} \n L: \n {windowCenter.toFixed(0)} \n
\n );\n }\n\n if (activeTools.includes('Zoom')) {\n return (\n \n Zoom: \n {scale.toFixed(2)}x \n
\n );\n }\n\n return null;\n }, [voi, scale, activeTools]);\n\n const getTopRightContent = useCallback(() => {\n const { imageIndex, numberOfSlices } = imageSliceData;\n if (!viewportData) {\n return;\n }\n\n let instanceNumber;\n\n if (viewportData.viewportType === Enums.ViewportType.STACK) {\n instanceNumber = _getInstanceNumberFromStack(viewportData, imageIndex);\n\n if (!instanceNumber) {\n return null;\n }\n } else if (viewportData.viewportType === Enums.ViewportType.ORTHOGRAPHIC) {\n instanceNumber = _getInstanceNumberFromVolume(\n viewportData,\n imageIndex,\n viewportIndex,\n CornerstoneViewportService\n );\n }\n\n return (\n \n I: \n \n {instanceNumber !== undefined\n ? `${instanceNumber} (${imageIndex + 1}/${numberOfSlices})`\n : `${imageIndex + 1}/${numberOfSlices}`}\n \n
\n );\n }, [imageSliceData, viewportData, viewportIndex]);\n\n if (!viewportData) {\n return null;\n }\n\n return (\n \n );\n}\n\nfunction _getInstanceNumberFromStack(viewportData, imageIndex) {\n const imageIds = viewportData.data.imageIds;\n const imageId = imageIds[imageIndex];\n\n if (!imageId) {\n return;\n }\n\n const generalImageModule = metaData.get('generalImageModule', imageId) || {};\n const { instanceNumber } = generalImageModule;\n\n const stackSize = imageIds.length;\n\n if (stackSize <= 1) {\n return;\n }\n\n return parseInt(instanceNumber);\n}\n\n// Since volume viewports can be in any view direction, they can render\n// a reconstructed image which don't have imageIds; therefore, no instance and instanceNumber\n// Here we check if viewport is in the acquisition direction and if so, we get the instanceNumber\nfunction _getInstanceNumberFromVolume(\n viewportData,\n imageIndex,\n viewportIndex,\n CornerstoneViewportService\n) {\n const volumes = viewportData.data.map(d => d.volume);\n\n // Todo: support fusion of acquisition plane which has instanceNumber\n if (!volumes || volumes.length > 1) {\n return;\n }\n\n const volume = volumes[0];\n const { direction, imageIds } = volume;\n\n const cornerstoneViewport = CornerstoneViewportService.getCornerstoneViewportByIndex(\n viewportIndex\n );\n\n if (!cornerstoneViewport) {\n return;\n }\n\n const camera = cornerstoneViewport.getCamera();\n const { viewPlaneNormal } = camera;\n // checking if camera is looking at the acquisition plane (defined by the direction on the volume)\n\n const scanAxisNormal = direction.slice(6, 9);\n\n // check if viewPlaneNormal is parallel to scanAxisNormal\n const cross = vec3.cross(vec3.create(), viewPlaneNormal, scanAxisNormal);\n const isAcquisitionPlane = vec3.length(cross) < EPSILON;\n\n if (isAcquisitionPlane) {\n const imageId = imageIds[imageIndex];\n\n if (!imageId) {\n return {};\n }\n\n const { instanceNumber } =\n metaData.get('generalImageModule', imageId) || {};\n return parseInt(instanceNumber);\n }\n}\n\nCornerstoneViewportOverlay.propTypes = {\n viewportData: PropTypes.object,\n imageIndex: PropTypes.number,\n viewportIndex: PropTypes.number,\n};\n\nexport default CornerstoneViewportOverlay;\n","import React, { useEffect, useState, useMemo } from 'react';\nimport {\n metaData,\n Enums,\n Types,\n getEnabledElement,\n utilities as csUtils,\n} from '@cornerstonejs/core';\nimport { utilities } from '@cornerstonejs/tools';\nimport PropTypes from 'prop-types';\nimport { vec3 } from 'gl-matrix';\n\nimport './ViewportOrientationMarkers.css';\n\nconst {\n getOrientationStringLPS,\n invertOrientationStringLPS,\n} = utilities.orientation;\n\nfunction ViewportOrientationMarkers({\n element,\n viewportData,\n imageSliceData,\n viewportIndex,\n servicesManager,\n orientationMarkers = ['top', 'left'],\n}) {\n // Rotation is in degrees\n const [rotation, setRotation] = useState(0);\n const [flipHorizontal, setFlipHorizontal] = useState(false);\n const [flipVertical, setFlipVertical] = useState(false);\n const { CornerstoneViewportService } = servicesManager.services;\n\n useEffect(() => {\n const cameraModifiedListener = (\n evt: Types.EventTypes.CameraModifiedEvent\n ) => {\n const { rotation, previousCamera, camera } = evt.detail;\n\n if (rotation !== undefined) {\n setRotation(rotation);\n }\n\n if (\n camera.flipHorizontal !== undefined &&\n previousCamera.flipHorizontal !== camera.flipHorizontal\n ) {\n setFlipHorizontal(camera.flipHorizontal);\n }\n\n if (\n camera.flipVertical !== undefined &&\n previousCamera.flipVertical !== camera.flipVertical\n ) {\n setFlipVertical(camera.flipVertical);\n }\n };\n\n element.addEventListener(\n Enums.Events.CAMERA_MODIFIED,\n cameraModifiedListener\n );\n\n return () => {\n element.removeEventListener(\n Enums.Events.CAMERA_MODIFIED,\n cameraModifiedListener\n );\n };\n }, []);\n\n const markers = useMemo(() => {\n if (!viewportData) {\n return '';\n }\n\n let rowCosines, columnCosines;\n if (viewportData.viewportType === 'stack') {\n const imageIndex = imageSliceData.imageIndex;\n const imageId = viewportData.data.imageIds?.[imageIndex];\n\n // Workaround for below TODO stub\n if (!imageId) {\n return false;\n }\n\n ({ rowCosines, columnCosines } =\n metaData.get('imagePlaneModule', imageId) || {});\n } else {\n if (!element || !getEnabledElement(element)) {\n return '';\n }\n\n const { viewport } = getEnabledElement(element);\n const { viewUp, viewPlaneNormal } = viewport.getCamera();\n\n const viewRight = vec3.create();\n vec3.cross(viewRight, viewUp, viewPlaneNormal);\n\n columnCosines = [-viewUp[0], -viewUp[1], -viewUp[2]];\n rowCosines = viewRight;\n }\n\n if (!rowCosines || !columnCosines || rotation === undefined) {\n return '';\n }\n\n const markers = _getOrientationMarkers(\n rowCosines,\n columnCosines,\n rotation,\n flipVertical,\n flipHorizontal\n );\n\n const ohifViewport = CornerstoneViewportService.getViewportInfoByIndex(\n viewportIndex\n );\n\n const backgroundColor = ohifViewport.getViewportOptions().background;\n\n const isLight = backgroundColor\n ? csUtils.isEqual(backgroundColor, [1, 1, 1])\n : false;\n\n return orientationMarkers.map((m, index) => (\n \n ));\n }, [\n viewportData,\n imageSliceData,\n rotation,\n flipVertical,\n flipHorizontal,\n orientationMarkers,\n element,\n ]);\n\n return {markers}
;\n}\n\nViewportOrientationMarkers.propTypes = {\n percentComplete: PropTypes.number,\n error: PropTypes.object,\n};\n\nViewportOrientationMarkers.defaultProps = {\n percentComplete: 0,\n error: null,\n};\n\n/**\n *\n * Computes the orientation labels on a Cornerstone-enabled Viewport element\n * when the viewport settings change (e.g. when a horizontal flip or a rotation occurs)\n *\n * @param {*} rowCosines\n * @param {*} columnCosines\n * @param {*} rotation in degrees\n * @returns\n */\nfunction _getOrientationMarkers(\n rowCosines,\n columnCosines,\n rotation,\n flipVertical,\n flipHorizontal\n) {\n const rowString = getOrientationStringLPS(rowCosines);\n const columnString = getOrientationStringLPS(columnCosines);\n const oppositeRowString = invertOrientationStringLPS(rowString);\n const oppositeColumnString = invertOrientationStringLPS(columnString);\n\n const markers = {\n top: oppositeColumnString,\n left: oppositeRowString,\n right: rowString,\n bottom: columnString,\n };\n\n // If any vertical or horizontal flips are applied, change the orientation strings ahead of\n // the rotation applications\n if (flipVertical) {\n markers.top = invertOrientationStringLPS(markers.top);\n markers.bottom = invertOrientationStringLPS(markers.bottom);\n }\n\n if (flipHorizontal) {\n markers.left = invertOrientationStringLPS(markers.left);\n markers.right = invertOrientationStringLPS(markers.right);\n }\n\n // Swap the labels accordingly if the viewport has been rotated\n // This could be done in a more complex way for intermediate rotation values (e.g. 45 degrees)\n if (rotation === 90 || rotation === -270) {\n return {\n top: markers.left,\n left: invertOrientationStringLPS(markers.top),\n right: invertOrientationStringLPS(markers.bottom),\n bottom: markers.right, // left\n };\n } else if (rotation === -90 || rotation === 270) {\n return {\n top: invertOrientationStringLPS(markers.left),\n left: markers.top,\n bottom: markers.left,\n right: markers.bottom,\n };\n } else if (rotation === 180 || rotation === -180) {\n return {\n top: invertOrientationStringLPS(markers.top),\n left: invertOrientationStringLPS(markers.left),\n bottom: invertOrientationStringLPS(markers.bottom),\n right: invertOrientationStringLPS(markers.right),\n };\n }\n\n return markers;\n}\n\nexport default ViewportOrientationMarkers;\n","import React, { useEffect, useState, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { Enums } from '@cornerstonejs/core';\n\nfunction ViewportImageSliceLoadingIndicator({ viewportData, element }) {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(false);\n\n const loadIndicatorRef = useRef(null);\n const imageIdToBeLoaded = useRef(null);\n\n const setLoadingState = evt => {\n clearTimeout(loadIndicatorRef.current);\n\n loadIndicatorRef.current = setTimeout(() => {\n setLoading(true);\n }, 50);\n };\n\n const setFinishLoadingState = evt => {\n clearTimeout(loadIndicatorRef.current);\n\n setLoading(false);\n };\n\n const setErrorState = evt => {\n clearTimeout(loadIndicatorRef.current);\n\n if (imageIdToBeLoaded.current === evt.detail.imageId) {\n setError(evt.detail.error);\n imageIdToBeLoaded.current = null;\n }\n };\n\n useEffect(() => {\n element.addEventListener(\n Enums.Events.STACK_VIEWPORT_SCROLL,\n setLoadingState\n );\n element.addEventListener(Enums.Events.IMAGE_LOAD_ERROR, setErrorState);\n element.addEventListener(\n Enums.Events.STACK_NEW_IMAGE,\n setFinishLoadingState\n );\n\n return () => {\n element.removeEventListener(\n Enums.Events.STACK_VIEWPORT_SCROLL,\n setLoadingState\n );\n\n element.removeEventListener(\n Enums.Events.STACK_NEW_IMAGE,\n setFinishLoadingState\n );\n\n element.removeEventListener(Enums.Events.IMAGE_LOAD_ERROR, setErrorState);\n };\n }, [element, viewportData]);\n\n if (error) {\n return (\n <>\n \n
\n
\n
Error Loading Image \n
An error has occurred.
\n
{error}
\n \n
\n
\n >\n );\n }\n\n if (loading) {\n return (\n // IMPORTANT: we need to use the pointer-events-none class to prevent the loading indicator from\n // interacting with the mouse, since scrolling should propagate to the viewport underneath\n \n );\n }\n\n return null;\n}\n\nViewportImageSliceLoadingIndicator.propTypes = {\n percentComplete: PropTypes.number,\n error: PropTypes.object,\n element: PropTypes.object,\n};\n\nViewportImageSliceLoadingIndicator.defaultProps = {\n percentComplete: 0,\n error: null,\n};\n\nexport default ViewportImageSliceLoadingIndicator;\n","import React, { useEffect, useState } from 'react';\n\nimport ViewportImageScrollbar from './ViewportImageScrollbar';\nimport ViewportOverlay from './ViewportOverlay';\nimport ViewportOrientationMarkers from './ViewportOrientationMarkers';\nimport ViewportImageSliceLoadingIndicator from './ViewportImageSliceLoadingIndicator';\n\nfunction CornerstoneOverlays(props) {\n const { viewportIndex, element, scrollbarHeight, servicesManager } = props;\n const { \n disableViewportImageScrollbar,\n disableViewportOverlay,\n disableViewportImageSliceLoadingIndicator,\n disableViewportOrientationMarkers,\n } = props;\n const { CornerstoneViewportService, CornerstoneCacheService} = servicesManager.services;\n const [imageSliceData, setImageSliceData] = useState({\n imageIndex: 0,\n numberOfSlices: 0,\n });\n const [viewportData, setViewportData] = useState(null);\n\n useEffect(() => {\n const { unsubscribe } = CornerstoneViewportService.subscribe(\n CornerstoneViewportService.EVENTS.VIEWPORT_DATA_CHANGED,\n props => {\n if (props.viewportIndex !== viewportIndex) {\n return;\n }\n\n setViewportData(props.viewportData);\n }\n );\n\n return () => {\n unsubscribe();\n };\n }, [viewportIndex]);\n\n if (!element) {\n return null;\n }\n\n if (viewportData) {\n const viewportInfo = CornerstoneViewportService.getViewportInfoByIndex(\n viewportIndex\n );\n\n if (viewportInfo?.viewportOptions?.customViewportProps?.hideOverlays) {\n return null;\n }\n }\n\n return (\n \n {!disableViewportImageScrollbar && (\n \n )}\n {!disableViewportOverlay && (\n \n )}\n {!disableViewportImageSliceLoadingIndicator && (\n \n )}\n {!disableViewportOrientationMarkers && (\n \n )}\n
\n );\n}\n\nexport default CornerstoneOverlays;\n","import React, { useEffect, useRef, useCallback, useState } from 'react';\nimport ReactResizeDetector from 'react-resize-detector';\nimport PropTypes from 'prop-types';\nimport * as cs3DTools from '@cornerstonejs/tools';\nimport {\n Enums,\n eventTarget,\n getEnabledElement,\n StackViewport,\n utilities as csUtils,\n CONSTANTS,\n} from '@cornerstonejs/core';\n\nimport { setEnabledElement } from '../state';\n\nimport './OHIFCornerstoneViewport.css';\nimport CornerstoneOverlays from './Overlays/CornerstoneOverlays';\nimport {\n IStackViewport,\n IVolumeViewport,\n} from '@cornerstonejs/core/dist/esm/types';\nimport getSOPInstanceAttributes from '../utils/measurementServiceMappings/utils/getSOPInstanceAttributes';\n\nconst STACK = 'stack';\n\nfunction areEqual(prevProps, nextProps) {\n if (nextProps.needsRerendering) {\n return false;\n }\n\n if (prevProps.displaySets.length !== nextProps.displaySets.length) {\n return false;\n }\n\n if (\n prevProps.viewportOptions.orientation !==\n nextProps.viewportOptions.orientation\n ) {\n return false;\n }\n\n if (\n prevProps.viewportOptions.viewportType !==\n nextProps.viewportOptions.viewportType\n ) {\n return false;\n }\n\n const prevDisplaySets = prevProps.displaySets;\n const nextDisplaySets = nextProps.displaySets;\n\n if (prevDisplaySets.length !== nextDisplaySets.length) {\n return false;\n }\n\n for (let i = 0; i < prevDisplaySets.length; i++) {\n const prevDisplaySet = prevDisplaySets[i];\n\n const foundDisplaySet = nextDisplaySets.find(\n nextDisplaySet =>\n nextDisplaySet.displaySetInstanceUID ===\n prevDisplaySet.displaySetInstanceUID\n );\n\n if (!foundDisplaySet) {\n return false;\n }\n\n // check they contain the same image\n if (foundDisplaySet.images?.length !== prevDisplaySet.images?.length) {\n return false;\n }\n\n // check if their imageIds are the same\n if (foundDisplaySet.images?.length) {\n for (let j = 0; j < foundDisplaySet.images.length; j++) {\n if (\n foundDisplaySet.images[j].imageId !== prevDisplaySet.images[j].imageId\n ) {\n return false;\n }\n }\n }\n }\n\n return true;\n}\n\n// Todo: This should be done with expose of internal API similar to react-vtkjs-viewport\n// Then we don't need to worry about the re-renders if the props change.\nconst OHIFCornerstoneViewport = React.memo(React.forwardRef((props, ref) => {\n const {\n viewportIndex,\n displaySets,\n dataSource,\n viewportOptions,\n displaySetOptions,\n servicesManager,\n onElementEnabled,\n onElementDisabled,\n // Note: you SHOULD NOT use the initialImageIdOrIndex for manipulation\n // of the imageData in the OHIFCornerstoneViewport. This prop is used\n // to set the initial state of the viewport's first image to render\n initialImageIndex,\n disableViewportImageScrollbar,\n disableViewportOverlay,\n disableViewportImageSliceLoadingIndicator,\n disableViewportOrientationMarkers,\n } = props;\n\n const [scrollbarHeight, setScrollbarHeight] = useState('100px');\n\n const elementRef = useRef();\n\n React.useImperativeHandle(ref, () => elementRef.current);\n\n const {\n MeasurementService,\n DisplaySetService,\n ToolBarService,\n ToolGroupService,\n SyncGroupService,\n CornerstoneViewportService,\n CornerstoneCacheService,\n ViewportGridService,\n } = servicesManager.services;\n\n // useCallback for scroll bar height calculation\n const setImageScrollBarHeight = useCallback(() => {\n const scrollbarHeight = `${elementRef.current.clientHeight - 20}px`;\n setScrollbarHeight(scrollbarHeight);\n }, [elementRef]);\n\n // useCallback for onResize\n const onResize = useCallback(() => {\n if (elementRef.current) {\n CornerstoneViewportService.resize();\n setImageScrollBarHeight();\n }\n }, [elementRef]);\n\n const elementEnabledHandler = useCallback(\n evt => {\n // check this is this element reference and return early if doesn't match\n if (evt.detail.element !== elementRef.current) {\n return;\n }\n\n const { viewportId, element } = evt.detail;\n const viewportInfo = CornerstoneViewportService.getViewportInfo(\n viewportId\n );\n const viewportIndex = viewportInfo.getViewportIndex();\n\n setEnabledElement(viewportIndex, element);\n\n const renderingEngineId = viewportInfo.getRenderingEngineId();\n const toolGroupId = viewportInfo.getToolGroupId();\n const syncGroups = viewportInfo.getSyncGroups();\n\n ToolGroupService.addViewportToToolGroup(\n viewportId,\n renderingEngineId,\n toolGroupId\n );\n\n SyncGroupService.addViewportToSyncGroup(\n viewportId,\n renderingEngineId,\n syncGroups\n );\n\n if (onElementEnabled) {\n onElementEnabled(evt);\n }\n },\n [viewportIndex, onElementEnabled, ToolGroupService]\n );\n\n // disable the element upon unmounting\n useEffect(() => {\n CornerstoneViewportService.enableViewport(\n viewportIndex,\n viewportOptions,\n elementRef.current\n );\n\n eventTarget.addEventListener(\n Enums.Events.ELEMENT_ENABLED,\n elementEnabledHandler\n );\n\n setImageScrollBarHeight();\n\n return () => {\n const viewportInfo = CornerstoneViewportService.getViewportInfoByIndex(\n viewportIndex\n );\n\n const viewportId = viewportInfo.getViewportId();\n const renderingEngineId = viewportInfo.getRenderingEngineId();\n const syncGroups = viewportInfo.getSyncGroups();\n\n ToolGroupService.removeViewportFromToolGroup(\n viewportId,\n renderingEngineId\n );\n\n SyncGroupService.removeViewportFromSyncGroup(\n viewportId,\n renderingEngineId,\n syncGroups\n );\n\n CornerstoneViewportService.disableElement(viewportIndex);\n\n if (onElementDisabled) {\n onElementDisabled(viewportInfo);\n }\n\n eventTarget.removeEventListener(\n Enums.Events.ELEMENT_ENABLED,\n elementEnabledHandler\n );\n };\n }, []);\n\n // subscribe to displaySet metadata invalidation (updates)\n // Currently, if the metadata changes we need to re-render the display set\n // for it to take effect in the viewport. As we deal with scaling in the loading,\n // we need to remove the old volume from the cache, and let the\n // viewport to re-add it which will use the new metadata. Otherwise, the\n // viewport will use the cached volume and the new metadata will not be used.\n // Note: this approach does not actually end of sending network requests\n // and it uses the network cache\n useEffect(() => {\n const { unsubscribe } = DisplaySetService.subscribe(\n DisplaySetService.EVENTS.DISPLAY_SET_SERIES_METADATA_INVALIDATED,\n async invalidatedDisplaySetInstanceUID => {\n const viewportInfo = CornerstoneViewportService.getViewportInfoByIndex(\n viewportIndex\n );\n\n if (viewportInfo.hasDisplaySet(invalidatedDisplaySetInstanceUID)) {\n const viewportData = viewportInfo.getViewportData();\n const newViewportData = await CornerstoneCacheService.invalidateViewportData(\n viewportData,\n invalidatedDisplaySetInstanceUID,\n dataSource,\n DisplaySetService\n );\n\n const keepCamera = true;\n CornerstoneViewportService.updateViewport(\n viewportIndex,\n newViewportData,\n keepCamera\n );\n }\n }\n );\n return () => {\n unsubscribe();\n };\n }, [viewportIndex]);\n\n useEffect(() => {\n // handle the default viewportType to be stack\n if (!viewportOptions.viewportType) {\n viewportOptions.viewportType = STACK;\n }\n\n const loadViewportData = async () => {\n const viewportData = await CornerstoneCacheService.createViewportData(\n displaySets,\n viewportOptions,\n dataSource,\n initialImageIndex\n );\n\n CornerstoneViewportService.setViewportData(\n viewportIndex,\n viewportData,\n viewportOptions,\n displaySetOptions\n );\n };\n\n loadViewportData();\n }, [viewportOptions, displaySets, dataSource]);\n\n /**\n * There are two scenarios for jump to click\n * 1. Current viewports contain the displaySet that the annotation was drawn on\n * 2. Current viewports don't contain the displaySet that the annotation was drawn on\n * and we need to change the viewports displaySet for jumping.\n * Since measurement_jump happens via events and listeners, the former case is handled\n * by the measurement_jump direct callback, but the latter case is handled first by\n * the viewportGrid to set the correct displaySet on the viewport, AND THEN we check\n * the cache for jumping to see if there is any jump queued, then we jump to the correct slice.\n */\n useEffect(() => {\n const unsubscribeFromJumpToMeasurementEvents = _subscribeToJumpToMeasurementEvents(\n MeasurementService,\n DisplaySetService,\n elementRef,\n viewportIndex,\n displaySets,\n ViewportGridService,\n CornerstoneViewportService\n );\n\n _checkForCachedJumpToMeasurementEvents(\n MeasurementService,\n DisplaySetService,\n elementRef,\n viewportIndex,\n displaySets,\n ViewportGridService,\n CornerstoneViewportService\n );\n\n return () => {\n unsubscribeFromJumpToMeasurementEvents();\n };\n }, [displaySets, elementRef, viewportIndex]);\n\n return (\n \n
\n
e.preventDefault()}\n onMouseDown={e => e.preventDefault()}\n ref={elementRef}\n >
\n
\n
\n );\n }),\n areEqual\n);\n\nfunction _subscribeToJumpToMeasurementEvents(\n MeasurementService,\n DisplaySetService,\n elementRef,\n viewportIndex,\n displaySets,\n ViewportGridService,\n CornerstoneViewportService\n) {\n const displaysUIDs = displaySets.map(\n displaySet => displaySet.displaySetInstanceUID\n );\n const { unsubscribe } = MeasurementService.subscribe(\n MeasurementService.EVENTS.JUMP_TO_MEASUREMENT,\n ({ measurement }) => {\n if (!measurement) return;\n\n // Jump the the measurement if the viewport contains the displaySetUID (fusion)\n if (displaysUIDs.includes(measurement.displaySetInstanceUID)) {\n _jumpToMeasurement(\n measurement,\n elementRef,\n viewportIndex,\n MeasurementService,\n DisplaySetService,\n ViewportGridService,\n CornerstoneViewportService\n );\n }\n }\n );\n\n return unsubscribe;\n}\n\n// Check if there is a queued jumpToMeasurement event\nfunction _checkForCachedJumpToMeasurementEvents(\n MeasurementService,\n DisplaySetService,\n elementRef,\n viewportIndex,\n displaySets,\n ViewportGridService,\n CornerstoneViewportService\n) {\n const displaysUIDs = displaySets.map(\n displaySet => displaySet.displaySetInstanceUID\n );\n\n const measurementIdToJumpTo = MeasurementService.getJumpToMeasurement(\n viewportIndex\n );\n\n if (measurementIdToJumpTo && elementRef) {\n // Jump to measurement if the measurement exists\n const measurement = MeasurementService.getMeasurement(\n measurementIdToJumpTo\n );\n\n if (displaysUIDs.includes(measurement.displaySetInstanceUID)) {\n _jumpToMeasurement(\n measurement,\n elementRef,\n viewportIndex,\n MeasurementService,\n DisplaySetService,\n ViewportGridService,\n CornerstoneViewportService\n );\n }\n }\n}\n\nfunction _jumpToMeasurement(\n measurement,\n targetElementRef,\n viewportIndex,\n MeasurementService,\n DisplaySetService,\n ViewportGridService,\n CornerstoneViewportService\n) {\n const targetElement = targetElementRef.current;\n const { displaySetInstanceUID, SOPInstanceUID, frameNumber } = measurement;\n\n if (!SOPInstanceUID) {\n console.warn('cannot jump in a non-acquisition plane measurements yet');\n }\n\n const referencedDisplaySet = DisplaySetService.getDisplaySetByUID(\n displaySetInstanceUID\n );\n\n // Todo: setCornerstoneMeasurementActive should be handled by the toolGroupManager\n // to set it properly\n // setCornerstoneMeasurementActive(measurement);\n\n ViewportGridService.setActiveViewportIndex(viewportIndex);\n\n const enableElement = getEnabledElement(targetElement);\n\n const viewportInfo = CornerstoneViewportService.getViewportInfoByIndex(\n viewportIndex\n );\n\n if (enableElement) {\n // See how the jumpToSlice() of Cornerstone3D deals with imageIdx param.\n const viewport = enableElement.viewport as IStackViewport | IVolumeViewport;\n\n let imageIdIndex = 0;\n let viewportCameraDirectionMatch = true;\n\n if (viewport instanceof StackViewport) {\n const imageIds = viewport.getImageIds();\n imageIdIndex = imageIds.findIndex(imageId => {\n const {\n SOPInstanceUID: aSOPInstanceUID,\n frameNumber: aFrameNumber,\n } = getSOPInstanceAttributes(imageId);\n return (\n aSOPInstanceUID === SOPInstanceUID &&\n (!frameNumber || frameNumber === aFrameNumber)\n );\n });\n } else {\n // for volume viewport we can't rely on the imageIdIndex since it can be\n // a reconstructed view that doesn't match the original slice numbers etc.\n const { viewPlaneNormal } = measurement.metadata;\n imageIdIndex = referencedDisplaySet.images.findIndex(\n i => i.SOPInstanceUID === SOPInstanceUID\n );\n\n const { orientation } = viewportInfo.getViewportOptions();\n\n if (\n orientation &&\n viewPlaneNormal &&\n !csUtils.isEqual(\n CONSTANTS.MPR_CAMERA_VALUES[orientation]?.viewPlaneNormal,\n viewPlaneNormal\n )\n ) {\n viewportCameraDirectionMatch = false;\n }\n }\n\n if (!viewportCameraDirectionMatch || imageIdIndex === -1) {\n return;\n }\n\n cs3DTools.utilities.jumpToSlice(targetElement, {\n imageIndex: imageIdIndex,\n });\n\n cs3DTools.annotation.selection.setAnnotationSelected(measurement.uid);\n // Jump to measurement consumed, remove.\n MeasurementService.removeJumpToMeasurement(viewportIndex);\n }\n}\n\n// Component displayName\nOHIFCornerstoneViewport.displayName = 'OHIFCornerstoneViewport';\n\nOHIFCornerstoneViewport.propTypes = {\n viewportIndex: PropTypes.number.isRequired,\n displaySets: PropTypes.array.isRequired,\n dataSource: PropTypes.object.isRequired,\n viewportOptions: PropTypes.object,\n displaySetOptions: PropTypes.arrayOf(PropTypes.any),\n servicesManager: PropTypes.object.isRequired,\n onElementEnabled: PropTypes.func,\n // Note: you SHOULD NOT use the initialImageIdOrIndex for manipulation\n // of the imageData in the OHIFCornerstoneViewport. This prop is used\n // to set the initial state of the viewport's first image to render\n initialImageIdOrIndex: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number,\n ]),\n};\n\nexport default OHIFCornerstoneViewport;\n"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","this","constructor","create","__rest","s","e","t","indexOf","getOwnPropertySymbols","i","length","propertyIsEnumerable","commonjsGlobal","globalThis","window","g","self","isObject_1","value","type","freeGlobal","freeSelf","root$2","Function","root$1","now_1","Date","now","reWhitespace","trimmedEndIndex","string","index","test","charAt","reTrimStart","_baseTrim","slice","replace","_Symbol","Symbol","Symbol$1","objectProto$1","nativeObjectToString$1","toString","symToStringTag$1","toStringTag","undefined","_getRawTag","isOwn","tag","unmasked","result","nativeObjectToString","getRawTag","objectToString","symToStringTag","baseGetTag","isObjectLike","baseTrim","isObject$2","isSymbol","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","isObject$1","toNumber","other","valueOf","isBinary","nativeMax","Math","max","nativeMin","min","debounce_1","func","wait","options","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","time","args","thisArg","apply","leadingEdge","setTimeout","timerExpired","shouldInvoke","timeSinceLastCall","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","arguments","clearTimeout","cancel","flush","debounce","isObject","throttle_1","patchResizeHandler","resizeCallback","refreshMode","refreshRate","refreshOptions","isFunction","fn","isSSR","isDOMElement","element","Element","HTMLDocument","createNotifier","onResize","setSize","handleWidth","handleHeight","_a","width","height","prev","ResizeDetector","_super","props","_this","cancelHandler","resizeHandler","attachObserver","targetRef","observerOptions","current","getElement","observableElement","resizeObserver","observe","querySelector","targetDomEl","document","currentElement","findDOMNode","getRenderType","parentElement","createResizeHandler","entries","_b","_c","notifyResize","setState","bind","forEach","entry","contentRect","skipOnMount","render","children","isValidElement","isArray","state","createRef","ResizeObserver","componentDidMount","componentDidUpdate","componentWillUnmount","disconnect","typedChildren","nodeType","WrapperTag","childProps","nativeProps","cloneElement","map","el","PureComponent","useEffect","useLayoutEffect","CornerstoneImageScrollbar","viewportData","viewportIndex","imageSliceData","setImageSliceData","scrollbarHeight","servicesManager","services","CineService","CornerstoneViewportService","viewport","getCornerstoneViewportByIndex","viewportType","Enums","sliceData","utilities","imageIndex","numberOfSlices","getCurrentImageIdIndex","data","imageIds","updateStackIndex","event","newImageIdIndex","detail","addEventListener","removeEventListener","updateVolumeIndex","onChange","evt","viewportId","getViewportInfoByIndex","getViewportId","getCornerstoneViewport","getState","isCineEnabled","stopClip","setCine","id","isPlaying","csToolsUtils","debounceLoading","onImageScrollbarChange","propTypes","PropTypes","EPSILON","CornerstoneViewportOverlay","ToolBarService","useState","windowCenter","windowWidth","voi","setVOI","scale","setScale","activeTools","setActiveTools","getActiveTools","isMounted","unsubscribe","subscribe","EVENTS","TOOL_BAR_STATE_MODIFIED","updateVOI","eventDetail","range","lower","upper","updateScale","previousCamera","camera","parallelScale","imageData","getImageData","spacing","clientHeight","getTopLeftContent","useCallback","includes","className","toFixed","getTopRightContent","instanceNumber","imageId","metaData","get","_getInstanceNumberFromStack","volumes","volume","direction","cornerstoneViewport","viewPlaneNormal","getCamera","scanAxisNormal","cross","vec3","_getInstanceNumberFromVolume","topLeft","topRight","getOrientationStringLPS","invertOrientationStringLPS","ViewportOrientationMarkers","orientationMarkers","rotation","setRotation","flipHorizontal","setFlipHorizontal","flipVertical","setFlipVertical","cameraModifiedListener","markers","useMemo","rowCosines","columnCosines","getEnabledElement","viewUp","viewRight","rowString","columnString","oppositeRowString","top","left","right","bottom","_getOrientationMarkers","backgroundColor","getViewportOptions","background","csUtils","m","key","percentComplete","error","defaultProps","ViewportImageSliceLoadingIndicator","loading","setLoading","setError","loadIndicatorRef","useRef","imageIdToBeLoaded","setLoadingState","setFinishLoadingState","setErrorState","disableViewportImageScrollbar","disableViewportOverlay","disableViewportImageSliceLoadingIndicator","disableViewportOrientationMarkers","CornerstoneCacheService","setViewportData","VIEWPORT_DATA_CHANGED","viewportInfo","viewportOptions","customViewportProps","hideOverlays","ViewportImageScrollbar","ViewportOverlay","areEqual","prevProps","nextProps","needsRerendering","displaySets","orientation","prevDisplaySets","nextDisplaySets","prevDisplaySet","foundDisplaySet","find","nextDisplaySet","displaySetInstanceUID","images","j","OHIFCornerstoneViewport","React","ref","dataSource","displaySetOptions","onElementEnabled","onElementDisabled","initialImageIndex","setScrollbarHeight","elementRef","MeasurementService","DisplaySetService","ToolGroupService","SyncGroupService","ViewportGridService","setImageScrollBarHeight","resize","elementEnabledHandler","getViewportInfo","getViewportIndex","setEnabledElement","renderingEngineId","getRenderingEngineId","toolGroupId","getToolGroupId","syncGroups","getSyncGroups","addViewportToToolGroup","addViewportToSyncGroup","enableViewport","eventTarget","removeViewportFromToolGroup","removeViewportFromSyncGroup","disableElement","DISPLAY_SET_SERIES_METADATA_INVALIDATED","invalidatedDisplaySetInstanceUID","hasDisplaySet","getViewportData","invalidateViewportData","newViewportData","updateViewport","loadViewportData","createViewportData","unsubscribeFromJumpToMeasurementEvents","displaysUIDs","displaySet","JUMP_TO_MEASUREMENT","measurement","_jumpToMeasurement","_subscribeToJumpToMeasurementEvents","measurementIdToJumpTo","getJumpToMeasurement","getMeasurement","_checkForCachedJumpToMeasurementEvents","style","onContextMenu","preventDefault","onMouseDown","targetElementRef","targetElement","SOPInstanceUID","frameNumber","console","warn","referencedDisplaySet","getDisplaySetByUID","setActiveViewportIndex","enableElement","imageIdIndex","viewportCameraDirectionMatch","StackViewport","getImageIds","findIndex","getSOPInstanceAttributes","aSOPInstanceUID","aFrameNumber","metadata","CONSTANTS","cs3DTools","uid","removeJumpToMeasurement","displayName","initialImageIdOrIndex"],"sourceRoot":""}
\ No newline at end of file
diff --git a/platform/viewer-static/dist/365.css b/platform/viewer-static/dist/365.css
new file mode 100644
index 00000000000..fbd17ab2608
--- /dev/null
+++ b/platform/viewer-static/dist/365.css
@@ -0,0 +1,2 @@
+.viewport-wrapper{height:100%;position:relative;width:100%}.cornerstone-viewport-element{background-color:#000;height:100%;outline:0!important;overflow:hidden;position:relative;width:100%}
+.ViewportOrientationMarkers{--marker-width:100px;--marker-height:100px;--scrollbar-width:20px;color:#ccc;font-size:15px;line-height:18px;pointer-events:none}.ViewportOrientationMarkers .orientation-marker{position:absolute}.ViewportOrientationMarkers .top-mid{left:50%;top:.6rem}.ViewportOrientationMarkers .left-mid{left:5px;top:47%}.ViewportOrientationMarkers .right-mid{left:calc(100% - var(--marker-width) - var(--scrollbar-width));top:47%}.ViewportOrientationMarkers .bottom-mid{left:47%;top:calc(100% - var(--marker-height) - .6rem)}.ViewportOrientationMarkers .right-mid .orientation-marker-value{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;min-width:var(--marker-width)}.ViewportOrientationMarkers .bottom-mid .orientation-marker-value{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;min-height:var(--marker-height)}
diff --git a/platform/viewer-static/dist/36785fbd89b0e17f6099.wasm b/platform/viewer-static/dist/36785fbd89b0e17f6099.wasm
new file mode 100644
index 00000000000..069fac9edeb
Binary files /dev/null and b/platform/viewer-static/dist/36785fbd89b0e17f6099.wasm differ
diff --git a/platform/viewer-static/dist/4f04ab70bef8f727404f.wasm b/platform/viewer-static/dist/4f04ab70bef8f727404f.wasm
new file mode 100644
index 00000000000..2826eb60094
Binary files /dev/null and b/platform/viewer-static/dist/4f04ab70bef8f727404f.wasm differ
diff --git a/platform/viewer-static/dist/569.bundle.5c809f7a1b9a80e0a01e.js b/platform/viewer-static/dist/569.bundle.5c809f7a1b9a80e0a01e.js
new file mode 100644
index 00000000000..81d5cf1623c
--- /dev/null
+++ b/platform/viewer-static/dist/569.bundle.5c809f7a1b9a80e0a01e.js
@@ -0,0 +1,3 @@
+/*! For license information please see 569.bundle.5c809f7a1b9a80e0a01e.js.LICENSE.txt */
+"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[569],{33569:function(t,e,n){n.r(e),n.d(e,{default:function(){return _}});var r=n(32735),o=n(60216),i=n.n(o),a=n(84334),c=n(72928),u=n(67013),s=n(38942);var l=function(t,e,n){var r=n.getModuleEntry("@ohif/extension-cornerstone.utilityModule.tools").exports,o=r.toolNames,i=r.Enums,a={active:[{toolName:o.WindowLevel,bindings:[{mouseButton:i.MouseBindings.Primary}]},{toolName:o.Pan,bindings:[{mouseButton:i.MouseBindings.Auxiliary}]},{toolName:o.Zoom,bindings:[{mouseButton:i.MouseBindings.Secondary}]},{toolName:o.StackScrollMouseWheel,bindings:[]}],enabled:[{toolName:o.SegmentationDisplay}]};return t.createToolGroupAndAddTools(e,a,{})};function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function p(){p=function(){return t};var t={},e=Object.prototype,n=e.hasOwnProperty,r="function"==typeof Symbol?Symbol:{},o=r.iterator||"@@iterator",i=r.asyncIterator||"@@asyncIterator",a=r.toStringTag||"@@toStringTag";function c(t,e,n){return Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{c({},"")}catch(t){c=function(t,e,n){return t[e]=n}}function u(t,e,n,r){var o=e&&e.prototype instanceof h?e:h,i=Object.create(o.prototype),a=new L(r||[]);return i._invoke=function(t,e,n){var r="suspendedStart";return function(o,i){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===o)throw i;return N()}for(n.method=o,n.arg=i;;){var a=n.delegate;if(a){var c=x(a,n);if(c){if(c===l)continue;return c}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var u=s(t,e,n);if("normal"===u.type){if(r=n.done?"completed":"suspendedYield",u.arg===l)continue;return{value:u.arg,done:n.done}}"throw"===u.type&&(r="completed",n.method="throw",n.arg=u.arg)}}}(t,n,a),i}function s(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(t){return{type:"throw",arg:t}}}t.wrap=u;var l={};function h(){}function d(){}function y(){}var v={};c(v,o,(function(){return this}));var m=Object.getPrototypeOf,g=m&&m(m(D([])));g&&g!==e&&n.call(g,o)&&(v=g);var w=y.prototype=h.prototype=Object.create(v);function S(t){["next","throw","return"].forEach((function(e){c(t,e,(function(t){return this._invoke(e,t)}))}))}function b(t,e){function r(o,i,a,c){var u=s(t[o],t,i);if("throw"!==u.type){var l=u.arg,p=l.value;return p&&"object"==f(p)&&n.call(p,"__await")?e.resolve(p.__await).then((function(t){r("next",t,a,c)}),(function(t){r("throw",t,a,c)})):e.resolve(p).then((function(t){l.value=t,a(l)}),(function(t){return r("throw",t,a,c)}))}c(u.arg)}var o;this._invoke=function(t,n){function i(){return new e((function(e,o){r(t,n,e,o)}))}return o=o?o.then(i,i):i()}}function x(t,e){var n=t.iterator[e.method];if(void 0===n){if(e.delegate=null,"throw"===e.method){if(t.iterator.return&&(e.method="return",e.arg=void 0,x(t,e),"throw"===e.method))return l;e.method="throw",e.arg=new TypeError("The iterator does not provide a 'throw' method")}return l}var r=s(n,t.iterator,e.arg);if("throw"===r.type)return e.method="throw",e.arg=r.arg,e.delegate=null,l;var o=r.arg;return o?o.done?(e[t.resultName]=o.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=void 0),e.delegate=null,l):o:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,l)}function E(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function I(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function L(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(E,this),this.reset(!0)}function D(t){if(t){var e=t[o];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var r=-1,i=function e(){for(;++r=0;--o){var i=this.tryEntries[o],a=i.completion;if("root"===i.tryLoc)return r("end");if(i.tryLoc<=this.prev){var c=n.call(i,"catchLoc"),u=n.call(i,"finallyLoc");if(c&&u){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),I(n),l}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var o=r.arg;I(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:D(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=void 0),l}},t}function h(t,e,n,r,o,i,a){try{var c=t[i](a),u=c.value}catch(t){return void n(t)}c.done?e(u):Promise.resolve(u).then(r,o)}function d(t){return function(){var e=this,n=arguments;return new Promise((function(r,o){var i=t.apply(e,n);function a(t){h(i,r,o,a,c,"next",t)}function c(t){h(i,r,o,a,c,"throw",t)}a(void 0)}))}}function y(){return(y=d(p().mark((function t(e){var n,r,o,i,a,c,u,s,l,f,h,d,y;return p().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return n=e.segDisplaySet,r=e.viewportIndex,o=e.toolGroupId,i=e.servicesManager,a=i.services,c=a.SegmentationService,u=a.HangingProtocolService,s=a.ViewportGridService,l=n.referencedDisplaySetInstanceUID,f=null,!1,t.next=7,c.createSegmentationForSEGDisplaySet(n,f,false);case 7:return f=t.sent,c.hydrateSegmentation(n.displaySetInstanceUID),h=s.getState(),d=h.viewports,y=u.getViewportsRequireUpdate(r,l),s.setDisplaySetsForViewports(y),d.forEach((function(t,e){e!==r&&(c.shouldRenderSegmentation(t.displaySetInstanceUIDs,n.displaySetInstanceUID)&&s.setDisplaySetsForViewport({viewportIndex:e,displaySetInstanceUIDs:t.displaySetInstanceUIDs,viewportOptions:{viewportType:"volume",toolGroupId:o,initialImageOptions:{preset:"middle"}}}))})),t.abrupt("return",!0);case 14:case"end":return t.stop()}}),t)})))).apply(this,arguments)}var v=function(t){return y.apply(this,arguments)};function m(t){return m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},m(t)}function g(){g=function(){return t};var t={},e=Object.prototype,n=e.hasOwnProperty,r="function"==typeof Symbol?Symbol:{},o=r.iterator||"@@iterator",i=r.asyncIterator||"@@asyncIterator",a=r.toStringTag||"@@toStringTag";function c(t,e,n){return Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{c({},"")}catch(t){c=function(t,e,n){return t[e]=n}}function u(t,e,n,r){var o=e&&e.prototype instanceof f?e:f,i=Object.create(o.prototype),a=new L(r||[]);return i._invoke=function(t,e,n){var r="suspendedStart";return function(o,i){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===o)throw i;return N()}for(n.method=o,n.arg=i;;){var a=n.delegate;if(a){var c=x(a,n);if(c){if(c===l)continue;return c}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var u=s(t,e,n);if("normal"===u.type){if(r=n.done?"completed":"suspendedYield",u.arg===l)continue;return{value:u.arg,done:n.done}}"throw"===u.type&&(r="completed",n.method="throw",n.arg=u.arg)}}}(t,n,a),i}function s(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(t){return{type:"throw",arg:t}}}t.wrap=u;var l={};function f(){}function p(){}function h(){}var d={};c(d,o,(function(){return this}));var y=Object.getPrototypeOf,v=y&&y(y(D([])));v&&v!==e&&n.call(v,o)&&(d=v);var w=h.prototype=f.prototype=Object.create(d);function S(t){["next","throw","return"].forEach((function(e){c(t,e,(function(t){return this._invoke(e,t)}))}))}function b(t,e){function r(o,i,a,c){var u=s(t[o],t,i);if("throw"!==u.type){var l=u.arg,f=l.value;return f&&"object"==m(f)&&n.call(f,"__await")?e.resolve(f.__await).then((function(t){r("next",t,a,c)}),(function(t){r("throw",t,a,c)})):e.resolve(f).then((function(t){l.value=t,a(l)}),(function(t){return r("throw",t,a,c)}))}c(u.arg)}var o;this._invoke=function(t,n){function i(){return new e((function(e,o){r(t,n,e,o)}))}return o=o?o.then(i,i):i()}}function x(t,e){var n=t.iterator[e.method];if(void 0===n){if(e.delegate=null,"throw"===e.method){if(t.iterator.return&&(e.method="return",e.arg=void 0,x(t,e),"throw"===e.method))return l;e.method="throw",e.arg=new TypeError("The iterator does not provide a 'throw' method")}return l}var r=s(n,t.iterator,e.arg);if("throw"===r.type)return e.method="throw",e.arg=r.arg,e.delegate=null,l;var o=r.arg;return o?o.done?(e[t.resultName]=o.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=void 0),e.delegate=null,l):o:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,l)}function E(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function I(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function L(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(E,this),this.reset(!0)}function D(t){if(t){var e=t[o];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var r=-1,i=function e(){for(;++r=0;--o){var i=this.tryEntries[o],a=i.completion;if("root"===i.tryLoc)return r("end");if(i.tryLoc<=this.prev){var c=n.call(i,"catchLoc"),u=n.call(i,"finallyLoc");if(c&&u){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),I(n),l}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var o=r.arg;I(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:D(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=void 0),l}},t}function w(t,e,n,r,o,i,a){try{var c=t[i](a),u=c.value}catch(t){return void n(t)}c.done?e(u):Promise.resolve(u).then(r,o)}var S=0,b=5;function x(t,e){return new Promise((function(n,r){var o=[{type:"secondary",text:"No",value:S},{type:"primary",text:"Yes",value:b}];t.show({viewportIndex:e,type:"info",message:"Do you want to open this Segmentation?",actions:o,onSubmit:function(e){t.hide(),n(e)},onOutsideClick:function(){t.hide(),n(S)}})}))}var E=function(t){var e=t.servicesManager,n=t.segDisplaySet,r=t.viewportIndex,o=t.toolGroupId,i=void 0===o?"default":o,a=e.services.UIViewportDialogService;return new Promise(function(){var t,o=(t=g().mark((function t(o,c){var u;return g().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,x(a,r);case 2:if(t.sent!==b){t.next=8;break}return t.next=6,v({segDisplaySet:n,viewportIndex:r,toolGroupId:i,servicesManager:e});case 6:u=t.sent,o(u);case 8:case"end":return t.stop()}}),t)})),function(){var e=this,n=arguments;return new Promise((function(r,o){var i=t.apply(e,n);function a(t){w(i,r,o,a,c,"next",t)}function c(t){w(i,r,o,a,c,"throw",t)}a(void 0)}))});return function(t,e){return o.apply(this,arguments)}}())},I=n(40841),L=n.n(I);function D(){return D=Object.assign?Object.assign.bind():function(t){for(var e=1;et.length)&&(e=t.length);for(var n=0,r=new Array(e);n1)throw new Error("SEG viewport should only have a single display set");var g=n[0],w=N((0,u.O_)(),2),S=w[0],b=w[1],x=N((0,u.en)(),2),I=x[0],P=(x[1],N((0,r.useState)(!1),2)),O=(P[0],P[1]),_=N((0,r.useState)(1),2),G=_[0],T=_[1],j=N((0,r.useState)(g.isHydrated),2),A=j[0],M=j[1],F=N((0,r.useState)(!g.isLoaded),2),C=F[0],U=F[1],V=N((0,r.useState)(null),2),R=(V[0],V[1]),B=N((0,r.useState)({segmentIndex:1,totalSegments:null}),2),Y=B[0],H=B[1],Z=(0,r.useRef)(null),q=S.viewports,J=S.activeViewportIndex,W=g.getReferenceDisplaySet(),X=function(t){var e=t.images[0];return{PatientID:e.PatientID,PatientName:e.PatientName,PatientSex:e.PatientSex,PatientAge:e.PatientAge,SliceThickness:e.SliceThickness,StudyDate:e.StudyDate,SeriesDescription:e.SeriesDescription,SeriesInstanceUID:e.SeriesInstanceUID,SeriesNumber:e.SeriesNumber,ManufacturerModelName:e.ManufacturerModelName,SpacingBetweenSlices:e.SpacingBetweenSlices}}(W);Z.current={displaySet:W,metadata:X};var $=function(t){R(t.detail.element)},z=function(){R(null)},K=(0,r.useCallback)((function(){var e=p.getModuleEntry("@ohif/extension-cornerstone.viewportModule.cornerstone").component,n=Z.current.displaySet;return r.createElement(e,D({},t,{displaySets:[n,g],viewportOptions:{viewportType:"volume",toolGroupId:m,orientation:o.orientation},onElementEnabled:$,onElementDisabled:z}))}),[i,g,m]),Q=(0,r.useCallback)((function(t){t="left"===t?-1:1;var e=g.displaySetInstanceUID,n=v.getSegmentation(e).segments,r=Object.keys(n).length,o=G+t;o>r-1?o=1:0===o&&(o=r-1),v.jumpToSegmentCenter(e,o,m),T(o)}),[G]);(0,r.useEffect)((function(){C||E({servicesManager:f,viewportIndex:i,segDisplaySet:g}).then((function(t){t&&M(!0)}))}),[f,i,g,C]),(0,r.useEffect)((function(){var t=v.subscribe(v.EVENTS.SEGMENTATION_PIXEL_DATA_CREATED,(function(t){t.segDisplaySet.displaySetInstanceUID===g.displaySetInstanceUID&&U(!1)})).unsubscribe;return function(){t()}}),[g]),(0,r.useEffect)((function(){var t=v.subscribe(v.EVENTS.SEGMENT_PIXEL_DATA_CREATED,(function(t){var e=t.segmentIndex,n=t.numSegments;H({segmentIndex:e,totalSegments:n})})).unsubscribe;return function(){t()}}),[g]),(0,r.useEffect)((function(){var t=d.subscribe(d.EVENTS.DISPLAY_SETS_REMOVED,(function(t){var e=t.displaySetInstanceUIDs,n=q[J];e.includes(n.displaySetInstanceUID)&&b.setDisplaySetsForViewport({viewportIndex:J,displaySetInstanceUIDs:[]})}));return function(){t.unsubscribe()}}),[]),(0,r.useEffect)((function(){var t=y.getToolGroup(m);if(!t)return t=l(y,m,p),O(!0),function(){v.removeSegmentationRepresentationFromToolGroup(m),y.destroyToolGroup(m)}}),[]),(0,r.useEffect)((function(){return M(g.isHydrated),function(){v.removeSegmentationRepresentationFromToolGroup(m),Z.current=null}}),[g]);var tt=null;if(!Z.current||W.displaySetInstanceUID!==Z.current.displaySet.displaySetInstanceUID)return null;e&&e.length&&(tt=e.map((function(t,e){return t&&r.cloneElement(t,{viewportIndex:i,key:e})})));var et=Z.current.metadata,nt=et.PatientID,rt=et.PatientName,ot=et.PatientSex,it=et.PatientAge,at=et.SliceThickness,ct=et.ManufacturerModelName,ut=et.StudyDate,st=et.SeriesDescription,lt=et.SpacingBetweenSlices,ft=et.SeriesNumber,pt=function(){E({servicesManager:f,viewportIndex:i,segDisplaySet:g}).then((function(t){t&&M(!0)}))};return r.createElement(r.Fragment,null,r.createElement(u.uY,{onDoubleClick:function(t){t.stopPropagation(),t.preventDefault()},onArrowsClick:Q,getStatusComponent:function(){return function(t){var e=t.isHydrated,n=t.onPillClick,o=null,i=null;switch(e){case!0:i=function(){return r.createElement("div",{className:"flex items-center justify-center -mr-1 rounded-full",style:{width:"18px",height:"18px",backgroundColor:"#98e5c1",border:"solid 1.5px #000000"}},r.createElement(u.JO,{name:"exclamation",style:{color:"#000",width:"12px",height:"12px"}}))},o=function(){return r.createElement("div",null,"This Segmentation is loaded in the segmentation panel")};break;case!1:i=function(){return r.createElement("div",{className:"flex items-center justify-center -mr-1 bg-white rounded-full group-hover:bg-customblue-200",style:{width:"18px",height:"18px",border:"solid 1.5px #000000"}},r.createElement(u.JO,{name:"arrow-left",style:{color:"#000",width:"14px",height:"14px"}}))},o=function(){return r.createElement("div",null,"Click to load segmentation.")}}var a=function(){return r.createElement("div",{className:L()("group relative flex items-center justify-center px-8 rounded-full cursor-default bg-customgreen-100",{"hover:bg-customblue-100":!e,"cursor-pointer":!e}),style:{height:"24px",width:"55px"},onClick:function(){e||n&&n()}},r.createElement("div",{className:"pr-1 text-base font-medium leading-none text-black"},"SEG"),r.createElement(i,null))};return r.createElement(r.Fragment,null,o&&r.createElement(u.u,{content:r.createElement(o,null),position:"bottom-left"},r.createElement(a,null)),!o&&r.createElement(a,null))}({isHydrated:A,onPillClick:pt})},studyData:{label:c,useAltStyling:!0,studyDate:k(ut),currentSeries:ft,seriesDescription:"SEG Viewport ".concat(st),patientInformation:{patientName:rt?a.ZP.utils.formatPN(rt.Alphabetic):"",patientSex:ot||"",patientAge:it||"",MRN:nt||"",thickness:at?"".concat(at.toFixed(2),"mm"):"",spacing:void 0!==lt?"".concat(lt.toFixed(2),"mm"):"",scanner:ct||""}}}),r.createElement("div",{className:"relative flex flex-row w-full h-full overflow-hidden"},C&&r.createElement(u.LE,{className:"w-full h-full",progress:null!==Y.totalSegments?(Y.segmentIndex+1)/Y.totalSegments*100:null,textBlock:Y.totalSegments?r.createElement("span",{className:"text-white text-sm flex items-baseline space-x-2"},r.createElement("div",null,"Loading Segment"),r.createElement("div",{className:"w-3"},"".concat(Y.segmentIndex)),r.createElement("div",null,"/"),r.createElement("div",null,"".concat(Y.totalSegments))):r.createElement("span",{className:"text-white text-sm"},"Loading SEG ...")}),K(),r.createElement("div",{className:"absolute w-full"},I.viewportIndex===i&&r.createElement(u.P_,{id:"viewport-notification",message:I.message,type:I.type,actions:I.actions,onSubmit:I.onSubmit,onOutsideClick:I.onOutsideClick})),tt))}O.propTypes={displaySets:i().arrayOf(i().object),viewportIndex:i().number.isRequired,dataSource:i().object,children:i().node,customProps:i().object},O.defaultProps={customProps:{}};var _=O}}]);
+//# sourceMappingURL=569.bundle.5c809f7a1b9a80e0a01e.js.map
\ No newline at end of file
diff --git a/platform/viewer-static/dist/569.bundle.5c809f7a1b9a80e0a01e.js.LICENSE.txt b/platform/viewer-static/dist/569.bundle.5c809f7a1b9a80e0a01e.js.LICENSE.txt
new file mode 100644
index 00000000000..ae386fb79c9
--- /dev/null
+++ b/platform/viewer-static/dist/569.bundle.5c809f7a1b9a80e0a01e.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
diff --git a/platform/viewer-static/dist/569.bundle.5c809f7a1b9a80e0a01e.js.map b/platform/viewer-static/dist/569.bundle.5c809f7a1b9a80e0a01e.js.map
new file mode 100644
index 00000000000..849c435d1c0
--- /dev/null
+++ b/platform/viewer-static/dist/569.bundle.5c809f7a1b9a80e0a01e.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"569.bundle.5c809f7a1b9a80e0a01e.js","mappings":"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","sources":["file:////Users/HemantP/Documents/RapidAI/RapidOHIFViewer/extensions/cornerstone-dicom-seg/src/utils/initSEGToolGroup.ts","file:////Users/HemantP/Documents/RapidAI/RapidOHIFViewer/extensions/cornerstone-dicom-seg/src/utils/_hydrateSEG.ts","file:////Users/HemantP/Documents/RapidAI/RapidOHIFViewer/extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts","file:////Users/HemantP/Documents/RapidAI/RapidOHIFViewer/extensions/cornerstone-dicom-seg/src/viewports/OHIFCornerstoneSEGViewport.tsx","file:////Users/HemantP/Documents/RapidAI/RapidOHIFViewer/extensions/cornerstone-dicom-seg/src/viewports/_getStatusComponent.tsx"],"sourcesContent":["function createSEGToolGroupAndAddTools(\n ToolGroupService,\n toolGroupId,\n extensionManager\n) {\n const utilityModule = extensionManager.getModuleEntry(\n '@ohif/extension-cornerstone.utilityModule.tools'\n );\n\n const { toolNames, Enums } = utilityModule.exports;\n\n const tools = {\n active: [\n {\n toolName: toolNames.WindowLevel,\n bindings: [{ mouseButton: Enums.MouseBindings.Primary }],\n },\n {\n toolName: toolNames.Pan,\n bindings: [{ mouseButton: Enums.MouseBindings.Auxiliary }],\n },\n {\n toolName: toolNames.Zoom,\n bindings: [{ mouseButton: Enums.MouseBindings.Secondary }],\n },\n { toolName: toolNames.StackScrollMouseWheel, bindings: [] },\n ],\n enabled: [{ toolName: toolNames.SegmentationDisplay }],\n };\n\n return ToolGroupService.createToolGroupAndAddTools(toolGroupId, tools, {});\n}\n\nexport default createSEGToolGroupAndAddTools;\n","async function _hydrateSEGDisplaySet({\n segDisplaySet,\n viewportIndex,\n toolGroupId,\n servicesManager,\n}) {\n const {\n SegmentationService,\n HangingProtocolService,\n ViewportGridService,\n } = servicesManager.services;\n\n const displaySetInstanceUID = segDisplaySet.referencedDisplaySetInstanceUID;\n\n let segmentationId = null;\n\n // We need the hydration to notify panels about the new segmentation added\n const suppressEvents = false;\n\n segmentationId = await SegmentationService.createSegmentationForSEGDisplaySet(\n segDisplaySet,\n segmentationId,\n suppressEvents\n );\n\n SegmentationService.hydrateSegmentation(segDisplaySet.displaySetInstanceUID);\n\n const { viewports } = ViewportGridService.getState();\n\n const updatedViewports = HangingProtocolService.getViewportsRequireUpdate(\n viewportIndex,\n displaySetInstanceUID\n );\n\n ViewportGridService.setDisplaySetsForViewports(updatedViewports);\n\n // Todo: fix this after we have a better way for stack viewport segmentations\n\n // check every viewport in the viewports to see if the displaySetInstanceUID\n // is being displayed, if so we need to update the viewport to use volume viewport\n // (if already is not using it) since Cornerstone3D currently only supports\n // volume viewport for segmentation\n viewports.forEach((viewport, index) => {\n if (index === viewportIndex) {\n return;\n }\n\n const shouldDisplaySeg = SegmentationService.shouldRenderSegmentation(\n viewport.displaySetInstanceUIDs,\n segDisplaySet.displaySetInstanceUID\n );\n\n if (shouldDisplaySeg) {\n ViewportGridService.setDisplaySetsForViewport({\n viewportIndex: index,\n displaySetInstanceUIDs: viewport.displaySetInstanceUIDs,\n viewportOptions: {\n viewportType: 'volume',\n toolGroupId,\n initialImageOptions: {\n preset: 'middle',\n },\n },\n });\n }\n });\n\n return true;\n}\n\nexport default _hydrateSEGDisplaySet;\n","import hydrateSEGDisplaySet from './_hydrateSEG';\n\nconst RESPONSE = {\n NO_NEVER: -1,\n CANCEL: 0,\n HYDRATE_SEG: 5,\n};\n\nfunction promptHydrateSEG({\n servicesManager,\n segDisplaySet,\n viewportIndex,\n toolGroupId = 'default',\n}) {\n const { UIViewportDialogService } = servicesManager.services;\n\n return new Promise(async function(resolve, reject) {\n const promptResult = await _askHydrate(\n UIViewportDialogService,\n viewportIndex\n );\n\n if (promptResult === RESPONSE.HYDRATE_SEG) {\n const isHydrated = await hydrateSEGDisplaySet({\n segDisplaySet,\n viewportIndex,\n toolGroupId,\n servicesManager,\n });\n\n resolve(isHydrated);\n }\n });\n}\n\nfunction _askHydrate(UIViewportDialogService, viewportIndex) {\n return new Promise(function(resolve, reject) {\n const message = 'Do you want to open this Segmentation?';\n const actions = [\n {\n type: 'secondary',\n text: 'No',\n value: RESPONSE.CANCEL,\n },\n {\n type: 'primary',\n text: 'Yes',\n value: RESPONSE.HYDRATE_SEG,\n },\n ];\n const onSubmit = result => {\n UIViewportDialogService.hide();\n resolve(result);\n };\n\n UIViewportDialogService.show({\n viewportIndex,\n type: 'info',\n message,\n actions,\n onSubmit,\n onOutsideClick: () => {\n UIViewportDialogService.hide();\n resolve(RESPONSE.CANCEL);\n },\n });\n });\n}\n\nexport default promptHydrateSEG;\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport OHIF, { utils } from '@ohif/core';\nimport {\n Notification,\n ViewportActionBar,\n useViewportGrid,\n useViewportDialog,\n LoadingIndicatorProgress,\n} from '@ohif/ui';\n\nimport { useTranslation } from 'react-i18next';\n\nimport createSEGToolGroupAndAddTools from '../utils/initSEGToolGroup';\nimport _hydrateSEGDisplaySet from '../utils/_hydrateSEG';\nimport promptHydrateSEG from '../utils/promptHydrateSEG';\nimport _getStatusComponent from './_getStatusComponent';\n\nconst { formatDate } = utils;\nconst SEG_TOOLGROUP_BASE_NAME = 'SEGToolGroup';\n\nfunction OHIFCornerstoneSEGViewport(props) {\n const {\n children,\n displaySets,\n viewportOptions,\n viewportIndex,\n viewportLabel,\n servicesManager,\n extensionManager,\n } = props;\n\n const { t } = useTranslation('SEGViewport');\n\n const {\n DisplaySetService,\n ToolGroupService,\n SegmentationService,\n } = servicesManager.services;\n\n const toolGroupId = `${SEG_TOOLGROUP_BASE_NAME}-${viewportIndex}`;\n\n // SEG viewport will always have a single display set\n if (displaySets.length > 1) {\n throw new Error('SEG viewport should only have a single display set');\n }\n\n const segDisplaySet = displaySets[0];\n\n const [viewportGrid, viewportGridService] = useViewportGrid();\n const [viewportDialogState, viewportDialogApi] = useViewportDialog();\n\n // States\n const [isToolGroupCreated, setToolGroupCreated] = useState(false);\n const [selectedSegment, setSelectedSegment] = useState(1);\n\n // Hydration means that the SEG is opened and segments are loaded into the\n // segmentation panel, and SEG is also rendered on any viewport that is in the\n // same frameOfReferenceUID as the referencedSeriesUID of the SEG. However,\n // loading basically means SEG loading over network and bit unpacking of the\n // SEG data.\n const [isHydrated, setIsHydrated] = useState(segDisplaySet.isHydrated);\n const [segIsLoading, setSegIsLoading] = useState(!segDisplaySet.isLoaded);\n const [element, setElement] = useState(null);\n const [processingProgress, setProcessingProgress] = useState({\n segmentIndex: 1,\n totalSegments: null,\n });\n\n // refs\n const referencedDisplaySetRef = useRef(null);\n\n const { viewports, activeViewportIndex } = viewportGrid;\n\n const referencedDisplaySet = segDisplaySet.getReferenceDisplaySet();\n const referencedDisplaySetMetadata = _getReferencedDisplaySetMetadata(\n referencedDisplaySet\n );\n\n referencedDisplaySetRef.current = {\n displaySet: referencedDisplaySet,\n metadata: referencedDisplaySetMetadata,\n };\n /**\n * OnElementEnabled callback which is called after the cornerstoneExtension\n * has enabled the element. Note: we delegate all the image rendering to\n * cornerstoneExtension, so we don't need to do anything here regarding\n * the image rendering, element enabling etc.\n */\n const onElementEnabled = evt => {\n setElement(evt.detail.element);\n };\n\n const onElementDisabled = () => {\n setElement(null);\n };\n\n const getCornerstoneViewport = useCallback(() => {\n const { component: Component } = extensionManager.getModuleEntry(\n '@ohif/extension-cornerstone.viewportModule.cornerstone'\n );\n\n const {\n displaySet: referencedDisplaySet,\n } = referencedDisplaySetRef.current;\n\n // Todo: jump to the center of the first segment\n\n return (\n \n );\n }, [viewportIndex, segDisplaySet, toolGroupId]);\n\n const onSegmentChange = useCallback(\n direction => {\n direction = direction === 'left' ? -1 : 1;\n const segmentationId = segDisplaySet.displaySetInstanceUID;\n const segmentation = SegmentationService.getSegmentation(segmentationId);\n\n const { segments } = segmentation;\n\n const numberOfSegments = Object.keys(segments).length;\n\n let newSelectedSegmentIndex = selectedSegment + direction;\n\n if (newSelectedSegmentIndex > numberOfSegments - 1) {\n newSelectedSegmentIndex = 1;\n } else if (newSelectedSegmentIndex === 0) {\n newSelectedSegmentIndex = numberOfSegments - 1;\n }\n\n SegmentationService.jumpToSegmentCenter(\n segmentationId,\n newSelectedSegmentIndex,\n toolGroupId\n );\n setSelectedSegment(newSelectedSegmentIndex);\n },\n [selectedSegment]\n );\n\n useEffect(() => {\n if (segIsLoading) {\n return;\n }\n\n promptHydrateSEG({\n servicesManager,\n viewportIndex,\n segDisplaySet,\n }).then(isHydrated => {\n if (isHydrated) {\n setIsHydrated(true);\n }\n });\n }, [servicesManager, viewportIndex, segDisplaySet, segIsLoading]);\n\n useEffect(() => {\n const { unsubscribe } = SegmentationService.subscribe(\n SegmentationService.EVENTS.SEGMENTATION_PIXEL_DATA_CREATED,\n evt => {\n if (\n evt.segDisplaySet.displaySetInstanceUID ===\n segDisplaySet.displaySetInstanceUID\n ) {\n setSegIsLoading(false);\n }\n }\n );\n\n return () => {\n unsubscribe();\n };\n }, [segDisplaySet]);\n\n useEffect(() => {\n const { unsubscribe } = SegmentationService.subscribe(\n SegmentationService.EVENTS.SEGMENT_PIXEL_DATA_CREATED,\n ({ segmentIndex, numSegments }) => {\n setProcessingProgress({\n segmentIndex,\n totalSegments: numSegments,\n });\n }\n );\n\n return () => {\n unsubscribe();\n };\n }, [segDisplaySet]);\n\n /**\n Cleanup the SEG viewport when the viewport is destroyed\n */\n useEffect(() => {\n const onDisplaySetsRemovedSubscription = DisplaySetService.subscribe(\n DisplaySetService.EVENTS.DISPLAY_SETS_REMOVED,\n ({ displaySetInstanceUIDs }) => {\n const activeViewport = viewports[activeViewportIndex];\n if (\n displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID)\n ) {\n viewportGridService.setDisplaySetsForViewport({\n viewportIndex: activeViewportIndex,\n displaySetInstanceUIDs: [],\n });\n }\n }\n );\n\n return () => {\n onDisplaySetsRemovedSubscription.unsubscribe();\n };\n }, []);\n\n useEffect(() => {\n let toolGroup = ToolGroupService.getToolGroup(toolGroupId);\n\n if (toolGroup) {\n return;\n }\n\n toolGroup = createSEGToolGroupAndAddTools(\n ToolGroupService,\n toolGroupId,\n extensionManager\n );\n\n setToolGroupCreated(true);\n\n return () => {\n // remove the segmentation representations if seg displayset changed\n SegmentationService.removeSegmentationRepresentationFromToolGroup(\n toolGroupId\n );\n\n ToolGroupService.destroyToolGroup(toolGroupId);\n };\n }, []);\n\n useEffect(() => {\n setIsHydrated(segDisplaySet.isHydrated);\n\n return () => {\n // remove the segmentation representations if seg displayset changed\n SegmentationService.removeSegmentationRepresentationFromToolGroup(\n toolGroupId\n );\n referencedDisplaySetRef.current = null;\n };\n }, [segDisplaySet]);\n\n // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n let childrenWithProps = null;\n\n if (\n !referencedDisplaySetRef.current ||\n referencedDisplaySet.displaySetInstanceUID !==\n referencedDisplaySetRef.current.displaySet.displaySetInstanceUID\n ) {\n return null;\n }\n\n if (children && children.length) {\n childrenWithProps = children.map((child, index) => {\n return (\n child &&\n React.cloneElement(child, {\n viewportIndex,\n key: index,\n })\n );\n });\n }\n\n const {\n PatientID,\n PatientName,\n PatientSex,\n PatientAge,\n SliceThickness,\n ManufacturerModelName,\n StudyDate,\n SeriesDescription,\n SpacingBetweenSlices,\n SeriesNumber,\n } = referencedDisplaySetRef.current.metadata;\n\n const onPillClick = () => {\n promptHydrateSEG({\n servicesManager,\n viewportIndex,\n segDisplaySet,\n }).then(isHydrated => {\n if (isHydrated) {\n setIsHydrated(true);\n }\n });\n };\n\n return (\n <>\n {\n evt.stopPropagation();\n evt.preventDefault();\n }}\n onArrowsClick={onSegmentChange}\n getStatusComponent={() => {\n return _getStatusComponent({\n isHydrated,\n onPillClick,\n });\n }}\n studyData={{\n label: viewportLabel,\n useAltStyling: true,\n studyDate: formatDate(StudyDate),\n currentSeries: SeriesNumber,\n seriesDescription: `SEG Viewport ${SeriesDescription}`,\n patientInformation: {\n patientName: PatientName\n ? OHIF.utils.formatPN(PatientName.Alphabetic)\n : '',\n patientSex: PatientSex || '',\n patientAge: PatientAge || '',\n MRN: PatientID || '',\n thickness: SliceThickness ? `${SliceThickness.toFixed(2)}mm` : '',\n spacing:\n SpacingBetweenSlices !== undefined\n ? `${SpacingBetweenSlices.toFixed(2)}mm`\n : '',\n scanner: ManufacturerModelName || '',\n },\n }}\n />\n\n \n {segIsLoading && (\n
Loading SEG ...\n ) : (\n \n Loading Segment
\n {`${processingProgress.segmentIndex}`}
\n /
\n {`${processingProgress.totalSegments}`}
\n \n )\n }\n />\n )}\n {getCornerstoneViewport()}\n \n {viewportDialogState.viewportIndex === viewportIndex && (\n \n )}\n
\n {childrenWithProps}\n \n >\n );\n}\n\nOHIFCornerstoneSEGViewport.propTypes = {\n displaySets: PropTypes.arrayOf(PropTypes.object),\n viewportIndex: PropTypes.number.isRequired,\n dataSource: PropTypes.object,\n children: PropTypes.node,\n customProps: PropTypes.object,\n};\n\nOHIFCornerstoneSEGViewport.defaultProps = {\n customProps: {},\n};\n\nfunction _getReferencedDisplaySetMetadata(referencedDisplaySet) {\n const image0 = referencedDisplaySet.images[0];\n const referencedDisplaySetMetadata = {\n PatientID: image0.PatientID,\n PatientName: image0.PatientName,\n PatientSex: image0.PatientSex,\n PatientAge: image0.PatientAge,\n SliceThickness: image0.SliceThickness,\n StudyDate: image0.StudyDate,\n SeriesDescription: image0.SeriesDescription,\n SeriesInstanceUID: image0.SeriesInstanceUID,\n SeriesNumber: image0.SeriesNumber,\n ManufacturerModelName: image0.ManufacturerModelName,\n SpacingBetweenSlices: image0.SpacingBetweenSlices,\n };\n\n return referencedDisplaySetMetadata;\n}\n\nexport default OHIFCornerstoneSEGViewport;\n","import React from 'react';\nimport classNames from 'classnames';\nimport { Icon, Tooltip } from '@ohif/ui';\n\nimport _hydrateSEGDisplaySet from '../utils/_hydrateSEG';\n\nexport default function _getStatusComponent({ isHydrated, onPillClick }) {\n let ToolTipMessage = null;\n let StatusIcon = null;\n\n switch (isHydrated) {\n case true:\n StatusIcon = () => (\n \n \n
\n );\n\n ToolTipMessage = () => (\n This Segmentation is loaded in the segmentation panel
\n );\n break;\n case false:\n StatusIcon = () => (\n \n \n
\n );\n\n ToolTipMessage = () => Click to load segmentation.
;\n }\n\n const StatusPill = () => (\n {\n if (!isHydrated) {\n if (onPillClick) {\n onPillClick();\n }\n }\n }}\n >\n
\n SEG\n
\n
\n
\n );\n\n return (\n <>\n {ToolTipMessage && (\n } position=\"bottom-left\">\n \n \n )}\n {!ToolTipMessage && }\n >\n );\n}\n"],"names":["ToolGroupService","toolGroupId","extensionManager","getModuleEntry","exports","toolNames","Enums","tools","active","toolName","WindowLevel","bindings","mouseButton","MouseBindings","Primary","Pan","Auxiliary","Zoom","Secondary","StackScrollMouseWheel","enabled","SegmentationDisplay","createToolGroupAndAddTools","segDisplaySet","viewportIndex","servicesManager","services","SegmentationService","HangingProtocolService","ViewportGridService","displaySetInstanceUID","referencedDisplaySetInstanceUID","segmentationId","createSegmentationForSEGDisplaySet","hydrateSegmentation","getState","viewports","updatedViewports","getViewportsRequireUpdate","setDisplaySetsForViewports","forEach","viewport","index","shouldRenderSegmentation","displaySetInstanceUIDs","setDisplaySetsForViewport","viewportOptions","viewportType","initialImageOptions","preset","RESPONSE","_askHydrate","UIViewportDialogService","Promise","resolve","reject","actions","type","text","value","show","message","onSubmit","result","hide","onOutsideClick","hydrateSEGDisplaySet","isHydrated","formatDate","utils","OHIFCornerstoneSEGViewport","props","children","displaySets","viewportLabel","useTranslation","t","DisplaySetService","length","Error","useViewportGrid","viewportGrid","viewportGridService","useViewportDialog","viewportDialogState","useState","setToolGroupCreated","selectedSegment","setSelectedSegment","setIsHydrated","isLoaded","segIsLoading","setSegIsLoading","setElement","segmentIndex","totalSegments","processingProgress","setProcessingProgress","referencedDisplaySetRef","useRef","activeViewportIndex","referencedDisplaySet","getReferenceDisplaySet","referencedDisplaySetMetadata","image0","images","PatientID","PatientName","PatientSex","PatientAge","SliceThickness","StudyDate","SeriesDescription","SeriesInstanceUID","SeriesNumber","ManufacturerModelName","SpacingBetweenSlices","_getReferencedDisplaySetMetadata","current","displaySet","metadata","onElementEnabled","evt","detail","element","onElementDisabled","getCornerstoneViewport","useCallback","Component","component","orientation","onSegmentChange","direction","segments","getSegmentation","numberOfSegments","Object","keys","newSelectedSegmentIndex","jumpToSegmentCenter","useEffect","promptHydrateSEG","then","unsubscribe","subscribe","EVENTS","SEGMENTATION_PIXEL_DATA_CREATED","SEGMENT_PIXEL_DATA_CREATED","numSegments","onDisplaySetsRemovedSubscription","DISPLAY_SETS_REMOVED","activeViewport","includes","toolGroup","getToolGroup","createSEGToolGroupAndAddTools","removeSegmentationRepresentationFromToolGroup","destroyToolGroup","childrenWithProps","map","child","React","key","onPillClick","onDoubleClick","stopPropagation","preventDefault","onArrowsClick","getStatusComponent","ToolTipMessage","StatusIcon","className","style","width","height","backgroundColor","border","name","color","StatusPill","classNames","onClick","content","position","_getStatusComponent","studyData","label","useAltStyling","studyDate","currentSeries","seriesDescription","patientInformation","patientName","OHIF","Alphabetic","patientSex","patientAge","MRN","thickness","toFixed","spacing","undefined","scanner","progress","textBlock","id","propTypes","PropTypes","dataSource","customProps","defaultProps"],"sourceRoot":""}
\ No newline at end of file
diff --git a/platform/viewer-static/dist/610.min.worker.js b/platform/viewer-static/dist/610.min.worker.js
new file mode 100644
index 00000000000..43145d49f68
--- /dev/null
+++ b/platform/viewer-static/dist/610.min.worker.js
@@ -0,0 +1 @@
+(self.webpackChunk=self.webpackChunk||[]).push([[610],{6610:function(s,e){!function(t){"object"==typeof e&&void 0!==s?s.exports=t():"function"==typeof define&&define.amd?define([],t):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).jpeg=t()}((function(){return function s(e,t,o){function r(a,l){if(!t[a]){if(!e[a]){var n="function"==typeof require&&require;if(!l&&n)return n(a,!0);if(i)return i(a,!0);var h=new Error("Cannot find module '"+a+"'");throw h.code="MODULE_NOT_FOUND",h}var c=t[a]={exports:{}};e[a][0].call(c.exports,(function(s){return r(e[a][1][s]||s)}),c,c.exports,s,e,t,o)}return t[a].exports}for(var i="function"==typeof require&&require,a=0;a>4!=4092||65476===i;){switch(i){case 65476:this.huffTable.read(this.stream,this.HuffTab);break;case 65484:throw new Error("Program doesn't support arithmetic coding. (format throw new IOException)");case 65499:this.quantTable.read(this.stream,r.lossless.Decoder.TABLE);break;case 65501:this.restartInterval=this.readNumber();break;case 65504:case 65505:case 65506:case 65507:case 65508:case 65509:case 65510:case 65511:case 65512:case 65513:case 65514:case 65515:case 65516:case 65517:case 65518:case 65519:this.readApp();break;case 65534:this.readComment();break;default:if(i>>8!=255)throw new Error("ERROR: format throw new IOException! (decode)")}i=this.stream.get16()}if(i<65472||i>65479)throw new Error("ERROR: could not handle arithmetic code!");this.frame.read(this.stream),i=this.stream.get16();do{for(;65498!==i;){switch(i){case 65476:this.huffTable.read(this.stream,this.HuffTab);break;case 65484:throw new Error("Program doesn't support arithmetic coding. (format throw new IOException)");case 65499:this.quantTable.read(this.stream,r.lossless.Decoder.TABLE);break;case 65501:this.restartInterval=this.readNumber();break;case 65504:case 65505:case 65506:case 65507:case 65508:case 65509:case 65510:case 65511:case 65512:case 65513:case 65514:case 65515:case 65516:case 65517:case 65518:case 65519:this.readApp();break;case 65534:this.readComment();break;default:if(i>>8!=255)throw new Error("ERROR: format throw new IOException! (Parser.decode)")}i=this.stream.get16()}switch(this.precision=this.frame.precision,this.components=this.frame.components,this.numBytes||(this.numBytes=parseInt(Math.ceil(this.precision/8))),1==this.numBytes?this.mask=255:this.mask=65535,this.scan.read(this.stream),this.numComp=this.scan.numComp,this.selection=this.scan.selection,1===this.numBytes?3===this.numComp?(this.getter=this.getValueRGB,this.setter=this.setValueRGB,this.output=this.outputRGB):(this.getter=this.getValue8,this.setter=this.setValue8,this.output=this.outputSingle):(this.getter=this.getValue16,this.setter=this.setValue16,this.output=this.outputSingle),this.selection){case 2:this.selector=this.select2;break;case 3:this.selector=this.select3;break;case 4:this.selector=this.select4;break;case 5:this.selector=this.select5;break;case 6:this.selector=this.select6;break;case 7:this.selector=this.select7;break;default:this.selector=this.select1}for(this.scanComps=this.scan.components,this.quantTables=this.quantTable.quantTables,a=0;a=r.lossless.Decoder.RESTART_MARKER_BEGIN&&i<=r.lossless.Decoder.RESTART_MARKER_END))break}65500===i&&1===h&&(this.readNumber(),i=this.stream.get16())}while(65497!==i&&this.xLoc>1)},r.lossless.Decoder.prototype.select6=function(s){return this.getPreviousY(s)+(this.getPreviousX(s)-this.getPreviousXY(s)>>1)},r.lossless.Decoder.prototype.select7=function(s){return(this.getPreviousX(s)+this.getPreviousY(s))/2},r.lossless.Decoder.prototype.decodeRGB=function(s,e,t){var o,i,a,l,n,h,c,u;for(s[0]=this.selector(0),s[1]=this.selector(1),s[2]=this.selector(2),n=0;n=65280)return o;for(s[n]=this.IDCT_Source[0]=s[n]+this.getn(t,o,e,t),this.IDCT_Source[0]*=l[0],u=1;u<64;u+=1){if((o=this.getHuffmanValue(i,e,t))>=65280)return o;if(u+=o>>4,0==(15&o)){if(o>>4==0)break}else this.IDCT_Source[r.lossless.Decoder.IDCT_P[u]]=this.getn(t,15&o,e,t)*l[u]}}return 0},r.lossless.Decoder.prototype.decodeSingle=function(s,e,t){var o,i,a,l;for(this.restarting?(this.restarting=!1,s[0]=1<=65280)return o;if((l=(a=this.getn(s,o,e,t))>>8)>=r.lossless.Decoder.RESTART_MARKER_BEGIN&&l<=r.lossless.Decoder.RESTART_MARKER_END)return l;s[0]+=a}return 0},r.lossless.Decoder.prototype.getHuffmanValue=function(s,e,t){var o,i;if(t[0]<8?(e[0]<<=8,255===(i=this.stream.get8())&&(this.marker=this.stream.get8(),0!==this.marker&&(this.markerIndex=9)),e[0]|=i):t[0]-=8,0!=((o=s[e[0]>>t[0]])&r.lossless.Decoder.MSB)){if(0!==this.markerIndex)return this.markerIndex=0,65280|this.marker;e[0]&=65535>>16-t[0],e[0]<<=8,255===(i=this.stream.get8())&&(this.marker=this.stream.get8(),0!==this.marker&&(this.markerIndex=9)),e[0]|=i,o=s[256*(255&o)+(e[0]>>t[0])],t[0]+=8}if(t[0]+=8-(o>>8),t[0]<0)throw new Error("index="+t[0]+" temp="+e[0]+" code="+o+" in HuffmanValue()");return t[0]>16-t[0],255&o)},r.lossless.Decoder.prototype.getn=function(s,e,t,o){var r,i;if(0===e)return 0;if(16===e)return s[0]>=0?-32768:32768;if(o[0]-=e,o[0]>=0){if(o[0]>o[0],t[0]&=65535>>16-o[0]}else{if(t[0]<<=8,255===(i=this.stream.get8())&&(this.marker=this.stream.get8(),0!==this.marker&&(this.markerIndex=9)),t[0]|=i,o[0]+=8,o[0]<0){if(0!==this.markerIndex)return this.markerIndex=0,(65280|this.marker)<<8;t[0]<<=8,255===(i=this.stream.get8())&&(this.marker=this.stream.get8(),0!==this.marker&&(this.markerIndex=9)),t[0]|=i,o[0]+=8}if(o[0]<0)throw new Error("index="+o[0]+" in getn()");if(o[0]>o[0],t[0]&=65535>>16-o[0]}return r<1<0?this.getter(this.yLoc*this.xDim+this.xLoc-1,s):this.yLoc>0?this.getPreviousY(s):1<0&&this.yLoc>0?this.getter((this.yLoc-1)*this.xDim+this.xLoc-1,s):this.getPreviousY(s)},r.lossless.Decoder.prototype.getPreviousY=function(s){return this.yLoc>0?this.getter((this.yLoc-1)*this.xDim+this.xLoc,s):this.getPreviousX(s)},r.lossless.Decoder.prototype.isLastPixel=function(){return this.xLoc===this.xDim-1&&this.yLoc===this.yDim-1},r.lossless.Decoder.prototype.outputSingle=function(s){this.xLoc=this.xDim&&(this.yLoc+=1,this.xLoc=0))},r.lossless.Decoder.prototype.outputRGB=function(s){var e=this.yLoc*this.xDim+this.xLoc;this.xLoc=this.xDim&&(this.yLoc+=1,this.xLoc=0))},r.lossless.Decoder.prototype.setValue8=function(s,e){this.outputData[s]=e},r.lossless.Decoder.prototype.getValue8=function(s){return this.outputData[s]},o=new ArrayBuffer(2),new DataView(o).setInt16(0,256,!0),256===new Int16Array(o)[0]?(r.lossless.Decoder.prototype.setValue16=r.lossless.Decoder.prototype.setValue8,r.lossless.Decoder.prototype.getValue16=r.lossless.Decoder.prototype.getValue8):(r.lossless.Decoder.prototype.setValue16=function(s,e){this.outputData[s]=(255&e)<<8|e>>8&255},r.lossless.Decoder.prototype.getValue16=function(s){var e=this.outputData[s];return(255&e)<<8|e>>8&255}),r.lossless.Decoder.prototype.setValueRGB=function(s,e,t){this.outputData[3*s+t]=e},r.lossless.Decoder.prototype.getValueRGB=function(s,e){return this.outputData[3*s+e]},r.lossless.Decoder.prototype.readApp=function(){var s=0,e=this.stream.get16();for(s+=2;se)throw new Error("ERROR: frame format error");if(r=s.get8(),(a+=1)>=e)throw new Error("ERROR: frame format error [c>=Lf]");i=s.get8(),a+=1,this.components[r]||(this.components[r]=new o.lossless.ComponentSpec),this.components[r].hSamp=i>>4,this.components[r].vSamp=15&i,this.components[r].quantTableSel=s.get8(),a+=1}if(a!==e)throw new Error("ERROR: frame format error [Lf!=count]");return 1},void 0!==e&&e.exports&&(e.exports=o.lossless.FrameHeader)},{"./component-spec.js":1,"./data-stream.js":2}],5:[function(s,e,t){"use strict";var o=o||{};o.lossless=o.lossless||{},o.lossless.DataStream=o.lossless.DataStream||(void 0!==s?s("./data-stream.js"):null),o.lossless.Utils=o.lossless.Utils||(void 0!==s?s("./utils.js"):null),o.lossless.HuffmanTable=o.lossless.HuffmanTable||function(){this.l=o.lossless.Utils.createArray(4,2,16),this.th=[],this.v=o.lossless.Utils.createArray(4,2,16,200),this.tc=o.lossless.Utils.createArray(4,2),this.tc[0][0]=0,this.tc[1][0]=0,this.tc[2][0]=0,this.tc[3][0]=0,this.tc[0][1]=0,this.tc[1][1]=0,this.tc[2][1]=0,this.tc[3][1]=0,this.th[0]=0,this.th[1]=0,this.th[2]=0,this.th[3]=0},o.lossless.HuffmanTable.MSB=2147483648,o.lossless.HuffmanTable.prototype.read=function(s,e){var t,o,r,i,a,l,n=0;for(t=s.get16(),n+=2;n3)throw new Error("ERROR: Huffman table ID > 3");if((i=o>>4)>2)throw new Error("ERROR: Huffman table [Table class > 2 ]");for(this.th[r]=1,this.tc[r][i]=1,a=0;a<16;a+=1)this.l[r][i][a]=s.get8(),n+=1;for(a=0;a<16;a+=1)for(l=0;lt)throw new Error("ERROR: Huffman table format error [count>Lh]");this.v[r][i][a][l]=s.get8(),n+=1}}if(n!==t)throw new Error("ERROR: Huffman table format error [count!=Lf]");for(a=0;a<4;a+=1)for(l=0;l<2;l+=1)0!==this.tc[a][l]&&this.buildHuffTable(e[a][l],this.l[a][l],this.v[a][l]);return 1},o.lossless.HuffmanTable.prototype.buildHuffTable=function(s,e,t){var r,i,a,l,n;for(i=0,a=0;a<8;a+=1)for(l=0;l>a+1;n+=1)s[i]=t[a][l]|a+1<<8,i+=1;for(a=1;i<256;a+=1,i+=1)s[i]=a|o.lossless.HuffmanTable.MSB;for(r=1,i=0,a=8;a<16;a+=1)for(l=0;l>a-7;n+=1)s[256*r+i]=t[a][l]|a+1<<8,i+=1;if(i>=256){if(i>256)throw new Error("ERROR: Huffman table error(1)!");i=0,r+=1}}},void 0!==e&&e.exports&&(e.exports=o.lossless.HuffmanTable)},{"./data-stream.js":2,"./utils.js":10}],6:[function(s,e,t){"use strict";var o=o||{};o.lossless=o.lossless||{},o.lossless.ComponentSpec=o.lossless.ComponentSpec||(void 0!==s?s("./component-spec.js"):null),o.lossless.DataStream=o.lossless.DataStream||(void 0!==s?s("./data-stream.js"):null),o.lossless.Decoder=o.lossless.Decoder||(void 0!==s?s("./decoder.js"):null),o.lossless.FrameHeader=o.lossless.FrameHeader||(void 0!==s?s("./frame-header.js"):null),o.lossless.HuffmanTable=o.lossless.HuffmanTable||(void 0!==s?s("./huffman-table.js"):null),o.lossless.QuantizationTable=o.lossless.QuantizationTable||(void 0!==s?s("./quantization-table.js"):null),o.lossless.ScanComponent=o.lossless.ScanComponent||(void 0!==s?s("./scan-component.js"):null),o.lossless.ScanHeader=o.lossless.ScanHeader||(void 0!==s?s("./scan-header.js"):null),o.lossless.Utils=o.lossless.Utils||(void 0!==s?s("./utils.js"):null),void 0!==e&&e.exports&&(e.exports=o)},{"./component-spec.js":1,"./data-stream.js":2,"./decoder.js":3,"./frame-header.js":4,"./huffman-table.js":5,"./quantization-table.js":7,"./scan-component.js":8,"./scan-header.js":9,"./utils.js":10}],7:[function(s,e,t){"use strict";var o=o||{};o.lossless=o.lossless||{},o.lossless.DataStream=o.lossless.DataStream||(void 0!==s?s("./data-stream.js"):null),o.lossless.Utils=o.lossless.Utils||(void 0!==s?s("./utils.js"):null),o.lossless.QuantizationTable=o.lossless.QuantizationTable||function(){this.precision=[],this.tq=[],this.quantTables=o.lossless.Utils.createArray(4,64),this.tq[0]=0,this.tq[1]=0,this.tq[2]=0,this.tq[3]=0},o.lossless.QuantizationTable.enhanceQuantizationTable=function(s,e){var t;for(t=0;t<8;t+=1)s[e[0+t]]*=90,s[e[32+t]]*=90,s[e[16+t]]*=118,s[e[48+t]]*=49,s[e[40+t]]*=71,s[e[8+t]]*=126,s[e[56+t]]*=25,s[e[24+t]]*=106;for(t=0;t<8;t+=1)s[e[0+8*t]]*=90,s[e[4+8*t]]*=90,s[e[2+8*t]]*=118,s[e[6+8*t]]*=49,s[e[5+8*t]]*=71,s[e[1+8*t]]*=126,s[e[7+8*t]]*=25,s[e[3+8*t]]*=106;for(t=0;t<64;t+=1)s[t]>>=6},o.lossless.QuantizationTable.prototype.read=function(s,e){var t,r,i,a,l=0;for(t=s.get16(),l+=2;l3)throw new Error("ERROR: Quantization table ID > 3");if(this.precision[i]=r>>4,0===this.precision[i])this.precision[i]=8;else{if(1!==this.precision[i])throw new Error("ERROR: Quantization table precision error");this.precision[i]=16}if(this.tq[i]=1,8===this.precision[i]){for(a=0;a<64;a+=1){if(l>t)throw new Error("ERROR: Quantization table format error");this.quantTables[i][a]=s.get8(),l+=1}o.lossless.QuantizationTable.enhanceQuantizationTable(this.quantTables[i],e)}else{for(a=0;a<64;a+=1){if(l>t)throw new Error("ERROR: Quantization table format error");this.quantTables[i][a]=s.get16(),l+=2}o.lossless.QuantizationTable.enhanceQuantizationTable(this.quantTables[i],e)}}if(l!==t)throw new Error("ERROR: Quantization table error [count!=Lq]");return 1},void 0!==e&&e.exports&&(e.exports=o.lossless.QuantizationTable)},{"./data-stream.js":2,"./utils.js":10}],8:[function(s,e,t){"use strict";var o=o||{};o.lossless=o.lossless||{},o.lossless.ScanComponent=o.lossless.ScanComponent||function(){this.acTabSel=0,this.dcTabSel=0,this.scanCompSel=0},void 0!==e&&e.exports&&(e.exports=o.lossless.ScanComponent)},{}],9:[function(s,e,t){"use strict";var o=o||{};o.lossless=o.lossless||{},o.lossless.DataStream=o.lossless.DataStream||(void 0!==s?s("./data-stream.js"):null),o.lossless.ScanComponent=o.lossless.ScanComponent||(void 0!==s?s("./scan-component.js"):null),o.lossless.ScanHeader=o.lossless.ScanHeader||function(){this.ah=0,this.al=0,this.numComp=0,this.selection=0,this.spectralEnd=0,this.components=[]},o.lossless.ScanHeader.prototype.read=function(s){var e,t,r,i=0;for(e=s.get16(),i+=2,this.numComp=s.get8(),i+=1,t=0;te)throw new Error("ERROR: scan header format error");this.components[t].scanCompSel=s.get8(),i+=1,r=s.get8(),i+=1,this.components[t].dcTabSel=r>>4,this.components[t].acTabSel=15&r}if(this.selection=s.get8(),i+=1,this.spectralEnd=s.get8(),i+=1,r=s.get8(),this.ah=r>>4,this.al=15&r,(i+=1)!==e)throw new Error("ERROR: scan header format error [count!=Ns]");return 1},void 0!==e&&e.exports&&(e.exports=o.lossless.ScanHeader)},{"./data-stream.js":2,"./scan-component.js":8}],10:[function(s,e,t){"use strict";var o=o||{};o.lossless=o.lossless||{},o.lossless.Utils=o.lossless.Utils||{},o.lossless.Utils.createArray=function(s){var e=new Array(s||0),t=s;if(arguments.length>1)for(var r=Array.prototype.slice.call(arguments,1);t--;)e[s-1-t]=o.lossless.Utils.createArray.apply(this,r);return e},o.lossless.Utils.makeCRCTable=function(){for(var s,e=[],t=0;t<256;t++){s=t;for(var o=0;o<8;o++)s=1&s?3988292384^s>>>1:s>>>1;e[t]=s}return e},o.lossless.Utils.crc32=function(s){for(var e=new Uint8Array(s.buffer),t=o.lossless.Utils.crcTable||(o.lossless.Utils.crcTable=o.lossless.Utils.makeCRCTable()),r=-1,i=0;i>>8^t[255&(r^e[i])];return(-1^r)>>>0},void 0!==e&&e.exports&&(e.exports=o.lossless.Utils)},{}]},{},[6])(6)}))}}]);
\ No newline at end of file
diff --git a/platform/viewer-static/dist/610.min.worker.js.map b/platform/viewer-static/dist/610.min.worker.js.map
new file mode 100644
index 00000000000..c6aa05932d9
--- /dev/null
+++ b/platform/viewer-static/dist/610.min.worker.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"610.min.worker.js","mappings":"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","sources":["webpack:///../codecs/jpegLossless.js"],"sourcesContent":["(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.jpeg = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o> 4) !== 0x0FFC) || (current === 0xFFC4))) { // SOF 0~15\n switch (current) {\n case 0xFFC4: // DHT\n this.huffTable.read(this.stream, this.HuffTab);\n break;\n case 0xFFCC: // DAC\n throw new Error(\"Program doesn't support arithmetic coding. (format throw new IOException)\");\n case 0xFFDB:\n this.quantTable.read(this.stream, jpeg.lossless.Decoder.TABLE);\n break;\n case 0xFFDD:\n this.restartInterval = this.readNumber();\n break;\n case 0xFFE0:\n case 0xFFE1:\n case 0xFFE2:\n case 0xFFE3:\n case 0xFFE4:\n case 0xFFE5:\n case 0xFFE6:\n case 0xFFE7:\n case 0xFFE8:\n case 0xFFE9:\n case 0xFFEA:\n case 0xFFEB:\n case 0xFFEC:\n case 0xFFED:\n case 0xFFEE:\n case 0xFFEF:\n this.readApp();\n break;\n case 0xFFFE:\n this.readComment();\n break;\n default:\n if ((current >> 8) !== 0xFF) {\n throw new Error(\"ERROR: format throw new IOException! (decode)\");\n }\n }\n\n current = this.stream.get16();\n }\n\n if ((current < 0xFFC0) || (current > 0xFFC7)) {\n throw new Error(\"ERROR: could not handle arithmetic code!\");\n }\n\n this.frame.read(this.stream);\n current = this.stream.get16();\n\n do {\n while (current !== 0x0FFDA) { // SOS\n switch (current) {\n case 0xFFC4: // DHT\n this.huffTable.read(this.stream, this.HuffTab);\n break;\n case 0xFFCC: // DAC\n throw new Error(\"Program doesn't support arithmetic coding. (format throw new IOException)\");\n case 0xFFDB:\n this.quantTable.read(this.stream, jpeg.lossless.Decoder.TABLE);\n break;\n case 0xFFDD:\n this.restartInterval = this.readNumber();\n break;\n case 0xFFE0:\n case 0xFFE1:\n case 0xFFE2:\n case 0xFFE3:\n case 0xFFE4:\n case 0xFFE5:\n case 0xFFE6:\n case 0xFFE7:\n case 0xFFE8:\n case 0xFFE9:\n case 0xFFEA:\n case 0xFFEB:\n case 0xFFEC:\n case 0xFFED:\n case 0xFFEE:\n case 0xFFEF:\n this.readApp();\n break;\n case 0xFFFE:\n this.readComment();\n break;\n default:\n if ((current >> 8) !== 0xFF) {\n throw new Error(\"ERROR: format throw new IOException! (Parser.decode)\");\n }\n }\n\n current = this.stream.get16();\n }\n\n this.precision = this.frame.precision;\n this.components = this.frame.components;\n\n if (!this.numBytes) {\n this.numBytes = parseInt(Math.ceil(this.precision / 8));\n }\n\n if (this.numBytes == 1) {\n this.mask = 0xFF;\n } else {\n this.mask = 0xFFFF;\n }\n\n this.scan.read(this.stream);\n this.numComp = this.scan.numComp;\n this.selection = this.scan.selection;\n\n if (this.numBytes === 1) {\n if (this.numComp === 3) {\n this.getter = this.getValueRGB;\n this.setter = this.setValueRGB;\n this.output = this.outputRGB;\n } else {\n this.getter = this.getValue8;\n this.setter = this.setValue8;\n this.output = this.outputSingle;\n }\n } else {\n this.getter = this.getValue16;\n this.setter = this.setValue16;\n this.output = this.outputSingle;\n }\n\n switch (this.selection) {\n case 2:\n this.selector = this.select2;\n break;\n case 3:\n this.selector = this.select3;\n break;\n case 4:\n this.selector = this.select4;\n break;\n case 5:\n this.selector = this.select5;\n break;\n case 6:\n this.selector = this.select6;\n break;\n case 7:\n this.selector = this.select7;\n break;\n default:\n this.selector = this.select1;\n break;\n }\n\n this.scanComps = this.scan.components;\n this.quantTables = this.quantTable.quantTables;\n\n for (i = 0; i < this.numComp; i+=1) {\n compN = this.scanComps[i].scanCompSel;\n this.qTab[i] = this.quantTables[this.components[compN].quantTableSel];\n this.nBlock[i] = this.components[compN].vSamp * this.components[compN].hSamp;\n this.dcTab[i] = this.HuffTab[this.scanComps[i].dcTabSel][0];\n this.acTab[i] = this.HuffTab[this.scanComps[i].acTabSel][1];\n }\n\n this.xDim = this.frame.dimX;\n this.yDim = this.frame.dimY;\n if (this.numBytes == 1) {\n this.outputData = new Uint8Array(new ArrayBuffer(this.xDim * this.yDim * this.numBytes * this.numComp));\n } else {\n this.outputData = new Uint16Array(new ArrayBuffer(this.xDim * this.yDim * this.numBytes * this.numComp));\n }\n\n scanNum+=1;\n\n while (true) { // Decode one scan\n temp[0] = 0;\n index[0] = 0;\n\n for (i = 0; i < 10; i+=1) {\n pred[i] = (1 << (this.precision - 1));\n }\n\n if (this.restartInterval === 0) {\n current = this.decodeUnit(pred, temp, index);\n\n while ((current === 0) && ((this.xLoc < this.xDim) && (this.yLoc < this.yDim))) {\n this.output(pred);\n current = this.decodeUnit(pred, temp, index);\n }\n\n break; //current=MARKER\n }\n\n for (mcuNum = 0; mcuNum < this.restartInterval; mcuNum+=1) {\n this.restarting = (mcuNum == 0);\n current = this.decodeUnit(pred, temp, index);\n this.output(pred);\n\n if (current !== 0) {\n break;\n }\n }\n\n if (current === 0) {\n if (this.markerIndex !== 0) {\n current = (0xFF00 | this.marker);\n this.markerIndex = 0;\n } else {\n current = this.stream.get16();\n }\n }\n\n if (!((current >= jpeg.lossless.Decoder.RESTART_MARKER_BEGIN) &&\n (current <= jpeg.lossless.Decoder.RESTART_MARKER_END))) {\n break; //current=MARKER\n }\n }\n\n if ((current === 0xFFDC) && (scanNum === 1)) { //DNL\n this.readNumber();\n current = this.stream.get16();\n }\n } while ((current !== 0xFFD9) && ((this.xLoc < this.xDim) && (this.yLoc < this.yDim)) && (scanNum === 0));\n\n return this.outputData;\n };\n\n\n\n jpeg.lossless.Decoder.prototype.decodeUnit = function (prev, temp, index) {\n if (this.numComp == 1) {\n return this.decodeSingle(prev, temp, index);\n } else if (this.numComp == 3) {\n return this.decodeRGB(prev, temp, index);\n } else {\n return -1;\n }\n };\n\n\n\n jpeg.lossless.Decoder.prototype.select1 = function (compOffset) {\n return this.getPreviousX(compOffset);\n };\n\n\n\n jpeg.lossless.Decoder.prototype.select2 = function (compOffset) {\n return this.getPreviousY(compOffset);\n };\n\n\n\n jpeg.lossless.Decoder.prototype.select3 = function (compOffset) {\n return this.getPreviousXY(compOffset);\n };\n\n\n\n jpeg.lossless.Decoder.prototype.select4 = function (compOffset) {\n return (this.getPreviousX(compOffset) + this.getPreviousY(compOffset)) - this.getPreviousXY(compOffset);\n };\n\n\n\n jpeg.lossless.Decoder.prototype.select5 = function (compOffset) {\n return this.getPreviousX(compOffset) + ((this.getPreviousY(compOffset) - this.getPreviousXY(compOffset)) >> 1);\n };\n\n\n\n jpeg.lossless.Decoder.prototype.select6 = function (compOffset) {\n return this.getPreviousY(compOffset) + ((this.getPreviousX(compOffset) - this.getPreviousXY(compOffset)) >> 1);\n };\n\n\n\n jpeg.lossless.Decoder.prototype.select7 = function (compOffset) {\n return ((this.getPreviousX(compOffset) + this.getPreviousY(compOffset)) / 2);\n };\n\n\n\n jpeg.lossless.Decoder.prototype.decodeRGB = function (prev, temp, index) {\n /*jslint bitwise: true */\n\n var value, actab, dctab, qtab, ctrC, i, k, j;\n\n prev[0] = this.selector(0);\n prev[1] = this.selector(1);\n prev[2] = this.selector(2);\n\n for (ctrC = 0; ctrC < this.numComp; ctrC+=1) {\n qtab = this.qTab[ctrC];\n actab = this.acTab[ctrC];\n dctab = this.dcTab[ctrC];\n for (i = 0; i < this.nBlock[ctrC]; i+=1) {\n for (k = 0; k < this.IDCT_Source.length; k+=1) {\n this.IDCT_Source[k] = 0;\n }\n\n value = this.getHuffmanValue(dctab, temp, index);\n\n if (value >= 0xFF00) {\n return value;\n }\n\n prev[ctrC] = this.IDCT_Source[0] = prev[ctrC] + this.getn(index, value, temp, index);\n this.IDCT_Source[0] *= qtab[0];\n\n for (j = 1; j < 64; j+=1) {\n value = this.getHuffmanValue(actab, temp, index);\n\n if (value >= 0xFF00) {\n return value;\n }\n\n j += (value >> 4);\n\n if ((value & 0x0F) === 0) {\n if ((value >> 4) === 0) {\n break;\n }\n } else {\n this.IDCT_Source[jpeg.lossless.Decoder.IDCT_P[j]] = this.getn(index, value & 0x0F, temp, index) * qtab[j];\n }\n }\n }\n }\n\n return 0;\n };\n\n\n\n jpeg.lossless.Decoder.prototype.decodeSingle = function (prev, temp, index) {\n /*jslint bitwise: true */\n\n var value, i, n, nRestart;\n\n if (this.restarting) {\n this.restarting = false;\n prev[0] = (1 << (this.frame.precision - 1));\n } else {\n prev[0] = this.selector();\n }\n\n for (i = 0; i < this.nBlock[0]; i+=1) {\n value = this.getHuffmanValue(this.dcTab[0], temp, index);\n if (value >= 0xFF00) {\n return value;\n }\n\n n = this.getn(prev, value, temp, index);\n nRestart = (n >> 8);\n\n if ((nRestart >= jpeg.lossless.Decoder.RESTART_MARKER_BEGIN) && (nRestart <= jpeg.lossless.Decoder.RESTART_MARKER_END)) {\n return nRestart;\n }\n\n prev[0] += n;\n }\n\n return 0;\n };\n\n\n\n // Huffman table for fast search: (HuffTab) 8-bit Look up table 2-layer search architecture, 1st-layer represent 256 node (8 bits) if codeword-length > 8\n // bits, then the entry of 1st-layer = (# of 2nd-layer table) | MSB and it is stored in the 2nd-layer Size of tables in each layer are 256.\n // HuffTab[*][*][0-256] is always the only 1st-layer table.\n //\n // An entry can be: (1) (# of 2nd-layer table) | MSB , for code length > 8 in 1st-layer (2) (Code length) << 8 | HuffVal\n //\n // HuffmanValue(table HuffTab[x][y] (ex) HuffmanValue(HuffTab[1][0],...)\n // ):\n // return: Huffman Value of table\n // 0xFF?? if it receives a MARKER\n // Parameter: table HuffTab[x][y] (ex) HuffmanValue(HuffTab[1][0],...)\n // temp temp storage for remainded bits\n // index index to bit of temp\n // in FILE pointer\n // Effect:\n // temp store new remainded bits\n // index change to new index\n // in change to new position\n // NOTE:\n // Initial by temp=0; index=0;\n // NOTE: (explain temp and index)\n // temp: is always in the form at calling time or returning time\n // | byte 4 | byte 3 | byte 2 | byte 1 |\n // | 0 | 0 | 00000000 | 00000??? | if not a MARKER\n // ^index=3 (from 0 to 15)\n // 321\n // NOTE (marker and marker_index):\n // If get a MARKER from 'in', marker=the low-byte of the MARKER\n // and marker_index=9\n // If marker_index=9 then index is always > 8, or HuffmanValue()\n // will not be called\n jpeg.lossless.Decoder.prototype.getHuffmanValue = function (table, temp, index) {\n /*jslint bitwise: true */\n\n var code, input, mask;\n mask = 0xFFFF;\n\n if (index[0] < 8) {\n temp[0] <<= 8;\n input = this.stream.get8();\n if (input === 0xFF) {\n this.marker = this.stream.get8();\n if (this.marker !== 0) {\n this.markerIndex = 9;\n }\n }\n temp[0] |= input;\n } else {\n index[0] -= 8;\n }\n\n code = table[temp[0] >> index[0]];\n\n if ((code & jpeg.lossless.Decoder.MSB) !== 0) {\n if (this.markerIndex !== 0) {\n this.markerIndex = 0;\n return 0xFF00 | this.marker;\n }\n\n temp[0] &= (mask >> (16 - index[0]));\n temp[0] <<= 8;\n input = this.stream.get8();\n\n if (input === 0xFF) {\n this.marker = this.stream.get8();\n if (this.marker !== 0) {\n this.markerIndex = 9;\n }\n }\n\n temp[0] |= input;\n code = table[((code & 0xFF) * 256) + (temp[0] >> index[0])];\n index[0] += 8;\n }\n\n index[0] += 8 - (code >> 8);\n\n if (index[0] < 0) {\n throw new Error(\"index=\" + index[0] + \" temp=\" + temp[0] + \" code=\" + code + \" in HuffmanValue()\");\n }\n\n if (index[0] < this.markerIndex) {\n this.markerIndex = 0;\n return 0xFF00 | this.marker;\n }\n\n temp[0] &= (mask >> (16 - index[0]));\n return code & 0xFF;\n };\n\n\n\n jpeg.lossless.Decoder.prototype.getn = function (PRED, n, temp, index) {\n /*jslint bitwise: true */\n\n var result, one, n_one, mask, input;\n one = 1;\n n_one = -1;\n mask = 0xFFFF;\n\n if (n === 0) {\n return 0;\n }\n\n if (n === 16) {\n if (PRED[0] >= 0) {\n return -32768;\n } else {\n return 32768;\n }\n }\n\n index[0] -= n;\n\n if (index[0] >= 0) {\n if ((index[0] < this.markerIndex) && !this.isLastPixel()) { // this was corrupting the last pixel in some cases\n this.markerIndex = 0;\n return (0xFF00 | this.marker) << 8;\n }\n\n result = temp[0] >> index[0];\n temp[0] &= (mask >> (16 - index[0]));\n } else {\n temp[0] <<= 8;\n input = this.stream.get8();\n\n if (input === 0xFF) {\n this.marker = this.stream.get8();\n if (this.marker !== 0) {\n this.markerIndex = 9;\n }\n }\n\n temp[0] |= input;\n index[0] += 8;\n\n if (index[0] < 0) {\n if (this.markerIndex !== 0) {\n this.markerIndex = 0;\n return (0xFF00 | this.marker) << 8;\n }\n\n temp[0] <<= 8;\n input = this.stream.get8();\n\n if (input === 0xFF) {\n this.marker = this.stream.get8();\n if (this.marker !== 0) {\n this.markerIndex = 9;\n }\n }\n\n temp[0] |= input;\n index[0] += 8;\n }\n\n if (index[0] < 0) {\n throw new Error(\"index=\" + index[0] + \" in getn()\");\n }\n\n if (index[0] < this.markerIndex) {\n this.markerIndex = 0;\n return (0xFF00 | this.marker) << 8;\n }\n\n result = temp[0] >> index[0];\n temp[0] &= (mask >> (16 - index[0]));\n }\n\n if (result < (one << (n - 1))) {\n result += (n_one << n) + 1;\n }\n\n return result;\n };\n\n\n\n jpeg.lossless.Decoder.prototype.getPreviousX = function (compOffset) {\n /*jslint bitwise: true */\n\n if (this.xLoc > 0) {\n return this.getter((((this.yLoc * this.xDim) + this.xLoc) - 1), compOffset);\n } else if (this.yLoc > 0) {\n return this.getPreviousY(compOffset);\n } else {\n return (1 << (this.frame.precision - 1));\n }\n };\n\n\n\n jpeg.lossless.Decoder.prototype.getPreviousXY = function (compOffset) {\n /*jslint bitwise: true */\n\n if ((this.xLoc > 0) && (this.yLoc > 0)) {\n return this.getter(((((this.yLoc - 1) * this.xDim) + this.xLoc) - 1), compOffset);\n } else {\n return this.getPreviousY(compOffset);\n }\n };\n\n\n\n jpeg.lossless.Decoder.prototype.getPreviousY = function (compOffset) {\n /*jslint bitwise: true */\n\n if (this.yLoc > 0) {\n return this.getter((((this.yLoc - 1) * this.xDim) + this.xLoc), compOffset);\n } else {\n return this.getPreviousX(compOffset);\n }\n };\n\n\n\n jpeg.lossless.Decoder.prototype.isLastPixel = function () {\n return (this.xLoc === (this.xDim - 1)) && (this.yLoc === (this.yDim - 1));\n };\n\n\n\n jpeg.lossless.Decoder.prototype.outputSingle = function (PRED) {\n if ((this.xLoc < this.xDim) && (this.yLoc < this.yDim)) {\n this.setter((((this.yLoc * this.xDim) + this.xLoc)), this.mask & PRED[0]);\n\n this.xLoc+=1;\n\n if (this.xLoc >= this.xDim) {\n this.yLoc+=1;\n this.xLoc = 0;\n }\n }\n };\n\n\n\n jpeg.lossless.Decoder.prototype.outputRGB = function (PRED) {\n var offset = ((this.yLoc * this.xDim) + this.xLoc);\n\n if ((this.xLoc < this.xDim) && (this.yLoc < this.yDim)) {\n this.setter(offset, PRED[0], 0);\n this.setter(offset, PRED[1], 1);\n this.setter(offset, PRED[2], 2);\n\n this.xLoc+=1;\n\n if (this.xLoc >= this.xDim) {\n this.yLoc+=1;\n this.xLoc = 0;\n }\n }\n };\n\n jpeg.lossless.Decoder.prototype.setValue8 = function (index, val) {\n this.outputData[index] = val;\n };\n\n jpeg.lossless.Decoder.prototype.getValue8 = function (index) {\n return this.outputData[index]; // mask should not be necessary because outputData is either Int8Array or Int16Array\n };\n\n var littleEndian = (function() {\n var buffer = new ArrayBuffer(2);\n new DataView(buffer).setInt16(0, 256, true /* littleEndian */);\n // Int16Array uses the platform's endianness.\n return new Int16Array(buffer)[0] === 256;\n })();\n\n if (littleEndian) {\n // just reading from an array is fine then. Int16Array will use platform endianness.\n jpeg.lossless.Decoder.prototype.setValue16 = jpeg.lossless.Decoder.prototype.setValue8;\n jpeg.lossless.Decoder.prototype.getValue16 = jpeg.lossless.Decoder.prototype.getValue8;\n }\n else {\n // If platform is big-endian, we will need to convert to little-endian\n jpeg.lossless.Decoder.prototype.setValue16 = function (index, val) {\n this.outputData[index] = ((val & 0xFF) << 8) | ((val >> 8) & 0xFF);\n };\n\n jpeg.lossless.Decoder.prototype.getValue16 = function (index) {\n var val = this.outputData[index];\n return ((val & 0xFF) << 8) | ((val >> 8) & 0xFF);\n };\n }\n\n jpeg.lossless.Decoder.prototype.setValueRGB = function (index, val, compOffset) {\n // this.outputData.setUint8(index * 3 + compOffset, val);\n this.outputData[index * 3 + compOffset] = val;\n };\n\n jpeg.lossless.Decoder.prototype.getValueRGB = function (index, compOffset) {\n // return this.outputData.getUint8(index * 3 + compOffset);\n return this.outputData[index * 3 + compOffset];\n };\n\n\n\n jpeg.lossless.Decoder.prototype.readApp = function() {\n var count = 0, length = this.stream.get16();\n count += 2;\n\n while (count < length) {\n this.stream.get8();\n count+=1;\n }\n\n return length;\n };\n\n\n\n jpeg.lossless.Decoder.prototype.readComment = function () {\n var sb = \"\", count = 0, length;\n\n length = this.stream.get16();\n count += 2;\n\n while (count < length) {\n sb += this.stream.get8();\n count+=1;\n }\n\n return sb;\n };\n\n\n\n jpeg.lossless.Decoder.prototype.readNumber = function() {\n var Ld = this.stream.get16();\n\n if (Ld !== 4) {\n throw new Error(\"ERROR: Define number format throw new IOException [Ld!=4]\");\n }\n\n return this.stream.get16();\n };\n\n\n\n /*** Exports ***/\n\n var moduleType = typeof module;\n if ((moduleType !== 'undefined') && module.exports) {\n module.exports = jpeg.lossless.Decoder;\n }\n\n },{\"./data-stream.js\":2,\"./frame-header.js\":4,\"./huffman-table.js\":5,\"./quantization-table.js\":7,\"./scan-header.js\":9,\"./utils.js\":10}],4:[function(require,module,exports){\n /*\n * Copyright (C) 2015 Michael Martinez\n * Changes: Added support for selection values 2-7, fixed minor bugs &\n * warnings, split into multiple class files, and general clean up.\n *\n * 08-25-2015: Helmut Dersch agreed to a license change from LGPL to MIT.\n */\n\n /*\n * Copyright (C) Helmut Dersch\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n /*jslint browser: true, node: true */\n /*global require, module */\n\n \"use strict\";\n\n /*** Imports ***/\n var jpeg = jpeg || {};\n jpeg.lossless = jpeg.lossless || {};\n jpeg.lossless.ComponentSpec = jpeg.lossless.ComponentSpec || ((typeof require !== 'undefined') ? require('./component-spec.js') : null);\n jpeg.lossless.DataStream = jpeg.lossless.DataStream || ((typeof require !== 'undefined') ? require('./data-stream.js') : null);\n\n\n /*** Constructor ***/\n jpeg.lossless.FrameHeader = jpeg.lossless.FrameHeader || function () {\n this.components = []; // Components\n this.dimX = 0; // Number of samples per line\n this.dimY = 0; // Number of lines\n this.numComp = 0; // Number of component in the frame\n this.precision = 0; // Sample Precision (from the original image)\n };\n\n\n\n /*** Prototype Methods ***/\n\n jpeg.lossless.FrameHeader.prototype.read = function (data) {\n /*jslint bitwise: true */\n\n var count = 0, length, i, c, temp;\n\n length = data.get16();\n count += 2;\n\n this.precision = data.get8();\n count+=1;\n\n this.dimY = data.get16();\n count += 2;\n\n this.dimX = data.get16();\n count += 2;\n\n this.numComp = data.get8();\n count+=1;\n for (i = 1; i <= this.numComp; i+=1) {\n if (count > length) {\n throw new Error(\"ERROR: frame format error\");\n }\n\n c = data.get8();\n count+=1;\n\n if (count >= length) {\n throw new Error(\"ERROR: frame format error [c>=Lf]\");\n }\n\n temp = data.get8();\n count+=1;\n\n if (!this.components[c]) {\n this.components[c] = new jpeg.lossless.ComponentSpec();\n }\n\n this.components[c].hSamp = temp >> 4;\n this.components[c].vSamp = temp & 0x0F;\n this.components[c].quantTableSel = data.get8();\n count+=1;\n }\n\n if (count !== length) {\n throw new Error(\"ERROR: frame format error [Lf!=count]\");\n }\n\n return 1;\n };\n\n\n /*** Exports ***/\n\n var moduleType = typeof module;\n if ((moduleType !== 'undefined') && module.exports) {\n module.exports = jpeg.lossless.FrameHeader;\n }\n\n },{\"./component-spec.js\":1,\"./data-stream.js\":2}],5:[function(require,module,exports){\n /*\n * Copyright (C) 2015 Michael Martinez\n * Changes: Added support for selection values 2-7, fixed minor bugs &\n * warnings, split into multiple class files, and general clean up.\n *\n * 08-25-2015: Helmut Dersch agreed to a license change from LGPL to MIT.\n */\n\n /*\n * Copyright (C) Helmut Dersch\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n /*jslint browser: true, node: true */\n /*global require, module */\n\n \"use strict\";\n\n /*** Imports ***/\n var jpeg = jpeg || {};\n jpeg.lossless = jpeg.lossless || {};\n jpeg.lossless.DataStream = jpeg.lossless.DataStream || ((typeof require !== 'undefined') ? require('./data-stream.js') : null);\n jpeg.lossless.Utils = jpeg.lossless.Utils || ((typeof require !== 'undefined') ? require('./utils.js') : null);\n\n\n /*** Constructor ***/\n jpeg.lossless.HuffmanTable = jpeg.lossless.HuffmanTable || function () {\n this.l = jpeg.lossless.Utils.createArray(4, 2, 16);\n this.th = [];\n this.v = jpeg.lossless.Utils.createArray(4, 2, 16, 200);\n this.tc = jpeg.lossless.Utils.createArray(4, 2);\n\n this.tc[0][0] = 0;\n this.tc[1][0] = 0;\n this.tc[2][0] = 0;\n this.tc[3][0] = 0;\n this.tc[0][1] = 0;\n this.tc[1][1] = 0;\n this.tc[2][1] = 0;\n this.tc[3][1] = 0;\n this.th[0] = 0;\n this.th[1] = 0;\n this.th[2] = 0;\n this.th[3] = 0;\n };\n\n\n\n /*** Static Pseudo-constants ***/\n\n jpeg.lossless.HuffmanTable.MSB = 0x80000000;\n\n\n /*** Prototype Methods ***/\n\n jpeg.lossless.HuffmanTable.prototype.read = function(data, HuffTab) {\n /*jslint bitwise: true */\n\n var count = 0, length, temp, t, c, i, j;\n\n length = data.get16();\n count += 2;\n\n while (count < length) {\n temp = data.get8();\n count+=1;\n t = temp & 0x0F;\n if (t > 3) {\n throw new Error(\"ERROR: Huffman table ID > 3\");\n }\n\n c = temp >> 4;\n if (c > 2) {\n throw new Error(\"ERROR: Huffman table [Table class > 2 ]\");\n }\n\n this.th[t] = 1;\n this.tc[t][c] = 1;\n\n for (i = 0; i < 16; i+=1) {\n this.l[t][c][i] = data.get8();\n count+=1;\n }\n\n for (i = 0; i < 16; i+=1) {\n for (j = 0; j < this.l[t][c][i]; j+=1) {\n if (count > length) {\n throw new Error(\"ERROR: Huffman table format error [count>Lh]\");\n }\n\n this.v[t][c][i][j] = data.get8();\n count+=1;\n }\n }\n }\n\n if (count !== length) {\n throw new Error(\"ERROR: Huffman table format error [count!=Lf]\");\n }\n\n for (i = 0; i < 4; i+=1) {\n for (j = 0; j < 2; j+=1) {\n if (this.tc[i][j] !== 0) {\n this.buildHuffTable(HuffTab[i][j], this.l[i][j], this.v[i][j]);\n }\n }\n }\n\n return 1;\n };\n\n\n\n // Build_HuffTab()\n // Parameter: t table ID\n // c table class ( 0 for DC, 1 for AC )\n // L[i] # of codewords which length is i\n // V[i][j] Huffman Value (length=i)\n // Effect:\n // build up HuffTab[t][c] using L and V.\n jpeg.lossless.HuffmanTable.prototype.buildHuffTable = function(tab, L, V) {\n /*jslint bitwise: true */\n\n var currentTable, temp, k, i, j, n;\n temp = 256;\n k = 0;\n\n for (i = 0; i < 8; i+=1) { // i+1 is Code length\n for (j = 0; j < L[i]; j+=1) {\n for (n = 0; n < (temp >> (i + 1)); n+=1) {\n tab[k] = V[i][j] | ((i + 1) << 8);\n k+=1;\n }\n }\n }\n\n for (i = 1; k < 256; i+=1, k+=1) {\n tab[k] = i | jpeg.lossless.HuffmanTable.MSB;\n }\n\n currentTable = 1;\n k = 0;\n\n for (i = 8; i < 16; i+=1) { // i+1 is Code length\n for (j = 0; j < L[i]; j+=1) {\n for (n = 0; n < (temp >> (i - 7)); n+=1) {\n tab[(currentTable * 256) + k] = V[i][j] | ((i + 1) << 8);\n k+=1;\n }\n\n if (k >= 256) {\n if (k > 256) {\n throw new Error(\"ERROR: Huffman table error(1)!\");\n }\n\n k = 0;\n currentTable+=1;\n }\n }\n }\n };\n\n\n /*** Exports ***/\n\n var moduleType = typeof module;\n if ((moduleType !== 'undefined') && module.exports) {\n module.exports = jpeg.lossless.HuffmanTable;\n }\n\n },{\"./data-stream.js\":2,\"./utils.js\":10}],6:[function(require,module,exports){\n /*jslint browser: true, node: true */\n /*global require, module */\n\n \"use strict\";\n\n /*** Imports ****/\n\n /**\n * jpeg\n * @type {*|{}}\n */\n var jpeg = jpeg || {};\n\n /**\n * jpeg.lossless\n * @type {*|{}}\n */\n jpeg.lossless = jpeg.lossless || {};\n\n\n jpeg.lossless.ComponentSpec = jpeg.lossless.ComponentSpec || ((typeof require !== 'undefined') ? require('./component-spec.js') : null);\n jpeg.lossless.DataStream = jpeg.lossless.DataStream || ((typeof require !== 'undefined') ? require('./data-stream.js') : null);\n jpeg.lossless.Decoder = jpeg.lossless.Decoder || ((typeof require !== 'undefined') ? require('./decoder.js') : null);\n jpeg.lossless.FrameHeader = jpeg.lossless.FrameHeader || ((typeof require !== 'undefined') ? require('./frame-header.js') : null);\n jpeg.lossless.HuffmanTable = jpeg.lossless.HuffmanTable || ((typeof require !== 'undefined') ? require('./huffman-table.js') : null);\n jpeg.lossless.QuantizationTable = jpeg.lossless.QuantizationTable || ((typeof require !== 'undefined') ? require('./quantization-table.js') : null);\n jpeg.lossless.ScanComponent = jpeg.lossless.ScanComponent || ((typeof require !== 'undefined') ? require('./scan-component.js') : null);\n jpeg.lossless.ScanHeader = jpeg.lossless.ScanHeader || ((typeof require !== 'undefined') ? require('./scan-header.js') : null);\n jpeg.lossless.Utils = jpeg.lossless.Utils || ((typeof require !== 'undefined') ? require('./utils.js') : null);\n\n\n /*** Exports ***/\n var moduleType = typeof module;\n if ((moduleType !== 'undefined') && module.exports) {\n module.exports = jpeg;\n }\n\n },{\"./component-spec.js\":1,\"./data-stream.js\":2,\"./decoder.js\":3,\"./frame-header.js\":4,\"./huffman-table.js\":5,\"./quantization-table.js\":7,\"./scan-component.js\":8,\"./scan-header.js\":9,\"./utils.js\":10}],7:[function(require,module,exports){\n /*\n * Copyright (C) 2015 Michael Martinez\n * Changes: Added support for selection values 2-7, fixed minor bugs &\n * warnings, split into multiple class files, and general clean up.\n *\n * 08-25-2015: Helmut Dersch agreed to a license change from LGPL to MIT.\n */\n\n /*\n * Copyright (C) Helmut Dersch\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n /*jslint browser: true, node: true */\n /*global require, module */\n\n \"use strict\";\n\n /*** Imports ***/\n var jpeg = jpeg || {};\n jpeg.lossless = jpeg.lossless || {};\n jpeg.lossless.DataStream = jpeg.lossless.DataStream || ((typeof require !== 'undefined') ? require('./data-stream.js') : null);\n jpeg.lossless.Utils = jpeg.lossless.Utils || ((typeof require !== 'undefined') ? require('./utils.js') : null);\n\n\n /*** Constructor ***/\n jpeg.lossless.QuantizationTable = jpeg.lossless.QuantizationTable || function () {\n this.precision = []; // Quantization precision 8 or 16\n this.tq = []; // 1: this table is presented\n this.quantTables = jpeg.lossless.Utils.createArray(4, 64); // Tables\n\n this.tq[0] = 0;\n this.tq[1] = 0;\n this.tq[2] = 0;\n this.tq[3] = 0;\n };\n\n\n\n /*** Static Methods ***/\n\n jpeg.lossless.QuantizationTable.enhanceQuantizationTable = function(qtab, table) {\n /*jslint bitwise: true */\n\n var i;\n\n for (i = 0; i < 8; i+=1) {\n qtab[table[(0 * 8) + i]] *= 90;\n qtab[table[(4 * 8) + i]] *= 90;\n qtab[table[(2 * 8) + i]] *= 118;\n qtab[table[(6 * 8) + i]] *= 49;\n qtab[table[(5 * 8) + i]] *= 71;\n qtab[table[(1 * 8) + i]] *= 126;\n qtab[table[(7 * 8) + i]] *= 25;\n qtab[table[(3 * 8) + i]] *= 106;\n }\n\n for (i = 0; i < 8; i+=1) {\n qtab[table[0 + (8 * i)]] *= 90;\n qtab[table[4 + (8 * i)]] *= 90;\n qtab[table[2 + (8 * i)]] *= 118;\n qtab[table[6 + (8 * i)]] *= 49;\n qtab[table[5 + (8 * i)]] *= 71;\n qtab[table[1 + (8 * i)]] *= 126;\n qtab[table[7 + (8 * i)]] *= 25;\n qtab[table[3 + (8 * i)]] *= 106;\n }\n\n for (i = 0; i < 64; i+=1) {\n qtab[i] >>= 6;\n }\n };\n\n\n /*** Prototype Methods ***/\n\n jpeg.lossless.QuantizationTable.prototype.read = function (data, table) {\n /*jslint bitwise: true */\n\n var count = 0, length, temp, t, i;\n\n length = data.get16();\n count += 2;\n\n while (count < length) {\n temp = data.get8();\n count+=1;\n t = temp & 0x0F;\n\n if (t > 3) {\n throw new Error(\"ERROR: Quantization table ID > 3\");\n }\n\n this.precision[t] = temp >> 4;\n\n if (this.precision[t] === 0) {\n this.precision[t] = 8;\n } else if (this.precision[t] === 1) {\n this.precision[t] = 16;\n } else {\n throw new Error(\"ERROR: Quantization table precision error\");\n }\n\n this.tq[t] = 1;\n\n if (this.precision[t] === 8) {\n for (i = 0; i < 64; i+=1) {\n if (count > length) {\n throw new Error(\"ERROR: Quantization table format error\");\n }\n\n this.quantTables[t][i] = data.get8();\n count+=1;\n }\n\n jpeg.lossless.QuantizationTable.enhanceQuantizationTable(this.quantTables[t], table);\n } else {\n for (i = 0; i < 64; i+=1) {\n if (count > length) {\n throw new Error(\"ERROR: Quantization table format error\");\n }\n\n this.quantTables[t][i] = data.get16();\n count += 2;\n }\n\n jpeg.lossless.QuantizationTable.enhanceQuantizationTable(this.quantTables[t], table);\n }\n }\n\n if (count !== length) {\n throw new Error(\"ERROR: Quantization table error [count!=Lq]\");\n }\n\n return 1;\n };\n\n\n\n /*** Exports ***/\n\n var moduleType = typeof module;\n if ((moduleType !== 'undefined') && module.exports) {\n module.exports = jpeg.lossless.QuantizationTable;\n }\n\n },{\"./data-stream.js\":2,\"./utils.js\":10}],8:[function(require,module,exports){\n /*\n * Copyright (C) 2015 Michael Martinez\n * Changes: Added support for selection values 2-7, fixed minor bugs &\n * warnings, split into multiple class files, and general clean up.\n *\n * 08-25-2015: Helmut Dersch agreed to a license change from LGPL to MIT.\n */\n\n /*\n * Copyright (C) Helmut Dersch\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n /*jslint browser: true, node: true */\n /*global require, module */\n\n \"use strict\";\n\n /*** Imports ***/\n var jpeg = jpeg || {};\n jpeg.lossless = jpeg.lossless || {};\n\n\n /*** Constructor ***/\n jpeg.lossless.ScanComponent = jpeg.lossless.ScanComponent || function () {\n this.acTabSel = 0; // AC table selector\n this.dcTabSel = 0; // DC table selector\n this.scanCompSel = 0; // Scan component selector\n };\n\n\n\n /*** Exports ***/\n\n var moduleType = typeof module;\n if ((moduleType !== 'undefined') && module.exports) {\n module.exports = jpeg.lossless.ScanComponent;\n }\n\n },{}],9:[function(require,module,exports){\n /*\n * Copyright (C) 2015 Michael Martinez\n * Changes: Added support for selection values 2-7, fixed minor bugs &\n * warnings, split into multiple class files, and general clean up.\n *\n * 08-25-2015: Helmut Dersch agreed to a license change from LGPL to MIT.\n */\n\n /*\n * Copyright (C) Helmut Dersch\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n /*jslint browser: true, node: true */\n /*global require, module */\n\n \"use strict\";\n\n /*** Imports ***/\n var jpeg = jpeg || {};\n jpeg.lossless = jpeg.lossless || {};\n jpeg.lossless.DataStream = jpeg.lossless.DataStream || ((typeof require !== 'undefined') ? require('./data-stream.js') : null);\n jpeg.lossless.ScanComponent = jpeg.lossless.ScanComponent || ((typeof require !== 'undefined') ? require('./scan-component.js') : null);\n\n\n /*** Constructor ***/\n jpeg.lossless.ScanHeader = jpeg.lossless.ScanHeader || function () {\n this.ah = 0;\n this.al = 0;\n this.numComp = 0; // Number of components in the scan\n this.selection = 0; // Start of spectral or predictor selection\n this.spectralEnd = 0; // End of spectral selection\n this.components = [];\n };\n\n\n /*** Prototype Methods ***/\n\n jpeg.lossless.ScanHeader.prototype.read = function(data) {\n /*jslint bitwise: true */\n\n var count = 0, length, i, temp;\n\n length = data.get16();\n count += 2;\n\n this.numComp = data.get8();\n count+=1;\n\n for (i = 0; i < this.numComp; i+=1) {\n this.components[i] = new jpeg.lossless.ScanComponent();\n\n if (count > length) {\n throw new Error(\"ERROR: scan header format error\");\n }\n\n this.components[i].scanCompSel = data.get8();\n count+=1;\n\n temp = data.get8();\n count+=1;\n\n this.components[i].dcTabSel = (temp >> 4);\n this.components[i].acTabSel = (temp & 0x0F);\n }\n\n this.selection = data.get8();\n count+=1;\n\n this.spectralEnd = data.get8();\n count+=1;\n\n temp = data.get8();\n this.ah = (temp >> 4);\n this.al = (temp & 0x0F);\n count+=1;\n\n if (count !== length) {\n throw new Error(\"ERROR: scan header format error [count!=Ns]\");\n }\n\n return 1;\n };\n\n\n\n /*** Exports ***/\n\n var moduleType = typeof module;\n if ((moduleType !== 'undefined') && module.exports) {\n module.exports = jpeg.lossless.ScanHeader;\n }\n\n },{\"./data-stream.js\":2,\"./scan-component.js\":8}],10:[function(require,module,exports){\n /*\n * Copyright (C) 2015 Michael Martinez\n * Changes: Added support for selection values 2-7, fixed minor bugs &\n * warnings, split into multiple class files, and general clean up.\n *\n * 08-25-2015: Helmut Dersch agreed to a license change from LGPL to MIT.\n */\n\n /*\n * Copyright (C) Helmut Dersch\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n /*jslint browser: true, node: true */\n /*global require, module */\n\n \"use strict\";\n\n /*** Imports ***/\n var jpeg = jpeg || {};\n jpeg.lossless = jpeg.lossless || {};\n\n\n /*** Constructor ***/\n jpeg.lossless.Utils = jpeg.lossless.Utils || {};\n\n\n /*** Static methods ***/\n\n // http://stackoverflow.com/questions/966225/how-can-i-create-a-two-dimensional-array-in-javascript\n jpeg.lossless.Utils.createArray = function (length) {\n var arr = new Array(length || 0),\n i = length;\n\n if (arguments.length > 1) {\n var args = Array.prototype.slice.call(arguments, 1);\n while(i--) arr[length-1 - i] = jpeg.lossless.Utils.createArray.apply(this, args);\n }\n\n return arr;\n };\n\n\n // http://stackoverflow.com/questions/18638900/javascript-crc32\n jpeg.lossless.Utils.makeCRCTable = function(){\n var c;\n var crcTable = [];\n for(var n =0; n < 256; n++){\n c = n;\n for(var k =0; k < 8; k++){\n c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n crcTable[n] = c;\n }\n return crcTable;\n };\n\n jpeg.lossless.Utils.crc32 = function(dataView) {\n var uint8view = new Uint8Array(dataView.buffer);\n var crcTable = jpeg.lossless.Utils.crcTable || (jpeg.lossless.Utils.crcTable = jpeg.lossless.Utils.makeCRCTable());\n var crc = 0 ^ (-1);\n\n for (var i = 0; i < uint8view.length; i++ ) {\n crc = (crc >>> 8) ^ crcTable[(crc ^ uint8view[i]) & 0xFF];\n }\n\n return (crc ^ (-1)) >>> 0;\n };\n\n\n /*** Exports ***/\n\n var moduleType = typeof module;\n if ((moduleType !== 'undefined') && module.exports) {\n module.exports = jpeg.lossless.Utils;\n }\n\n},{}]},{},[6])(6)\n});\n"],"names":["f","exports","module","define","amd","window","global","self","this","jpeg","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","lossless","ComponentSpec","hSamp","quantTableSel","vSamp","DataStream","data","offset","buffer","Uint8Array","index","prototype","get16","value","get8","HuffmanTable","QuantizationTable","ScanHeader","FrameHeader","Utils","Decoder","numBytes","frame","huffTable","quantTable","scan","DU","createArray","HuffTab","IDCT_Source","nBlock","acTab","dcTab","qTab","marker","markerIndex","numComp","restartInterval","selection","xDim","yDim","xLoc","yLoc","outputData","restarting","mask","IDCT_P","TABLE","MAX_HUFFMAN_SUBTREE","MSB","RESTART_MARKER_BEGIN","RESTART_MARKER_END","decompress","decode","current","compN","mcuNum","scanNum","pred","temp","stream","read","readNumber","readApp","readComment","precision","components","parseInt","Math","ceil","getter","getValueRGB","setter","setValueRGB","output","outputRGB","getValue8","setValue8","outputSingle","getValue16","setValue16","selector","select2","select3","select4","select5","select6","select7","select1","scanComps","quantTables","scanCompSel","dcTabSel","acTabSel","dimX","dimY","ArrayBuffer","Uint16Array","decodeUnit","prev","decodeSingle","decodeRGB","compOffset","getPreviousX","getPreviousY","getPreviousXY","actab","dctab","qtab","ctrC","k","j","getHuffmanValue","getn","nRestart","table","input","PRED","result","isLastPixel","val","DataView","setInt16","Int16Array","count","sb","c","th","v","tc","buildHuffTable","tab","L","V","currentTable","ScanComponent","tq","enhanceQuantizationTable","ah","al","spectralEnd","arr","Array","arguments","args","slice","apply","makeCRCTable","crcTable","crc32","dataView","uint8view","crc"],"sourceRoot":""}
\ No newline at end of file
diff --git a/platform/viewer-static/dist/62ab5d58a2bea7b5a1dc.wasm b/platform/viewer-static/dist/62ab5d58a2bea7b5a1dc.wasm
new file mode 100644
index 00000000000..aab6671410f
Binary files /dev/null and b/platform/viewer-static/dist/62ab5d58a2bea7b5a1dc.wasm differ
diff --git a/platform/viewer-static/dist/65916ef3def695744bda.wasm b/platform/viewer-static/dist/65916ef3def695744bda.wasm
new file mode 100644
index 00000000000..1bb417256fd
Binary files /dev/null and b/platform/viewer-static/dist/65916ef3def695744bda.wasm differ
diff --git a/platform/viewer-static/dist/75788f12450d4c5ed494.wasm b/platform/viewer-static/dist/75788f12450d4c5ed494.wasm
new file mode 100644
index 00000000000..827651b36cb
Binary files /dev/null and b/platform/viewer-static/dist/75788f12450d4c5ed494.wasm differ
diff --git a/platform/viewer-static/dist/75a0c2dfe07b824c7d21.wasm b/platform/viewer-static/dist/75a0c2dfe07b824c7d21.wasm
new file mode 100644
index 00000000000..f8b19d1ac3b
Binary files /dev/null and b/platform/viewer-static/dist/75a0c2dfe07b824c7d21.wasm differ
diff --git a/platform/viewer-static/dist/799.bundle.2ef6f5cf10afff0b9cec.js b/platform/viewer-static/dist/799.bundle.2ef6f5cf10afff0b9cec.js
new file mode 100644
index 00000000000..ebfaecfd7e8
--- /dev/null
+++ b/platform/viewer-static/dist/799.bundle.2ef6f5cf10afff0b9cec.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[799],{91799:function(e,t,n){n.r(t);var r=n(32735),a=n(60216),i=n.n(a),o=n(72928),l=n(84334),s=n(67013),c=n(38942),u=n(41841),m=n(72682),f=n(74099),d=n(56789);function p(){return p=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n {\n if (!cines || !cines[viewportIndex] || !element) {\n return;\n }\n\n const cine = cines[viewportIndex];\n const isPlaying = cine.isPlaying || false;\n const frameRate = cine.frameRate || 24;\n\n const validFrameRate = Math.max(frameRate, 1);\n\n if (isPlaying) {\n cineService.playClip(element, {\n framesPerSecond: validFrameRate,\n });\n } else {\n cineService.stopClip(element);\n }\n };\n\n useEffect(() => {\n if (isTracked) {\n annotation.config.style.setViewportToolStyles(viewportId, {\n global: {\n lineDash: '',\n },\n });\n\n CornerstoneViewportService.getRenderingEngine().renderViewport(\n viewportId\n );\n\n return;\n }\n\n annotation.config.style.setViewportToolStyles(`viewport-${viewportIndex}`, {\n global: {\n lineDash: '4,4',\n },\n });\n\n CornerstoneViewportService.getRenderingEngine().renderViewport(viewportId);\n\n return () => {\n annotation.config.style.setViewportToolStyles(viewportId, {});\n };\n }, [isTracked]);\n\n // unmount cleanup\n useEffect(() => {\n eventTarget.addEventListener(\n Enums.Events.STACK_VIEWPORT_NEW_STACK,\n cineHandler\n );\n\n return () => {\n cineService.setCine({ id: viewportIndex, isPlaying: false });\n eventTarget.removeEventListener(\n Enums.Events.STACK_VIEWPORT_NEW_STACK,\n cineHandler\n );\n };\n }, [element]);\n\n useEffect(() => {\n if (!cines || !cines[viewportIndex] || !element) {\n return;\n }\n\n cineHandler();\n\n return () => {\n if (element && cines?.[viewportIndex]?.isPlaying) {\n cineService.stopClip(element);\n }\n };\n }, [cines, viewportIndex, cineService, element, cineHandler]);\n\n if (trackedSeries.includes(SeriesInstanceUID) !== isTracked) {\n setIsTracked(!isTracked);\n }\n\n /**\n * OnElementEnabled callback which is called after the cornerstoneExtension\n * has enabled the element. Note: we delegate all the image rendering to\n * cornerstoneExtension, so we don't need to do anything here regarding\n * the image rendering, element enabling etc.\n */\n const onElementEnabled = evt => {\n setElement(evt.detail.element);\n };\n\n function switchMeasurement(direction) {\n const newTrackedMeasurementUID = _getNextMeasurementUID(\n direction,\n servicesManager,\n trackedMeasurementUID,\n trackedMeasurements\n );\n\n if (!newTrackedMeasurementUID) {\n return;\n }\n\n setTrackedMeasurementUID(newTrackedMeasurementUID);\n\n MeasurementService.jumpToMeasurement(\n viewportIndex,\n newTrackedMeasurementUID\n );\n }\n\n const getCornerstoneViewport = () => {\n const { component: Component } = extensionManager.getModuleEntry(\n '@ohif/extension-cornerstone.viewportModule.cornerstone'\n );\n\n return ;\n };\n\n const cine = cines[viewportIndex];\n const isPlaying = (cine && cine.isPlaying) || false;\n\n return (\n <>\n {\n evt.stopPropagation();\n evt.preventDefault();\n }}\n useAltStyling={isTracked}\n onArrowsClick={direction => switchMeasurement(direction)}\n getStatusComponent={() => _getStatusComponent(isTracked)}\n studyData={{\n label: viewportLabel,\n studyDate: formatDate(SeriesDate), // TODO: This is series date. Is that ok?\n currentSeries: SeriesNumber, // TODO - switch entire currentSeries to be UID based or actual position based\n seriesDescription: SeriesDescription,\n patientInformation: {\n patientName: PatientName\n ? OHIF.utils.formatPN(PatientName.Alphabetic)\n : '',\n patientSex: PatientSex || '',\n patientAge: PatientAge || '',\n MRN: PatientID || '',\n thickness: SliceThickness\n ? `${parseFloat(SliceThickness).toFixed(2)}mm`\n : '',\n spacing:\n SpacingBetweenSlices !== undefined\n ? `${parseFloat(SpacingBetweenSlices).toFixed(2)}mm`\n : '',\n scanner: ManufacturerModelName || '',\n },\n }}\n showNavArrows={!isCineEnabled}\n showCine={isCineEnabled}\n cineProps={{\n isPlaying,\n onClose: () => commandsManager.runCommand('toggleCine'),\n onPlayPauseChange: isPlaying =>\n cineService.setCine({\n id: activeViewportIndex,\n isPlaying,\n }),\n onFrameRateChange: frameRate =>\n cineService.setCine({\n id: activeViewportIndex,\n frameRate,\n }),\n }}\n />\n {/* TODO: Viewport interface to accept stack or layers of content like this? */}\n \n {getCornerstoneViewport()}\n
\n {viewportDialogState.viewportIndex === viewportIndex && (\n \n )}\n
\n
\n >\n );\n}\n\nTrackedCornerstoneViewport.propTypes = {\n displaySets: PropTypes.arrayOf(PropTypes.object.isRequired).isRequired,\n viewportIndex: PropTypes.number.isRequired,\n dataSource: PropTypes.object,\n children: PropTypes.node,\n customProps: PropTypes.object,\n};\n\nTrackedCornerstoneViewport.defaultProps = {\n customProps: {},\n};\n\nfunction _getNextMeasurementUID(\n direction,\n servicesManager,\n trackedMeasurementId,\n trackedMeasurements\n) {\n const { MeasurementService } = servicesManager.services;\n const measurements = MeasurementService.getMeasurements();\n\n const { trackedSeries } = trackedMeasurements.context;\n\n // Get the potentially trackable measurements for this series,\n // The measurements to jump between are the same\n // regardless if this series is tracked or not.\n\n const filteredMeasurements = measurements.filter(m =>\n trackedSeries.includes(m.referenceSeriesUID)\n );\n\n if (!filteredMeasurements.length) {\n // No measurements on this series.\n return;\n }\n\n const measurementCount = filteredMeasurements.length;\n\n const uids = filteredMeasurements.map(fm => fm.uid);\n let measurementIndex = uids.findIndex(uid => uid === trackedMeasurementId);\n\n if (measurementIndex === -1) {\n // Not tracking a measurement, or previous measurement now deleted, revert to 0.\n measurementIndex = 0;\n } else {\n if (direction === 'left') {\n measurementIndex--;\n\n if (measurementIndex < 0) {\n measurementIndex = measurementCount - 1;\n }\n } else if (direction === 'right') {\n measurementIndex++;\n\n if (measurementIndex === measurementCount) {\n measurementIndex = 0;\n }\n }\n }\n\n const newTrackedMeasurementId = uids[measurementIndex];\n\n return newTrackedMeasurementId;\n}\n\nfunction _getStatusComponent(isTracked) {\n const trackedIcon = isTracked ? 'tracked' : 'dotted-circle';\n\n return (\n \n
\n \n \n
\n \n \n {isTracked ? (\n <>\n Series is\n tracked and\n can be viewed in the measurement panel\n >\n ) : (\n <>\n Measurements for\n untracked \n series will not be shown in the measurements\n panel\n >\n )}\n \n
\n \n }\n >\n \n \n \n );\n}\n\nexport default TrackedCornerstoneViewport;\n"],"names":["formatDate","utils","TrackedCornerstoneViewport","props","children","displaySets","viewportIndex","viewportLabel","servicesManager","extensionManager","commandsManager","useTranslation","t","services","MeasurementService","CornerstoneViewportService","displaySet","trackedMeasurements","useTrackedMeasurements","activeViewportIndex","useViewportGrid","useCine","isCineEnabled","cines","cineService","viewportDialogState","useViewportDialog","useState","isTracked","setIsTracked","trackedMeasurementUID","setTrackedMeasurementUID","element","setElement","trackedSeries","context","viewportId","getViewportId","SeriesDate","Modality","SeriesDescription","SeriesInstanceUID","SeriesNumber","images","PatientID","PatientName","PatientSex","PatientAge","SliceThickness","SpacingBetweenSlices","ManufacturerModelName","cineHandler","cine","isPlaying","frameRate","validFrameRate","Math","max","playClip","framesPerSecond","stopClip","useEffect","annotation","global","lineDash","getRenderingEngine","renderViewport","eventTarget","Enums","setCine","id","includes","onElementEnabled","evt","detail","Component","onDoubleClick","stopPropagation","preventDefault","useAltStyling","onArrowsClick","direction","newTrackedMeasurementUID","trackedMeasurementId","measurements","getMeasurements","filteredMeasurements","filter","m","referenceSeriesUID","length","measurementCount","uids","map","fm","uid","measurementIndex","findIndex","_getNextMeasurementUID","jumpToMeasurement","switchMeasurement","getStatusComponent","trackedIcon","className","position","content","name","_getStatusComponent","studyData","label","studyDate","currentSeries","seriesDescription","patientInformation","patientName","OHIF","Alphabetic","patientSex","patientAge","MRN","thickness","parseFloat","toFixed","spacing","undefined","scanner","showNavArrows","showCine","cineProps","onClose","runCommand","onPlayPauseChange","onFrameRateChange","getModuleEntry","component","message","type","actions","onSubmit","onOutsideClick","propTypes","PropTypes","isRequired","dataSource","customProps","defaultProps"],"sourceRoot":""}
\ No newline at end of file
diff --git a/platform/viewer-static/dist/888.min.worker.js b/platform/viewer-static/dist/888.min.worker.js
new file mode 100644
index 00000000000..4cfcce95536
--- /dev/null
+++ b/platform/viewer-static/dist/888.min.worker.js
@@ -0,0 +1 @@
+(self.webpackChunk=self.webpackChunk||[]).push([[888],{1888:function(e,n){var r={Unkown:0,Grayscale:1,AdobeRGB:2,RGB:3,CYMK:4},o=function(){"use strict";var e=new Int32Array([0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63]),n=4017,o=799,a=3406,t=2276,s=1567,i=3784,c=5793,l=2896;function f(){}function u(e,n){for(var r,o,a=0,t=[],s=16;s>0&&!e[s-1];)s--;t.push({children:[],index:0});var i,c=t[0];for(r=0;r