diff --git a/.babelrc.json b/.babelrc.json
deleted file mode 100644
index 5471b198..00000000
--- a/.babelrc.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "exclude": "node_modules/**",
- "presets": [
- [
- "@babel/preset-env",
- {
- "targets": "> 1%, not dead",
- "useBuiltIns": "usage",
- "corejs": 3
- }
- ]
- ]
-}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index f16721ed..9c30299a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,3 +13,4 @@ node_modules
/dev/Figure_S20_geo.json
/dev/issue_360.html
/package-lock.json
+dist/
diff --git a/css/_igv-menu-popup.scss b/css/_igv-menu-popup.scss
index 742f2ebd..6a3144c6 100644
--- a/css/_igv-menu-popup.scss
+++ b/css/_igv-menu-popup.scss
@@ -1,3 +1,8 @@
+// Variables with defaults - can be overridden via @use ... with
+$igv-trackgear-grey-color: #7F7F7F !default;
+$igv-trackgear-popover-border-radius: 4px !default;
+$igv-trackgear-font-color: #4b4b4b !default;
+$igv-trackgear-default-font-face: 'Open Sans', sans-serif !default;
.jb-igv-menu-popup {
position: absolute;
diff --git a/css/juicebox.css b/css/juicebox.css
index ee0d9def..cccc6595 100644
--- a/css/juicebox.css
+++ b/css/juicebox.css
@@ -1,16 +1,3 @@
-:root {
- --nav-bar-label-height: 36px;
- --nav-bar-widget-container-height: 36px;
- --nav-bar-widget-container-margin: 4px;
- --hic-scrollbar-height: 20px;
- --hic-axis-height: 40px;
- --track-margin: 2px;
- --track-height: 36px;
- --hic-viewport-width: 640px;
- --hic-viewport-height: 640px;
- --hic-viewport-spinner-size: 120px;
-}
-
.jb-igv-menu-popup {
position: absolute;
top: 0;
@@ -146,6 +133,19 @@
background-color: rgb(209, 113, 5);
}
+:root {
+ --nav-bar-label-height: 36px;
+ --nav-bar-widget-container-height: 36px;
+ --nav-bar-widget-container-margin: 4px;
+ --hic-scrollbar-height: 20px;
+ --hic-axis-height: 40px;
+ --track-margin: 2px;
+ --track-height: 36px;
+ --hic-viewport-width: 640px;
+ --hic-viewport-height: 640px;
+ --hic-viewport-spinner-size: 120px;
+}
+
.hic-igv-right-hand-gutter {
position: absolute;
top: 0;
@@ -1103,6 +1103,25 @@ div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$
overflow-x: hidden;
overflow-y: hidden;
}
+div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=viewport] div[id$=contact-map-canvas-container],
+div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=viewport] div[id$=live-contact-map-canvas-container],
+div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=viewport] div[id$=live-distance-map-canvas-container] {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=viewport] div[id$=contact-map-canvas-container] canvas,
+div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=viewport] div[id$=live-contact-map-canvas-container] canvas,
+div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=viewport] div[id$=live-distance-map-canvas-container] canvas {
+ width: 100%;
+ height: 100%;
+}
+div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=viewport] div[id$=live-contact-map-canvas-container],
+div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=viewport] div[id$=live-distance-map-canvas-container] {
+ display: none;
+}
div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=viewport] div[id$=viewport-spinner-container] {
display: table-cell;
margin: auto;
@@ -1265,6 +1284,4 @@ div[id$=content-container] div[id$=x-scrollbar-container] div[id$=x-axis-scrollb
.igv-trackgear-container:hover {
cursor: pointer;
color: #444;
-}
-
-/*# sourceMappingURL=juicebox.css.map */
+}
\ No newline at end of file
diff --git a/css/juicebox.css.map b/css/juicebox.css.map
index 7e626521..ee8ee948 100644
--- a/css/juicebox.css.map
+++ b/css/juicebox.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["juicebox.scss","_igv-menu-popup.scss"],"names":[],"mappings":"AAAA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACTF;EACE;EACA;EACA;EAEA;EAEA;EAEA;EAEA,aDgBgC;ECfhC;EACA;EACA,ODYyB;ECVzB;EAEA,eDOoC;ECNpC,cDKyB;ECJzB;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;;AAEA;EACE;;AAEA;EACE;;AAGF;EACE;EACA;;AAGF;EACE,2BDnBgC;ECoBhC,4BDpBgC;ECqBhC;EACA;EACA;;AAGF;EACE;;;AAON;EACE;EACA;EACA;;;AAGF;EAEE;EACA;EACA;EACA;EAEA;EACA,wBDhDoC;ECiDpC,yBDjDoC;ECmDpC,qBDpDyB;ECqDzB;EACA;EAEA;EAEA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA,ODpEuB;;ACuEzB;EACE;EACA;;;AAKJ;EAEE;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAON;EAEE;EACA;EACA;EACA;EACA;EAEA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIF;EACE;;AAIF;EACE;;AAIF;EACE;;AAIF;EACE;;;ADUJ;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,OAhLe;EAiLf,QAhLgB;EAiLhB;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBA1LgB;EA2LhB;EACA;EACA,oBAnMmB;EAoMnB;EACA;EACA;EACA;EACA;;AACA;EAlGA;EACA;EACA;EACA;EACA;EACA;EACA,cA7HsB;EA8HtB,YA7HgB;EA8HhB,eA9HgB;EA+HhB;;AA2FE;EACE;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA,QA/PgB;EAgQhB;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;AAAA;AAAA;EAGE;EACA;;AAIN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA,eAnQoB;;AAoGtB;EACE;EACA;EACA;EACA;EACA;EACA,aAlFkB;EAmFlB;EACA,OA5FiB;EA6FjB;EACA;EACA;EACA;EACA,cAlGmB;EAmGnB;;AAmJA;EACE;EACA;EACA;EACA,OAzPe;;AA2PjB;AAAA;AAAA;EAGE;EACA,OA5PgB;;AA+PpB;EA3JA;EACA;EACA;EACA;EACA;EACA;EACA,cA7HsB;EA8HtB,YA7HgB;EA8HhB,eA9HgB;EA+HhB;;AAzDA;EACE;EACA;EACA;EACA,aAnDkB;EAoDlB;EACA,OA7DiB;;AAqQjB;EACE;;AAGJ;EAlKA;EACA;EACA;EACA;EACA;EACA;EACA,cA7HsB;EA8HtB,YA7HgB;EA8HhB,eA9HgB;EA+HhB;;AA2JE;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;;AAEF;AAAA;AAAA;EAGE;EACA,OAxRc;;AAoDpB;EACE;EACA;EACA;EACA,aAnDkB;EAoDlB;EACA,OA7DiB;;AA+RjB;EACE;;AAGJ;EA5LA;EACA;EACA;EACA;EACA;EACA;EACA,cA7HsB;EA8HtB,YA7HgB;EA8HhB,eA9HgB;EA+HhB;;AAqLE;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cA9SiB;EA+SjB;;AAEF;AAAA;EAEE;EACA;;AAEF;EACE;;;AAIN;AAAA;AAAA;EAGE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,eAxVgB;;AAyVhB;EACE;EACA;EACA;EACA,OA9UiB;;AAgVnB;AAAA;AAAA;EAGE;EACA,OAjVkB;;;AAoVtB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAlWmB;EAmWnB;EACA;EACA;EACA,aA9VoB;EA+VpB;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA,QA7ZoB;EA8ZpB;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA,OAlYe;;AAoYjB;AAAA;AAAA;EAGE;EACA,OArYgB;;AAwYpB;EACE;EACA;EACA;EACA;EACA;EACA;EACA,QAzZ8B;EA0Z9B;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA,OAzbe;;AA2bjB;EACE;;AAEF;EACE;EACA,OArckC;EAsclC,QAtckC;EAuclC;EACA;;AAEF;EACE;;AAEF;EACE;;AAEF;EACE;;AAEF;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA,OAxda;;AA0df;EACE;EACA;EACA;EACA,OA9da;;AAkenB;AAAA;AAAA;EAGE;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA,QAtiBoB;;AAuiBpB;EACE;EACA;EACA,OA7fe;;AA+fjB;AAAA;AAAA;EAGE;EACA,OAhgBgB;;;AAogBtB;EACE;EACA;EACA;EACA;EACA;EACA;EACA,OA9gBmB;EA+gBnB,aAvgBoB;EAwgBpB;EACA;EACA,kBAphBoB;;AAqhBpB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA,OA3iBe;;AA4iBf;EACE;EACA;;AAEF;EACE;;AAEF;EACE;;AAEF;EACE;EACA,OArjBc;;AAyjBpB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACE;;AAvgBA;EACE;EACA;EACA;EACA;EACA,aA/DkB;EAgElB;EACA,OAzEiB;EA0EjB;EACA;EACA;EACA;EACA,cA/EmB;EAgFnB;;;AA6fJ;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA,OAvlBiB;;AAylBnB;EACE;EACA;EACA;EACA,OA7lBiB;;AAoFnB;EACE;EACA;EACA;EACA;EACA;EACA,aAlFkB;EAmFlB;EACA,OA5FiB;EA6FjB;EACA;EACA;EACA;EACA,cAlGmB;EAmGnB;;AA8fF;EACE;EACA;;AAEF;EACE;EACA;EACA;EACA,OAxmBiB;;AA0mBnB;AAAA;AAAA;EAGE;EACA,OA3mBkB;;AA6mBpB;EACE;EACA;EACA;EACA,OApnBiB;;AAsnBnB;AAAA;AAAA;EAGE;EACA,OAvnBkB;;;AA0nBtB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AA7kBA;EACE;EACA;EACA;EACA,aAnDkB;EAoDlB;EACA,OA7DiB;;AAsoBnB;EACE;EACA;EACA;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;;AA9lBF;EACE;EACA;EACA;EACA,aAnDkB;EAoDlB;EACA,OA7DiB;;AAwpBnB;EACE;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;;AAEF;AAAA;AAAA;EAGE;EACA,OAjrBgB;;AAoDpB;EACE;EACA;EACA;EACA,aAnDkB;EAoDlB;EACA,OA7DiB;;AAwrBnB;EACE;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA,QAztBuB;EA0tBvB;;AACA;EACE,OA5tBqB;EA6tBrB;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;;AAEF;EACE;EACA;;AAEF;EACE;EACA;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,aAhwBc;EAiwBd;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKR;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE,aAjzBY;EAkzBZ;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAMV;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA,OAt3BmB;EAu3BnB;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIN;EACE;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE,aAv4BY;EAw4BZ;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKR;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE;EACA;EACA;EACA;EACA,kBAl+BY;;AAm+BZ;EACE;EACA;EACA;EACA;EACA;EACA,kBA1+BiB;;AA+BvB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,aAvCkB;EAwClB;EACA;EACA;;AAk8BF;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA,kBA3/BY;;AA4/BZ;EACE;EACA;EACA;EACA;EACA;EACA,kBAngCiB;;AAQvB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,aApBkB;EAqBlB;EACA;EACA;;;AA++BJ;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA,OAllCyB;;;AAolC3B;EACE;EACA","file":"juicebox.css"}
\ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["juicebox.scss","_igv-menu-popup.scss"],"names":[],"mappings":"AAAA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACTF;EACE;EACA;EACA;EAEA;EAEA;EAEA;EAEA,aDgBgC;ECfhC;EACA;EACA,ODYyB;ECVzB;EAEA,eDOoC;ECNpC,cDKyB;ECJzB;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;;AAEA;EACE;;AAEA;EACE;;AAGF;EACE;EACA;;AAGF;EACE,2BDnBgC;ECoBhC,4BDpBgC;ECqBhC;EACA;EACA;;AAGF;EACE;;;AAON;EACE;EACA;EACA;;;AAGF;EAEE;EACA;EACA;EACA;EAEA;EACA,wBDhDoC;ECiDpC,yBDjDoC;ECmDpC,qBDpDyB;ECqDzB;EACA;EAEA;EAEA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA,ODpEuB;;ACuEzB;EACE;EACA;;;AAKJ;EAEE;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAON;EAEE;EACA;EACA;EACA;EACA;EAEA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIF;EACE;;AAIF;EACE;;AAIF;EACE;;AAIF;EACE;;;ADUJ;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,OAhLe;EAiLf,QAhLgB;EAiLhB;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBA1LgB;EA2LhB;EACA;EACA,oBAnMmB;EAoMnB;EACA;EACA;EACA;EACA;;AACA;EAlGA;EACA;EACA;EACA;EACA;EACA;EACA,cA7HsB;EA8HtB,YA7HgB;EA8HhB,eA9HgB;EA+HhB;;AA2FE;EACE;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA,QA/PgB;EAgQhB;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;AAAA;AAAA;EAGE;EACA;;AAIN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA,eAnQoB;;AAoGtB;EACE;EACA;EACA;EACA;EACA;EACA,aAlFkB;EAmFlB;EACA,OA5FiB;EA6FjB;EACA;EACA;EACA;EACA,cAlGmB;EAmGnB;;AAmJA;EACE;EACA;EACA;EACA,OAzPe;;AA2PjB;AAAA;AAAA;EAGE;EACA,OA5PgB;;AA+PpB;EA3JA;EACA;EACA;EACA;EACA;EACA;EACA,cA7HsB;EA8HtB,YA7HgB;EA8HhB,eA9HgB;EA+HhB;;AAzDA;EACE;EACA;EACA;EACA,aAnDkB;EAoDlB;EACA,OA7DiB;;AAqQjB;EACE;;AAGJ;EAlKA;EACA;EACA;EACA;EACA;EACA;EACA,cA7HsB;EA8HtB,YA7HgB;EA8HhB,eA9HgB;EA+HhB;;AA2JE;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;;AAEF;AAAA;AAAA;EAGE;EACA,OAxRc;;AAoDpB;EACE;EACA;EACA;EACA,aAnDkB;EAoDlB;EACA,OA7DiB;;AA+RjB;EACE;;AAGJ;EA5LA;EACA;EACA;EACA;EACA;EACA;EACA,cA7HsB;EA8HtB,YA7HgB;EA8HhB,eA9HgB;EA+HhB;;AAqLE;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cA9SiB;EA+SjB;;AAEF;AAAA;EAEE;EACA;;AAEF;EACE;;;AAIN;AAAA;AAAA;EAGE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,eAxVgB;;AAyVhB;EACE;EACA;EACA;EACA,OA9UiB;;AAgVnB;AAAA;AAAA;EAGE;EACA,OAjVkB;;;AAoVtB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAlWmB;EAmWnB;EACA;EACA;EACA,aA9VoB;EA+VpB;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA,QA7ZoB;EA8ZpB;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA,OAlYe;;AAoYjB;AAAA;AAAA;EAGE;EACA,OArYgB;;AAwYpB;EACE;EACA;EACA;EACA;EACA;EACA;EACA,QAzZ8B;EA0Z9B;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA,OAzbe;;AA2bjB;EACE;;AAEF;EACE;EACA,OArckC;EAsclC,QAtckC;EAuclC;EACA;;AAEF;EACE;;AAEF;EACE;;AAEF;EACE;;AAEF;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA,OAxda;;AA0df;EACE;EACA;EACA;EACA,OA9da;;AAkenB;AAAA;AAAA;EAGE;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA,QAtiBoB;;AAuiBpB;EACE;EACA;EACA,OA7fe;;AA+fjB;AAAA;AAAA;EAGE;EACA,OAhgBgB;;;AAogBtB;EACE;EACA;EACA;EACA;EACA;EACA;EACA,OA9gBmB;EA+gBnB,aAvgBoB;EAwgBpB;EACA;EACA,kBAphBoB;;AAqhBpB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA,OA3iBe;;AA4iBf;EACE;EACA;;AAEF;EACE;;AAEF;EACE;;AAEF;EACE;EACA,OArjBc;;AAyjBpB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACE;;AAvgBA;EACE;EACA;EACA;EACA;EACA,aA/DkB;EAgElB;EACA,OAzEiB;EA0EjB;EACA;EACA;EACA;EACA,cA/EmB;EAgFnB;;;AA6fJ;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA,OAvlBiB;;AAylBnB;EACE;EACA;EACA;EACA,OA7lBiB;;AAoFnB;EACE;EACA;EACA;EACA;EACA;EACA,aAlFkB;EAmFlB;EACA,OA5FiB;EA6FjB;EACA;EACA;EACA;EACA,cAlGmB;EAmGnB;;AA8fF;EACE;EACA;;AAEF;EACE;EACA;EACA;EACA,OAxmBiB;;AA0mBnB;AAAA;AAAA;EAGE;EACA,OA3mBkB;;AA6mBpB;EACE;EACA;EACA;EACA,OApnBiB;;AAsnBnB;AAAA;AAAA;EAGE;EACA,OAvnBkB;;;AA0nBtB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AA7kBA;EACE;EACA;EACA;EACA,aAnDkB;EAoDlB;EACA,OA7DiB;;AAsoBnB;EACE;EACA;EACA;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;;AA9lBF;EACE;EACA;EACA;EACA,aAnDkB;EAoDlB;EACA,OA7DiB;;AAwpBnB;EACE;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;;AAEF;AAAA;AAAA;EAGE;EACA,OAjrBgB;;AAoDpB;EACE;EACA;EACA;EACA,aAnDkB;EAoDlB;EACA,OA7DiB;;AAwrBnB;EACE;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA,QAztBuB;EA0tBvB;;AACA;EACE,OA5tBqB;EA6tBrB;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;;AAEF;EACE;EACA;;AAEF;EACE;EACA;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,aAhwBc;EAiwBd;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKR;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE,aAjzBY;EAkzBZ;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAMV;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA,OAt3BmB;EAu3BnB;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIN;EACE;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE,aAv4BY;EAw4BZ;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKR;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;;AACA;AAAA;AAAA;EACE;EACA;;AAGJ;AAAA;EAEE;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE;EACA;EACA;EACA;EACA,kBAn/BY;;AAo/BZ;EACE;EACA;EACA;EACA;EACA;EACA,kBA3/BiB;;AA+BvB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,aAvCkB;EAwClB;EACA;EACA;;AAm9BF;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA,kBA5gCY;;AA6gCZ;EACE;EACA;EACA;EACA;EACA;EACA,kBAphCiB;;AAQvB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,aApBkB;EAqBlB;EACA;EACA;;;AAggCJ;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA,OAnmCyB;;;AAqmC3B;EACE;EACA","file":"juicebox.css"}
\ No newline at end of file
diff --git a/css/juicebox.scss b/css/juicebox.scss
index d81d1c5a..bf0545ab 100644
--- a/css/juicebox.scss
+++ b/css/juicebox.scss
@@ -1,3 +1,10 @@
+@use "igv-menu-popup" as * with (
+ $igv-trackgear-grey-color: #7F7F7F,
+ $igv-trackgear-popover-border-radius: 4px,
+ $igv-trackgear-font-color: #4b4b4b,
+ $igv-trackgear-default-font-face: ('Open Sans', sans-serif)
+);
+
:root {
--nav-bar-label-height: 36px;
--nav-bar-widget-container-height: 36px;
@@ -23,11 +30,6 @@ $track-height: var(--track-height);
//
$hic-color-swatch-size: 24px;
-$igv-trackgear-grey-color: #7F7F7F;
-$igv-trackgear-popover-border-radius: 4px;
-$igv-trackgear-font-color: #4b4b4b;
-$igv-trackgear-default-font-face: 'Open Sans', sans-serif;
-
$nav-bar-widget-height: 24px;
// ::::::::::::::: Used by layoutController.js :::::::::::::::
@@ -76,8 +78,6 @@ $scrollbar-color: #efefef;
$default-font-family: 'Open Sans', sans-serif;
-@import "igv-menu-popup";
-
@mixin x-scrollbar-label {
div {
display: inline-block;
@@ -1009,6 +1009,23 @@ div[id$="content-container"] {
height: 100%;
overflow-x: hidden;
overflow-y: hidden;
+ div[id$="contact-map-canvas-container"],
+ div[id$="live-contact-map-canvas-container"],
+ div[id$="live-distance-map-canvas-container"] {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ canvas {
+ width: 100%;
+ height: 100%;
+ }
+ }
+ div[id$="live-contact-map-canvas-container"],
+ div[id$="live-distance-map-canvas-container"] {
+ display: none;
+ }
div[id$="viewport-spinner-container"] {
display: table-cell;
margin: auto;
diff --git a/dashboard.html b/dashboard.html
new file mode 100644
index 00000000..8b73e49a
--- /dev/null
+++ b/dashboard.html
@@ -0,0 +1,202 @@
+
+
+
+
+
+ Juicebox.js Launch Dashboard
+
+
+
+
+
+
+
+
+
diff --git a/dist/css/img/circular-arrows-24-blue.png b/dist/css/img/circular-arrows-24-blue.png
deleted file mode 100644
index e9f8c383..00000000
Binary files a/dist/css/img/circular-arrows-24-blue.png and /dev/null differ
diff --git a/dist/css/img/circular-arrows-24-grey.png b/dist/css/img/circular-arrows-24-grey.png
deleted file mode 100644
index bca82558..00000000
Binary files a/dist/css/img/circular-arrows-24-grey.png and /dev/null differ
diff --git a/dist/css/img/matrix-diagonal-all.svg b/dist/css/img/matrix-diagonal-all.svg
deleted file mode 100644
index ccb28a2f..00000000
--- a/dist/css/img/matrix-diagonal-all.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
diff --git a/dist/css/img/matrix-diagonal-lower.svg b/dist/css/img/matrix-diagonal-lower.svg
deleted file mode 100644
index db46f82f..00000000
--- a/dist/css/img/matrix-diagonal-lower.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
diff --git a/dist/css/img/matrix-diagonal-upper.svg b/dist/css/img/matrix-diagonal-upper.svg
deleted file mode 100644
index 04a96351..00000000
--- a/dist/css/img/matrix-diagonal-upper.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
diff --git a/dist/css/juicebox.css b/dist/css/juicebox.css
deleted file mode 100644
index ee0d9def..00000000
--- a/dist/css/juicebox.css
+++ /dev/null
@@ -1,1270 +0,0 @@
-:root {
- --nav-bar-label-height: 36px;
- --nav-bar-widget-container-height: 36px;
- --nav-bar-widget-container-margin: 4px;
- --hic-scrollbar-height: 20px;
- --hic-axis-height: 40px;
- --track-margin: 2px;
- --track-height: 36px;
- --hic-viewport-width: 640px;
- --hic-viewport-height: 640px;
- --hic-viewport-spinner-size: 120px;
-}
-
-.jb-igv-menu-popup {
- position: absolute;
- top: 0;
- left: 0;
- min-width: 132px;
- z-index: 4096;
- cursor: pointer;
- font-family: "Open Sans", sans-serif;
- font-size: small;
- font-weight: 400;
- color: #4b4b4b;
- background: white;
- border-radius: 4px;
- border-color: #7F7F7F;
- border-style: solid;
- border-width: thin;
- display: flex;
- flex-flow: column;
- flex-wrap: nowrap;
- justify-content: flex-start;
- align-items: flex-end;
- text-align: left;
-}
-.jb-igv-menu-popup > div:not(:first-child) {
- width: 100%;
-}
-.jb-igv-menu-popup > div:not(:first-child) > div {
- background: white;
-}
-.jb-igv-menu-popup > div:not(:first-child) > div.context-menu {
- padding-left: 4px;
- padding-right: 4px;
-}
-.jb-igv-menu-popup > div:not(:first-child) > div:last-child {
- border-bottom-left-radius: 4px;
- border-bottom-right-radius: 4px;
- border-bottom-color: transparent;
- border-bottom-style: solid;
- border-bottom-width: thin;
-}
-.jb-igv-menu-popup > div:not(:first-child) > div:hover {
- background: #efefef;
-}
-
-.jb-igv-menu-popup-shim {
- padding-left: 8px;
- padding-right: 8px;
- width: unset !important;
-}
-
-.jb-igv-menu-popup-header {
- position: relative;
- width: 100%;
- height: 24px;
- cursor: move;
- border-top-color: transparent;
- border-top-left-radius: 4px;
- border-top-right-radius: 4px;
- border-bottom-color: #7F7F7F;
- border-bottom-style: solid;
- border-bottom-width: thin;
- background-color: #eee;
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: flex-end;
- align-items: center;
-}
-.jb-igv-menu-popup-header div {
- margin-right: 4px;
- height: 12px;
- width: 12px;
- color: #7F7F7F;
-}
-.jb-igv-menu-popup-header div:hover {
- cursor: pointer;
- color: #444;
-}
-
-.jb-igv-menu-popup-check-container {
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: flex-start;
- align-items: center;
- width: 100%;
- height: 20px;
- background-color: transparent;
-}
-.jb-igv-menu-popup-check-container div {
- padding-top: 2px;
- padding-left: 8px;
-}
-.jb-igv-menu-popup-check-container div:first-child {
- position: relative;
- width: 12px;
- height: 12px;
-}
-.jb-igv-menu-popup-check-container div:first-child svg {
- position: absolute;
- width: 12px;
- height: 12px;
-}
-
-.jb-igv-menu-popup-chart {
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: space-evenly;
- align-items: center;
- height: 16px;
-}
-.jb-igv-menu-popup-chart > div {
- font-size: 0.75rem;
- font-weight: 800;
- width: 16px;
- height: 16px;
- line-height: 16px;
- color: white;
- text-align: center;
- vertical-align: middle;
-}
-.jb-igv-menu-popup-chart > div:nth-child(1) {
- background-color: rgb(0, 200, 0);
-}
-.jb-igv-menu-popup-chart > div:nth-child(2) {
- background-color: rgb(0, 0, 200);
-}
-.jb-igv-menu-popup-chart > div:nth-child(3) {
- background-color: rgb(255, 0, 0);
-}
-.jb-igv-menu-popup-chart > div:nth-child(4) {
- background-color: rgb(209, 113, 5);
-}
-
-.hic-igv-right-hand-gutter {
- position: absolute;
- top: 0;
- right: -16px;
- margin-top: 4px;
- background-color: transparent;
- width: unset;
-}
-
-.igv-app-dropdown-item-cloud-storage {
- display: flex;
- flex-direction: row;
- flex-wrap: nowrap;
- justify-content: flex-start;
- align-items: center;
- height: 18px;
- margin-top: 4px;
- margin-bottom: 4px;
-}
-.igv-app-dropdown-item-cloud-storage div:first-child {
- margin-right: 4px;
-}
-.igv-app-dropdown-item-cloud-storage div:last-child {
- margin-left: 4px;
-}
-
-#hic-modal-button-container {
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: flex-start;
- align-items: center;
- margin-top: 64px;
- margin-left: 32px;
- height: 64px;
-}
-#hic-modal-button-container > div {
- margin-left: 12px;
- margin-right: 12px;
-}
-
-#hic-encode-modal > .modal-dialog {
- max-width: 90% !important;
- width: 90% !important;
-}
-
-.hic-root {
- position: relative;
- left: 0;
- right: 0;
- width: calc(var(--hic-scrollbar-height) + var(--hic-axis-height) + var(--hic-viewport-width));
- height: calc(var(--hic-scrollbar-height) + var(--hic-axis-height) + calc(2 * (var(--nav-bar-label-height) + var(--nav-bar-widget-container-height) + 2 * var(--nav-bar-widget-container-margin))) + var(--hic-viewport-height));
- margin: 4px;
- background-color: white;
- border-style: solid;
- border-width: 2px;
- border-color: #bfbfbf;
-}
-
-.hic-root-prevent-interaction {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-color: rgba(99, 99, 99, 0.25);
- z-index: 1024;
-}
-
-.hic-menu {
- position: absolute;
- bottom: 0;
- left: 0;
- width: 200px;
- height: 100%;
- z-index: 4096;
- background-color: #efefef;
- border-right-style: solid;
- border-right-width: thin;
- border-right-color: #5f5f5f;
- display: flex;
- flex-flow: column;
- flex-wrap: nowrap;
- justify-content: flex-start;
- align-items: center;
-}
-.hic-menu .hic-chromosome-selector-widget-container {
- display: flex;
- flex-flow: column;
- flex-wrap: nowrap;
- justify-content: space-around;
- align-items: flex-start;
- width: 100%;
- padding-left: 8px;
- margin-top: 8px;
- margin-bottom: 8px;
- background-color: transparent;
-}
-.hic-menu .hic-chromosome-selector-widget-container div {
- padding-top: 2px;
- padding-bottom: 4px;
-}
-.hic-menu .hic-chromosome-selector-widget-container div {
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: space-between;
- align-items: flex-start;
-}
-.hic-menu .hic-chromosome-selector-widget-container div select {
- display: block;
- cursor: pointer;
- width: 64px;
- height: 24px;
- margin-right: 8px;
- direction: rtl;
-}
-.hic-menu .hic-chromosome-selector-widget-container div div {
- width: 24px;
- height: 24px;
- background-image: url("img/circular-arrows-24-grey.png");
- background-repeat: no-repeat;
-}
-.hic-menu .hic-chromosome-selector-widget-container div div:hover,
-.hic-menu .hic-chromosome-selector-widget-container div div:focus,
-.hic-menu .hic-chromosome-selector-widget-container div div:active {
- cursor: pointer;
- background-image: url("img/circular-arrows-24-blue.png");
-}
-.hic-menu .hic-colorscale-widget-container {
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: space-around;
- align-items: center;
- width: 95%;
- margin-top: calc(2 * 8px);
- margin-bottom: 8px;
-}
-.hic-menu .hic-colorscale-widget-container input {
- display: block;
- margin-right: 4px;
- height: calc(var(--nav-bar-widget-container-height) - 4px);
- width: 96px;
- padding: 4px;
- font-family: "Open Sans", sans-serif;
- font-weight: 400;
- color: #5f5f5f;
- text-align: left;
- outline: none;
- border-style: solid;
- border-width: thin;
- border-color: #a6a6a6;
- background-color: white;
-}
-.hic-menu .hic-colorscale-widget-container i.fa {
- display: block;
- margin-left: 4px;
- margin-right: 4px;
- color: #5f5f5f;
-}
-.hic-menu .hic-colorscale-widget-container i.fa:hover,
-.hic-menu .hic-colorscale-widget-container i.fa:focus,
-.hic-menu .hic-colorscale-widget-container i.fa:active {
- cursor: pointer;
- color: #0f0f0f;
-}
-.hic-menu .hic-normalization-selector-container {
- display: flex;
- flex-flow: column;
- flex-wrap: nowrap;
- justify-content: space-around;
- align-items: flex-start;
- width: 100%;
- padding-left: 8px;
- margin-top: 8px;
- margin-bottom: 8px;
- background-color: transparent;
-}
-.hic-menu .hic-normalization-selector-container select {
- display: block;
- height: calc(var(--nav-bar-widget-container-height) - 4px);
- width: 96px;
- font-family: "Open Sans", sans-serif;
- font-weight: 400;
- color: #5f5f5f;
-}
-.hic-menu .hic-normalization-selector-container select {
- width: 95%;
-}
-.hic-menu .hic-resolution-selector-container {
- display: flex;
- flex-flow: column;
- flex-wrap: nowrap;
- justify-content: space-around;
- align-items: flex-start;
- width: 100%;
- padding-left: 8px;
- margin-top: 8px;
- margin-bottom: 8px;
- background-color: transparent;
-}
-.hic-menu .hic-resolution-selector-container div#hic-resolution-label-container {
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- align-items: flex-start;
- cursor: pointer;
-}
-.hic-menu .hic-resolution-selector-container div#hic-resolution-label-container i.fa#hic-resolution-lock {
- display: block;
- font-size: 12px;
- padding-top: 4px;
- padding-left: 5px;
-}
-.hic-menu .hic-resolution-selector-container div#hic-resolution-label-container i.fa:hover,
-.hic-menu .hic-resolution-selector-container div#hic-resolution-label-container i.fa:focus,
-.hic-menu .hic-resolution-selector-container div#hic-resolution-label-container i.fa:active {
- cursor: pointer;
- color: #0f0f0f;
-}
-.hic-menu .hic-resolution-selector-container select {
- display: block;
- height: calc(var(--nav-bar-widget-container-height) - 4px);
- width: 96px;
- font-family: "Open Sans", sans-serif;
- font-weight: 400;
- color: #5f5f5f;
-}
-.hic-menu .hic-resolution-selector-container select {
- width: 95%;
-}
-.hic-menu .hic-annotation-presentation-button-container {
- display: flex;
- flex-flow: column;
- flex-wrap: nowrap;
- justify-content: space-around;
- align-items: flex-start;
- width: 100%;
- padding-left: 8px;
- margin-top: 8px;
- margin-bottom: 8px;
- background-color: transparent;
-}
-.hic-menu .hic-annotation-presentation-button-container button {
- display: block;
- width: 90%;
- padding: 8px;
- box-shadow: none;
- border-radius: 0;
- border-style: solid;
- border-width: thin;
- border-color: #a6a6a6;
- background-color: transparent;
-}
-.hic-menu .hic-annotation-presentation-button-container button:hover,
-.hic-menu .hic-annotation-presentation-button-container button:active {
- cursor: pointer;
- background-color: #dfdfdf;
-}
-.hic-menu .hic-annotation-presentation-button-container button:focus {
- outline: none;
-}
-
-.hic-menu > div:hover,
-.hic-menu > div:focus,
-.hic-menu > div:active {
- cursor: pointer;
-}
-
-.hic-menu-close-button {
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: flex-end;
- align-items: center;
- width: 100%;
- height: calc(64px / 2);
- margin-top: calc(8px / 2);
- margin-bottom: calc(8px / 2);
- padding-right: 8px;
-}
-.hic-menu-close-button i.fa {
- display: block;
- margin-left: 4px;
- margin-right: 4px;
- color: #5f5f5f;
-}
-.hic-menu-close-button i.fa:hover,
-.hic-menu-close-button i.fa:focus,
-.hic-menu-close-button i.fa:active {
- cursor: pointer;
- color: #0f0f0f;
-}
-
-.hic-annotation-panel-container {
- display: flex;
- flex-flow: column;
- flex-wrap: nowrap;
- align-items: flex-start;
- position: absolute;
- top: 25%;
- left: 15%;
- width: 700px;
- border-style: solid;
- border-width: thin;
- border-color: #5f5f5f;
- background-color: white;
- z-index: 5000;
- color: #0f0f0f;
- font-family: "Open Sans", sans-serif;
- font-size: 12px;
- font-weight: 600;
-}
-.hic-annotation-panel-container .hic-annotation-panel-header {
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: space-between;
- align-items: center;
- width: 100%;
- height: 24px;
- border-bottom-style: solid;
- border-bottom-width: thin;
- border-bottom-color: #dddddd;
- background-color: #dddddd;
-}
-.hic-annotation-panel-container .hic-annotation-panel-header div:first-child {
- display: block;
- margin-top: 2px;
- margin-left: 8px;
- margin-right: 4px;
- text-align: left;
- text-overflow: ellipsis;
- width: 200px;
- height: 100%;
-}
-.hic-annotation-panel-container .hic-annotation-panel-header i.fa {
- display: block;
- margin-right: 4px;
- color: #5f5f5f;
-}
-.hic-annotation-panel-container .hic-annotation-panel-header i.fa:hover,
-.hic-annotation-panel-container .hic-annotation-panel-header i.fa:focus,
-.hic-annotation-panel-container .hic-annotation-panel-header i.fa:active {
- cursor: pointer;
- color: #0f0f0f;
-}
-.hic-annotation-panel-container .hic-annotation-panel-load-container {
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: flex-start;
- align-items: center;
- width: 100%;
- height: 40px;
- border-bottom-style: solid;
- border-bottom-width: thin;
- border-bottom-color: #dddddd;
- font-size: 14px;
- font-weight: 400;
-}
-.hic-annotation-panel-container .hic-annotation-panel-load-container div {
- margin-left: 8px;
- background-color: rgba(94, 219, 255, 0.51);
-}
-.hic-annotation-panel-container .hic-annotation-row-container {
- display: flex;
- flex-flow: column;
- flex-wrap: nowrap;
- justify-content: flex-start;
- align-items: center;
- width: 100%;
-}
-.hic-annotation-panel-container .hic-annotation-modal-row {
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: space-between;
- align-items: center;
- width: 100%;
- height: 40px;
- background-color: white;
- cursor: default;
-}
-.hic-annotation-panel-container .hic-annotation-modal-row > div:first-child {
- display: block;
- margin-left: 8px;
- margin-right: 4px;
- text-align: left;
- text-overflow: ellipsis;
- width: 384px;
-}
-.hic-annotation-panel-container .hic-annotation-modal-row > i.fa {
- display: block;
- color: #5f5f5f;
-}
-.hic-annotation-panel-container .hic-annotation-modal-row > i.fa:last-child {
- margin-right: 32px;
-}
-.hic-annotation-panel-container .hic-annotation-modal-row .matrix-diagonal-widget-container {
- cursor: pointer;
- width: 16px;
- height: 16px;
- background-repeat: no-repeat;
- background-size: 16px 16px;
-}
-.hic-annotation-panel-container .hic-annotation-modal-row .matrix-diagonal-widget-all {
- background: url(img/matrix-diagonal-all.svg);
-}
-.hic-annotation-panel-container .hic-annotation-modal-row .matrix-diagonal-widget-lower {
- background: url(img/matrix-diagonal-lower.svg);
-}
-.hic-annotation-panel-container .hic-annotation-modal-row .matrix-diagonal-widget-upper {
- background: url(img/matrix-diagonal-upper.svg);
-}
-.hic-annotation-panel-container .hic-annotation-modal-row .up-down-arrow-container {
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: flex-end;
- align-items: center;
-}
-.hic-annotation-panel-container .hic-annotation-modal-row .up-down-arrow-container i.fa:first-child {
- display: block;
- margin-left: 32px;
- margin-right: 8px;
- color: #5f5f5f;
-}
-.hic-annotation-panel-container .hic-annotation-modal-row .up-down-arrow-container i.fa:last-child {
- display: block;
- margin-left: 8px;
- margin-right: 32px;
- color: #5f5f5f;
-}
-.hic-annotation-panel-container .hic-annotation-modal-row:hover,
-.hic-annotation-panel-container .hic-annotation-modal-row:focus,
-.hic-annotation-panel-container .hic-annotation-modal-row:active {
- background-color: #f7f7f7;
-}
-
-.hic-color-swatch-container {
- position: absolute;
- z-index: 4096;
- display: flex;
- flex-direction: row;
- flex-wrap: wrap;
- justify-content: flex-start;
- align-items: center;
- width: 100%;
- background-color: white;
-}
-.hic-color-swatch-container div:first-child {
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: flex-end;
- align-items: center;
- width: 100%;
- height: 24px;
-}
-.hic-color-swatch-container div:first-child i.fa {
- display: block;
- margin-right: 4px;
- color: #5f5f5f;
-}
-.hic-color-swatch-container div:first-child i.fa:hover,
-.hic-color-swatch-container div:first-child i.fa:focus,
-.hic-color-swatch-container div:first-child i.fa:active {
- cursor: pointer;
- color: #0f0f0f;
-}
-
-.hic-navbar-container {
- display: flex;
- flex-flow: column;
- flex-wrap: nowrap;
- justify-content: flex-start;
- align-items: center;
- width: 100%;
- color: #5f5f5f;
- font-family: "Open Sans", sans-serif;
- font-size: 14px;
- font-weight: 400;
- background-color: #f7f7f7;
-}
-.hic-navbar-container div[id$=hic-nav-bar-map-container] {
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: space-between;
- align-items: center;
- width: 95%;
- height: var(--nav-bar-label-height);
-}
-.hic-navbar-container div[id$=hic-nav-bar-map-container] div[id$=hic-nav-bar-map-label] {
- height: 100%;
- text-overflow: ellipsis;
- white-space: nowrap;
- overflow: hidden;
- vertical-align: middle;
- line-height: var(--nav-bar-label-height);
- background-color: transparent;
-}
-.hic-navbar-container div[id$=hic-nav-bar-map-container] .hic-nav-bar-button-container {
- height: 100%;
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: flex-end;
- align-items: center;
- color: #5f5f5f;
-}
-.hic-navbar-container div[id$=hic-nav-bar-map-container] .hic-nav-bar-button-container i {
- display: block;
- margin-top: 8px;
-}
-.hic-navbar-container div[id$=hic-nav-bar-map-container] .hic-nav-bar-button-container i:first-child {
- margin-right: 4px;
-}
-.hic-navbar-container div[id$=hic-nav-bar-map-container] .hic-nav-bar-button-container i:last-child {
- margin-left: 4px;
-}
-.hic-navbar-container div[id$=hic-nav-bar-map-container] .hic-nav-bar-button-container i:hover {
- cursor: pointer;
- color: #0f0f0f;
-}
-.hic-navbar-container div[id$=hic-nav-bar-widget-container] {
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: space-between;
- align-items: center;
- width: 95%;
- height: var(--nav-bar-widget-container-height);
- margin-top: var(--nav-bar-widget-container-margin);
- margin-bottom: var(--nav-bar-widget-container-margin);
-}
-
-.hic-chromosome-goto-container {
- width: 75%;
-}
-.hic-chromosome-goto-container input {
- display: block;
- height: calc(var(--nav-bar-widget-container-height) - 4px);
- width: 100%;
- padding-left: 4px;
- font-family: "Open Sans", sans-serif;
- font-weight: 400;
- color: #5f5f5f;
- text-align: left;
- outline: none;
- border-style: solid;
- border-width: thin;
- border-color: #a6a6a6;
- background-color: white;
-}
-
-.hic-colorscale-widget-container {
- width: 30%;
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: space-between;
- align-items: center;
-}
-.hic-colorscale-widget-container > i.fa-minus {
- display: block;
- margin-left: 1%;
- margin-right: 1%;
- color: #5f5f5f;
-}
-.hic-colorscale-widget-container > i.fa-plus {
- display: block;
- margin-left: 1%;
- margin-right: 1%;
- color: #5f5f5f;
-}
-.hic-colorscale-widget-container input {
- display: block;
- margin-right: 4px;
- height: calc(var(--nav-bar-widget-container-height) - 4px);
- width: 96px;
- padding: 4px;
- font-family: "Open Sans", sans-serif;
- font-weight: 400;
- color: #5f5f5f;
- text-align: left;
- outline: none;
- border-style: solid;
- border-width: thin;
- border-color: #a6a6a6;
- background-color: white;
-}
-.hic-colorscale-widget-container input {
- width: 30%;
- height: 32px;
-}
-.hic-colorscale-widget-container i.fa-minus {
- display: block;
- margin-left: 2%;
- margin-right: 2%;
- color: #5f5f5f;
-}
-.hic-colorscale-widget-container i.fa-minus:hover,
-.hic-colorscale-widget-container i.fa-minus:focus,
-.hic-colorscale-widget-container i.fa-minus:active {
- cursor: pointer;
- color: #0f0f0f;
-}
-.hic-colorscale-widget-container i.fa-plus {
- display: block;
- margin-left: 2%;
- margin-right: 2%;
- color: #5f5f5f;
-}
-.hic-colorscale-widget-container i.fa-plus:hover,
-.hic-colorscale-widget-container i.fa-plus:focus,
-.hic-colorscale-widget-container i.fa-plus:active {
- cursor: pointer;
- color: #0f0f0f;
-}
-
-.hic-control-map-selector-container {
- margin-left: 40px;
- width: 20%;
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: flex-start;
- align-items: center;
-}
-.hic-control-map-selector-container select {
- display: block;
- height: calc(var(--nav-bar-widget-container-height) - 4px);
- width: 96px;
- font-family: "Open Sans", sans-serif;
- font-weight: 400;
- color: #5f5f5f;
-}
-.hic-control-map-selector-container div {
- cursor: pointer;
- margin-left: 6px;
- margin-top: 6px;
-}
-
-.hic-normalization-selector-container {
- width: 25%;
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: flex-end;
- align-items: center;
-}
-.hic-normalization-selector-container div {
- display: block;
- margin-right: 6px;
-}
-.hic-normalization-selector-container select {
- display: block;
- height: calc(var(--nav-bar-widget-container-height) - 4px);
- width: 96px;
- font-family: "Open Sans", sans-serif;
- font-weight: 400;
- color: #5f5f5f;
-}
-.hic-normalization-selector-container select {
- width: 75%;
-}
-
-.hic-resolution-selector-container {
- width: 25%;
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: flex-end;
- align-items: center;
-}
-.hic-resolution-selector-container div#hic-resolution-label-container {
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- align-items: flex-start;
- margin-right: 6px;
- cursor: pointer;
-}
-.hic-resolution-selector-container div#hic-resolution-label-container i.fa#hic-resolution-lock {
- display: block;
- font-size: 12px;
- padding-top: 4px;
- padding-left: 5px;
-}
-.hic-resolution-selector-container div#hic-resolution-label-container i.fa:hover,
-.hic-resolution-selector-container div#hic-resolution-label-container i.fa:focus,
-.hic-resolution-selector-container div#hic-resolution-label-container i.fa:active {
- cursor: pointer;
- color: #0f0f0f;
-}
-.hic-resolution-selector-container select {
- display: block;
- height: calc(var(--nav-bar-widget-container-height) - 4px);
- width: 96px;
- font-family: "Open Sans", sans-serif;
- font-weight: 400;
- color: #5f5f5f;
-}
-.hic-resolution-selector-container select {
- width: 74%;
-}
-
-div[id$=x-track-container] {
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: flex-start;
- width: 100%;
- height: calc(0 * var(--track-height));
- background-color: white;
-}
-div[id$=x-track-container] div[id$=track-shim] {
- width: calc(0 * var(--track-height));
- height: 100%;
- margin-right: var(--hic-axis-height);
-}
-div[id$=x-track-container] div[id$=x-tracks] {
- position: relative;
- display: flex;
- flex-flow: column;
- flex-wrap: nowrap;
- justify-content: flex-start;
- width: calc(100% - (calc(0 * var(--track-height)) + var(--hic-axis-height) + var(--hic-scrollbar-height)));
- height: 100%;
- margin-right: var(--hic-scrollbar-height);
-}
-div[id$=x-track-container] div[id$=x-tracks] div[id$=y-track-guide] {
- position: absolute;
- top: 0;
- left: 50%;
- width: 1px;
- height: 100%;
- border-left-style: dotted;
- border-left-width: thin;
- border-left-color: rgb(32, 32, 32);
- user-select: none;
- -moz-user-select: none;
- -webkit-user-select: none;
- z-index: 666;
-}
-div[id$=x-track-container] div[id$=x-tracks] .x-track-canvas-container {
- cursor: pointer;
- position: relative;
- width: 100%;
- margin-right: 0;
- margin-bottom: var(--track-margin);
-}
-div[id$=x-track-container] div[id$=x-tracks] .x-track-canvas-container .x-track-reorder-handle {
- display: block;
- position: absolute;
- top: 0;
- left: -32px;
- width: 16px;
- height: 100%;
- background-color: transparent;
-}
-div[id$=x-track-container] div[id$=x-tracks] .x-track-canvas-container .x-track-reorder-handle > i {
- color: #7F7F7F;
- font-size: 0.8rem;
- display: block;
-}
-div[id$=x-track-container] div[id$=x-tracks] .x-track-canvas-container .x-track-reorder-handle > i:first-child {
- margin-top: 2px;
- margin-bottom: 1px;
-}
-div[id$=x-track-container] div[id$=x-tracks] .x-track-canvas-container .x-track-reorder-handle > i:last-child {
- margin-top: 1px;
- margin-bottom: 2px;
-}
-div[id$=x-track-container] div[id$=x-tracks] .x-track-canvas-container .x-track-label {
- display: inline-block;
- position: absolute;
- top: 0;
- left: 0;
- height: 22px;
- width: 120px;
- margin-top: calc(0.125 * var(--track-height));
- padding-left: 4px;
- padding-right: 4px;
- padding-top: 1px;
- padding-bottom: 1px;
- font-family: "Open Sans", sans-serif;
- font-size: 12px;
- font-weight: 400;
- text-align: center;
- vertical-align: top;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-div[id$=x-track-container] div[id$=x-tracks] .x-track-canvas-container .x-track-spinner {
- position: absolute;
- top: 0;
- left: 50%;
- width: var(--track-height);
- height: var(--track-height);
- margin-left: -var(--track-height)/2;
- background-color: rgba(255, 255, 255, 0);
-}
-
-div[id$=content-container] {
- display: flex;
- flex-flow: column;
- flex-wrap: nowrap;
- justify-content: space-between;
- width: 100%;
- height: calc(100% - (calc(2 * (var(--nav-bar-label-height) + var(--nav-bar-widget-container-height) + 2 * var(--nav-bar-widget-container-margin))) + calc(0 * var(--track-height))));
- background-color: white;
-}
-div[id$=content-container] div[id$=x-axis-container] {
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: flex-end;
- width: 100%;
- height: var(--hic-axis-height);
-}
-div[id$=content-container] div[id$=x-axis-container] div[id$=x-axis] {
- width: calc(100% - (calc(0 * var(--track-height)) + var(--hic-axis-height) + var(--hic-scrollbar-height)));
- height: 100%;
- margin-right: var(--hic-scrollbar-height);
- background-color: white;
-}
-div[id$=content-container] div[id$=x-axis-container] div[id$=x-axis] div[id$=x-axis-whole-genome-container] {
- width: 100%;
- height: 100%;
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: flex-start;
-}
-div[id$=content-container] div[id$=x-axis-container] div[id$=x-axis] div[id$=x-axis-whole-genome-container] .x-axis-whole-genome-chromosome-container {
- font-family: "Open Sans", sans-serif;
- font-size: 8px;
- font-weight: 400;
- color: #444;
- height: 100%;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-div[id$=content-container] div[id$=x-axis-container] div[id$=x-axis] div[id$=x-axis-whole-genome-container] .x-axis-whole-genome-chromosome-container > div {
- display: flex;
- flex-direction: column;
- flex-wrap: nowrap;
- justify-content: center;
- align-items: center;
- width: 100%;
- height: 100%;
- border-left-color: #868686;
- border-left-style: solid;
- border-left-width: thin;
-}
-div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] {
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: flex-end;
- width: 100%;
- height: calc(100% - (var(--hic-axis-height) + var(--hic-scrollbar-height)));
- background-color: white;
-}
-div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=y-tracks] {
- position: relative;
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: flex-start;
- width: calc(0 * var(--track-height));
- height: 100%;
- background-color: white;
-}
-div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=y-tracks] div[id$=x-track-guide] {
- position: absolute;
- top: 50%;
- left: 0;
- width: 100%;
- height: 1px;
- border-top-style: dotted;
- border-top-width: thin;
- border-top-color: rgb(32, 32, 32);
- user-select: none;
- -moz-user-select: none;
- -webkit-user-select: none;
- z-index: 666;
-}
-div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=y-tracks] .y-track-canvas-container {
- display: block;
- position: relative;
- height: 100%;
- margin-right: var(--track-margin);
- background-color: white;
-}
-div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=y-tracks] .y-track-canvas-container .y-track-spinner {
- display: block;
- position: absolute;
- top: 50%;
- left: 0;
- width: var(--track-height);
- height: var(--track-height);
- margin-top: -var(--track-height)/2;
- background-color: rgba(255, 255, 255, 0);
-}
-div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=y-axis] {
- width: var(--hic-axis-height);
- height: 100%;
- margin-bottom: var(--hic-scrollbar-height);
- background-color: white;
-}
-div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=y-axis] div[id$=y-axis-whole-genome-container] {
- width: 100%;
- height: 100%;
- display: flex;
- flex-flow: column;
- flex-wrap: nowrap;
- justify-content: flex-start;
-}
-div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=y-axis] div[id$=y-axis-whole-genome-container] .y-axis-whole-genome-chromosome-container {
- font-family: "Open Sans", sans-serif;
- font-size: 8px;
- font-weight: 400;
- color: #444;
- width: 100%;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=y-axis] div[id$=y-axis-whole-genome-container] .y-axis-whole-genome-chromosome-container > div {
- display: flex;
- flex-direction: column;
- flex-wrap: nowrap;
- justify-content: center;
- align-items: center;
- width: 100%;
- height: 100%;
- border-top-color: #868686;
- border-top-style: solid;
- border-top-width: thin;
-}
-div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=viewport] {
- display: block;
- position: relative;
- left: 0;
- top: 0;
- width: calc(100% - (calc(0 * var(--track-height)) + var(--hic-axis-height) + var(--hic-scrollbar-height)));
- height: 100%;
- overflow-x: hidden;
- overflow-y: hidden;
-}
-div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=viewport] div[id$=viewport-spinner-container] {
- display: table-cell;
- margin: auto;
- position: absolute;
- top: 25%;
- left: 0;
- right: 0;
- height: var(--hic-viewport-spinner-size);
- width: var(--hic-viewport-spinner-size);
- z-index: 2048;
- pointer-events: none;
- background-color: rgba(255, 255, 255, 0);
-}
-div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=viewport] div[id$=sweep-zoom-container] {
- display: block;
- position: absolute;
- top: 0;
- left: 0;
- width: 1px;
- height: 1px;
- z-index: 512;
- background-color: rgba(68, 134, 247, 0.25);
-}
-div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=viewport] div[id$=x-guide] {
- position: absolute;
- top: 50%;
- left: 0;
- width: 100%;
- height: 1px;
- border-top-style: dotted;
- border-top-width: thin;
- border-top-color: rgb(32, 32, 32);
- user-select: none;
- -moz-user-select: none;
- -webkit-user-select: none;
- z-index: 555;
-}
-div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=viewport] div[id$=y-guide] {
- position: absolute;
- top: 0;
- left: 50%;
- width: 1px;
- height: 100%;
- border-left-style: dotted;
- border-left-width: thin;
- border-left-color: rgb(32, 32, 32);
- user-select: none;
- -moz-user-select: none;
- -webkit-user-select: none;
- z-index: 666;
-}
-div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=y-axis-scrollbar-container] {
- display: block;
- position: relative;
- width: var(--hic-scrollbar-height);
- height: 100%;
- background-color: #efefef;
-}
-div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=y-axis-scrollbar-container] div[id$=y-axis-scrollbar] {
- position: relative;
- top: 25%;
- height: 50%;
- left: 0;
- width: 100%;
- background-color: #a5a5a5;
-}
-div[id$=content-container] div[id$=y-tracks-y-axis-viewport-y-scrollbar] div[id$=y-axis-scrollbar-container] div[id$=y-axis-scrollbar] div {
- display: inline-block;
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translateX(-50%) translateY(-50%) rotate(-90deg);
- z-index: 512;
- vertical-align: middle;
- text-align: center;
- line-height: var(--hic-scrollbar-height);
- color: #373737;
- font-family: "Open Sans", sans-serif;
- font-size: medium;
- font-weight: 400;
- white-space: nowrap;
-}
-div[id$=content-container] div[id$=x-scrollbar-container] {
- display: flex;
- flex-flow: row;
- flex-wrap: nowrap;
- justify-content: flex-end;
- width: 100%;
- height: var(--hic-scrollbar-height);
-}
-div[id$=content-container] div[id$=x-scrollbar-container] div[id$=x-axis-scrollbar-container] {
- display: block;
- position: relative;
- width: calc(100% - (calc(0 * var(--track-height)) + var(--hic-axis-height) + var(--hic-scrollbar-height)));
- height: 100%;
- margin-right: var(--hic-scrollbar-height);
- background-color: #efefef;
-}
-div[id$=content-container] div[id$=x-scrollbar-container] div[id$=x-axis-scrollbar-container] div[id$=x-axis-scrollbar] {
- position: relative;
- left: 25%;
- width: 50%;
- top: 0;
- height: 100%;
- background-color: #a5a5a5;
-}
-div[id$=content-container] div[id$=x-scrollbar-container] div[id$=x-axis-scrollbar-container] div[id$=x-axis-scrollbar] div {
- display: inline-block;
- position: absolute;
- margin: auto;
- left: 0;
- top: 0;
- right: 0;
- bottom: 0;
- height: var(--hic-scrollbar-height);
- width: 100%;
- z-index: 512;
- vertical-align: middle;
- text-align: center;
- line-height: var(--hic-scrollbar-height);
- color: #373737;
- font-family: "Open Sans", sans-serif;
- font-size: medium;
- font-weight: 400;
- white-space: nowrap;
-}
-
-.hic-whole-genome-chromosome-highlight {
- cursor: pointer;
-}
-
-.hic-track-menu {
- position: absolute;
- color: white;
- width: 120px;
- height: 120px;
- background-color: #3a8ab4;
-}
-
-.hic-root-selected {
- border-color: #5f5f5f;
-}
-
-.unselect {
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-
-.igv-trackgear-container {
- position: relative;
- width: 14px;
- height: 14px;
- margin-left: 4px;
- color: #7F7F7F;
-}
-
-.igv-trackgear-container:hover {
- cursor: pointer;
- color: #444;
-}
-
-/*# sourceMappingURL=juicebox.css.map */
diff --git a/dist/juicebox.esm.js b/dist/juicebox.esm.js
deleted file mode 100644
index 1a17ee34..00000000
--- a/dist/juicebox.esm.js
+++ /dev/null
@@ -1,91377 +0,0 @@
-/**
- * Covers string literals and String objects
- * @param x
- * @returns {boolean}
- */
-function isString$3(x) {
- return typeof x === "string" || x instanceof String
-}
-
-
-// StackOverflow: http://stackoverflow.com/a/10810674/116169
-function numberFormatter$2(rawNumber) {
-
- var dec = String(rawNumber).split(/[.,]/),
- sep = ',',
- decsep = '.';
-
- return dec[0].split('').reverse().reduce(function (prev, now, i) {
- return i % 3 === 0 ? prev + sep + now : prev + now;
- }).split('').reverse().join('') + (dec[1] ? decsep + dec[1] : '');
-}
-
-const numberUnFormatter = formatedNumber => formatedNumber.split(",").join().replace(",", "", "g");
-
-const splitLines$6 = function (string) {
- return string.split(/\n|\r\n|\r/g);
-};
-
-function stripQuotes$2(str) {
- if(str === undefined) {
- return str;
- }
- if(str.startsWith("'") || str.startsWith('"')) {
- str = str.substring(1);
- }
- if (str.endsWith("'") || str.endsWith('"')) {
- str = str.substring(0, str.length - 1);
- }
- return str;
-}
-
-/**
- * Return the filename from the path. Example
- * https://foo.com/bar.bed?param=2 => bar.bed
- * @param urlOrFile
- */
-
-function getFilename$3(urlOrFile) {
-
- if (urlOrFile.name !== undefined) {
- return urlOrFile.name
- } else if (isString$3(urlOrFile)) {
-
- let index = urlOrFile.lastIndexOf("/");
- let filename = index < 0 ? urlOrFile : urlOrFile.substr(index + 1);
-
- //Strip parameters -- handle local files later
- index = filename.indexOf("?");
- if (index > 0) {
- filename = filename.substr(0, index);
- }
- return filename
- } else {
- throw Error(`Expected File or string, got ${typeof urlOrFile}`)
- }
-}
-
-
-/**
- * Test if object is a File or File-like object.
- *
- * @param object
- */
-function isFile$2(object) {
- if(!object) {
- return false;
- }
- return typeof object !== 'function' &&
- (object instanceof File ||
- (object.hasOwnProperty("name") && typeof object.slice === 'function' && typeof object.arrayBuffer === 'function'))
-}
-
-if (typeof process === 'object' && typeof window === 'undefined') {
- global.atob = function (str) {
- return Buffer.from(str, 'base64').toString('binary');
- };
-}
-
-
-function parseUri$1(str) {
-
- var o = options$1,
- m = o.parser["loose"].exec(str),
- uri = {},
- i = 14;
-
- while (i--) uri[o.key[i]] = m[i] || "";
-
- uri[o.q.name] = {};
- uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
- if ($1) uri[o.q.name][$1] = $2;
- });
-
- return uri;
-}
-
-const options$1 = {
- strictMode: false,
- key: ["source", "protocol", "authority", "userInfo", "user", "password", "host", "port", "relative", "path", "directory", "file", "query", "anchor"],
- q: {
- name: "queryKey",
- parser: /(?:^|&)([^&=]*)=?([^&]*)/g
- },
- parser: {
- strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
- loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
- }
-};
-
-/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-/* eslint-disable space-unary-ops */
-
-/* Public constants ==========================================================*/
-/* ===========================================================================*/
-
-
-//const Z_FILTERED = 1;
-//const Z_HUFFMAN_ONLY = 2;
-//const Z_RLE = 3;
-const Z_FIXED$1$1 = 4;
-//const Z_DEFAULT_STRATEGY = 0;
-
-/* Possible values of the data_type field (though see inflate()) */
-const Z_BINARY$1 = 0;
-const Z_TEXT$1 = 1;
-//const Z_ASCII = 1; // = Z_TEXT
-const Z_UNKNOWN$1$1 = 2;
-
-/*============================================================================*/
-
-
-function zero$1$2(buf) { let len = buf.length; while (--len >= 0) { buf[len] = 0; } }
-
-// From zutil.h
-
-const STORED_BLOCK$1 = 0;
-const STATIC_TREES$1 = 1;
-const DYN_TREES$1 = 2;
-/* The three kinds of block type */
-
-const MIN_MATCH$1$2 = 3;
-const MAX_MATCH$1$2 = 258;
-/* The minimum and maximum match lengths */
-
-// From deflate.h
-/* ===========================================================================
- * Internal compression state.
- */
-
-const LENGTH_CODES$1$2 = 29;
-/* number of length codes, not counting the special END_BLOCK code */
-
-const LITERALS$1$2 = 256;
-/* number of literal bytes 0..255 */
-
-const L_CODES$1$2 = LITERALS$1$2 + 1 + LENGTH_CODES$1$2;
-/* number of Literal or Length codes, including the END_BLOCK code */
-
-const D_CODES$1$2 = 30;
-/* number of distance codes */
-
-const BL_CODES$1$1 = 19;
-/* number of codes used to transfer the bit lengths */
-
-const HEAP_SIZE$1$1 = 2 * L_CODES$1$2 + 1;
-/* maximum heap size */
-
-const MAX_BITS$1$1 = 15;
-/* All codes must not exceed MAX_BITS bits */
-
-const Buf_size$1 = 16;
-/* size of bit buffer in bi_buf */
-
-
-/* ===========================================================================
- * Constants
- */
-
-const MAX_BL_BITS$1 = 7;
-/* Bit length codes must not exceed MAX_BL_BITS bits */
-
-const END_BLOCK$1 = 256;
-/* end of block literal code */
-
-const REP_3_6$1 = 16;
-/* repeat previous bit length 3-6 times (2 bits of repeat count) */
-
-const REPZ_3_10$1 = 17;
-/* repeat a zero length 3-10 times (3 bits of repeat count) */
-
-const REPZ_11_138$1 = 18;
-/* repeat a zero length 11-138 times (7 bits of repeat count) */
-
-/* eslint-disable comma-spacing,array-bracket-spacing */
-const extra_lbits$1 = /* extra bits for each length code */
- new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]);
-
-const extra_dbits$1 = /* extra bits for each distance code */
- new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]);
-
-const extra_blbits$1 = /* extra bits for each bit length code */
- new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]);
-
-const bl_order$1 =
- new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);
-/* eslint-enable comma-spacing,array-bracket-spacing */
-
-/* The lengths of the bit length codes are sent in order of decreasing
- * probability, to avoid transmitting the lengths for unused bit length codes.
- */
-
-/* ===========================================================================
- * Local data. These are initialized only once.
- */
-
-// We pre-fill arrays with 0 to avoid uninitialized gaps
-
-const DIST_CODE_LEN$2 = 512; /* see definition of array dist_code below */
-
-// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1
-const static_ltree$2 = new Array((L_CODES$1$2 + 2) * 2);
-zero$1$2(static_ltree$2);
-/* The static literal tree. Since the bit lengths are imposed, there is no
- * need for the L_CODES extra codes used during heap construction. However
- * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
- * below).
- */
-
-const static_dtree$2 = new Array(D_CODES$1$2 * 2);
-zero$1$2(static_dtree$2);
-/* The static distance tree. (Actually a trivial tree since all codes use
- * 5 bits.)
- */
-
-const _dist_code$2 = new Array(DIST_CODE_LEN$2);
-zero$1$2(_dist_code$2);
-/* Distance codes. The first 256 values correspond to the distances
- * 3 .. 258, the last 256 values correspond to the top 8 bits of
- * the 15 bit distances.
- */
-
-const _length_code$2 = new Array(MAX_MATCH$1$2 - MIN_MATCH$1$2 + 1);
-zero$1$2(_length_code$2);
-/* length code for each normalized match length (0 == MIN_MATCH) */
-
-const base_length$2 = new Array(LENGTH_CODES$1$2);
-zero$1$2(base_length$2);
-/* First normalized length for each code (0 = MIN_MATCH) */
-
-const base_dist$2 = new Array(D_CODES$1$2);
-zero$1$2(base_dist$2);
-/* First normalized distance for each code (0 = distance of 1) */
-
-
-function StaticTreeDesc$1(static_tree, extra_bits, extra_base, elems, max_length) {
-
- this.static_tree = static_tree; /* static tree or NULL */
- this.extra_bits = extra_bits; /* extra bits for each code or NULL */
- this.extra_base = extra_base; /* base index for extra_bits */
- this.elems = elems; /* max number of elements in the tree */
- this.max_length = max_length; /* max bit length for the codes */
-
- // show if `static_tree` has data or dummy - needed for monomorphic objects
- this.has_stree = static_tree && static_tree.length;
-}
-
-
-let static_l_desc$1;
-let static_d_desc$1;
-let static_bl_desc$1;
-
-
-function TreeDesc$1(dyn_tree, stat_desc) {
- this.dyn_tree = dyn_tree; /* the dynamic tree */
- this.max_code = 0; /* largest code with non zero frequency */
- this.stat_desc = stat_desc; /* the corresponding static tree */
-}
-
-
-
-const d_code$1 = (dist) => {
-
- return dist < 256 ? _dist_code$2[dist] : _dist_code$2[256 + (dist >>> 7)];
-};
-
-
-/* ===========================================================================
- * Output a short LSB first on the stream.
- * IN assertion: there is enough room in pendingBuf.
- */
-const put_short$1 = (s, w) => {
-// put_byte(s, (uch)((w) & 0xff));
-// put_byte(s, (uch)((ush)(w) >> 8));
- s.pending_buf[s.pending++] = (w) & 0xff;
- s.pending_buf[s.pending++] = (w >>> 8) & 0xff;
-};
-
-
-/* ===========================================================================
- * Send a value on a given number of bits.
- * IN assertion: length <= 16 and value fits in length bits.
- */
-const send_bits$1 = (s, value, length) => {
-
- if (s.bi_valid > (Buf_size$1 - length)) {
- s.bi_buf |= (value << s.bi_valid) & 0xffff;
- put_short$1(s, s.bi_buf);
- s.bi_buf = value >> (Buf_size$1 - s.bi_valid);
- s.bi_valid += length - Buf_size$1;
- } else {
- s.bi_buf |= (value << s.bi_valid) & 0xffff;
- s.bi_valid += length;
- }
-};
-
-
-const send_code$1 = (s, c, tree) => {
-
- send_bits$1(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);
-};
-
-
-/* ===========================================================================
- * Reverse the first len bits of a code, using straightforward code (a faster
- * method would use a table)
- * IN assertion: 1 <= len <= 15
- */
-const bi_reverse$1 = (code, len) => {
-
- let res = 0;
- do {
- res |= code & 1;
- code >>>= 1;
- res <<= 1;
- } while (--len > 0);
- return res >>> 1;
-};
-
-
-/* ===========================================================================
- * Flush the bit buffer, keeping at most 7 bits in it.
- */
-const bi_flush$1 = (s) => {
-
- if (s.bi_valid === 16) {
- put_short$1(s, s.bi_buf);
- s.bi_buf = 0;
- s.bi_valid = 0;
-
- } else if (s.bi_valid >= 8) {
- s.pending_buf[s.pending++] = s.bi_buf & 0xff;
- s.bi_buf >>= 8;
- s.bi_valid -= 8;
- }
-};
-
-
-/* ===========================================================================
- * Compute the optimal bit lengths for a tree and update the total bit length
- * for the current block.
- * IN assertion: the fields freq and dad are set, heap[heap_max] and
- * above are the tree nodes sorted by increasing frequency.
- * OUT assertions: the field len is set to the optimal bit length, the
- * array bl_count contains the frequencies for each bit length.
- * The length opt_len is updated; static_len is also updated if stree is
- * not null.
- */
-const gen_bitlen$1 = (s, desc) => {
-// deflate_state *s;
-// tree_desc *desc; /* the tree descriptor */
-
- const tree = desc.dyn_tree;
- const max_code = desc.max_code;
- const stree = desc.stat_desc.static_tree;
- const has_stree = desc.stat_desc.has_stree;
- const extra = desc.stat_desc.extra_bits;
- const base = desc.stat_desc.extra_base;
- const max_length = desc.stat_desc.max_length;
- let h; /* heap index */
- let n, m; /* iterate over the tree elements */
- let bits; /* bit length */
- let xbits; /* extra bits */
- let f; /* frequency */
- let overflow = 0; /* number of elements with bit length too large */
-
- for (bits = 0; bits <= MAX_BITS$1$1; bits++) {
- s.bl_count[bits] = 0;
- }
-
- /* In a first pass, compute the optimal bit lengths (which may
- * overflow in the case of the bit length tree).
- */
- tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */
-
- for (h = s.heap_max + 1; h < HEAP_SIZE$1$1; h++) {
- n = s.heap[h];
- bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;
- if (bits > max_length) {
- bits = max_length;
- overflow++;
- }
- tree[n * 2 + 1]/*.Len*/ = bits;
- /* We overwrite tree[n].Dad which is no longer needed */
-
- if (n > max_code) { continue; } /* not a leaf node */
-
- s.bl_count[bits]++;
- xbits = 0;
- if (n >= base) {
- xbits = extra[n - base];
- }
- f = tree[n * 2]/*.Freq*/;
- s.opt_len += f * (bits + xbits);
- if (has_stree) {
- s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);
- }
- }
- if (overflow === 0) { return; }
-
- // Tracev((stderr,"\nbit length overflow\n"));
- /* This happens for example on obj2 and pic of the Calgary corpus */
-
- /* Find the first bit length which could increase: */
- do {
- bits = max_length - 1;
- while (s.bl_count[bits] === 0) { bits--; }
- s.bl_count[bits]--; /* move one leaf down the tree */
- s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */
- s.bl_count[max_length]--;
- /* The brother of the overflow item also moves one step up,
- * but this does not affect bl_count[max_length]
- */
- overflow -= 2;
- } while (overflow > 0);
-
- /* Now recompute all bit lengths, scanning in increasing frequency.
- * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
- * lengths instead of fixing only the wrong ones. This idea is taken
- * from 'ar' written by Haruhiko Okumura.)
- */
- for (bits = max_length; bits !== 0; bits--) {
- n = s.bl_count[bits];
- while (n !== 0) {
- m = s.heap[--h];
- if (m > max_code) { continue; }
- if (tree[m * 2 + 1]/*.Len*/ !== bits) {
- // Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
- s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;
- tree[m * 2 + 1]/*.Len*/ = bits;
- }
- n--;
- }
- }
-};
-
-
-/* ===========================================================================
- * Generate the codes for a given tree and bit counts (which need not be
- * optimal).
- * IN assertion: the array bl_count contains the bit length statistics for
- * the given tree and the field len is set for all tree elements.
- * OUT assertion: the field code is set for all tree elements of non
- * zero code length.
- */
-const gen_codes$1 = (tree, max_code, bl_count) => {
-// ct_data *tree; /* the tree to decorate */
-// int max_code; /* largest code with non zero frequency */
-// ushf *bl_count; /* number of codes at each bit length */
-
- const next_code = new Array(MAX_BITS$1$1 + 1); /* next code value for each bit length */
- let code = 0; /* running code value */
- let bits; /* bit index */
- let n; /* code index */
-
- /* The distribution counts are first used to generate the code values
- * without bit reversal.
- */
- for (bits = 1; bits <= MAX_BITS$1$1; bits++) {
- code = (code + bl_count[bits - 1]) << 1;
- next_code[bits] = code;
- }
- /* Check that the bit counts in bl_count are consistent. The last code
- * must be all ones.
- */
- //Assert (code + bl_count[MAX_BITS]-1 == (1< {
-
- let n; /* iterates over tree elements */
- let bits; /* bit counter */
- let length; /* length value */
- let code; /* code value */
- let dist; /* distance index */
- const bl_count = new Array(MAX_BITS$1$1 + 1);
- /* number of codes at each bit length for an optimal tree */
-
- // do check in _tr_init()
- //if (static_init_done) return;
-
- /* For some embedded targets, global variables are not initialized: */
-/*#ifdef NO_INIT_GLOBAL_POINTERS
- static_l_desc.static_tree = static_ltree;
- static_l_desc.extra_bits = extra_lbits;
- static_d_desc.static_tree = static_dtree;
- static_d_desc.extra_bits = extra_dbits;
- static_bl_desc.extra_bits = extra_blbits;
-#endif*/
-
- /* Initialize the mapping length (0..255) -> length code (0..28) */
- length = 0;
- for (code = 0; code < LENGTH_CODES$1$2 - 1; code++) {
- base_length$2[code] = length;
- for (n = 0; n < (1 << extra_lbits$1[code]); n++) {
- _length_code$2[length++] = code;
- }
- }
- //Assert (length == 256, "tr_static_init: length != 256");
- /* Note that the length 255 (match length 258) can be represented
- * in two different ways: code 284 + 5 bits or code 285, so we
- * overwrite length_code[255] to use the best encoding:
- */
- _length_code$2[length - 1] = code;
-
- /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
- dist = 0;
- for (code = 0; code < 16; code++) {
- base_dist$2[code] = dist;
- for (n = 0; n < (1 << extra_dbits$1[code]); n++) {
- _dist_code$2[dist++] = code;
- }
- }
- //Assert (dist == 256, "tr_static_init: dist != 256");
- dist >>= 7; /* from now on, all distances are divided by 128 */
- for (; code < D_CODES$1$2; code++) {
- base_dist$2[code] = dist << 7;
- for (n = 0; n < (1 << (extra_dbits$1[code] - 7)); n++) {
- _dist_code$2[256 + dist++] = code;
- }
- }
- //Assert (dist == 256, "tr_static_init: 256+dist != 512");
-
- /* Construct the codes of the static literal tree */
- for (bits = 0; bits <= MAX_BITS$1$1; bits++) {
- bl_count[bits] = 0;
- }
-
- n = 0;
- while (n <= 143) {
- static_ltree$2[n * 2 + 1]/*.Len*/ = 8;
- n++;
- bl_count[8]++;
- }
- while (n <= 255) {
- static_ltree$2[n * 2 + 1]/*.Len*/ = 9;
- n++;
- bl_count[9]++;
- }
- while (n <= 279) {
- static_ltree$2[n * 2 + 1]/*.Len*/ = 7;
- n++;
- bl_count[7]++;
- }
- while (n <= 287) {
- static_ltree$2[n * 2 + 1]/*.Len*/ = 8;
- n++;
- bl_count[8]++;
- }
- /* Codes 286 and 287 do not exist, but we must include them in the
- * tree construction to get a canonical Huffman tree (longest code
- * all ones)
- */
- gen_codes$1(static_ltree$2, L_CODES$1$2 + 1, bl_count);
-
- /* The static distance tree is trivial: */
- for (n = 0; n < D_CODES$1$2; n++) {
- static_dtree$2[n * 2 + 1]/*.Len*/ = 5;
- static_dtree$2[n * 2]/*.Code*/ = bi_reverse$1(n, 5);
- }
-
- // Now data ready and we can init static trees
- static_l_desc$1 = new StaticTreeDesc$1(static_ltree$2, extra_lbits$1, LITERALS$1$2 + 1, L_CODES$1$2, MAX_BITS$1$1);
- static_d_desc$1 = new StaticTreeDesc$1(static_dtree$2, extra_dbits$1, 0, D_CODES$1$2, MAX_BITS$1$1);
- static_bl_desc$1 = new StaticTreeDesc$1(new Array(0), extra_blbits$1, 0, BL_CODES$1$1, MAX_BL_BITS$1);
-
- //static_init_done = true;
-};
-
-
-/* ===========================================================================
- * Initialize a new block.
- */
-const init_block$1 = (s) => {
-
- let n; /* iterates over tree elements */
-
- /* Initialize the trees. */
- for (n = 0; n < L_CODES$1$2; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }
- for (n = 0; n < D_CODES$1$2; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }
- for (n = 0; n < BL_CODES$1$1; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }
-
- s.dyn_ltree[END_BLOCK$1 * 2]/*.Freq*/ = 1;
- s.opt_len = s.static_len = 0;
- s.sym_next = s.matches = 0;
-};
-
-
-/* ===========================================================================
- * Flush the bit buffer and align the output on a byte boundary
- */
-const bi_windup$1 = (s) =>
-{
- if (s.bi_valid > 8) {
- put_short$1(s, s.bi_buf);
- } else if (s.bi_valid > 0) {
- //put_byte(s, (Byte)s->bi_buf);
- s.pending_buf[s.pending++] = s.bi_buf;
- }
- s.bi_buf = 0;
- s.bi_valid = 0;
-};
-
-/* ===========================================================================
- * Compares to subtrees, using the tree depth as tie breaker when
- * the subtrees have equal frequency. This minimizes the worst case length.
- */
-const smaller$1 = (tree, n, m, depth) => {
-
- const _n2 = n * 2;
- const _m2 = m * 2;
- return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||
- (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));
-};
-
-/* ===========================================================================
- * Restore the heap property by moving down the tree starting at node k,
- * exchanging a node with the smallest of its two sons if necessary, stopping
- * when the heap property is re-established (each father smaller than its
- * two sons).
- */
-const pqdownheap$1 = (s, tree, k) => {
-// deflate_state *s;
-// ct_data *tree; /* the tree to restore */
-// int k; /* node to move down */
-
- const v = s.heap[k];
- let j = k << 1; /* left son of k */
- while (j <= s.heap_len) {
- /* Set j to the smallest of the two sons: */
- if (j < s.heap_len &&
- smaller$1(tree, s.heap[j + 1], s.heap[j], s.depth)) {
- j++;
- }
- /* Exit if v is smaller than both sons */
- if (smaller$1(tree, v, s.heap[j], s.depth)) { break; }
-
- /* Exchange v with the smallest son */
- s.heap[k] = s.heap[j];
- k = j;
-
- /* And continue down the tree, setting j to the left son of k */
- j <<= 1;
- }
- s.heap[k] = v;
-};
-
-
-// inlined manually
-// const SMALLEST = 1;
-
-/* ===========================================================================
- * Send the block data compressed using the given Huffman trees
- */
-const compress_block$1 = (s, ltree, dtree) => {
-// deflate_state *s;
-// const ct_data *ltree; /* literal tree */
-// const ct_data *dtree; /* distance tree */
-
- let dist; /* distance of matched string */
- let lc; /* match length or unmatched char (if dist == 0) */
- let sx = 0; /* running index in sym_buf */
- let code; /* the code to send */
- let extra; /* number of extra bits to send */
-
- if (s.sym_next !== 0) {
- do {
- dist = s.pending_buf[s.sym_buf + sx++] & 0xff;
- dist += (s.pending_buf[s.sym_buf + sx++] & 0xff) << 8;
- lc = s.pending_buf[s.sym_buf + sx++];
- if (dist === 0) {
- send_code$1(s, lc, ltree); /* send a literal byte */
- //Tracecv(isgraph(lc), (stderr," '%c' ", lc));
- } else {
- /* Here, lc is the match length - MIN_MATCH */
- code = _length_code$2[lc];
- send_code$1(s, code + LITERALS$1$2 + 1, ltree); /* send the length code */
- extra = extra_lbits$1[code];
- if (extra !== 0) {
- lc -= base_length$2[code];
- send_bits$1(s, lc, extra); /* send the extra length bits */
- }
- dist--; /* dist is now the match distance - 1 */
- code = d_code$1(dist);
- //Assert (code < D_CODES, "bad d_code");
-
- send_code$1(s, code, dtree); /* send the distance code */
- extra = extra_dbits$1[code];
- if (extra !== 0) {
- dist -= base_dist$2[code];
- send_bits$1(s, dist, extra); /* send the extra distance bits */
- }
- } /* literal or match pair ? */
-
- /* Check that the overlay between pending_buf and sym_buf is ok: */
- //Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow");
-
- } while (sx < s.sym_next);
- }
-
- send_code$1(s, END_BLOCK$1, ltree);
-};
-
-
-/* ===========================================================================
- * Construct one Huffman tree and assigns the code bit strings and lengths.
- * Update the total bit length for the current block.
- * IN assertion: the field freq is set for all tree elements.
- * OUT assertions: the fields len and code are set to the optimal bit length
- * and corresponding code. The length opt_len is updated; static_len is
- * also updated if stree is not null. The field max_code is set.
- */
-const build_tree$1 = (s, desc) => {
-// deflate_state *s;
-// tree_desc *desc; /* the tree descriptor */
-
- const tree = desc.dyn_tree;
- const stree = desc.stat_desc.static_tree;
- const has_stree = desc.stat_desc.has_stree;
- const elems = desc.stat_desc.elems;
- let n, m; /* iterate over heap elements */
- let max_code = -1; /* largest code with non zero frequency */
- let node; /* new node being created */
-
- /* Construct the initial heap, with least frequent element in
- * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
- * heap[0] is not used.
- */
- s.heap_len = 0;
- s.heap_max = HEAP_SIZE$1$1;
-
- for (n = 0; n < elems; n++) {
- if (tree[n * 2]/*.Freq*/ !== 0) {
- s.heap[++s.heap_len] = max_code = n;
- s.depth[n] = 0;
-
- } else {
- tree[n * 2 + 1]/*.Len*/ = 0;
- }
- }
-
- /* The pkzip format requires that at least one distance code exists,
- * and that at least one bit should be sent even if there is only one
- * possible code. So to avoid special checks later on we force at least
- * two codes of non zero frequency.
- */
- while (s.heap_len < 2) {
- node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);
- tree[node * 2]/*.Freq*/ = 1;
- s.depth[node] = 0;
- s.opt_len--;
-
- if (has_stree) {
- s.static_len -= stree[node * 2 + 1]/*.Len*/;
- }
- /* node is 0 or 1 so it does not have extra bits */
- }
- desc.max_code = max_code;
-
- /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
- * establish sub-heaps of increasing lengths:
- */
- for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap$1(s, tree, n); }
-
- /* Construct the Huffman tree by repeatedly combining the least two
- * frequent nodes.
- */
- node = elems; /* next internal node of the tree */
- do {
- //pqremove(s, tree, n); /* n = node of least frequency */
- /*** pqremove ***/
- n = s.heap[1/*SMALLEST*/];
- s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];
- pqdownheap$1(s, tree, 1/*SMALLEST*/);
- /***/
-
- m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */
-
- s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */
- s.heap[--s.heap_max] = m;
-
- /* Create a new node father of n and m */
- tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;
- s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;
- tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;
-
- /* and insert the new node in the heap */
- s.heap[1/*SMALLEST*/] = node++;
- pqdownheap$1(s, tree, 1/*SMALLEST*/);
-
- } while (s.heap_len >= 2);
-
- s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];
-
- /* At this point, the fields freq and dad are set. We can now
- * generate the bit lengths.
- */
- gen_bitlen$1(s, desc);
-
- /* The field len is now set, we can generate the bit codes */
- gen_codes$1(tree, max_code, s.bl_count);
-};
-
-
-/* ===========================================================================
- * Scan a literal or distance tree to determine the frequencies of the codes
- * in the bit length tree.
- */
-const scan_tree$1 = (s, tree, max_code) => {
-// deflate_state *s;
-// ct_data *tree; /* the tree to be scanned */
-// int max_code; /* and its largest code of non zero frequency */
-
- let n; /* iterates over all tree elements */
- let prevlen = -1; /* last emitted length */
- let curlen; /* length of current code */
-
- let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */
-
- let count = 0; /* repeat count of the current code */
- let max_count = 7; /* max repeat count */
- let min_count = 4; /* min repeat count */
-
- if (nextlen === 0) {
- max_count = 138;
- min_count = 3;
- }
- tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */
-
- for (n = 0; n <= max_code; n++) {
- curlen = nextlen;
- nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;
-
- if (++count < max_count && curlen === nextlen) {
- continue;
-
- } else if (count < min_count) {
- s.bl_tree[curlen * 2]/*.Freq*/ += count;
-
- } else if (curlen !== 0) {
-
- if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }
- s.bl_tree[REP_3_6$1 * 2]/*.Freq*/++;
-
- } else if (count <= 10) {
- s.bl_tree[REPZ_3_10$1 * 2]/*.Freq*/++;
-
- } else {
- s.bl_tree[REPZ_11_138$1 * 2]/*.Freq*/++;
- }
-
- count = 0;
- prevlen = curlen;
-
- if (nextlen === 0) {
- max_count = 138;
- min_count = 3;
-
- } else if (curlen === nextlen) {
- max_count = 6;
- min_count = 3;
-
- } else {
- max_count = 7;
- min_count = 4;
- }
- }
-};
-
-
-/* ===========================================================================
- * Send a literal or distance tree in compressed form, using the codes in
- * bl_tree.
- */
-const send_tree$1 = (s, tree, max_code) => {
-// deflate_state *s;
-// ct_data *tree; /* the tree to be scanned */
-// int max_code; /* and its largest code of non zero frequency */
-
- let n; /* iterates over all tree elements */
- let prevlen = -1; /* last emitted length */
- let curlen; /* length of current code */
-
- let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */
-
- let count = 0; /* repeat count of the current code */
- let max_count = 7; /* max repeat count */
- let min_count = 4; /* min repeat count */
-
- /* tree[max_code+1].Len = -1; */ /* guard already set */
- if (nextlen === 0) {
- max_count = 138;
- min_count = 3;
- }
-
- for (n = 0; n <= max_code; n++) {
- curlen = nextlen;
- nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;
-
- if (++count < max_count && curlen === nextlen) {
- continue;
-
- } else if (count < min_count) {
- do { send_code$1(s, curlen, s.bl_tree); } while (--count !== 0);
-
- } else if (curlen !== 0) {
- if (curlen !== prevlen) {
- send_code$1(s, curlen, s.bl_tree);
- count--;
- }
- //Assert(count >= 3 && count <= 6, " 3_6?");
- send_code$1(s, REP_3_6$1, s.bl_tree);
- send_bits$1(s, count - 3, 2);
-
- } else if (count <= 10) {
- send_code$1(s, REPZ_3_10$1, s.bl_tree);
- send_bits$1(s, count - 3, 3);
-
- } else {
- send_code$1(s, REPZ_11_138$1, s.bl_tree);
- send_bits$1(s, count - 11, 7);
- }
-
- count = 0;
- prevlen = curlen;
- if (nextlen === 0) {
- max_count = 138;
- min_count = 3;
-
- } else if (curlen === nextlen) {
- max_count = 6;
- min_count = 3;
-
- } else {
- max_count = 7;
- min_count = 4;
- }
- }
-};
-
-
-/* ===========================================================================
- * Construct the Huffman tree for the bit lengths and return the index in
- * bl_order of the last bit length code to send.
- */
-const build_bl_tree$1 = (s) => {
-
- let max_blindex; /* index of last bit length code of non zero freq */
-
- /* Determine the bit length frequencies for literal and distance trees */
- scan_tree$1(s, s.dyn_ltree, s.l_desc.max_code);
- scan_tree$1(s, s.dyn_dtree, s.d_desc.max_code);
-
- /* Build the bit length tree: */
- build_tree$1(s, s.bl_desc);
- /* opt_len now includes the length of the tree representations, except
- * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
- */
-
- /* Determine the number of bit length codes to send. The pkzip format
- * requires that at least 4 bit length codes be sent. (appnote.txt says
- * 3 but the actual value used is 4.)
- */
- for (max_blindex = BL_CODES$1$1 - 1; max_blindex >= 3; max_blindex--) {
- if (s.bl_tree[bl_order$1[max_blindex] * 2 + 1]/*.Len*/ !== 0) {
- break;
- }
- }
- /* Update opt_len to include the bit length tree and counts */
- s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;
- //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
- // s->opt_len, s->static_len));
-
- return max_blindex;
-};
-
-
-/* ===========================================================================
- * Send the header for a block using dynamic Huffman trees: the counts, the
- * lengths of the bit length codes, the literal tree and the distance tree.
- * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
- */
-const send_all_trees$1 = (s, lcodes, dcodes, blcodes) => {
-// deflate_state *s;
-// int lcodes, dcodes, blcodes; /* number of codes for each tree */
-
- let rank; /* index in bl_order */
-
- //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
- //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
- // "too many codes");
- //Tracev((stderr, "\nbl counts: "));
- send_bits$1(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */
- send_bits$1(s, dcodes - 1, 5);
- send_bits$1(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */
- for (rank = 0; rank < blcodes; rank++) {
- //Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
- send_bits$1(s, s.bl_tree[bl_order$1[rank] * 2 + 1]/*.Len*/, 3);
- }
- //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
-
- send_tree$1(s, s.dyn_ltree, lcodes - 1); /* literal tree */
- //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
-
- send_tree$1(s, s.dyn_dtree, dcodes - 1); /* distance tree */
- //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
-};
-
-
-/* ===========================================================================
- * Check if the data type is TEXT or BINARY, using the following algorithm:
- * - TEXT if the two conditions below are satisfied:
- * a) There are no non-portable control characters belonging to the
- * "block list" (0..6, 14..25, 28..31).
- * b) There is at least one printable character belonging to the
- * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
- * - BINARY otherwise.
- * - The following partially-portable control characters form a
- * "gray list" that is ignored in this detection algorithm:
- * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
- * IN assertion: the fields Freq of dyn_ltree are set.
- */
-const detect_data_type$1 = (s) => {
- /* block_mask is the bit mask of block-listed bytes
- * set bits 0..6, 14..25, and 28..31
- * 0xf3ffc07f = binary 11110011111111111100000001111111
- */
- let block_mask = 0xf3ffc07f;
- let n;
-
- /* Check for non-textual ("block-listed") bytes. */
- for (n = 0; n <= 31; n++, block_mask >>>= 1) {
- if ((block_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {
- return Z_BINARY$1;
- }
- }
-
- /* Check for textual ("allow-listed") bytes. */
- if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||
- s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {
- return Z_TEXT$1;
- }
- for (n = 32; n < LITERALS$1$2; n++) {
- if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {
- return Z_TEXT$1;
- }
- }
-
- /* There are no "block-listed" or "allow-listed" bytes:
- * this stream either is empty or has tolerated ("gray-listed") bytes only.
- */
- return Z_BINARY$1;
-};
-
-
-let static_init_done$1 = false;
-
-/* ===========================================================================
- * Initialize the tree data structures for a new zlib stream.
- */
-const _tr_init$1$1 = (s) =>
-{
-
- if (!static_init_done$1) {
- tr_static_init$1();
- static_init_done$1 = true;
- }
-
- s.l_desc = new TreeDesc$1(s.dyn_ltree, static_l_desc$1);
- s.d_desc = new TreeDesc$1(s.dyn_dtree, static_d_desc$1);
- s.bl_desc = new TreeDesc$1(s.bl_tree, static_bl_desc$1);
-
- s.bi_buf = 0;
- s.bi_valid = 0;
-
- /* Initialize the first block of the first file: */
- init_block$1(s);
-};
-
-
-/* ===========================================================================
- * Send a stored block
- */
-const _tr_stored_block$1$1 = (s, buf, stored_len, last) => {
-//DeflateState *s;
-//charf *buf; /* input block */
-//ulg stored_len; /* length of input block */
-//int last; /* one if this is the last block for a file */
-
- send_bits$1(s, (STORED_BLOCK$1 << 1) + (last ? 1 : 0), 3); /* send block type */
- bi_windup$1(s); /* align on byte boundary */
- put_short$1(s, stored_len);
- put_short$1(s, ~stored_len);
- if (stored_len) {
- s.pending_buf.set(s.window.subarray(buf, buf + stored_len), s.pending);
- }
- s.pending += stored_len;
-};
-
-
-/* ===========================================================================
- * Send one empty static block to give enough lookahead for inflate.
- * This takes 10 bits, of which 7 may remain in the bit buffer.
- */
-const _tr_align$1$1 = (s) => {
- send_bits$1(s, STATIC_TREES$1 << 1, 3);
- send_code$1(s, END_BLOCK$1, static_ltree$2);
- bi_flush$1(s);
-};
-
-
-/* ===========================================================================
- * Determine the best encoding for the current block: dynamic trees, static
- * trees or store, and write out the encoded block.
- */
-const _tr_flush_block$1$1 = (s, buf, stored_len, last) => {
-//DeflateState *s;
-//charf *buf; /* input block, or NULL if too old */
-//ulg stored_len; /* length of input block */
-//int last; /* one if this is the last block for a file */
-
- let opt_lenb, static_lenb; /* opt_len and static_len in bytes */
- let max_blindex = 0; /* index of last bit length code of non zero freq */
-
- /* Build the Huffman trees unless a stored block is forced */
- if (s.level > 0) {
-
- /* Check if the file is binary or text */
- if (s.strm.data_type === Z_UNKNOWN$1$1) {
- s.strm.data_type = detect_data_type$1(s);
- }
-
- /* Construct the literal and distance trees */
- build_tree$1(s, s.l_desc);
- // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
- // s->static_len));
-
- build_tree$1(s, s.d_desc);
- // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
- // s->static_len));
- /* At this point, opt_len and static_len are the total bit lengths of
- * the compressed block data, excluding the tree representations.
- */
-
- /* Build the bit length tree for the above two trees, and get the index
- * in bl_order of the last bit length code to send.
- */
- max_blindex = build_bl_tree$1(s);
-
- /* Determine the best encoding. Compute the block lengths in bytes. */
- opt_lenb = (s.opt_len + 3 + 7) >>> 3;
- static_lenb = (s.static_len + 3 + 7) >>> 3;
-
- // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
- // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
- // s->sym_next / 3));
-
- if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }
-
- } else {
- // Assert(buf != (char*)0, "lost buf");
- opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
- }
-
- if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {
- /* 4: two words for the lengths */
-
- /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
- * Otherwise we can't have processed more than WSIZE input bytes since
- * the last block flush, because compression would have been
- * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
- * transform a block into a stored block.
- */
- _tr_stored_block$1$1(s, buf, stored_len, last);
-
- } else if (s.strategy === Z_FIXED$1$1 || static_lenb === opt_lenb) {
-
- send_bits$1(s, (STATIC_TREES$1 << 1) + (last ? 1 : 0), 3);
- compress_block$1(s, static_ltree$2, static_dtree$2);
-
- } else {
- send_bits$1(s, (DYN_TREES$1 << 1) + (last ? 1 : 0), 3);
- send_all_trees$1(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);
- compress_block$1(s, s.dyn_ltree, s.dyn_dtree);
- }
- // Assert (s->compressed_len == s->bits_sent, "bad compressed size");
- /* The above check is made mod 2^32, for files larger than 512 MB
- * and uLong implemented on 32 bits.
- */
- init_block$1(s);
-
- if (last) {
- bi_windup$1(s);
- }
- // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
- // s->compressed_len-7*last));
-};
-
-/* ===========================================================================
- * Save the match info and tally the frequency counts. Return true if
- * the current block must be flushed.
- */
-const _tr_tally$1$1 = (s, dist, lc) => {
-// deflate_state *s;
-// unsigned dist; /* distance of matched string */
-// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */
-
- s.pending_buf[s.sym_buf + s.sym_next++] = dist;
- s.pending_buf[s.sym_buf + s.sym_next++] = dist >> 8;
- s.pending_buf[s.sym_buf + s.sym_next++] = lc;
- if (dist === 0) {
- /* lc is the unmatched char */
- s.dyn_ltree[lc * 2]/*.Freq*/++;
- } else {
- s.matches++;
- /* Here, lc is the match length - MIN_MATCH */
- dist--; /* dist = match distance - 1 */
- //Assert((ush)dist < (ush)MAX_DIST(s) &&
- // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
- // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match");
-
- s.dyn_ltree[(_length_code$2[lc] + LITERALS$1$2 + 1) * 2]/*.Freq*/++;
- s.dyn_dtree[d_code$1(dist) * 2]/*.Freq*/++;
- }
-
- return (s.sym_next === s.sym_end);
-};
-
-var _tr_init_1$1 = _tr_init$1$1;
-var _tr_stored_block_1$1 = _tr_stored_block$1$1;
-var _tr_flush_block_1$1 = _tr_flush_block$1$1;
-var _tr_tally_1$1 = _tr_tally$1$1;
-var _tr_align_1$1 = _tr_align$1$1;
-
-var trees$1 = {
- _tr_init: _tr_init_1$1,
- _tr_stored_block: _tr_stored_block_1$1,
- _tr_flush_block: _tr_flush_block_1$1,
- _tr_tally: _tr_tally_1$1,
- _tr_align: _tr_align_1$1
-};
-
-// Note: adler32 takes 12% for level 0 and 2% for level 6.
-// It isn't worth it to make additional optimizations as in original.
-// Small size is preferable.
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-const adler32$2 = (adler, buf, len, pos) => {
- let s1 = (adler & 0xffff) |0,
- s2 = ((adler >>> 16) & 0xffff) |0,
- n = 0;
-
- while (len !== 0) {
- // Set limit ~ twice less than 5552, to keep
- // s2 in 31-bits, because we force signed ints.
- // in other case %= will fail.
- n = len > 2000 ? 2000 : len;
- len -= n;
-
- do {
- s1 = (s1 + buf[pos++]) |0;
- s2 = (s2 + s1) |0;
- } while (--n);
-
- s1 %= 65521;
- s2 %= 65521;
- }
-
- return (s1 | (s2 << 16)) |0;
-};
-
-
-var adler32_1$2 = adler32$2;
-
-// Note: we can't get significant speed boost here.
-// So write code to minimize size - no pregenerated tables
-// and array tools dependencies.
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-// Use ordinary array, since untyped makes no boost here
-const makeTable$2 = () => {
- let c, table = [];
-
- for (var n = 0; n < 256; n++) {
- c = n;
- for (var k = 0; k < 8; k++) {
- c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
- }
- table[n] = c;
- }
-
- return table;
-};
-
-// Create table on load. Just 255 signed longs. Not a problem.
-const crcTable$2 = new Uint32Array(makeTable$2());
-
-
-const crc32$2 = (crc, buf, len, pos) => {
- const t = crcTable$2;
- const end = pos + len;
-
- crc ^= -1;
-
- for (let i = pos; i < end; i++) {
- crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
- }
-
- return (crc ^ (-1)); // >>> 0;
-};
-
-
-var crc32_1$2 = crc32$2;
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-var messages$2 = {
- 2: 'need dictionary', /* Z_NEED_DICT 2 */
- 1: 'stream end', /* Z_STREAM_END 1 */
- 0: '', /* Z_OK 0 */
- '-1': 'file error', /* Z_ERRNO (-1) */
- '-2': 'stream error', /* Z_STREAM_ERROR (-2) */
- '-3': 'data error', /* Z_DATA_ERROR (-3) */
- '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */
- '-5': 'buffer error', /* Z_BUF_ERROR (-5) */
- '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */
-};
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-var constants$2$2 = {
-
- /* Allowed flush values; see deflate() and inflate() below for details */
- Z_NO_FLUSH: 0,
- Z_PARTIAL_FLUSH: 1,
- Z_SYNC_FLUSH: 2,
- Z_FULL_FLUSH: 3,
- Z_FINISH: 4,
- Z_BLOCK: 5,
- Z_TREES: 6,
-
- /* Return codes for the compression/decompression functions. Negative values
- * are errors, positive values are used for special but normal events.
- */
- Z_OK: 0,
- Z_STREAM_END: 1,
- Z_NEED_DICT: 2,
- Z_ERRNO: -1,
- Z_STREAM_ERROR: -2,
- Z_DATA_ERROR: -3,
- Z_MEM_ERROR: -4,
- Z_BUF_ERROR: -5,
- //Z_VERSION_ERROR: -6,
-
- /* compression levels */
- Z_NO_COMPRESSION: 0,
- Z_BEST_SPEED: 1,
- Z_BEST_COMPRESSION: 9,
- Z_DEFAULT_COMPRESSION: -1,
-
-
- Z_FILTERED: 1,
- Z_HUFFMAN_ONLY: 2,
- Z_RLE: 3,
- Z_FIXED: 4,
- Z_DEFAULT_STRATEGY: 0,
-
- /* Possible values of the data_type field (though see inflate()) */
- Z_BINARY: 0,
- Z_TEXT: 1,
- //Z_ASCII: 1, // = Z_TEXT (deprecated)
- Z_UNKNOWN: 2,
-
- /* The deflate compression method */
- Z_DEFLATED: 8
- //Z_NULL: null // Use -1 or null inline, depending on var type
-};
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-const { _tr_init: _tr_init$2, _tr_stored_block: _tr_stored_block$2, _tr_flush_block: _tr_flush_block$2, _tr_tally: _tr_tally$2, _tr_align: _tr_align$2 } = trees$1;
-
-
-
-
-/* Public constants ==========================================================*/
-/* ===========================================================================*/
-
-const {
- Z_NO_FLUSH: Z_NO_FLUSH$2$1, Z_PARTIAL_FLUSH: Z_PARTIAL_FLUSH$1, Z_FULL_FLUSH: Z_FULL_FLUSH$1$1, Z_FINISH: Z_FINISH$3$1, Z_BLOCK: Z_BLOCK$1$1,
- Z_OK: Z_OK$3$1, Z_STREAM_END: Z_STREAM_END$3$1, Z_STREAM_ERROR: Z_STREAM_ERROR$2$1, Z_DATA_ERROR: Z_DATA_ERROR$2$1, Z_BUF_ERROR: Z_BUF_ERROR$1$1,
- Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1$1,
- Z_FILTERED: Z_FILTERED$1, Z_HUFFMAN_ONLY: Z_HUFFMAN_ONLY$1, Z_RLE: Z_RLE$1, Z_FIXED: Z_FIXED$2, Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1$1,
- Z_UNKNOWN: Z_UNKNOWN$2,
- Z_DEFLATED: Z_DEFLATED$2$1
-} = constants$2$2;
-
-/*============================================================================*/
-
-
-const MAX_MEM_LEVEL$1 = 9;
-/* Maximum value for memLevel in deflateInit2 */
-const MAX_WBITS$1$1 = 15;
-/* 32K LZ77 window */
-const DEF_MEM_LEVEL$1 = 8;
-
-
-const LENGTH_CODES$2 = 29;
-/* number of length codes, not counting the special END_BLOCK code */
-const LITERALS$2 = 256;
-/* number of literal bytes 0..255 */
-const L_CODES$2 = LITERALS$2 + 1 + LENGTH_CODES$2;
-/* number of Literal or Length codes, including the END_BLOCK code */
-const D_CODES$2 = 30;
-/* number of distance codes */
-const BL_CODES$2 = 19;
-/* number of codes used to transfer the bit lengths */
-const HEAP_SIZE$2 = 2 * L_CODES$2 + 1;
-/* maximum heap size */
-const MAX_BITS$2 = 15;
-/* All codes must not exceed MAX_BITS bits */
-
-const MIN_MATCH$2 = 3;
-const MAX_MATCH$2 = 258;
-const MIN_LOOKAHEAD$1 = (MAX_MATCH$2 + MIN_MATCH$2 + 1);
-
-const PRESET_DICT$1 = 0x20;
-
-const INIT_STATE$1 = 42; /* zlib header -> BUSY_STATE */
-//#ifdef GZIP
-const GZIP_STATE$1 = 57; /* gzip header -> BUSY_STATE | EXTRA_STATE */
-//#endif
-const EXTRA_STATE$1 = 69; /* gzip extra block -> NAME_STATE */
-const NAME_STATE$1 = 73; /* gzip file name -> COMMENT_STATE */
-const COMMENT_STATE$1 = 91; /* gzip comment -> HCRC_STATE */
-const HCRC_STATE$1 = 103; /* gzip header CRC -> BUSY_STATE */
-const BUSY_STATE$1 = 113; /* deflate -> FINISH_STATE */
-const FINISH_STATE$1 = 666; /* stream complete */
-
-const BS_NEED_MORE$1 = 1; /* block not completed, need more input or more output */
-const BS_BLOCK_DONE$1 = 2; /* block flush performed */
-const BS_FINISH_STARTED$1 = 3; /* finish started, need only more output at next deflate */
-const BS_FINISH_DONE$1 = 4; /* finish done, accept no more input or output */
-
-const OS_CODE$1 = 0x03; // Unix :) . Don't detect, use this default.
-
-const err$1 = (strm, errorCode) => {
- strm.msg = messages$2[errorCode];
- return errorCode;
-};
-
-const rank$1 = (f) => {
- return ((f) * 2) - ((f) > 4 ? 9 : 0);
-};
-
-const zero$2 = (buf) => {
- let len = buf.length; while (--len >= 0) { buf[len] = 0; }
-};
-
-/* ===========================================================================
- * Slide the hash table when sliding the window down (could be avoided with 32
- * bit values at the expense of memory usage). We slide even when level == 0 to
- * keep the hash table consistent if we switch back to level > 0 later.
- */
-const slide_hash$1 = (s) => {
- let n, m;
- let p;
- let wsize = s.w_size;
-
- n = s.hash_size;
- p = n;
- do {
- m = s.head[--p];
- s.head[p] = (m >= wsize ? m - wsize : 0);
- } while (--n);
- n = wsize;
-//#ifndef FASTEST
- p = n;
- do {
- m = s.prev[--p];
- s.prev[p] = (m >= wsize ? m - wsize : 0);
- /* If n is not on any hash chain, prev[n] is garbage but
- * its value will never be used.
- */
- } while (--n);
-//#endif
-};
-
-/* eslint-disable new-cap */
-let HASH_ZLIB$1 = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask;
-// This hash causes less collisions, https://github.com/nodeca/pako/issues/135
-// But breaks binary compatibility
-//let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask;
-let HASH$1 = HASH_ZLIB$1;
-
-
-/* =========================================================================
- * Flush as much pending output as possible. All deflate() output, except for
- * some deflate_stored() output, goes through this function so some
- * applications may wish to modify it to avoid allocating a large
- * strm->next_out buffer and copying into it. (See also read_buf()).
- */
-const flush_pending$1 = (strm) => {
- const s = strm.state;
-
- //_tr_flush_bits(s);
- let len = s.pending;
- if (len > strm.avail_out) {
- len = strm.avail_out;
- }
- if (len === 0) { return; }
-
- strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out);
- strm.next_out += len;
- s.pending_out += len;
- strm.total_out += len;
- strm.avail_out -= len;
- s.pending -= len;
- if (s.pending === 0) {
- s.pending_out = 0;
- }
-};
-
-
-const flush_block_only$1 = (s, last) => {
- _tr_flush_block$2(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);
- s.block_start = s.strstart;
- flush_pending$1(s.strm);
-};
-
-
-const put_byte$1 = (s, b) => {
- s.pending_buf[s.pending++] = b;
-};
-
-
-/* =========================================================================
- * Put a short in the pending buffer. The 16-bit value is put in MSB order.
- * IN assertion: the stream state is correct and there is enough room in
- * pending_buf.
- */
-const putShortMSB$1 = (s, b) => {
-
- // put_byte(s, (Byte)(b >> 8));
-// put_byte(s, (Byte)(b & 0xff));
- s.pending_buf[s.pending++] = (b >>> 8) & 0xff;
- s.pending_buf[s.pending++] = b & 0xff;
-};
-
-
-/* ===========================================================================
- * Read a new buffer from the current input stream, update the adler32
- * and total number of bytes read. All deflate() input goes through
- * this function so some applications may wish to modify it to avoid
- * allocating a large strm->input buffer and copying from it.
- * (See also flush_pending()).
- */
-const read_buf$1 = (strm, buf, start, size) => {
-
- let len = strm.avail_in;
-
- if (len > size) { len = size; }
- if (len === 0) { return 0; }
-
- strm.avail_in -= len;
-
- // zmemcpy(buf, strm->next_in, len);
- buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start);
- if (strm.state.wrap === 1) {
- strm.adler = adler32_1$2(strm.adler, buf, len, start);
- }
-
- else if (strm.state.wrap === 2) {
- strm.adler = crc32_1$2(strm.adler, buf, len, start);
- }
-
- strm.next_in += len;
- strm.total_in += len;
-
- return len;
-};
-
-
-/* ===========================================================================
- * Set match_start to the longest match starting at the given string and
- * return its length. Matches shorter or equal to prev_length are discarded,
- * in which case the result is equal to prev_length and match_start is
- * garbage.
- * IN assertions: cur_match is the head of the hash chain for the current
- * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
- * OUT assertion: the match length is not greater than s->lookahead.
- */
-const longest_match$1 = (s, cur_match) => {
-
- let chain_length = s.max_chain_length; /* max hash chain length */
- let scan = s.strstart; /* current string */
- let match; /* matched string */
- let len; /* length of current match */
- let best_len = s.prev_length; /* best match length so far */
- let nice_match = s.nice_match; /* stop if match long enough */
- const limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD$1)) ?
- s.strstart - (s.w_size - MIN_LOOKAHEAD$1) : 0/*NIL*/;
-
- const _win = s.window; // shortcut
-
- const wmask = s.w_mask;
- const prev = s.prev;
-
- /* Stop when cur_match becomes <= limit. To simplify the code,
- * we prevent matches with the string of window index 0.
- */
-
- const strend = s.strstart + MAX_MATCH$2;
- let scan_end1 = _win[scan + best_len - 1];
- let scan_end = _win[scan + best_len];
-
- /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
- * It is easy to get rid of this optimization if necessary.
- */
- // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
-
- /* Do not waste too much time if we already have a good match: */
- if (s.prev_length >= s.good_match) {
- chain_length >>= 2;
- }
- /* Do not look for matches beyond the end of the input. This is necessary
- * to make deflate deterministic.
- */
- if (nice_match > s.lookahead) { nice_match = s.lookahead; }
-
- // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
-
- do {
- // Assert(cur_match < s->strstart, "no future");
- match = cur_match;
-
- /* Skip to next match if the match length cannot increase
- * or if the match length is less than 2. Note that the checks below
- * for insufficient lookahead only occur occasionally for performance
- * reasons. Therefore uninitialized memory will be accessed, and
- * conditional jumps will be made that depend on those values.
- * However the length of the match is limited to the lookahead, so
- * the output of deflate is not affected by the uninitialized values.
- */
-
- if (_win[match + best_len] !== scan_end ||
- _win[match + best_len - 1] !== scan_end1 ||
- _win[match] !== _win[scan] ||
- _win[++match] !== _win[scan + 1]) {
- continue;
- }
-
- /* The check at best_len-1 can be removed because it will be made
- * again later. (This heuristic is not always a win.)
- * It is not necessary to compare scan[2] and match[2] since they
- * are always equal when the other bytes match, given that
- * the hash keys are equal and that HASH_BITS >= 8.
- */
- scan += 2;
- match++;
- // Assert(*scan == *match, "match[2]?");
-
- /* We check for insufficient lookahead only every 8th comparison;
- * the 256th check will be made at strstart+258.
- */
- do {
- /*jshint noempty:false*/
- } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
- _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
- _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
- _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
- scan < strend);
-
- // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
-
- len = MAX_MATCH$2 - (strend - scan);
- scan = strend - MAX_MATCH$2;
-
- if (len > best_len) {
- s.match_start = cur_match;
- best_len = len;
- if (len >= nice_match) {
- break;
- }
- scan_end1 = _win[scan + best_len - 1];
- scan_end = _win[scan + best_len];
- }
- } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);
-
- if (best_len <= s.lookahead) {
- return best_len;
- }
- return s.lookahead;
-};
-
-
-/* ===========================================================================
- * Fill the window when the lookahead becomes insufficient.
- * Updates strstart and lookahead.
- *
- * IN assertion: lookahead < MIN_LOOKAHEAD
- * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
- * At least one byte has been read, or avail_in == 0; reads are
- * performed for at least two bytes (required for the zip translate_eol
- * option -- not supported here).
- */
-const fill_window$1 = (s) => {
-
- const _w_size = s.w_size;
- let n, more, str;
-
- //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
-
- do {
- more = s.window_size - s.lookahead - s.strstart;
-
- // JS ints have 32 bit, block below not needed
- /* Deal with !@#$% 64K limit: */
- //if (sizeof(int) <= 2) {
- // if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
- // more = wsize;
- //
- // } else if (more == (unsigned)(-1)) {
- // /* Very unlikely, but possible on 16 bit machine if
- // * strstart == 0 && lookahead == 1 (input done a byte at time)
- // */
- // more--;
- // }
- //}
-
-
- /* If the window is almost full and there is insufficient lookahead,
- * move the upper half to the lower one to make room in the upper half.
- */
- if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD$1)) {
-
- s.window.set(s.window.subarray(_w_size, _w_size + _w_size - more), 0);
- s.match_start -= _w_size;
- s.strstart -= _w_size;
- /* we now have strstart >= MAX_DIST */
- s.block_start -= _w_size;
- if (s.insert > s.strstart) {
- s.insert = s.strstart;
- }
- slide_hash$1(s);
- more += _w_size;
- }
- if (s.strm.avail_in === 0) {
- break;
- }
-
- /* If there was no sliding:
- * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
- * more == window_size - lookahead - strstart
- * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
- * => more >= window_size - 2*WSIZE + 2
- * In the BIG_MEM or MMAP case (not yet supported),
- * window_size == input_size + MIN_LOOKAHEAD &&
- * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
- * Otherwise, window_size == 2*WSIZE so more >= 2.
- * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
- */
- //Assert(more >= 2, "more < 2");
- n = read_buf$1(s.strm, s.window, s.strstart + s.lookahead, more);
- s.lookahead += n;
-
- /* Initialize the hash value now that we have some input: */
- if (s.lookahead + s.insert >= MIN_MATCH$2) {
- str = s.strstart - s.insert;
- s.ins_h = s.window[str];
-
- /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */
- s.ins_h = HASH$1(s, s.ins_h, s.window[str + 1]);
-//#if MIN_MATCH != 3
-// Call update_hash() MIN_MATCH-3 more times
-//#endif
- while (s.insert) {
- /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
- s.ins_h = HASH$1(s, s.ins_h, s.window[str + MIN_MATCH$2 - 1]);
-
- s.prev[str & s.w_mask] = s.head[s.ins_h];
- s.head[s.ins_h] = str;
- str++;
- s.insert--;
- if (s.lookahead + s.insert < MIN_MATCH$2) {
- break;
- }
- }
- }
- /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
- * but this is not important since only literal bytes will be emitted.
- */
-
- } while (s.lookahead < MIN_LOOKAHEAD$1 && s.strm.avail_in !== 0);
-
- /* If the WIN_INIT bytes after the end of the current data have never been
- * written, then zero those bytes in order to avoid memory check reports of
- * the use of uninitialized (or uninitialised as Julian writes) bytes by
- * the longest match routines. Update the high water mark for the next
- * time through here. WIN_INIT is set to MAX_MATCH since the longest match
- * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
- */
-// if (s.high_water < s.window_size) {
-// const curr = s.strstart + s.lookahead;
-// let init = 0;
-//
-// if (s.high_water < curr) {
-// /* Previous high water mark below current data -- zero WIN_INIT
-// * bytes or up to end of window, whichever is less.
-// */
-// init = s.window_size - curr;
-// if (init > WIN_INIT)
-// init = WIN_INIT;
-// zmemzero(s->window + curr, (unsigned)init);
-// s->high_water = curr + init;
-// }
-// else if (s->high_water < (ulg)curr + WIN_INIT) {
-// /* High water mark at or above current data, but below current data
-// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
-// * to end of window, whichever is less.
-// */
-// init = (ulg)curr + WIN_INIT - s->high_water;
-// if (init > s->window_size - s->high_water)
-// init = s->window_size - s->high_water;
-// zmemzero(s->window + s->high_water, (unsigned)init);
-// s->high_water += init;
-// }
-// }
-//
-// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
-// "not enough room for search");
-};
-
-/* ===========================================================================
- * Copy without compression as much as possible from the input stream, return
- * the current block state.
- *
- * In case deflateParams() is used to later switch to a non-zero compression
- * level, s->matches (otherwise unused when storing) keeps track of the number
- * of hash table slides to perform. If s->matches is 1, then one hash table
- * slide will be done when switching. If s->matches is 2, the maximum value
- * allowed here, then the hash table will be cleared, since two or more slides
- * is the same as a clear.
- *
- * deflate_stored() is written to minimize the number of times an input byte is
- * copied. It is most efficient with large input and output buffers, which
- * maximizes the opportunites to have a single copy from next_in to next_out.
- */
-const deflate_stored$1 = (s, flush) => {
-
- /* Smallest worthy block size when not flushing or finishing. By default
- * this is 32K. This can be as small as 507 bytes for memLevel == 1. For
- * large input and output buffers, the stored block size will be larger.
- */
- let min_block = s.pending_buf_size - 5 > s.w_size ? s.w_size : s.pending_buf_size - 5;
-
- /* Copy as many min_block or larger stored blocks directly to next_out as
- * possible. If flushing, copy the remaining available input to next_out as
- * stored blocks, if there is enough space.
- */
- let len, left, have, last = 0;
- let used = s.strm.avail_in;
- do {
- /* Set len to the maximum size block that we can copy directly with the
- * available input data and output space. Set left to how much of that
- * would be copied from what's left in the window.
- */
- len = 65535/* MAX_STORED */; /* maximum deflate stored block length */
- have = (s.bi_valid + 42) >> 3; /* number of header bytes */
- if (s.strm.avail_out < have) { /* need room for header */
- break;
- }
- /* maximum stored block length that will fit in avail_out: */
- have = s.strm.avail_out - have;
- left = s.strstart - s.block_start; /* bytes left in window */
- if (len > left + s.strm.avail_in) {
- len = left + s.strm.avail_in; /* limit len to the input */
- }
- if (len > have) {
- len = have; /* limit len to the output */
- }
-
- /* If the stored block would be less than min_block in length, or if
- * unable to copy all of the available input when flushing, then try
- * copying to the window and the pending buffer instead. Also don't
- * write an empty block when flushing -- deflate() does that.
- */
- if (len < min_block && ((len === 0 && flush !== Z_FINISH$3$1) ||
- flush === Z_NO_FLUSH$2$1 ||
- len !== left + s.strm.avail_in)) {
- break;
- }
-
- /* Make a dummy stored block in pending to get the header bytes,
- * including any pending bits. This also updates the debugging counts.
- */
- last = flush === Z_FINISH$3$1 && len === left + s.strm.avail_in ? 1 : 0;
- _tr_stored_block$2(s, 0, 0, last);
-
- /* Replace the lengths in the dummy stored block with len. */
- s.pending_buf[s.pending - 4] = len;
- s.pending_buf[s.pending - 3] = len >> 8;
- s.pending_buf[s.pending - 2] = ~len;
- s.pending_buf[s.pending - 1] = ~len >> 8;
-
- /* Write the stored block header bytes. */
- flush_pending$1(s.strm);
-
-//#ifdef ZLIB_DEBUG
-// /* Update debugging counts for the data about to be copied. */
-// s->compressed_len += len << 3;
-// s->bits_sent += len << 3;
-//#endif
-
- /* Copy uncompressed bytes from the window to next_out. */
- if (left) {
- if (left > len) {
- left = len;
- }
- //zmemcpy(s->strm->next_out, s->window + s->block_start, left);
- s.strm.output.set(s.window.subarray(s.block_start, s.block_start + left), s.strm.next_out);
- s.strm.next_out += left;
- s.strm.avail_out -= left;
- s.strm.total_out += left;
- s.block_start += left;
- len -= left;
- }
-
- /* Copy uncompressed bytes directly from next_in to next_out, updating
- * the check value.
- */
- if (len) {
- read_buf$1(s.strm, s.strm.output, s.strm.next_out, len);
- s.strm.next_out += len;
- s.strm.avail_out -= len;
- s.strm.total_out += len;
- }
- } while (last === 0);
-
- /* Update the sliding window with the last s->w_size bytes of the copied
- * data, or append all of the copied data to the existing window if less
- * than s->w_size bytes were copied. Also update the number of bytes to
- * insert in the hash tables, in the event that deflateParams() switches to
- * a non-zero compression level.
- */
- used -= s.strm.avail_in; /* number of input bytes directly copied */
- if (used) {
- /* If any input was used, then no unused input remains in the window,
- * therefore s->block_start == s->strstart.
- */
- if (used >= s.w_size) { /* supplant the previous history */
- s.matches = 2; /* clear hash */
- //zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size);
- s.window.set(s.strm.input.subarray(s.strm.next_in - s.w_size, s.strm.next_in), 0);
- s.strstart = s.w_size;
- s.insert = s.strstart;
- }
- else {
- if (s.window_size - s.strstart <= used) {
- /* Slide the window down. */
- s.strstart -= s.w_size;
- //zmemcpy(s->window, s->window + s->w_size, s->strstart);
- s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0);
- if (s.matches < 2) {
- s.matches++; /* add a pending slide_hash() */
- }
- if (s.insert > s.strstart) {
- s.insert = s.strstart;
- }
- }
- //zmemcpy(s->window + s->strstart, s->strm->next_in - used, used);
- s.window.set(s.strm.input.subarray(s.strm.next_in - used, s.strm.next_in), s.strstart);
- s.strstart += used;
- s.insert += used > s.w_size - s.insert ? s.w_size - s.insert : used;
- }
- s.block_start = s.strstart;
- }
- if (s.high_water < s.strstart) {
- s.high_water = s.strstart;
- }
-
- /* If the last block was written to next_out, then done. */
- if (last) {
- return BS_FINISH_DONE$1;
- }
-
- /* If flushing and all input has been consumed, then done. */
- if (flush !== Z_NO_FLUSH$2$1 && flush !== Z_FINISH$3$1 &&
- s.strm.avail_in === 0 && s.strstart === s.block_start) {
- return BS_BLOCK_DONE$1;
- }
-
- /* Fill the window with any remaining input. */
- have = s.window_size - s.strstart;
- if (s.strm.avail_in > have && s.block_start >= s.w_size) {
- /* Slide the window down. */
- s.block_start -= s.w_size;
- s.strstart -= s.w_size;
- //zmemcpy(s->window, s->window + s->w_size, s->strstart);
- s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0);
- if (s.matches < 2) {
- s.matches++; /* add a pending slide_hash() */
- }
- have += s.w_size; /* more space now */
- if (s.insert > s.strstart) {
- s.insert = s.strstart;
- }
- }
- if (have > s.strm.avail_in) {
- have = s.strm.avail_in;
- }
- if (have) {
- read_buf$1(s.strm, s.window, s.strstart, have);
- s.strstart += have;
- s.insert += have > s.w_size - s.insert ? s.w_size - s.insert : have;
- }
- if (s.high_water < s.strstart) {
- s.high_water = s.strstart;
- }
-
- /* There was not enough avail_out to write a complete worthy or flushed
- * stored block to next_out. Write a stored block to pending instead, if we
- * have enough input for a worthy block, or if flushing and there is enough
- * room for the remaining input as a stored block in the pending buffer.
- */
- have = (s.bi_valid + 42) >> 3; /* number of header bytes */
- /* maximum stored block length that will fit in pending: */
- have = s.pending_buf_size - have > 65535/* MAX_STORED */ ? 65535/* MAX_STORED */ : s.pending_buf_size - have;
- min_block = have > s.w_size ? s.w_size : have;
- left = s.strstart - s.block_start;
- if (left >= min_block ||
- ((left || flush === Z_FINISH$3$1) && flush !== Z_NO_FLUSH$2$1 &&
- s.strm.avail_in === 0 && left <= have)) {
- len = left > have ? have : left;
- last = flush === Z_FINISH$3$1 && s.strm.avail_in === 0 &&
- len === left ? 1 : 0;
- _tr_stored_block$2(s, s.block_start, len, last);
- s.block_start += len;
- flush_pending$1(s.strm);
- }
-
- /* We've done all we can with the available input and output. */
- return last ? BS_FINISH_STARTED$1 : BS_NEED_MORE$1;
-};
-
-
-/* ===========================================================================
- * Compress as much as possible from the input stream, return the current
- * block state.
- * This function does not perform lazy evaluation of matches and inserts
- * new strings in the dictionary only for unmatched strings or for short
- * matches. It is used only for the fast compression options.
- */
-const deflate_fast$1 = (s, flush) => {
-
- let hash_head; /* head of the hash chain */
- let bflush; /* set if current block must be flushed */
-
- for (;;) {
- /* Make sure that we always have enough lookahead, except
- * at the end of the input file. We need MAX_MATCH bytes
- * for the next match, plus MIN_MATCH bytes to insert the
- * string following the next match.
- */
- if (s.lookahead < MIN_LOOKAHEAD$1) {
- fill_window$1(s);
- if (s.lookahead < MIN_LOOKAHEAD$1 && flush === Z_NO_FLUSH$2$1) {
- return BS_NEED_MORE$1;
- }
- if (s.lookahead === 0) {
- break; /* flush the current block */
- }
- }
-
- /* Insert the string window[strstart .. strstart+2] in the
- * dictionary, and set hash_head to the head of the hash chain:
- */
- hash_head = 0/*NIL*/;
- if (s.lookahead >= MIN_MATCH$2) {
- /*** INSERT_STRING(s, s.strstart, hash_head); ***/
- s.ins_h = HASH$1(s, s.ins_h, s.window[s.strstart + MIN_MATCH$2 - 1]);
- hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
- s.head[s.ins_h] = s.strstart;
- /***/
- }
-
- /* Find the longest match, discarding those <= prev_length.
- * At this point we have always match_length < MIN_MATCH
- */
- if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD$1))) {
- /* To simplify the code, we prevent matches with the string
- * of window index 0 (in particular we have to avoid a match
- * of the string with itself at the start of the input file).
- */
- s.match_length = longest_match$1(s, hash_head);
- /* longest_match() sets match_start */
- }
- if (s.match_length >= MIN_MATCH$2) {
- // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only
-
- /*** _tr_tally_dist(s, s.strstart - s.match_start,
- s.match_length - MIN_MATCH, bflush); ***/
- bflush = _tr_tally$2(s, s.strstart - s.match_start, s.match_length - MIN_MATCH$2);
-
- s.lookahead -= s.match_length;
-
- /* Insert new strings in the hash table only if the match length
- * is not too large. This saves time but degrades compression.
- */
- if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH$2) {
- s.match_length--; /* string at strstart already in table */
- do {
- s.strstart++;
- /*** INSERT_STRING(s, s.strstart, hash_head); ***/
- s.ins_h = HASH$1(s, s.ins_h, s.window[s.strstart + MIN_MATCH$2 - 1]);
- hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
- s.head[s.ins_h] = s.strstart;
- /***/
- /* strstart never exceeds WSIZE-MAX_MATCH, so there are
- * always MIN_MATCH bytes ahead.
- */
- } while (--s.match_length !== 0);
- s.strstart++;
- } else
- {
- s.strstart += s.match_length;
- s.match_length = 0;
- s.ins_h = s.window[s.strstart];
- /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
- s.ins_h = HASH$1(s, s.ins_h, s.window[s.strstart + 1]);
-
-//#if MIN_MATCH != 3
-// Call UPDATE_HASH() MIN_MATCH-3 more times
-//#endif
- /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
- * matter since it will be recomputed at next deflate call.
- */
- }
- } else {
- /* No match, output a literal byte */
- //Tracevv((stderr,"%c", s.window[s.strstart]));
- /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
- bflush = _tr_tally$2(s, 0, s.window[s.strstart]);
-
- s.lookahead--;
- s.strstart++;
- }
- if (bflush) {
- /*** FLUSH_BLOCK(s, 0); ***/
- flush_block_only$1(s, false);
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE$1;
- }
- /***/
- }
- }
- s.insert = ((s.strstart < (MIN_MATCH$2 - 1)) ? s.strstart : MIN_MATCH$2 - 1);
- if (flush === Z_FINISH$3$1) {
- /*** FLUSH_BLOCK(s, 1); ***/
- flush_block_only$1(s, true);
- if (s.strm.avail_out === 0) {
- return BS_FINISH_STARTED$1;
- }
- /***/
- return BS_FINISH_DONE$1;
- }
- if (s.sym_next) {
- /*** FLUSH_BLOCK(s, 0); ***/
- flush_block_only$1(s, false);
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE$1;
- }
- /***/
- }
- return BS_BLOCK_DONE$1;
-};
-
-/* ===========================================================================
- * Same as above, but achieves better compression. We use a lazy
- * evaluation for matches: a match is finally adopted only if there is
- * no better match at the next window position.
- */
-const deflate_slow$1 = (s, flush) => {
-
- let hash_head; /* head of hash chain */
- let bflush; /* set if current block must be flushed */
-
- let max_insert;
-
- /* Process the input block. */
- for (;;) {
- /* Make sure that we always have enough lookahead, except
- * at the end of the input file. We need MAX_MATCH bytes
- * for the next match, plus MIN_MATCH bytes to insert the
- * string following the next match.
- */
- if (s.lookahead < MIN_LOOKAHEAD$1) {
- fill_window$1(s);
- if (s.lookahead < MIN_LOOKAHEAD$1 && flush === Z_NO_FLUSH$2$1) {
- return BS_NEED_MORE$1;
- }
- if (s.lookahead === 0) { break; } /* flush the current block */
- }
-
- /* Insert the string window[strstart .. strstart+2] in the
- * dictionary, and set hash_head to the head of the hash chain:
- */
- hash_head = 0/*NIL*/;
- if (s.lookahead >= MIN_MATCH$2) {
- /*** INSERT_STRING(s, s.strstart, hash_head); ***/
- s.ins_h = HASH$1(s, s.ins_h, s.window[s.strstart + MIN_MATCH$2 - 1]);
- hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
- s.head[s.ins_h] = s.strstart;
- /***/
- }
-
- /* Find the longest match, discarding those <= prev_length.
- */
- s.prev_length = s.match_length;
- s.prev_match = s.match_start;
- s.match_length = MIN_MATCH$2 - 1;
-
- if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&
- s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD$1)/*MAX_DIST(s)*/) {
- /* To simplify the code, we prevent matches with the string
- * of window index 0 (in particular we have to avoid a match
- * of the string with itself at the start of the input file).
- */
- s.match_length = longest_match$1(s, hash_head);
- /* longest_match() sets match_start */
-
- if (s.match_length <= 5 &&
- (s.strategy === Z_FILTERED$1 || (s.match_length === MIN_MATCH$2 && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {
-
- /* If prev_match is also MIN_MATCH, match_start is garbage
- * but we will ignore the current match anyway.
- */
- s.match_length = MIN_MATCH$2 - 1;
- }
- }
- /* If there was a match at the previous step and the current
- * match is not better, output the previous match:
- */
- if (s.prev_length >= MIN_MATCH$2 && s.match_length <= s.prev_length) {
- max_insert = s.strstart + s.lookahead - MIN_MATCH$2;
- /* Do not insert strings in hash table beyond this. */
-
- //check_match(s, s.strstart-1, s.prev_match, s.prev_length);
-
- /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,
- s.prev_length - MIN_MATCH, bflush);***/
- bflush = _tr_tally$2(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH$2);
- /* Insert in hash table all strings up to the end of the match.
- * strstart-1 and strstart are already inserted. If there is not
- * enough lookahead, the last two strings are not inserted in
- * the hash table.
- */
- s.lookahead -= s.prev_length - 1;
- s.prev_length -= 2;
- do {
- if (++s.strstart <= max_insert) {
- /*** INSERT_STRING(s, s.strstart, hash_head); ***/
- s.ins_h = HASH$1(s, s.ins_h, s.window[s.strstart + MIN_MATCH$2 - 1]);
- hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
- s.head[s.ins_h] = s.strstart;
- /***/
- }
- } while (--s.prev_length !== 0);
- s.match_available = 0;
- s.match_length = MIN_MATCH$2 - 1;
- s.strstart++;
-
- if (bflush) {
- /*** FLUSH_BLOCK(s, 0); ***/
- flush_block_only$1(s, false);
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE$1;
- }
- /***/
- }
-
- } else if (s.match_available) {
- /* If there was no match at the previous position, output a
- * single literal. If there was a match but the current match
- * is longer, truncate the previous match to a single literal.
- */
- //Tracevv((stderr,"%c", s->window[s->strstart-1]));
- /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
- bflush = _tr_tally$2(s, 0, s.window[s.strstart - 1]);
-
- if (bflush) {
- /*** FLUSH_BLOCK_ONLY(s, 0) ***/
- flush_block_only$1(s, false);
- /***/
- }
- s.strstart++;
- s.lookahead--;
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE$1;
- }
- } else {
- /* There is no previous match to compare with, wait for
- * the next step to decide.
- */
- s.match_available = 1;
- s.strstart++;
- s.lookahead--;
- }
- }
- //Assert (flush != Z_NO_FLUSH, "no flush?");
- if (s.match_available) {
- //Tracevv((stderr,"%c", s->window[s->strstart-1]));
- /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
- bflush = _tr_tally$2(s, 0, s.window[s.strstart - 1]);
-
- s.match_available = 0;
- }
- s.insert = s.strstart < MIN_MATCH$2 - 1 ? s.strstart : MIN_MATCH$2 - 1;
- if (flush === Z_FINISH$3$1) {
- /*** FLUSH_BLOCK(s, 1); ***/
- flush_block_only$1(s, true);
- if (s.strm.avail_out === 0) {
- return BS_FINISH_STARTED$1;
- }
- /***/
- return BS_FINISH_DONE$1;
- }
- if (s.sym_next) {
- /*** FLUSH_BLOCK(s, 0); ***/
- flush_block_only$1(s, false);
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE$1;
- }
- /***/
- }
-
- return BS_BLOCK_DONE$1;
-};
-
-
-/* ===========================================================================
- * For Z_RLE, simply look for runs of bytes, generate matches only of distance
- * one. Do not maintain a hash table. (It will be regenerated if this run of
- * deflate switches away from Z_RLE.)
- */
-const deflate_rle$1 = (s, flush) => {
-
- let bflush; /* set if current block must be flushed */
- let prev; /* byte at distance one to match */
- let scan, strend; /* scan goes up to strend for length of run */
-
- const _win = s.window;
-
- for (;;) {
- /* Make sure that we always have enough lookahead, except
- * at the end of the input file. We need MAX_MATCH bytes
- * for the longest run, plus one for the unrolled loop.
- */
- if (s.lookahead <= MAX_MATCH$2) {
- fill_window$1(s);
- if (s.lookahead <= MAX_MATCH$2 && flush === Z_NO_FLUSH$2$1) {
- return BS_NEED_MORE$1;
- }
- if (s.lookahead === 0) { break; } /* flush the current block */
- }
-
- /* See how many times the previous byte repeats */
- s.match_length = 0;
- if (s.lookahead >= MIN_MATCH$2 && s.strstart > 0) {
- scan = s.strstart - 1;
- prev = _win[scan];
- if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {
- strend = s.strstart + MAX_MATCH$2;
- do {
- /*jshint noempty:false*/
- } while (prev === _win[++scan] && prev === _win[++scan] &&
- prev === _win[++scan] && prev === _win[++scan] &&
- prev === _win[++scan] && prev === _win[++scan] &&
- prev === _win[++scan] && prev === _win[++scan] &&
- scan < strend);
- s.match_length = MAX_MATCH$2 - (strend - scan);
- if (s.match_length > s.lookahead) {
- s.match_length = s.lookahead;
- }
- }
- //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
- }
-
- /* Emit match if have run of MIN_MATCH or longer, else emit literal */
- if (s.match_length >= MIN_MATCH$2) {
- //check_match(s, s.strstart, s.strstart - 1, s.match_length);
-
- /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/
- bflush = _tr_tally$2(s, 1, s.match_length - MIN_MATCH$2);
-
- s.lookahead -= s.match_length;
- s.strstart += s.match_length;
- s.match_length = 0;
- } else {
- /* No match, output a literal byte */
- //Tracevv((stderr,"%c", s->window[s->strstart]));
- /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
- bflush = _tr_tally$2(s, 0, s.window[s.strstart]);
-
- s.lookahead--;
- s.strstart++;
- }
- if (bflush) {
- /*** FLUSH_BLOCK(s, 0); ***/
- flush_block_only$1(s, false);
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE$1;
- }
- /***/
- }
- }
- s.insert = 0;
- if (flush === Z_FINISH$3$1) {
- /*** FLUSH_BLOCK(s, 1); ***/
- flush_block_only$1(s, true);
- if (s.strm.avail_out === 0) {
- return BS_FINISH_STARTED$1;
- }
- /***/
- return BS_FINISH_DONE$1;
- }
- if (s.sym_next) {
- /*** FLUSH_BLOCK(s, 0); ***/
- flush_block_only$1(s, false);
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE$1;
- }
- /***/
- }
- return BS_BLOCK_DONE$1;
-};
-
-/* ===========================================================================
- * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.
- * (It will be regenerated if this run of deflate switches away from Huffman.)
- */
-const deflate_huff$1 = (s, flush) => {
-
- let bflush; /* set if current block must be flushed */
-
- for (;;) {
- /* Make sure that we have a literal to write. */
- if (s.lookahead === 0) {
- fill_window$1(s);
- if (s.lookahead === 0) {
- if (flush === Z_NO_FLUSH$2$1) {
- return BS_NEED_MORE$1;
- }
- break; /* flush the current block */
- }
- }
-
- /* Output a literal byte */
- s.match_length = 0;
- //Tracevv((stderr,"%c", s->window[s->strstart]));
- /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
- bflush = _tr_tally$2(s, 0, s.window[s.strstart]);
- s.lookahead--;
- s.strstart++;
- if (bflush) {
- /*** FLUSH_BLOCK(s, 0); ***/
- flush_block_only$1(s, false);
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE$1;
- }
- /***/
- }
- }
- s.insert = 0;
- if (flush === Z_FINISH$3$1) {
- /*** FLUSH_BLOCK(s, 1); ***/
- flush_block_only$1(s, true);
- if (s.strm.avail_out === 0) {
- return BS_FINISH_STARTED$1;
- }
- /***/
- return BS_FINISH_DONE$1;
- }
- if (s.sym_next) {
- /*** FLUSH_BLOCK(s, 0); ***/
- flush_block_only$1(s, false);
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE$1;
- }
- /***/
- }
- return BS_BLOCK_DONE$1;
-};
-
-/* Values for max_lazy_match, good_match and max_chain_length, depending on
- * the desired pack level (0..9). The values given below have been tuned to
- * exclude worst case performance for pathological files. Better values may be
- * found for specific files.
- */
-function Config$1(good_length, max_lazy, nice_length, max_chain, func) {
-
- this.good_length = good_length;
- this.max_lazy = max_lazy;
- this.nice_length = nice_length;
- this.max_chain = max_chain;
- this.func = func;
-}
-
-const configuration_table$1 = [
- /* good lazy nice chain */
- new Config$1(0, 0, 0, 0, deflate_stored$1), /* 0 store only */
- new Config$1(4, 4, 8, 4, deflate_fast$1), /* 1 max speed, no lazy matches */
- new Config$1(4, 5, 16, 8, deflate_fast$1), /* 2 */
- new Config$1(4, 6, 32, 32, deflate_fast$1), /* 3 */
-
- new Config$1(4, 4, 16, 16, deflate_slow$1), /* 4 lazy matches */
- new Config$1(8, 16, 32, 32, deflate_slow$1), /* 5 */
- new Config$1(8, 16, 128, 128, deflate_slow$1), /* 6 */
- new Config$1(8, 32, 128, 256, deflate_slow$1), /* 7 */
- new Config$1(32, 128, 258, 1024, deflate_slow$1), /* 8 */
- new Config$1(32, 258, 258, 4096, deflate_slow$1) /* 9 max compression */
-];
-
-
-/* ===========================================================================
- * Initialize the "longest match" routines for a new zlib stream
- */
-const lm_init$1 = (s) => {
-
- s.window_size = 2 * s.w_size;
-
- /*** CLEAR_HASH(s); ***/
- zero$2(s.head); // Fill with NIL (= 0);
-
- /* Set the default configuration parameters:
- */
- s.max_lazy_match = configuration_table$1[s.level].max_lazy;
- s.good_match = configuration_table$1[s.level].good_length;
- s.nice_match = configuration_table$1[s.level].nice_length;
- s.max_chain_length = configuration_table$1[s.level].max_chain;
-
- s.strstart = 0;
- s.block_start = 0;
- s.lookahead = 0;
- s.insert = 0;
- s.match_length = s.prev_length = MIN_MATCH$2 - 1;
- s.match_available = 0;
- s.ins_h = 0;
-};
-
-
-function DeflateState$1() {
- this.strm = null; /* pointer back to this zlib stream */
- this.status = 0; /* as the name implies */
- this.pending_buf = null; /* output still pending */
- this.pending_buf_size = 0; /* size of pending_buf */
- this.pending_out = 0; /* next pending byte to output to the stream */
- this.pending = 0; /* nb of bytes in the pending buffer */
- this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */
- this.gzhead = null; /* gzip header information to write */
- this.gzindex = 0; /* where in extra, name, or comment */
- this.method = Z_DEFLATED$2$1; /* can only be DEFLATED */
- this.last_flush = -1; /* value of flush param for previous deflate call */
-
- this.w_size = 0; /* LZ77 window size (32K by default) */
- this.w_bits = 0; /* log2(w_size) (8..16) */
- this.w_mask = 0; /* w_size - 1 */
-
- this.window = null;
- /* Sliding window. Input bytes are read into the second half of the window,
- * and move to the first half later to keep a dictionary of at least wSize
- * bytes. With this organization, matches are limited to a distance of
- * wSize-MAX_MATCH bytes, but this ensures that IO is always
- * performed with a length multiple of the block size.
- */
-
- this.window_size = 0;
- /* Actual size of window: 2*wSize, except when the user input buffer
- * is directly used as sliding window.
- */
-
- this.prev = null;
- /* Link to older string with same hash index. To limit the size of this
- * array to 64K, this link is maintained only for the last 32K strings.
- * An index in this array is thus a window index modulo 32K.
- */
-
- this.head = null; /* Heads of the hash chains or NIL. */
-
- this.ins_h = 0; /* hash index of string to be inserted */
- this.hash_size = 0; /* number of elements in hash table */
- this.hash_bits = 0; /* log2(hash_size) */
- this.hash_mask = 0; /* hash_size-1 */
-
- this.hash_shift = 0;
- /* Number of bits by which ins_h must be shifted at each input
- * step. It must be such that after MIN_MATCH steps, the oldest
- * byte no longer takes part in the hash key, that is:
- * hash_shift * MIN_MATCH >= hash_bits
- */
-
- this.block_start = 0;
- /* Window position at the beginning of the current output block. Gets
- * negative when the window is moved backwards.
- */
-
- this.match_length = 0; /* length of best match */
- this.prev_match = 0; /* previous match */
- this.match_available = 0; /* set if previous match exists */
- this.strstart = 0; /* start of string to insert */
- this.match_start = 0; /* start of matching string */
- this.lookahead = 0; /* number of valid bytes ahead in window */
-
- this.prev_length = 0;
- /* Length of the best match at previous step. Matches not greater than this
- * are discarded. This is used in the lazy match evaluation.
- */
-
- this.max_chain_length = 0;
- /* To speed up deflation, hash chains are never searched beyond this
- * length. A higher limit improves compression ratio but degrades the
- * speed.
- */
-
- this.max_lazy_match = 0;
- /* Attempt to find a better match only when the current match is strictly
- * smaller than this value. This mechanism is used only for compression
- * levels >= 4.
- */
- // That's alias to max_lazy_match, don't use directly
- //this.max_insert_length = 0;
- /* Insert new strings in the hash table only if the match length is not
- * greater than this length. This saves time but degrades compression.
- * max_insert_length is used only for compression levels <= 3.
- */
-
- this.level = 0; /* compression level (1..9) */
- this.strategy = 0; /* favor or force Huffman coding*/
-
- this.good_match = 0;
- /* Use a faster search when the previous match is longer than this */
-
- this.nice_match = 0; /* Stop searching when current match exceeds this */
-
- /* used by trees.c: */
-
- /* Didn't use ct_data typedef below to suppress compiler warning */
-
- // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */
- // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
- // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */
-
- // Use flat array of DOUBLE size, with interleaved fata,
- // because JS does not support effective
- this.dyn_ltree = new Uint16Array(HEAP_SIZE$2 * 2);
- this.dyn_dtree = new Uint16Array((2 * D_CODES$2 + 1) * 2);
- this.bl_tree = new Uint16Array((2 * BL_CODES$2 + 1) * 2);
- zero$2(this.dyn_ltree);
- zero$2(this.dyn_dtree);
- zero$2(this.bl_tree);
-
- this.l_desc = null; /* desc. for literal tree */
- this.d_desc = null; /* desc. for distance tree */
- this.bl_desc = null; /* desc. for bit length tree */
-
- //ush bl_count[MAX_BITS+1];
- this.bl_count = new Uint16Array(MAX_BITS$2 + 1);
- /* number of codes at each bit length for an optimal tree */
-
- //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */
- this.heap = new Uint16Array(2 * L_CODES$2 + 1); /* heap used to build the Huffman trees */
- zero$2(this.heap);
-
- this.heap_len = 0; /* number of elements in the heap */
- this.heap_max = 0; /* element of largest frequency */
- /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
- * The same heap array is used to build all trees.
- */
-
- this.depth = new Uint16Array(2 * L_CODES$2 + 1); //uch depth[2*L_CODES+1];
- zero$2(this.depth);
- /* Depth of each subtree used as tie breaker for trees of equal frequency
- */
-
- this.sym_buf = 0; /* buffer for distances and literals/lengths */
-
- this.lit_bufsize = 0;
- /* Size of match buffer for literals/lengths. There are 4 reasons for
- * limiting lit_bufsize to 64K:
- * - frequencies can be kept in 16 bit counters
- * - if compression is not successful for the first block, all input
- * data is still in the window so we can still emit a stored block even
- * when input comes from standard input. (This can also be done for
- * all blocks if lit_bufsize is not greater than 32K.)
- * - if compression is not successful for a file smaller than 64K, we can
- * even emit a stored file instead of a stored block (saving 5 bytes).
- * This is applicable only for zip (not gzip or zlib).
- * - creating new Huffman trees less frequently may not provide fast
- * adaptation to changes in the input data statistics. (Take for
- * example a binary file with poorly compressible code followed by
- * a highly compressible string table.) Smaller buffer sizes give
- * fast adaptation but have of course the overhead of transmitting
- * trees more frequently.
- * - I can't count above 4
- */
-
- this.sym_next = 0; /* running index in sym_buf */
- this.sym_end = 0; /* symbol table full when sym_next reaches this */
-
- this.opt_len = 0; /* bit length of current block with optimal trees */
- this.static_len = 0; /* bit length of current block with static trees */
- this.matches = 0; /* number of string matches in current block */
- this.insert = 0; /* bytes at end of window left to insert */
-
-
- this.bi_buf = 0;
- /* Output buffer. bits are inserted starting at the bottom (least
- * significant bits).
- */
- this.bi_valid = 0;
- /* Number of valid bits in bi_buf. All bits above the last valid bit
- * are always zero.
- */
-
- // Used for window memory init. We safely ignore it for JS. That makes
- // sense only for pointers and memory check tools.
- //this.high_water = 0;
- /* High water mark offset in window for initialized bytes -- bytes above
- * this are set to zero in order to avoid memory check warnings when
- * longest match routines access bytes past the input. This is then
- * updated to the new high water mark.
- */
-}
-
-
-/* =========================================================================
- * Check for a valid deflate stream state. Return 0 if ok, 1 if not.
- */
-const deflateStateCheck$1 = (strm) => {
-
- if (!strm) {
- return 1;
- }
- const s = strm.state;
- if (!s || s.strm !== strm || (s.status !== INIT_STATE$1 &&
-//#ifdef GZIP
- s.status !== GZIP_STATE$1 &&
-//#endif
- s.status !== EXTRA_STATE$1 &&
- s.status !== NAME_STATE$1 &&
- s.status !== COMMENT_STATE$1 &&
- s.status !== HCRC_STATE$1 &&
- s.status !== BUSY_STATE$1 &&
- s.status !== FINISH_STATE$1)) {
- return 1;
- }
- return 0;
-};
-
-
-const deflateResetKeep$1 = (strm) => {
-
- if (deflateStateCheck$1(strm)) {
- return err$1(strm, Z_STREAM_ERROR$2$1);
- }
-
- strm.total_in = strm.total_out = 0;
- strm.data_type = Z_UNKNOWN$2;
-
- const s = strm.state;
- s.pending = 0;
- s.pending_out = 0;
-
- if (s.wrap < 0) {
- s.wrap = -s.wrap;
- /* was made negative by deflate(..., Z_FINISH); */
- }
- s.status =
-//#ifdef GZIP
- s.wrap === 2 ? GZIP_STATE$1 :
-//#endif
- s.wrap ? INIT_STATE$1 : BUSY_STATE$1;
- strm.adler = (s.wrap === 2) ?
- 0 // crc32(0, Z_NULL, 0)
- :
- 1; // adler32(0, Z_NULL, 0)
- s.last_flush = -2;
- _tr_init$2(s);
- return Z_OK$3$1;
-};
-
-
-const deflateReset$1 = (strm) => {
-
- const ret = deflateResetKeep$1(strm);
- if (ret === Z_OK$3$1) {
- lm_init$1(strm.state);
- }
- return ret;
-};
-
-
-const deflateSetHeader$1 = (strm, head) => {
-
- if (deflateStateCheck$1(strm) || strm.state.wrap !== 2) {
- return Z_STREAM_ERROR$2$1;
- }
- strm.state.gzhead = head;
- return Z_OK$3$1;
-};
-
-
-const deflateInit2$1 = (strm, level, method, windowBits, memLevel, strategy) => {
-
- if (!strm) { // === Z_NULL
- return Z_STREAM_ERROR$2$1;
- }
- let wrap = 1;
-
- if (level === Z_DEFAULT_COMPRESSION$1$1) {
- level = 6;
- }
-
- if (windowBits < 0) { /* suppress zlib wrapper */
- wrap = 0;
- windowBits = -windowBits;
- }
-
- else if (windowBits > 15) {
- wrap = 2; /* write gzip wrapper instead */
- windowBits -= 16;
- }
-
-
- if (memLevel < 1 || memLevel > MAX_MEM_LEVEL$1 || method !== Z_DEFLATED$2$1 ||
- windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
- strategy < 0 || strategy > Z_FIXED$2 || (windowBits === 8 && wrap !== 1)) {
- return err$1(strm, Z_STREAM_ERROR$2$1);
- }
-
-
- if (windowBits === 8) {
- windowBits = 9;
- }
- /* until 256-byte window bug fixed */
-
- const s = new DeflateState$1();
-
- strm.state = s;
- s.strm = strm;
- s.status = INIT_STATE$1; /* to pass state test in deflateReset() */
-
- s.wrap = wrap;
- s.gzhead = null;
- s.w_bits = windowBits;
- s.w_size = 1 << s.w_bits;
- s.w_mask = s.w_size - 1;
-
- s.hash_bits = memLevel + 7;
- s.hash_size = 1 << s.hash_bits;
- s.hash_mask = s.hash_size - 1;
- s.hash_shift = ~~((s.hash_bits + MIN_MATCH$2 - 1) / MIN_MATCH$2);
-
- s.window = new Uint8Array(s.w_size * 2);
- s.head = new Uint16Array(s.hash_size);
- s.prev = new Uint16Array(s.w_size);
-
- // Don't need mem init magic for JS.
- //s.high_water = 0; /* nothing written to s->window yet */
-
- s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
-
- /* We overlay pending_buf and sym_buf. This works since the average size
- * for length/distance pairs over any compressed block is assured to be 31
- * bits or less.
- *
- * Analysis: The longest fixed codes are a length code of 8 bits plus 5
- * extra bits, for lengths 131 to 257. The longest fixed distance codes are
- * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest
- * possible fixed-codes length/distance pair is then 31 bits total.
- *
- * sym_buf starts one-fourth of the way into pending_buf. So there are
- * three bytes in sym_buf for every four bytes in pending_buf. Each symbol
- * in sym_buf is three bytes -- two for the distance and one for the
- * literal/length. As each symbol is consumed, the pointer to the next
- * sym_buf value to read moves forward three bytes. From that symbol, up to
- * 31 bits are written to pending_buf. The closest the written pending_buf
- * bits gets to the next sym_buf symbol to read is just before the last
- * code is written. At that time, 31*(n-2) bits have been written, just
- * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at
- * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1
- * symbols are written.) The closest the writing gets to what is unread is
- * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and
- * can range from 128 to 32768.
- *
- * Therefore, at a minimum, there are 142 bits of space between what is
- * written and what is read in the overlain buffers, so the symbols cannot
- * be overwritten by the compressed data. That space is actually 139 bits,
- * due to the three-bit fixed-code block header.
- *
- * That covers the case where either Z_FIXED is specified, forcing fixed
- * codes, or when the use of fixed codes is chosen, because that choice
- * results in a smaller compressed block than dynamic codes. That latter
- * condition then assures that the above analysis also covers all dynamic
- * blocks. A dynamic-code block will only be chosen to be emitted if it has
- * fewer bits than a fixed-code block would for the same set of symbols.
- * Therefore its average symbol length is assured to be less than 31. So
- * the compressed data for a dynamic block also cannot overwrite the
- * symbols from which it is being constructed.
- */
-
- s.pending_buf_size = s.lit_bufsize * 4;
- s.pending_buf = new Uint8Array(s.pending_buf_size);
-
- // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)
- //s->sym_buf = s->pending_buf + s->lit_bufsize;
- s.sym_buf = s.lit_bufsize;
-
- //s->sym_end = (s->lit_bufsize - 1) * 3;
- s.sym_end = (s.lit_bufsize - 1) * 3;
- /* We avoid equality with lit_bufsize*3 because of wraparound at 64K
- * on 16 bit machines and because stored blocks are restricted to
- * 64K-1 bytes.
- */
-
- s.level = level;
- s.strategy = strategy;
- s.method = method;
-
- return deflateReset$1(strm);
-};
-
-const deflateInit$1 = (strm, level) => {
-
- return deflateInit2$1(strm, level, Z_DEFLATED$2$1, MAX_WBITS$1$1, DEF_MEM_LEVEL$1, Z_DEFAULT_STRATEGY$1$1);
-};
-
-
-/* ========================================================================= */
-const deflate$2$1 = (strm, flush) => {
-
- if (deflateStateCheck$1(strm) || flush > Z_BLOCK$1$1 || flush < 0) {
- return strm ? err$1(strm, Z_STREAM_ERROR$2$1) : Z_STREAM_ERROR$2$1;
- }
-
- const s = strm.state;
-
- if (!strm.output ||
- (strm.avail_in !== 0 && !strm.input) ||
- (s.status === FINISH_STATE$1 && flush !== Z_FINISH$3$1)) {
- return err$1(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$1$1 : Z_STREAM_ERROR$2$1);
- }
-
- const old_flush = s.last_flush;
- s.last_flush = flush;
-
- /* Flush as much pending output as possible */
- if (s.pending !== 0) {
- flush_pending$1(strm);
- if (strm.avail_out === 0) {
- /* Since avail_out is 0, deflate will be called again with
- * more output space, but possibly with both pending and
- * avail_in equal to zero. There won't be anything to do,
- * but this is not an error situation so make sure we
- * return OK instead of BUF_ERROR at next call of deflate:
- */
- s.last_flush = -1;
- return Z_OK$3$1;
- }
-
- /* Make sure there is something to do and avoid duplicate consecutive
- * flushes. For repeated and useless calls with Z_FINISH, we keep
- * returning Z_STREAM_END instead of Z_BUF_ERROR.
- */
- } else if (strm.avail_in === 0 && rank$1(flush) <= rank$1(old_flush) &&
- flush !== Z_FINISH$3$1) {
- return err$1(strm, Z_BUF_ERROR$1$1);
- }
-
- /* User must not provide more input after the first FINISH: */
- if (s.status === FINISH_STATE$1 && strm.avail_in !== 0) {
- return err$1(strm, Z_BUF_ERROR$1$1);
- }
-
- /* Write the header */
- if (s.status === INIT_STATE$1 && s.wrap === 0) {
- s.status = BUSY_STATE$1;
- }
- if (s.status === INIT_STATE$1) {
- /* zlib header */
- let header = (Z_DEFLATED$2$1 + ((s.w_bits - 8) << 4)) << 8;
- let level_flags = -1;
-
- if (s.strategy >= Z_HUFFMAN_ONLY$1 || s.level < 2) {
- level_flags = 0;
- } else if (s.level < 6) {
- level_flags = 1;
- } else if (s.level === 6) {
- level_flags = 2;
- } else {
- level_flags = 3;
- }
- header |= (level_flags << 6);
- if (s.strstart !== 0) { header |= PRESET_DICT$1; }
- header += 31 - (header % 31);
-
- putShortMSB$1(s, header);
-
- /* Save the adler32 of the preset dictionary: */
- if (s.strstart !== 0) {
- putShortMSB$1(s, strm.adler >>> 16);
- putShortMSB$1(s, strm.adler & 0xffff);
- }
- strm.adler = 1; // adler32(0L, Z_NULL, 0);
- s.status = BUSY_STATE$1;
-
- /* Compression must start with an empty pending buffer */
- flush_pending$1(strm);
- if (s.pending !== 0) {
- s.last_flush = -1;
- return Z_OK$3$1;
- }
- }
-//#ifdef GZIP
- if (s.status === GZIP_STATE$1) {
- /* gzip header */
- strm.adler = 0; //crc32(0L, Z_NULL, 0);
- put_byte$1(s, 31);
- put_byte$1(s, 139);
- put_byte$1(s, 8);
- if (!s.gzhead) { // s->gzhead == Z_NULL
- put_byte$1(s, 0);
- put_byte$1(s, 0);
- put_byte$1(s, 0);
- put_byte$1(s, 0);
- put_byte$1(s, 0);
- put_byte$1(s, s.level === 9 ? 2 :
- (s.strategy >= Z_HUFFMAN_ONLY$1 || s.level < 2 ?
- 4 : 0));
- put_byte$1(s, OS_CODE$1);
- s.status = BUSY_STATE$1;
-
- /* Compression must start with an empty pending buffer */
- flush_pending$1(strm);
- if (s.pending !== 0) {
- s.last_flush = -1;
- return Z_OK$3$1;
- }
- }
- else {
- put_byte$1(s, (s.gzhead.text ? 1 : 0) +
- (s.gzhead.hcrc ? 2 : 0) +
- (!s.gzhead.extra ? 0 : 4) +
- (!s.gzhead.name ? 0 : 8) +
- (!s.gzhead.comment ? 0 : 16)
- );
- put_byte$1(s, s.gzhead.time & 0xff);
- put_byte$1(s, (s.gzhead.time >> 8) & 0xff);
- put_byte$1(s, (s.gzhead.time >> 16) & 0xff);
- put_byte$1(s, (s.gzhead.time >> 24) & 0xff);
- put_byte$1(s, s.level === 9 ? 2 :
- (s.strategy >= Z_HUFFMAN_ONLY$1 || s.level < 2 ?
- 4 : 0));
- put_byte$1(s, s.gzhead.os & 0xff);
- if (s.gzhead.extra && s.gzhead.extra.length) {
- put_byte$1(s, s.gzhead.extra.length & 0xff);
- put_byte$1(s, (s.gzhead.extra.length >> 8) & 0xff);
- }
- if (s.gzhead.hcrc) {
- strm.adler = crc32_1$2(strm.adler, s.pending_buf, s.pending, 0);
- }
- s.gzindex = 0;
- s.status = EXTRA_STATE$1;
- }
- }
- if (s.status === EXTRA_STATE$1) {
- if (s.gzhead.extra/* != Z_NULL*/) {
- let beg = s.pending; /* start of bytes to update crc */
- let left = (s.gzhead.extra.length & 0xffff) - s.gzindex;
- while (s.pending + left > s.pending_buf_size) {
- let copy = s.pending_buf_size - s.pending;
- // zmemcpy(s.pending_buf + s.pending,
- // s.gzhead.extra + s.gzindex, copy);
- s.pending_buf.set(s.gzhead.extra.subarray(s.gzindex, s.gzindex + copy), s.pending);
- s.pending = s.pending_buf_size;
- //--- HCRC_UPDATE(beg) ---//
- if (s.gzhead.hcrc && s.pending > beg) {
- strm.adler = crc32_1$2(strm.adler, s.pending_buf, s.pending - beg, beg);
- }
- //---//
- s.gzindex += copy;
- flush_pending$1(strm);
- if (s.pending !== 0) {
- s.last_flush = -1;
- return Z_OK$3$1;
- }
- beg = 0;
- left -= copy;
- }
- // JS specific: s.gzhead.extra may be TypedArray or Array for backward compatibility
- // TypedArray.slice and TypedArray.from don't exist in IE10-IE11
- let gzhead_extra = new Uint8Array(s.gzhead.extra);
- // zmemcpy(s->pending_buf + s->pending,
- // s->gzhead->extra + s->gzindex, left);
- s.pending_buf.set(gzhead_extra.subarray(s.gzindex, s.gzindex + left), s.pending);
- s.pending += left;
- //--- HCRC_UPDATE(beg) ---//
- if (s.gzhead.hcrc && s.pending > beg) {
- strm.adler = crc32_1$2(strm.adler, s.pending_buf, s.pending - beg, beg);
- }
- //---//
- s.gzindex = 0;
- }
- s.status = NAME_STATE$1;
- }
- if (s.status === NAME_STATE$1) {
- if (s.gzhead.name/* != Z_NULL*/) {
- let beg = s.pending; /* start of bytes to update crc */
- let val;
- do {
- if (s.pending === s.pending_buf_size) {
- //--- HCRC_UPDATE(beg) ---//
- if (s.gzhead.hcrc && s.pending > beg) {
- strm.adler = crc32_1$2(strm.adler, s.pending_buf, s.pending - beg, beg);
- }
- //---//
- flush_pending$1(strm);
- if (s.pending !== 0) {
- s.last_flush = -1;
- return Z_OK$3$1;
- }
- beg = 0;
- }
- // JS specific: little magic to add zero terminator to end of string
- if (s.gzindex < s.gzhead.name.length) {
- val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;
- } else {
- val = 0;
- }
- put_byte$1(s, val);
- } while (val !== 0);
- //--- HCRC_UPDATE(beg) ---//
- if (s.gzhead.hcrc && s.pending > beg) {
- strm.adler = crc32_1$2(strm.adler, s.pending_buf, s.pending - beg, beg);
- }
- //---//
- s.gzindex = 0;
- }
- s.status = COMMENT_STATE$1;
- }
- if (s.status === COMMENT_STATE$1) {
- if (s.gzhead.comment/* != Z_NULL*/) {
- let beg = s.pending; /* start of bytes to update crc */
- let val;
- do {
- if (s.pending === s.pending_buf_size) {
- //--- HCRC_UPDATE(beg) ---//
- if (s.gzhead.hcrc && s.pending > beg) {
- strm.adler = crc32_1$2(strm.adler, s.pending_buf, s.pending - beg, beg);
- }
- //---//
- flush_pending$1(strm);
- if (s.pending !== 0) {
- s.last_flush = -1;
- return Z_OK$3$1;
- }
- beg = 0;
- }
- // JS specific: little magic to add zero terminator to end of string
- if (s.gzindex < s.gzhead.comment.length) {
- val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;
- } else {
- val = 0;
- }
- put_byte$1(s, val);
- } while (val !== 0);
- //--- HCRC_UPDATE(beg) ---//
- if (s.gzhead.hcrc && s.pending > beg) {
- strm.adler = crc32_1$2(strm.adler, s.pending_buf, s.pending - beg, beg);
- }
- //---//
- }
- s.status = HCRC_STATE$1;
- }
- if (s.status === HCRC_STATE$1) {
- if (s.gzhead.hcrc) {
- if (s.pending + 2 > s.pending_buf_size) {
- flush_pending$1(strm);
- if (s.pending !== 0) {
- s.last_flush = -1;
- return Z_OK$3$1;
- }
- }
- put_byte$1(s, strm.adler & 0xff);
- put_byte$1(s, (strm.adler >> 8) & 0xff);
- strm.adler = 0; //crc32(0L, Z_NULL, 0);
- }
- s.status = BUSY_STATE$1;
-
- /* Compression must start with an empty pending buffer */
- flush_pending$1(strm);
- if (s.pending !== 0) {
- s.last_flush = -1;
- return Z_OK$3$1;
- }
- }
-//#endif
-
- /* Start a new block or continue the current one.
- */
- if (strm.avail_in !== 0 || s.lookahead !== 0 ||
- (flush !== Z_NO_FLUSH$2$1 && s.status !== FINISH_STATE$1)) {
- let bstate = s.level === 0 ? deflate_stored$1(s, flush) :
- s.strategy === Z_HUFFMAN_ONLY$1 ? deflate_huff$1(s, flush) :
- s.strategy === Z_RLE$1 ? deflate_rle$1(s, flush) :
- configuration_table$1[s.level].func(s, flush);
-
- if (bstate === BS_FINISH_STARTED$1 || bstate === BS_FINISH_DONE$1) {
- s.status = FINISH_STATE$1;
- }
- if (bstate === BS_NEED_MORE$1 || bstate === BS_FINISH_STARTED$1) {
- if (strm.avail_out === 0) {
- s.last_flush = -1;
- /* avoid BUF_ERROR next call, see above */
- }
- return Z_OK$3$1;
- /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
- * of deflate should use the same flush parameter to make sure
- * that the flush is complete. So we don't have to output an
- * empty block here, this will be done at next call. This also
- * ensures that for a very small output buffer, we emit at most
- * one empty block.
- */
- }
- if (bstate === BS_BLOCK_DONE$1) {
- if (flush === Z_PARTIAL_FLUSH$1) {
- _tr_align$2(s);
- }
- else if (flush !== Z_BLOCK$1$1) { /* FULL_FLUSH or SYNC_FLUSH */
-
- _tr_stored_block$2(s, 0, 0, false);
- /* For a full flush, this empty block will be recognized
- * as a special marker by inflate_sync().
- */
- if (flush === Z_FULL_FLUSH$1$1) {
- /*** CLEAR_HASH(s); ***/ /* forget history */
- zero$2(s.head); // Fill with NIL (= 0);
-
- if (s.lookahead === 0) {
- s.strstart = 0;
- s.block_start = 0;
- s.insert = 0;
- }
- }
- }
- flush_pending$1(strm);
- if (strm.avail_out === 0) {
- s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */
- return Z_OK$3$1;
- }
- }
- }
-
- if (flush !== Z_FINISH$3$1) { return Z_OK$3$1; }
- if (s.wrap <= 0) { return Z_STREAM_END$3$1; }
-
- /* Write the trailer */
- if (s.wrap === 2) {
- put_byte$1(s, strm.adler & 0xff);
- put_byte$1(s, (strm.adler >> 8) & 0xff);
- put_byte$1(s, (strm.adler >> 16) & 0xff);
- put_byte$1(s, (strm.adler >> 24) & 0xff);
- put_byte$1(s, strm.total_in & 0xff);
- put_byte$1(s, (strm.total_in >> 8) & 0xff);
- put_byte$1(s, (strm.total_in >> 16) & 0xff);
- put_byte$1(s, (strm.total_in >> 24) & 0xff);
- }
- else
- {
- putShortMSB$1(s, strm.adler >>> 16);
- putShortMSB$1(s, strm.adler & 0xffff);
- }
-
- flush_pending$1(strm);
- /* If avail_out is zero, the application will call deflate again
- * to flush the rest.
- */
- if (s.wrap > 0) { s.wrap = -s.wrap; }
- /* write the trailer only once! */
- return s.pending !== 0 ? Z_OK$3$1 : Z_STREAM_END$3$1;
-};
-
-
-const deflateEnd$1 = (strm) => {
-
- if (deflateStateCheck$1(strm)) {
- return Z_STREAM_ERROR$2$1;
- }
-
- const status = strm.state.status;
-
- strm.state = null;
-
- return status === BUSY_STATE$1 ? err$1(strm, Z_DATA_ERROR$2$1) : Z_OK$3$1;
-};
-
-
-/* =========================================================================
- * Initializes the compression dictionary from the given byte
- * sequence without producing any compressed output.
- */
-const deflateSetDictionary$1 = (strm, dictionary) => {
-
- let dictLength = dictionary.length;
-
- if (deflateStateCheck$1(strm)) {
- return Z_STREAM_ERROR$2$1;
- }
-
- const s = strm.state;
- const wrap = s.wrap;
-
- if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE$1) || s.lookahead) {
- return Z_STREAM_ERROR$2$1;
- }
-
- /* when using zlib wrappers, compute Adler-32 for provided dictionary */
- if (wrap === 1) {
- /* adler32(strm->adler, dictionary, dictLength); */
- strm.adler = adler32_1$2(strm.adler, dictionary, dictLength, 0);
- }
-
- s.wrap = 0; /* avoid computing Adler-32 in read_buf */
-
- /* if dictionary would fill window, just replace the history */
- if (dictLength >= s.w_size) {
- if (wrap === 0) { /* already empty otherwise */
- /*** CLEAR_HASH(s); ***/
- zero$2(s.head); // Fill with NIL (= 0);
- s.strstart = 0;
- s.block_start = 0;
- s.insert = 0;
- }
- /* use the tail */
- // dictionary = dictionary.slice(dictLength - s.w_size);
- let tmpDict = new Uint8Array(s.w_size);
- tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0);
- dictionary = tmpDict;
- dictLength = s.w_size;
- }
- /* insert dictionary into window and hash */
- const avail = strm.avail_in;
- const next = strm.next_in;
- const input = strm.input;
- strm.avail_in = dictLength;
- strm.next_in = 0;
- strm.input = dictionary;
- fill_window$1(s);
- while (s.lookahead >= MIN_MATCH$2) {
- let str = s.strstart;
- let n = s.lookahead - (MIN_MATCH$2 - 1);
- do {
- /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
- s.ins_h = HASH$1(s, s.ins_h, s.window[str + MIN_MATCH$2 - 1]);
-
- s.prev[str & s.w_mask] = s.head[s.ins_h];
-
- s.head[s.ins_h] = str;
- str++;
- } while (--n);
- s.strstart = str;
- s.lookahead = MIN_MATCH$2 - 1;
- fill_window$1(s);
- }
- s.strstart += s.lookahead;
- s.block_start = s.strstart;
- s.insert = s.lookahead;
- s.lookahead = 0;
- s.match_length = s.prev_length = MIN_MATCH$2 - 1;
- s.match_available = 0;
- strm.next_in = next;
- strm.input = input;
- strm.avail_in = avail;
- s.wrap = wrap;
- return Z_OK$3$1;
-};
-
-
-var deflateInit_1$1 = deflateInit$1;
-var deflateInit2_1$1 = deflateInit2$1;
-var deflateReset_1$1 = deflateReset$1;
-var deflateResetKeep_1$1 = deflateResetKeep$1;
-var deflateSetHeader_1$1 = deflateSetHeader$1;
-var deflate_2$1$1 = deflate$2$1;
-var deflateEnd_1$1 = deflateEnd$1;
-var deflateSetDictionary_1$1 = deflateSetDictionary$1;
-var deflateInfo$1 = 'pako deflate (from Nodeca project)';
-
-/* Not implemented
-module.exports.deflateBound = deflateBound;
-module.exports.deflateCopy = deflateCopy;
-module.exports.deflateGetDictionary = deflateGetDictionary;
-module.exports.deflateParams = deflateParams;
-module.exports.deflatePending = deflatePending;
-module.exports.deflatePrime = deflatePrime;
-module.exports.deflateTune = deflateTune;
-*/
-
-var deflate_1$2$1 = {
- deflateInit: deflateInit_1$1,
- deflateInit2: deflateInit2_1$1,
- deflateReset: deflateReset_1$1,
- deflateResetKeep: deflateResetKeep_1$1,
- deflateSetHeader: deflateSetHeader_1$1,
- deflate: deflate_2$1$1,
- deflateEnd: deflateEnd_1$1,
- deflateSetDictionary: deflateSetDictionary_1$1,
- deflateInfo: deflateInfo$1
-};
-
-const _has$2 = (obj, key) => {
- return Object.prototype.hasOwnProperty.call(obj, key);
-};
-
-var assign$2 = function (obj /*from1, from2, from3, ...*/) {
- const sources = Array.prototype.slice.call(arguments, 1);
- while (sources.length) {
- const source = sources.shift();
- if (!source) { continue; }
-
- if (typeof source !== 'object') {
- throw new TypeError(source + 'must be non-object');
- }
-
- for (const p in source) {
- if (_has$2(source, p)) {
- obj[p] = source[p];
- }
- }
- }
-
- return obj;
-};
-
-
-// Join array of chunks to single array.
-var flattenChunks$2 = (chunks) => {
- // calculate data length
- let len = 0;
-
- for (let i = 0, l = chunks.length; i < l; i++) {
- len += chunks[i].length;
- }
-
- // join chunks
- const result = new Uint8Array(len);
-
- for (let i = 0, pos = 0, l = chunks.length; i < l; i++) {
- let chunk = chunks[i];
- result.set(chunk, pos);
- pos += chunk.length;
- }
-
- return result;
-};
-
-var common$2 = {
- assign: assign$2,
- flattenChunks: flattenChunks$2
-};
-
-// String encode/decode helpers
-
-
-// Quick check if we can use fast array to bin string conversion
-//
-// - apply(Array) can fail on Android 2.2
-// - apply(Uint8Array) can fail on iOS 5.1 Safari
-//
-let STR_APPLY_UIA_OK$2 = true;
-
-try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK$2 = false; }
-
-
-// Table with utf8 lengths (calculated by first byte of sequence)
-// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
-// because max possible codepoint is 0x10ffff
-const _utf8len$2 = new Uint8Array(256);
-for (let q = 0; q < 256; q++) {
- _utf8len$2[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);
-}
-_utf8len$2[254] = _utf8len$2[254] = 1; // Invalid sequence start
-
-
-// convert string to array (typed, when possible)
-var string2buf$2 = (str) => {
- if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) {
- return new TextEncoder().encode(str);
- }
-
- let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
-
- // count binary size
- for (m_pos = 0; m_pos < str_len; m_pos++) {
- c = str.charCodeAt(m_pos);
- if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {
- c2 = str.charCodeAt(m_pos + 1);
- if ((c2 & 0xfc00) === 0xdc00) {
- c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
- m_pos++;
- }
- }
- buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;
- }
-
- // allocate buffer
- buf = new Uint8Array(buf_len);
-
- // convert
- for (i = 0, m_pos = 0; i < buf_len; m_pos++) {
- c = str.charCodeAt(m_pos);
- if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {
- c2 = str.charCodeAt(m_pos + 1);
- if ((c2 & 0xfc00) === 0xdc00) {
- c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
- m_pos++;
- }
- }
- if (c < 0x80) {
- /* one byte */
- buf[i++] = c;
- } else if (c < 0x800) {
- /* two bytes */
- buf[i++] = 0xC0 | (c >>> 6);
- buf[i++] = 0x80 | (c & 0x3f);
- } else if (c < 0x10000) {
- /* three bytes */
- buf[i++] = 0xE0 | (c >>> 12);
- buf[i++] = 0x80 | (c >>> 6 & 0x3f);
- buf[i++] = 0x80 | (c & 0x3f);
- } else {
- /* four bytes */
- buf[i++] = 0xf0 | (c >>> 18);
- buf[i++] = 0x80 | (c >>> 12 & 0x3f);
- buf[i++] = 0x80 | (c >>> 6 & 0x3f);
- buf[i++] = 0x80 | (c & 0x3f);
- }
- }
-
- return buf;
-};
-
-// Helper
-const buf2binstring$2 = (buf, len) => {
- // On Chrome, the arguments in a function call that are allowed is `65534`.
- // If the length of the buffer is smaller than that, we can use this optimization,
- // otherwise we will take a slower path.
- if (len < 65534) {
- if (buf.subarray && STR_APPLY_UIA_OK$2) {
- return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len));
- }
- }
-
- let result = '';
- for (let i = 0; i < len; i++) {
- result += String.fromCharCode(buf[i]);
- }
- return result;
-};
-
-
-// convert array to string
-var buf2string$2 = (buf, max) => {
- const len = max || buf.length;
-
- if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) {
- return new TextDecoder().decode(buf.subarray(0, max));
- }
-
- let i, out;
-
- // Reserve max possible length (2 words per char)
- // NB: by unknown reasons, Array is significantly faster for
- // String.fromCharCode.apply than Uint16Array.
- const utf16buf = new Array(len * 2);
-
- for (out = 0, i = 0; i < len;) {
- let c = buf[i++];
- // quick process ascii
- if (c < 0x80) { utf16buf[out++] = c; continue; }
-
- let c_len = _utf8len$2[c];
- // skip 5 & 6 byte codes
- if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }
-
- // apply mask on first byte
- c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
- // join the rest
- while (c_len > 1 && i < len) {
- c = (c << 6) | (buf[i++] & 0x3f);
- c_len--;
- }
-
- // terminated by end of string?
- if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
-
- if (c < 0x10000) {
- utf16buf[out++] = c;
- } else {
- c -= 0x10000;
- utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
- utf16buf[out++] = 0xdc00 | (c & 0x3ff);
- }
- }
-
- return buf2binstring$2(utf16buf, out);
-};
-
-
-// Calculate max possible position in utf8 buffer,
-// that will not break sequence. If that's not possible
-// - (very small limits) return max size as is.
-//
-// buf[] - utf8 bytes array
-// max - length limit (mandatory);
-var utf8border$2 = (buf, max) => {
-
- max = max || buf.length;
- if (max > buf.length) { max = buf.length; }
-
- // go back from last position, until start of sequence found
- let pos = max - 1;
- while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
-
- // Very small and broken sequence,
- // return max, because we should return something anyway.
- if (pos < 0) { return max; }
-
- // If we came to start of buffer - that means buffer is too small,
- // return max too.
- if (pos === 0) { return max; }
-
- return (pos + _utf8len$2[buf[pos]] > max) ? pos : max;
-};
-
-var strings$2 = {
- string2buf: string2buf$2,
- buf2string: buf2string$2,
- utf8border: utf8border$2
-};
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-function ZStream$2() {
- /* next input byte */
- this.input = null; // JS specific, because we have no pointers
- this.next_in = 0;
- /* number of bytes available at input */
- this.avail_in = 0;
- /* total number of input bytes read so far */
- this.total_in = 0;
- /* next output byte should be put there */
- this.output = null; // JS specific, because we have no pointers
- this.next_out = 0;
- /* remaining free space at output */
- this.avail_out = 0;
- /* total number of bytes output so far */
- this.total_out = 0;
- /* last error message, NULL if no error */
- this.msg = ''/*Z_NULL*/;
- /* not visible by applications */
- this.state = null;
- /* best guess about the data type: binary or text */
- this.data_type = 2/*Z_UNKNOWN*/;
- /* adler32 value of the uncompressed data */
- this.adler = 0;
-}
-
-var zstream$2 = ZStream$2;
-
-const toString$1$1 = Object.prototype.toString;
-
-/* Public constants ==========================================================*/
-/* ===========================================================================*/
-
-const {
- Z_NO_FLUSH: Z_NO_FLUSH$1$1, Z_SYNC_FLUSH: Z_SYNC_FLUSH$1, Z_FULL_FLUSH: Z_FULL_FLUSH$2, Z_FINISH: Z_FINISH$2$1,
- Z_OK: Z_OK$2$1, Z_STREAM_END: Z_STREAM_END$2$1,
- Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$2,
- Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$2,
- Z_DEFLATED: Z_DEFLATED$1$1
-} = constants$2$2;
-
-/* ===========================================================================*/
-
-
-/**
- * class Deflate
- *
- * Generic JS-style wrapper for zlib calls. If you don't need
- * streaming behaviour - use more simple functions: [[deflate]],
- * [[deflateRaw]] and [[gzip]].
- **/
-
-/* internal
- * Deflate.chunks -> Array
- *
- * Chunks of output data, if [[Deflate#onData]] not overridden.
- **/
-
-/**
- * Deflate.result -> Uint8Array
- *
- * Compressed result, generated by default [[Deflate#onData]]
- * and [[Deflate#onEnd]] handlers. Filled after you push last chunk
- * (call [[Deflate#push]] with `Z_FINISH` / `true` param).
- **/
-
-/**
- * Deflate.err -> Number
- *
- * Error code after deflate finished. 0 (Z_OK) on success.
- * You will not need it in real life, because deflate errors
- * are possible only on wrong options or bad `onData` / `onEnd`
- * custom handlers.
- **/
-
-/**
- * Deflate.msg -> String
- *
- * Error message, if [[Deflate.err]] != 0
- **/
-
-
-/**
- * new Deflate(options)
- * - options (Object): zlib deflate options.
- *
- * Creates new deflator instance with specified params. Throws exception
- * on bad params. Supported options:
- *
- * - `level`
- * - `windowBits`
- * - `memLevel`
- * - `strategy`
- * - `dictionary`
- *
- * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
- * for more information on these.
- *
- * Additional options, for internal needs:
- *
- * - `chunkSize` - size of generated data chunks (16K by default)
- * - `raw` (Boolean) - do raw deflate
- * - `gzip` (Boolean) - create gzip wrapper
- * - `header` (Object) - custom header for gzip
- * - `text` (Boolean) - true if compressed data believed to be text
- * - `time` (Number) - modification time, unix timestamp
- * - `os` (Number) - operation system code
- * - `extra` (Array) - array of bytes with extra data (max 65536)
- * - `name` (String) - file name (binary string)
- * - `comment` (String) - comment (binary string)
- * - `hcrc` (Boolean) - true if header crc should be added
- *
- * ##### Example:
- *
- * ```javascript
- * const pako = require('pako')
- * , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])
- * , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);
- *
- * const deflate = new pako.Deflate({ level: 3});
- *
- * deflate.push(chunk1, false);
- * deflate.push(chunk2, true); // true -> last chunk
- *
- * if (deflate.err) { throw new Error(deflate.err); }
- *
- * console.log(deflate.result);
- * ```
- **/
-function Deflate$1$1(options) {
- this.options = common$2.assign({
- level: Z_DEFAULT_COMPRESSION$2,
- method: Z_DEFLATED$1$1,
- chunkSize: 16384,
- windowBits: 15,
- memLevel: 8,
- strategy: Z_DEFAULT_STRATEGY$2
- }, options || {});
-
- let opt = this.options;
-
- if (opt.raw && (opt.windowBits > 0)) {
- opt.windowBits = -opt.windowBits;
- }
-
- else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {
- opt.windowBits += 16;
- }
-
- this.err = 0; // error code, if happens (0 = Z_OK)
- this.msg = ''; // error message
- this.ended = false; // used to avoid multiple onEnd() calls
- this.chunks = []; // chunks of compressed data
-
- this.strm = new zstream$2();
- this.strm.avail_out = 0;
-
- let status = deflate_1$2$1.deflateInit2(
- this.strm,
- opt.level,
- opt.method,
- opt.windowBits,
- opt.memLevel,
- opt.strategy
- );
-
- if (status !== Z_OK$2$1) {
- throw new Error(messages$2[status]);
- }
-
- if (opt.header) {
- deflate_1$2$1.deflateSetHeader(this.strm, opt.header);
- }
-
- if (opt.dictionary) {
- let dict;
- // Convert data if needed
- if (typeof opt.dictionary === 'string') {
- // If we need to compress text, change encoding to utf8.
- dict = strings$2.string2buf(opt.dictionary);
- } else if (toString$1$1.call(opt.dictionary) === '[object ArrayBuffer]') {
- dict = new Uint8Array(opt.dictionary);
- } else {
- dict = opt.dictionary;
- }
-
- status = deflate_1$2$1.deflateSetDictionary(this.strm, dict);
-
- if (status !== Z_OK$2$1) {
- throw new Error(messages$2[status]);
- }
-
- this._dict_set = true;
- }
-}
-
-/**
- * Deflate#push(data[, flush_mode]) -> Boolean
- * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be
- * converted to utf8 byte sequence.
- * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
- * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.
- *
- * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with
- * new compressed chunks. Returns `true` on success. The last data block must
- * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending
- * buffers and call [[Deflate#onEnd]].
- *
- * On fail call [[Deflate#onEnd]] with error code and return false.
- *
- * ##### Example
- *
- * ```javascript
- * push(chunk, false); // push one of data chunks
- * ...
- * push(chunk, true); // push last chunk
- * ```
- **/
-Deflate$1$1.prototype.push = function (data, flush_mode) {
- const strm = this.strm;
- const chunkSize = this.options.chunkSize;
- let status, _flush_mode;
-
- if (this.ended) { return false; }
-
- if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;
- else _flush_mode = flush_mode === true ? Z_FINISH$2$1 : Z_NO_FLUSH$1$1;
-
- // Convert data if needed
- if (typeof data === 'string') {
- // If we need to compress text, change encoding to utf8.
- strm.input = strings$2.string2buf(data);
- } else if (toString$1$1.call(data) === '[object ArrayBuffer]') {
- strm.input = new Uint8Array(data);
- } else {
- strm.input = data;
- }
-
- strm.next_in = 0;
- strm.avail_in = strm.input.length;
-
- for (;;) {
- if (strm.avail_out === 0) {
- strm.output = new Uint8Array(chunkSize);
- strm.next_out = 0;
- strm.avail_out = chunkSize;
- }
-
- // Make sure avail_out > 6 to avoid repeating markers
- if ((_flush_mode === Z_SYNC_FLUSH$1 || _flush_mode === Z_FULL_FLUSH$2) && strm.avail_out <= 6) {
- this.onData(strm.output.subarray(0, strm.next_out));
- strm.avail_out = 0;
- continue;
- }
-
- status = deflate_1$2$1.deflate(strm, _flush_mode);
-
- // Ended => flush and finish
- if (status === Z_STREAM_END$2$1) {
- if (strm.next_out > 0) {
- this.onData(strm.output.subarray(0, strm.next_out));
- }
- status = deflate_1$2$1.deflateEnd(this.strm);
- this.onEnd(status);
- this.ended = true;
- return status === Z_OK$2$1;
- }
-
- // Flush if out buffer full
- if (strm.avail_out === 0) {
- this.onData(strm.output);
- continue;
- }
-
- // Flush if requested and has data
- if (_flush_mode > 0 && strm.next_out > 0) {
- this.onData(strm.output.subarray(0, strm.next_out));
- strm.avail_out = 0;
- continue;
- }
-
- if (strm.avail_in === 0) break;
- }
-
- return true;
-};
-
-
-/**
- * Deflate#onData(chunk) -> Void
- * - chunk (Uint8Array): output data.
- *
- * By default, stores data blocks in `chunks[]` property and glue
- * those in `onEnd`. Override this handler, if you need another behaviour.
- **/
-Deflate$1$1.prototype.onData = function (chunk) {
- this.chunks.push(chunk);
-};
-
-
-/**
- * Deflate#onEnd(status) -> Void
- * - status (Number): deflate status. 0 (Z_OK) on success,
- * other if not.
- *
- * Called once after you tell deflate that the input stream is
- * complete (Z_FINISH). By default - join collected chunks,
- * free memory and fill `results` / `err` properties.
- **/
-Deflate$1$1.prototype.onEnd = function (status) {
- // On success - join
- if (status === Z_OK$2$1) {
- this.result = common$2.flattenChunks(this.chunks);
- }
- this.chunks = [];
- this.err = status;
- this.msg = this.strm.msg;
-};
-
-
-/**
- * deflate(data[, options]) -> Uint8Array
- * - data (Uint8Array|ArrayBuffer|String): input data to compress.
- * - options (Object): zlib deflate options.
- *
- * Compress `data` with deflate algorithm and `options`.
- *
- * Supported options are:
- *
- * - level
- * - windowBits
- * - memLevel
- * - strategy
- * - dictionary
- *
- * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
- * for more information on these.
- *
- * Sugar (options):
- *
- * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
- * negative windowBits implicitly.
- *
- * ##### Example:
- *
- * ```javascript
- * const pako = require('pako')
- * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]);
- *
- * console.log(pako.deflate(data));
- * ```
- **/
-function deflate$1$1(input, options) {
- const deflator = new Deflate$1$1(options);
-
- deflator.push(input, true);
-
- // That will never happens, if you don't cheat with options :)
- if (deflator.err) { throw deflator.msg || messages$2[deflator.err]; }
-
- return deflator.result;
-}
-
-
-/**
- * deflateRaw(data[, options]) -> Uint8Array
- * - data (Uint8Array|ArrayBuffer|String): input data to compress.
- * - options (Object): zlib deflate options.
- *
- * The same as [[deflate]], but creates raw data, without wrapper
- * (header and adler32 crc).
- **/
-function deflateRaw$1$1(input, options) {
- options = options || {};
- options.raw = true;
- return deflate$1$1(input, options);
-}
-
-
-/**
- * gzip(data[, options]) -> Uint8Array
- * - data (Uint8Array|ArrayBuffer|String): input data to compress.
- * - options (Object): zlib deflate options.
- *
- * The same as [[deflate]], but create gzip wrapper instead of
- * deflate one.
- **/
-function gzip$1$1(input, options) {
- options = options || {};
- options.gzip = true;
- return deflate$1$1(input, options);
-}
-
-
-var Deflate_1$1$1 = Deflate$1$1;
-var deflate_2$2 = deflate$1$1;
-var deflateRaw_1$1$1 = deflateRaw$1$1;
-var gzip_1$1$1 = gzip$1$1;
-var constants$1$1 = constants$2$2;
-
-var deflate_1$1$1 = {
- Deflate: Deflate_1$1$1,
- deflate: deflate_2$2,
- deflateRaw: deflateRaw_1$1$1,
- gzip: gzip_1$1$1,
- constants: constants$1$1
-};
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-// See state defs from inflate.js
-const BAD$1$2 = 16209; /* got a data error -- remain here until reset */
-const TYPE$1$2 = 16191; /* i: waiting for type bits, including last-flag bit */
-
-/*
- Decode literal, length, and distance codes and write out the resulting
- literal and match bytes until either not enough input or output is
- available, an end-of-block is encountered, or a data error is encountered.
- When large enough input and output buffers are supplied to inflate(), for
- example, a 16K input buffer and a 64K output buffer, more than 95% of the
- inflate execution time is spent in this routine.
-
- Entry assumptions:
-
- state.mode === LEN
- strm.avail_in >= 6
- strm.avail_out >= 258
- start >= strm.avail_out
- state.bits < 8
-
- On return, state.mode is one of:
-
- LEN -- ran out of enough output space or enough available input
- TYPE -- reached end of block code, inflate() to interpret next block
- BAD -- error in block data
-
- Notes:
-
- - The maximum input bits used by a length/distance pair is 15 bits for the
- length code, 5 bits for the length extra, 15 bits for the distance code,
- and 13 bits for the distance extra. This totals 48 bits, or six bytes.
- Therefore if strm.avail_in >= 6, then there is enough input to avoid
- checking for available input while decoding.
-
- - The maximum bytes that a single length/distance pair can output is 258
- bytes, which is the maximum length that can be coded. inflate_fast()
- requires strm.avail_out >= 258 for each loop to avoid checking for
- output space.
- */
-var inffast$2 = function inflate_fast(strm, start) {
- let _in; /* local strm.input */
- let last; /* have enough input while in < last */
- let _out; /* local strm.output */
- let beg; /* inflate()'s initial strm.output */
- let end; /* while out < end, enough space available */
-//#ifdef INFLATE_STRICT
- let dmax; /* maximum distance from zlib header */
-//#endif
- let wsize; /* window size or zero if not using window */
- let whave; /* valid bytes in the window */
- let wnext; /* window write index */
- // Use `s_window` instead `window`, avoid conflict with instrumentation tools
- let s_window; /* allocated sliding window, if wsize != 0 */
- let hold; /* local strm.hold */
- let bits; /* local strm.bits */
- let lcode; /* local strm.lencode */
- let dcode; /* local strm.distcode */
- let lmask; /* mask for first level of length codes */
- let dmask; /* mask for first level of distance codes */
- let here; /* retrieved table entry */
- let op; /* code bits, operation, extra bits, or */
- /* window position, window bytes to copy */
- let len; /* match length, unused bytes */
- let dist; /* match distance */
- let from; /* where to copy match from */
- let from_source;
-
-
- let input, output; // JS specific, because we have no pointers
-
- /* copy state to local variables */
- const state = strm.state;
- //here = state.here;
- _in = strm.next_in;
- input = strm.input;
- last = _in + (strm.avail_in - 5);
- _out = strm.next_out;
- output = strm.output;
- beg = _out - (start - strm.avail_out);
- end = _out + (strm.avail_out - 257);
-//#ifdef INFLATE_STRICT
- dmax = state.dmax;
-//#endif
- wsize = state.wsize;
- whave = state.whave;
- wnext = state.wnext;
- s_window = state.window;
- hold = state.hold;
- bits = state.bits;
- lcode = state.lencode;
- dcode = state.distcode;
- lmask = (1 << state.lenbits) - 1;
- dmask = (1 << state.distbits) - 1;
-
-
- /* decode literals and length/distances until end-of-block or not enough
- input data or output space */
-
- top:
- do {
- if (bits < 15) {
- hold += input[_in++] << bits;
- bits += 8;
- hold += input[_in++] << bits;
- bits += 8;
- }
-
- here = lcode[hold & lmask];
-
- dolen:
- for (;;) { // Goto emulation
- op = here >>> 24/*here.bits*/;
- hold >>>= op;
- bits -= op;
- op = (here >>> 16) & 0xff/*here.op*/;
- if (op === 0) { /* literal */
- //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
- // "inflate: literal '%c'\n" :
- // "inflate: literal 0x%02x\n", here.val));
- output[_out++] = here & 0xffff/*here.val*/;
- }
- else if (op & 16) { /* length base */
- len = here & 0xffff/*here.val*/;
- op &= 15; /* number of extra bits */
- if (op) {
- if (bits < op) {
- hold += input[_in++] << bits;
- bits += 8;
- }
- len += hold & ((1 << op) - 1);
- hold >>>= op;
- bits -= op;
- }
- //Tracevv((stderr, "inflate: length %u\n", len));
- if (bits < 15) {
- hold += input[_in++] << bits;
- bits += 8;
- hold += input[_in++] << bits;
- bits += 8;
- }
- here = dcode[hold & dmask];
-
- dodist:
- for (;;) { // goto emulation
- op = here >>> 24/*here.bits*/;
- hold >>>= op;
- bits -= op;
- op = (here >>> 16) & 0xff/*here.op*/;
-
- if (op & 16) { /* distance base */
- dist = here & 0xffff/*here.val*/;
- op &= 15; /* number of extra bits */
- if (bits < op) {
- hold += input[_in++] << bits;
- bits += 8;
- if (bits < op) {
- hold += input[_in++] << bits;
- bits += 8;
- }
- }
- dist += hold & ((1 << op) - 1);
-//#ifdef INFLATE_STRICT
- if (dist > dmax) {
- strm.msg = 'invalid distance too far back';
- state.mode = BAD$1$2;
- break top;
- }
-//#endif
- hold >>>= op;
- bits -= op;
- //Tracevv((stderr, "inflate: distance %u\n", dist));
- op = _out - beg; /* max distance in output */
- if (dist > op) { /* see if copy from window */
- op = dist - op; /* distance back in window */
- if (op > whave) {
- if (state.sane) {
- strm.msg = 'invalid distance too far back';
- state.mode = BAD$1$2;
- break top;
- }
-
-// (!) This block is disabled in zlib defaults,
-// don't enable it for binary compatibility
-//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
-// if (len <= op - whave) {
-// do {
-// output[_out++] = 0;
-// } while (--len);
-// continue top;
-// }
-// len -= op - whave;
-// do {
-// output[_out++] = 0;
-// } while (--op > whave);
-// if (op === 0) {
-// from = _out - dist;
-// do {
-// output[_out++] = output[from++];
-// } while (--len);
-// continue top;
-// }
-//#endif
- }
- from = 0; // window index
- from_source = s_window;
- if (wnext === 0) { /* very common case */
- from += wsize - op;
- if (op < len) { /* some from window */
- len -= op;
- do {
- output[_out++] = s_window[from++];
- } while (--op);
- from = _out - dist; /* rest from output */
- from_source = output;
- }
- }
- else if (wnext < op) { /* wrap around window */
- from += wsize + wnext - op;
- op -= wnext;
- if (op < len) { /* some from end of window */
- len -= op;
- do {
- output[_out++] = s_window[from++];
- } while (--op);
- from = 0;
- if (wnext < len) { /* some from start of window */
- op = wnext;
- len -= op;
- do {
- output[_out++] = s_window[from++];
- } while (--op);
- from = _out - dist; /* rest from output */
- from_source = output;
- }
- }
- }
- else { /* contiguous in window */
- from += wnext - op;
- if (op < len) { /* some from window */
- len -= op;
- do {
- output[_out++] = s_window[from++];
- } while (--op);
- from = _out - dist; /* rest from output */
- from_source = output;
- }
- }
- while (len > 2) {
- output[_out++] = from_source[from++];
- output[_out++] = from_source[from++];
- output[_out++] = from_source[from++];
- len -= 3;
- }
- if (len) {
- output[_out++] = from_source[from++];
- if (len > 1) {
- output[_out++] = from_source[from++];
- }
- }
- }
- else {
- from = _out - dist; /* copy direct from output */
- do { /* minimum length is three */
- output[_out++] = output[from++];
- output[_out++] = output[from++];
- output[_out++] = output[from++];
- len -= 3;
- } while (len > 2);
- if (len) {
- output[_out++] = output[from++];
- if (len > 1) {
- output[_out++] = output[from++];
- }
- }
- }
- }
- else if ((op & 64) === 0) { /* 2nd level distance code */
- here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
- continue dodist;
- }
- else {
- strm.msg = 'invalid distance code';
- state.mode = BAD$1$2;
- break top;
- }
-
- break; // need to emulate goto via "continue"
- }
- }
- else if ((op & 64) === 0) { /* 2nd level length code */
- here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
- continue dolen;
- }
- else if (op & 32) { /* end-of-block */
- //Tracevv((stderr, "inflate: end of block\n"));
- state.mode = TYPE$1$2;
- break top;
- }
- else {
- strm.msg = 'invalid literal/length code';
- state.mode = BAD$1$2;
- break top;
- }
-
- break; // need to emulate goto via "continue"
- }
- } while (_in < last && _out < end);
-
- /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
- len = bits >> 3;
- _in -= len;
- bits -= len << 3;
- hold &= (1 << bits) - 1;
-
- /* update state and return */
- strm.next_in = _in;
- strm.next_out = _out;
- strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));
- strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));
- state.hold = hold;
- state.bits = bits;
- return;
-};
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-const MAXBITS$2 = 15;
-const ENOUGH_LENS$1$2 = 852;
-const ENOUGH_DISTS$1$2 = 592;
-//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
-
-const CODES$1$2 = 0;
-const LENS$1$2 = 1;
-const DISTS$1$2 = 2;
-
-const lbase$2 = new Uint16Array([ /* Length codes 257..285 base */
- 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
- 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
-]);
-
-const lext$2 = new Uint8Array([ /* Length codes 257..285 extra */
- 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
- 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
-]);
-
-const dbase$2 = new Uint16Array([ /* Distance codes 0..29 base */
- 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
- 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
- 8193, 12289, 16385, 24577, 0, 0
-]);
-
-const dext$2 = new Uint8Array([ /* Distance codes 0..29 extra */
- 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
- 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
- 28, 28, 29, 29, 64, 64
-]);
-
-const inflate_table$2 = (type, lens, lens_index, codes, table, table_index, work, opts) =>
-{
- const bits = opts.bits;
- //here = opts.here; /* table entry for duplication */
-
- let len = 0; /* a code's length in bits */
- let sym = 0; /* index of code symbols */
- let min = 0, max = 0; /* minimum and maximum code lengths */
- let root = 0; /* number of index bits for root table */
- let curr = 0; /* number of index bits for current table */
- let drop = 0; /* code bits to drop for sub-table */
- let left = 0; /* number of prefix codes available */
- let used = 0; /* code entries in table used */
- let huff = 0; /* Huffman code */
- let incr; /* for incrementing code, index */
- let fill; /* index for replicating entries */
- let low; /* low bits for current root entry */
- let mask; /* mask for low root bits */
- let next; /* next available space in table */
- let base = null; /* base value table to use */
-// let shoextra; /* extra bits table to use */
- let match; /* use base and extra for symbol >= match */
- const count = new Uint16Array(MAXBITS$2 + 1); //[MAXBITS+1]; /* number of codes of each length */
- const offs = new Uint16Array(MAXBITS$2 + 1); //[MAXBITS+1]; /* offsets in table for each length */
- let extra = null;
-
- let here_bits, here_op, here_val;
-
- /*
- Process a set of code lengths to create a canonical Huffman code. The
- code lengths are lens[0..codes-1]. Each length corresponds to the
- symbols 0..codes-1. The Huffman code is generated by first sorting the
- symbols by length from short to long, and retaining the symbol order
- for codes with equal lengths. Then the code starts with all zero bits
- for the first code of the shortest length, and the codes are integer
- increments for the same length, and zeros are appended as the length
- increases. For the deflate format, these bits are stored backwards
- from their more natural integer increment ordering, and so when the
- decoding tables are built in the large loop below, the integer codes
- are incremented backwards.
-
- This routine assumes, but does not check, that all of the entries in
- lens[] are in the range 0..MAXBITS. The caller must assure this.
- 1..MAXBITS is interpreted as that code length. zero means that that
- symbol does not occur in this code.
-
- The codes are sorted by computing a count of codes for each length,
- creating from that a table of starting indices for each length in the
- sorted table, and then entering the symbols in order in the sorted
- table. The sorted table is work[], with that space being provided by
- the caller.
-
- The length counts are used for other purposes as well, i.e. finding
- the minimum and maximum length codes, determining if there are any
- codes at all, checking for a valid set of lengths, and looking ahead
- at length counts to determine sub-table sizes when building the
- decoding tables.
- */
-
- /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
- for (len = 0; len <= MAXBITS$2; len++) {
- count[len] = 0;
- }
- for (sym = 0; sym < codes; sym++) {
- count[lens[lens_index + sym]]++;
- }
-
- /* bound code lengths, force root to be within code lengths */
- root = bits;
- for (max = MAXBITS$2; max >= 1; max--) {
- if (count[max] !== 0) { break; }
- }
- if (root > max) {
- root = max;
- }
- if (max === 0) { /* no symbols to code at all */
- //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */
- //table.bits[opts.table_index] = 1; //here.bits = (var char)1;
- //table.val[opts.table_index++] = 0; //here.val = (var short)0;
- table[table_index++] = (1 << 24) | (64 << 16) | 0;
-
-
- //table.op[opts.table_index] = 64;
- //table.bits[opts.table_index] = 1;
- //table.val[opts.table_index++] = 0;
- table[table_index++] = (1 << 24) | (64 << 16) | 0;
-
- opts.bits = 1;
- return 0; /* no symbols, but wait for decoding to report error */
- }
- for (min = 1; min < max; min++) {
- if (count[min] !== 0) { break; }
- }
- if (root < min) {
- root = min;
- }
-
- /* check for an over-subscribed or incomplete set of lengths */
- left = 1;
- for (len = 1; len <= MAXBITS$2; len++) {
- left <<= 1;
- left -= count[len];
- if (left < 0) {
- return -1;
- } /* over-subscribed */
- }
- if (left > 0 && (type === CODES$1$2 || max !== 1)) {
- return -1; /* incomplete set */
- }
-
- /* generate offsets into symbol table for each length for sorting */
- offs[1] = 0;
- for (len = 1; len < MAXBITS$2; len++) {
- offs[len + 1] = offs[len] + count[len];
- }
-
- /* sort symbols by length, by symbol order within each length */
- for (sym = 0; sym < codes; sym++) {
- if (lens[lens_index + sym] !== 0) {
- work[offs[lens[lens_index + sym]]++] = sym;
- }
- }
-
- /*
- Create and fill in decoding tables. In this loop, the table being
- filled is at next and has curr index bits. The code being used is huff
- with length len. That code is converted to an index by dropping drop
- bits off of the bottom. For codes where len is less than drop + curr,
- those top drop + curr - len bits are incremented through all values to
- fill the table with replicated entries.
-
- root is the number of index bits for the root table. When len exceeds
- root, sub-tables are created pointed to by the root entry with an index
- of the low root bits of huff. This is saved in low to check for when a
- new sub-table should be started. drop is zero when the root table is
- being filled, and drop is root when sub-tables are being filled.
-
- When a new sub-table is needed, it is necessary to look ahead in the
- code lengths to determine what size sub-table is needed. The length
- counts are used for this, and so count[] is decremented as codes are
- entered in the tables.
-
- used keeps track of how many table entries have been allocated from the
- provided *table space. It is checked for LENS and DIST tables against
- the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
- the initial root table size constants. See the comments in inftrees.h
- for more information.
-
- sym increments through all symbols, and the loop terminates when
- all codes of length max, i.e. all codes, have been processed. This
- routine permits incomplete codes, so another loop after this one fills
- in the rest of the decoding tables with invalid code markers.
- */
-
- /* set up for code type */
- // poor man optimization - use if-else instead of switch,
- // to avoid deopts in old v8
- if (type === CODES$1$2) {
- base = extra = work; /* dummy value--not used */
- match = 20;
-
- } else if (type === LENS$1$2) {
- base = lbase$2;
- extra = lext$2;
- match = 257;
-
- } else { /* DISTS */
- base = dbase$2;
- extra = dext$2;
- match = 0;
- }
-
- /* initialize opts for loop */
- huff = 0; /* starting code */
- sym = 0; /* starting code symbol */
- len = min; /* starting code length */
- next = table_index; /* current table to fill in */
- curr = root; /* current table index bits */
- drop = 0; /* current bits to drop from code for index */
- low = -1; /* trigger new sub-table when len > root */
- used = 1 << root; /* use root table entries */
- mask = used - 1; /* mask for comparing low */
-
- /* check available table space */
- if ((type === LENS$1$2 && used > ENOUGH_LENS$1$2) ||
- (type === DISTS$1$2 && used > ENOUGH_DISTS$1$2)) {
- return 1;
- }
-
- /* process all codes and make table entries */
- for (;;) {
- /* create table entry */
- here_bits = len - drop;
- if (work[sym] + 1 < match) {
- here_op = 0;
- here_val = work[sym];
- }
- else if (work[sym] >= match) {
- here_op = extra[work[sym] - match];
- here_val = base[work[sym] - match];
- }
- else {
- here_op = 32 + 64; /* end of block */
- here_val = 0;
- }
-
- /* replicate for those indices with low len bits equal to huff */
- incr = 1 << (len - drop);
- fill = 1 << curr;
- min = fill; /* save offset to next table */
- do {
- fill -= incr;
- table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;
- } while (fill !== 0);
-
- /* backwards increment the len-bit code huff */
- incr = 1 << (len - 1);
- while (huff & incr) {
- incr >>= 1;
- }
- if (incr !== 0) {
- huff &= incr - 1;
- huff += incr;
- } else {
- huff = 0;
- }
-
- /* go to next symbol, update count, len */
- sym++;
- if (--count[len] === 0) {
- if (len === max) { break; }
- len = lens[lens_index + work[sym]];
- }
-
- /* create new sub-table if needed */
- if (len > root && (huff & mask) !== low) {
- /* if first time, transition to sub-tables */
- if (drop === 0) {
- drop = root;
- }
-
- /* increment past last table */
- next += min; /* here min is 1 << curr */
-
- /* determine length of next table */
- curr = len - drop;
- left = 1 << curr;
- while (curr + drop < max) {
- left -= count[curr + drop];
- if (left <= 0) { break; }
- curr++;
- left <<= 1;
- }
-
- /* check for enough space */
- used += 1 << curr;
- if ((type === LENS$1$2 && used > ENOUGH_LENS$1$2) ||
- (type === DISTS$1$2 && used > ENOUGH_DISTS$1$2)) {
- return 1;
- }
-
- /* point entry in root table to sub-table */
- low = huff & mask;
- /*table.op[low] = curr;
- table.bits[low] = root;
- table.val[low] = next - opts.table_index;*/
- table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;
- }
- }
-
- /* fill in remaining table entry if code is incomplete (guaranteed to have
- at most one remaining entry, since if the code is incomplete, the
- maximum code length that was allowed to get this far is one bit) */
- if (huff !== 0) {
- //table.op[next + huff] = 64; /* invalid code marker */
- //table.bits[next + huff] = len - drop;
- //table.val[next + huff] = 0;
- table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;
- }
-
- /* set return parameters */
- //opts.table_index += used;
- opts.bits = root;
- return 0;
-};
-
-
-var inftrees$2 = inflate_table$2;
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-
-
-
-
-
-const CODES$3 = 0;
-const LENS$3 = 1;
-const DISTS$3 = 2;
-
-/* Public constants ==========================================================*/
-/* ===========================================================================*/
-
-const {
- Z_FINISH: Z_FINISH$1$2, Z_BLOCK: Z_BLOCK$3, Z_TREES: Z_TREES$2,
- Z_OK: Z_OK$1$2, Z_STREAM_END: Z_STREAM_END$1$2, Z_NEED_DICT: Z_NEED_DICT$1$2, Z_STREAM_ERROR: Z_STREAM_ERROR$1$2, Z_DATA_ERROR: Z_DATA_ERROR$1$2, Z_MEM_ERROR: Z_MEM_ERROR$1$2, Z_BUF_ERROR: Z_BUF_ERROR$3,
- Z_DEFLATED: Z_DEFLATED$4
-} = constants$2$2;
-
-
-/* STATES ====================================================================*/
-/* ===========================================================================*/
-
-
-const HEAD$2 = 16180; /* i: waiting for magic header */
-const FLAGS$2 = 16181; /* i: waiting for method and flags (gzip) */
-const TIME$2 = 16182; /* i: waiting for modification time (gzip) */
-const OS$2 = 16183; /* i: waiting for extra flags and operating system (gzip) */
-const EXLEN$2 = 16184; /* i: waiting for extra length (gzip) */
-const EXTRA$2 = 16185; /* i: waiting for extra bytes (gzip) */
-const NAME$2 = 16186; /* i: waiting for end of file name (gzip) */
-const COMMENT$2 = 16187; /* i: waiting for end of comment (gzip) */
-const HCRC$2 = 16188; /* i: waiting for header crc (gzip) */
-const DICTID$2 = 16189; /* i: waiting for dictionary check value */
-const DICT$2 = 16190; /* waiting for inflateSetDictionary() call */
-const TYPE$3 = 16191; /* i: waiting for type bits, including last-flag bit */
-const TYPEDO$2 = 16192; /* i: same, but skip check to exit inflate on new block */
-const STORED$2 = 16193; /* i: waiting for stored size (length and complement) */
-const COPY_$2 = 16194; /* i/o: same as COPY below, but only first time in */
-const COPY$2 = 16195; /* i/o: waiting for input or output to copy stored block */
-const TABLE$2 = 16196; /* i: waiting for dynamic block table lengths */
-const LENLENS$2 = 16197; /* i: waiting for code length code lengths */
-const CODELENS$2 = 16198; /* i: waiting for length/lit and distance code lengths */
-const LEN_$2 = 16199; /* i: same as LEN below, but only first time in */
-const LEN$2 = 16200; /* i: waiting for length/lit/eob code */
-const LENEXT$2 = 16201; /* i: waiting for length extra bits */
-const DIST$2 = 16202; /* i: waiting for distance code */
-const DISTEXT$2 = 16203; /* i: waiting for distance extra bits */
-const MATCH$2 = 16204; /* o: waiting for output space to copy string */
-const LIT$2 = 16205; /* o: waiting for output space to write literal */
-const CHECK$2 = 16206; /* i: waiting for 32-bit check value */
-const LENGTH$2 = 16207; /* i: waiting for 32-bit length (gzip) */
-const DONE$2 = 16208; /* finished check, done -- remain here until reset */
-const BAD$3 = 16209; /* got a data error -- remain here until reset */
-const MEM$2 = 16210; /* got an inflate() memory error -- remain here until reset */
-const SYNC$2 = 16211; /* looking for synchronization bytes to restart inflate() */
-
-/* ===========================================================================*/
-
-
-
-const ENOUGH_LENS$3 = 852;
-const ENOUGH_DISTS$3 = 592;
-//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
-
-const MAX_WBITS$3 = 15;
-/* 32K LZ77 window */
-const DEF_WBITS$2 = MAX_WBITS$3;
-
-
-const zswap32$2 = (q) => {
-
- return (((q >>> 24) & 0xff) +
- ((q >>> 8) & 0xff00) +
- ((q & 0xff00) << 8) +
- ((q & 0xff) << 24));
-};
-
-
-function InflateState$2() {
- this.strm = null; /* pointer back to this zlib stream */
- this.mode = 0; /* current inflate mode */
- this.last = false; /* true if processing last block */
- this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip,
- bit 2 true to validate check value */
- this.havedict = false; /* true if dictionary provided */
- this.flags = 0; /* gzip header method and flags (0 if zlib), or
- -1 if raw or no header yet */
- this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */
- this.check = 0; /* protected copy of check value */
- this.total = 0; /* protected copy of output count */
- // TODO: may be {}
- this.head = null; /* where to save gzip header information */
-
- /* sliding window */
- this.wbits = 0; /* log base 2 of requested window size */
- this.wsize = 0; /* window size or zero if not using window */
- this.whave = 0; /* valid bytes in the window */
- this.wnext = 0; /* window write index */
- this.window = null; /* allocated sliding window, if needed */
-
- /* bit accumulator */
- this.hold = 0; /* input bit accumulator */
- this.bits = 0; /* number of bits in "in" */
-
- /* for string and stored block copying */
- this.length = 0; /* literal or length of data to copy */
- this.offset = 0; /* distance back to copy string from */
-
- /* for table and code decoding */
- this.extra = 0; /* extra bits needed */
-
- /* fixed and dynamic code tables */
- this.lencode = null; /* starting table for length/literal codes */
- this.distcode = null; /* starting table for distance codes */
- this.lenbits = 0; /* index bits for lencode */
- this.distbits = 0; /* index bits for distcode */
-
- /* dynamic table building */
- this.ncode = 0; /* number of code length code lengths */
- this.nlen = 0; /* number of length code lengths */
- this.ndist = 0; /* number of distance code lengths */
- this.have = 0; /* number of code lengths in lens[] */
- this.next = null; /* next available space in codes[] */
-
- this.lens = new Uint16Array(320); /* temporary storage for code lengths */
- this.work = new Uint16Array(288); /* work area for code table building */
-
- /*
- because we don't have pointers in js, we use lencode and distcode directly
- as buffers so we don't need codes
- */
- //this.codes = new Int32Array(ENOUGH); /* space for code tables */
- this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */
- this.distdyn = null; /* dynamic table for distance codes (JS specific) */
- this.sane = 0; /* if false, allow invalid distance too far */
- this.back = 0; /* bits back of last unprocessed length/lit */
- this.was = 0; /* initial length of match */
-}
-
-
-const inflateStateCheck$1 = (strm) => {
-
- if (!strm) {
- return 1;
- }
- const state = strm.state;
- if (!state || state.strm !== strm ||
- state.mode < HEAD$2 || state.mode > SYNC$2) {
- return 1;
- }
- return 0;
-};
-
-
-const inflateResetKeep$2 = (strm) => {
-
- if (inflateStateCheck$1(strm)) { return Z_STREAM_ERROR$1$2; }
- const state = strm.state;
- strm.total_in = strm.total_out = state.total = 0;
- strm.msg = ''; /*Z_NULL*/
- if (state.wrap) { /* to support ill-conceived Java test suite */
- strm.adler = state.wrap & 1;
- }
- state.mode = HEAD$2;
- state.last = 0;
- state.havedict = 0;
- state.flags = -1;
- state.dmax = 32768;
- state.head = null/*Z_NULL*/;
- state.hold = 0;
- state.bits = 0;
- //state.lencode = state.distcode = state.next = state.codes;
- state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS$3);
- state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS$3);
-
- state.sane = 1;
- state.back = -1;
- //Tracev((stderr, "inflate: reset\n"));
- return Z_OK$1$2;
-};
-
-
-const inflateReset$2 = (strm) => {
-
- if (inflateStateCheck$1(strm)) { return Z_STREAM_ERROR$1$2; }
- const state = strm.state;
- state.wsize = 0;
- state.whave = 0;
- state.wnext = 0;
- return inflateResetKeep$2(strm);
-
-};
-
-
-const inflateReset2$2 = (strm, windowBits) => {
- let wrap;
-
- /* get the state */
- if (inflateStateCheck$1(strm)) { return Z_STREAM_ERROR$1$2; }
- const state = strm.state;
-
- /* extract wrap request from windowBits parameter */
- if (windowBits < 0) {
- wrap = 0;
- windowBits = -windowBits;
- }
- else {
- wrap = (windowBits >> 4) + 5;
- if (windowBits < 48) {
- windowBits &= 15;
- }
- }
-
- /* set number of window bits, free window if different */
- if (windowBits && (windowBits < 8 || windowBits > 15)) {
- return Z_STREAM_ERROR$1$2;
- }
- if (state.window !== null && state.wbits !== windowBits) {
- state.window = null;
- }
-
- /* update state and reset the rest of it */
- state.wrap = wrap;
- state.wbits = windowBits;
- return inflateReset$2(strm);
-};
-
-
-const inflateInit2$2 = (strm, windowBits) => {
-
- if (!strm) { return Z_STREAM_ERROR$1$2; }
- //strm.msg = Z_NULL; /* in case we return an error */
-
- const state = new InflateState$2();
-
- //if (state === Z_NULL) return Z_MEM_ERROR;
- //Tracev((stderr, "inflate: allocated\n"));
- strm.state = state;
- state.strm = strm;
- state.window = null/*Z_NULL*/;
- state.mode = HEAD$2; /* to pass state test in inflateReset2() */
- const ret = inflateReset2$2(strm, windowBits);
- if (ret !== Z_OK$1$2) {
- strm.state = null/*Z_NULL*/;
- }
- return ret;
-};
-
-
-const inflateInit$2 = (strm) => {
-
- return inflateInit2$2(strm, DEF_WBITS$2);
-};
-
-
-/*
- Return state with length and distance decoding tables and index sizes set to
- fixed code decoding. Normally this returns fixed tables from inffixed.h.
- If BUILDFIXED is defined, then instead this routine builds the tables the
- first time it's called, and returns those tables the first time and
- thereafter. This reduces the size of the code by about 2K bytes, in
- exchange for a little execution time. However, BUILDFIXED should not be
- used for threaded applications, since the rewriting of the tables and virgin
- may not be thread-safe.
- */
-let virgin$2 = true;
-
-let lenfix$2, distfix$2; // We have no pointers in JS, so keep tables separate
-
-
-const fixedtables$2 = (state) => {
-
- /* build fixed huffman tables if first call (may not be thread safe) */
- if (virgin$2) {
- lenfix$2 = new Int32Array(512);
- distfix$2 = new Int32Array(32);
-
- /* literal/length table */
- let sym = 0;
- while (sym < 144) { state.lens[sym++] = 8; }
- while (sym < 256) { state.lens[sym++] = 9; }
- while (sym < 280) { state.lens[sym++] = 7; }
- while (sym < 288) { state.lens[sym++] = 8; }
-
- inftrees$2(LENS$3, state.lens, 0, 288, lenfix$2, 0, state.work, { bits: 9 });
-
- /* distance table */
- sym = 0;
- while (sym < 32) { state.lens[sym++] = 5; }
-
- inftrees$2(DISTS$3, state.lens, 0, 32, distfix$2, 0, state.work, { bits: 5 });
-
- /* do this just once */
- virgin$2 = false;
- }
-
- state.lencode = lenfix$2;
- state.lenbits = 9;
- state.distcode = distfix$2;
- state.distbits = 5;
-};
-
-
-/*
- Update the window with the last wsize (normally 32K) bytes written before
- returning. If window does not exist yet, create it. This is only called
- when a window is already in use, or when output has been written during this
- inflate call, but the end of the deflate stream has not been reached yet.
- It is also called to create a window for dictionary data when a dictionary
- is loaded.
-
- Providing output buffers larger than 32K to inflate() should provide a speed
- advantage, since only the last 32K of output is copied to the sliding window
- upon return from inflate(), and since all distances after the first 32K of
- output will fall in the output data, making match copies simpler and faster.
- The advantage may be dependent on the size of the processor's data caches.
- */
-const updatewindow$2 = (strm, src, end, copy) => {
-
- let dist;
- const state = strm.state;
-
- /* if it hasn't been done already, allocate space for the window */
- if (state.window === null) {
- state.wsize = 1 << state.wbits;
- state.wnext = 0;
- state.whave = 0;
-
- state.window = new Uint8Array(state.wsize);
- }
-
- /* copy state->wsize or less output bytes into the circular window */
- if (copy >= state.wsize) {
- state.window.set(src.subarray(end - state.wsize, end), 0);
- state.wnext = 0;
- state.whave = state.wsize;
- }
- else {
- dist = state.wsize - state.wnext;
- if (dist > copy) {
- dist = copy;
- }
- //zmemcpy(state->window + state->wnext, end - copy, dist);
- state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext);
- copy -= dist;
- if (copy) {
- //zmemcpy(state->window, end - copy, copy);
- state.window.set(src.subarray(end - copy, end), 0);
- state.wnext = copy;
- state.whave = state.wsize;
- }
- else {
- state.wnext += dist;
- if (state.wnext === state.wsize) { state.wnext = 0; }
- if (state.whave < state.wsize) { state.whave += dist; }
- }
- }
- return 0;
-};
-
-
-const inflate$2$2 = (strm, flush) => {
-
- let state;
- let input, output; // input/output buffers
- let next; /* next input INDEX */
- let put; /* next output INDEX */
- let have, left; /* available input and output */
- let hold; /* bit buffer */
- let bits; /* bits in bit buffer */
- let _in, _out; /* save starting available input and output */
- let copy; /* number of stored or match bytes to copy */
- let from; /* where to copy match bytes from */
- let from_source;
- let here = 0; /* current decoding table entry */
- let here_bits, here_op, here_val; // paked "here" denormalized (JS specific)
- //let last; /* parent table entry */
- let last_bits, last_op, last_val; // paked "last" denormalized (JS specific)
- let len; /* length to copy for repeats, bits to drop */
- let ret; /* return code */
- const hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */
- let opts;
-
- let n; // temporary variable for NEED_BITS
-
- const order = /* permutation of code lengths */
- new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]);
-
-
- if (inflateStateCheck$1(strm) || !strm.output ||
- (!strm.input && strm.avail_in !== 0)) {
- return Z_STREAM_ERROR$1$2;
- }
-
- state = strm.state;
- if (state.mode === TYPE$3) { state.mode = TYPEDO$2; } /* skip check */
-
-
- //--- LOAD() ---
- put = strm.next_out;
- output = strm.output;
- left = strm.avail_out;
- next = strm.next_in;
- input = strm.input;
- have = strm.avail_in;
- hold = state.hold;
- bits = state.bits;
- //---
-
- _in = have;
- _out = left;
- ret = Z_OK$1$2;
-
- inf_leave: // goto emulation
- for (;;) {
- switch (state.mode) {
- case HEAD$2:
- if (state.wrap === 0) {
- state.mode = TYPEDO$2;
- break;
- }
- //=== NEEDBITS(16);
- while (bits < 16) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */
- if (state.wbits === 0) {
- state.wbits = 15;
- }
- state.check = 0/*crc32(0L, Z_NULL, 0)*/;
- //=== CRC2(state.check, hold);
- hbuf[0] = hold & 0xff;
- hbuf[1] = (hold >>> 8) & 0xff;
- state.check = crc32_1$2(state.check, hbuf, 2, 0);
- //===//
-
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- state.mode = FLAGS$2;
- break;
- }
- if (state.head) {
- state.head.done = false;
- }
- if (!(state.wrap & 1) || /* check if zlib header allowed */
- (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {
- strm.msg = 'incorrect header check';
- state.mode = BAD$3;
- break;
- }
- if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED$4) {
- strm.msg = 'unknown compression method';
- state.mode = BAD$3;
- break;
- }
- //--- DROPBITS(4) ---//
- hold >>>= 4;
- bits -= 4;
- //---//
- len = (hold & 0x0f)/*BITS(4)*/ + 8;
- if (state.wbits === 0) {
- state.wbits = len;
- }
- if (len > 15 || len > state.wbits) {
- strm.msg = 'invalid window size';
- state.mode = BAD$3;
- break;
- }
-
- // !!! pako patch. Force use `options.windowBits` if passed.
- // Required to always use max window size by default.
- state.dmax = 1 << state.wbits;
- //state.dmax = 1 << len;
-
- state.flags = 0; /* indicate zlib header */
- //Tracev((stderr, "inflate: zlib header ok\n"));
- strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
- state.mode = hold & 0x200 ? DICTID$2 : TYPE$3;
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- break;
- case FLAGS$2:
- //=== NEEDBITS(16); */
- while (bits < 16) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- state.flags = hold;
- if ((state.flags & 0xff) !== Z_DEFLATED$4) {
- strm.msg = 'unknown compression method';
- state.mode = BAD$3;
- break;
- }
- if (state.flags & 0xe000) {
- strm.msg = 'unknown header flags set';
- state.mode = BAD$3;
- break;
- }
- if (state.head) {
- state.head.text = ((hold >> 8) & 1);
- }
- if ((state.flags & 0x0200) && (state.wrap & 4)) {
- //=== CRC2(state.check, hold);
- hbuf[0] = hold & 0xff;
- hbuf[1] = (hold >>> 8) & 0xff;
- state.check = crc32_1$2(state.check, hbuf, 2, 0);
- //===//
- }
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- state.mode = TIME$2;
- /* falls through */
- case TIME$2:
- //=== NEEDBITS(32); */
- while (bits < 32) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- if (state.head) {
- state.head.time = hold;
- }
- if ((state.flags & 0x0200) && (state.wrap & 4)) {
- //=== CRC4(state.check, hold)
- hbuf[0] = hold & 0xff;
- hbuf[1] = (hold >>> 8) & 0xff;
- hbuf[2] = (hold >>> 16) & 0xff;
- hbuf[3] = (hold >>> 24) & 0xff;
- state.check = crc32_1$2(state.check, hbuf, 4, 0);
- //===
- }
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- state.mode = OS$2;
- /* falls through */
- case OS$2:
- //=== NEEDBITS(16); */
- while (bits < 16) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- if (state.head) {
- state.head.xflags = (hold & 0xff);
- state.head.os = (hold >> 8);
- }
- if ((state.flags & 0x0200) && (state.wrap & 4)) {
- //=== CRC2(state.check, hold);
- hbuf[0] = hold & 0xff;
- hbuf[1] = (hold >>> 8) & 0xff;
- state.check = crc32_1$2(state.check, hbuf, 2, 0);
- //===//
- }
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- state.mode = EXLEN$2;
- /* falls through */
- case EXLEN$2:
- if (state.flags & 0x0400) {
- //=== NEEDBITS(16); */
- while (bits < 16) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- state.length = hold;
- if (state.head) {
- state.head.extra_len = hold;
- }
- if ((state.flags & 0x0200) && (state.wrap & 4)) {
- //=== CRC2(state.check, hold);
- hbuf[0] = hold & 0xff;
- hbuf[1] = (hold >>> 8) & 0xff;
- state.check = crc32_1$2(state.check, hbuf, 2, 0);
- //===//
- }
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- }
- else if (state.head) {
- state.head.extra = null/*Z_NULL*/;
- }
- state.mode = EXTRA$2;
- /* falls through */
- case EXTRA$2:
- if (state.flags & 0x0400) {
- copy = state.length;
- if (copy > have) { copy = have; }
- if (copy) {
- if (state.head) {
- len = state.head.extra_len - state.length;
- if (!state.head.extra) {
- // Use untyped array for more convenient processing later
- state.head.extra = new Uint8Array(state.head.extra_len);
- }
- state.head.extra.set(
- input.subarray(
- next,
- // extra field is limited to 65536 bytes
- // - no need for additional size check
- next + copy
- ),
- /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/
- len
- );
- //zmemcpy(state.head.extra + len, next,
- // len + copy > state.head.extra_max ?
- // state.head.extra_max - len : copy);
- }
- if ((state.flags & 0x0200) && (state.wrap & 4)) {
- state.check = crc32_1$2(state.check, input, copy, next);
- }
- have -= copy;
- next += copy;
- state.length -= copy;
- }
- if (state.length) { break inf_leave; }
- }
- state.length = 0;
- state.mode = NAME$2;
- /* falls through */
- case NAME$2:
- if (state.flags & 0x0800) {
- if (have === 0) { break inf_leave; }
- copy = 0;
- do {
- // TODO: 2 or 1 bytes?
- len = input[next + copy++];
- /* use constant limit because in js we should not preallocate memory */
- if (state.head && len &&
- (state.length < 65536 /*state.head.name_max*/)) {
- state.head.name += String.fromCharCode(len);
- }
- } while (len && copy < have);
-
- if ((state.flags & 0x0200) && (state.wrap & 4)) {
- state.check = crc32_1$2(state.check, input, copy, next);
- }
- have -= copy;
- next += copy;
- if (len) { break inf_leave; }
- }
- else if (state.head) {
- state.head.name = null;
- }
- state.length = 0;
- state.mode = COMMENT$2;
- /* falls through */
- case COMMENT$2:
- if (state.flags & 0x1000) {
- if (have === 0) { break inf_leave; }
- copy = 0;
- do {
- len = input[next + copy++];
- /* use constant limit because in js we should not preallocate memory */
- if (state.head && len &&
- (state.length < 65536 /*state.head.comm_max*/)) {
- state.head.comment += String.fromCharCode(len);
- }
- } while (len && copy < have);
- if ((state.flags & 0x0200) && (state.wrap & 4)) {
- state.check = crc32_1$2(state.check, input, copy, next);
- }
- have -= copy;
- next += copy;
- if (len) { break inf_leave; }
- }
- else if (state.head) {
- state.head.comment = null;
- }
- state.mode = HCRC$2;
- /* falls through */
- case HCRC$2:
- if (state.flags & 0x0200) {
- //=== NEEDBITS(16); */
- while (bits < 16) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- if ((state.wrap & 4) && hold !== (state.check & 0xffff)) {
- strm.msg = 'header crc mismatch';
- state.mode = BAD$3;
- break;
- }
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- }
- if (state.head) {
- state.head.hcrc = ((state.flags >> 9) & 1);
- state.head.done = true;
- }
- strm.adler = state.check = 0;
- state.mode = TYPE$3;
- break;
- case DICTID$2:
- //=== NEEDBITS(32); */
- while (bits < 32) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- strm.adler = state.check = zswap32$2(hold);
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- state.mode = DICT$2;
- /* falls through */
- case DICT$2:
- if (state.havedict === 0) {
- //--- RESTORE() ---
- strm.next_out = put;
- strm.avail_out = left;
- strm.next_in = next;
- strm.avail_in = have;
- state.hold = hold;
- state.bits = bits;
- //---
- return Z_NEED_DICT$1$2;
- }
- strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
- state.mode = TYPE$3;
- /* falls through */
- case TYPE$3:
- if (flush === Z_BLOCK$3 || flush === Z_TREES$2) { break inf_leave; }
- /* falls through */
- case TYPEDO$2:
- if (state.last) {
- //--- BYTEBITS() ---//
- hold >>>= bits & 7;
- bits -= bits & 7;
- //---//
- state.mode = CHECK$2;
- break;
- }
- //=== NEEDBITS(3); */
- while (bits < 3) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- state.last = (hold & 0x01)/*BITS(1)*/;
- //--- DROPBITS(1) ---//
- hold >>>= 1;
- bits -= 1;
- //---//
-
- switch ((hold & 0x03)/*BITS(2)*/) {
- case 0: /* stored block */
- //Tracev((stderr, "inflate: stored block%s\n",
- // state.last ? " (last)" : ""));
- state.mode = STORED$2;
- break;
- case 1: /* fixed block */
- fixedtables$2(state);
- //Tracev((stderr, "inflate: fixed codes block%s\n",
- // state.last ? " (last)" : ""));
- state.mode = LEN_$2; /* decode codes */
- if (flush === Z_TREES$2) {
- //--- DROPBITS(2) ---//
- hold >>>= 2;
- bits -= 2;
- //---//
- break inf_leave;
- }
- break;
- case 2: /* dynamic block */
- //Tracev((stderr, "inflate: dynamic codes block%s\n",
- // state.last ? " (last)" : ""));
- state.mode = TABLE$2;
- break;
- case 3:
- strm.msg = 'invalid block type';
- state.mode = BAD$3;
- }
- //--- DROPBITS(2) ---//
- hold >>>= 2;
- bits -= 2;
- //---//
- break;
- case STORED$2:
- //--- BYTEBITS() ---// /* go to byte boundary */
- hold >>>= bits & 7;
- bits -= bits & 7;
- //---//
- //=== NEEDBITS(32); */
- while (bits < 32) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {
- strm.msg = 'invalid stored block lengths';
- state.mode = BAD$3;
- break;
- }
- state.length = hold & 0xffff;
- //Tracev((stderr, "inflate: stored length %u\n",
- // state.length));
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- state.mode = COPY_$2;
- if (flush === Z_TREES$2) { break inf_leave; }
- /* falls through */
- case COPY_$2:
- state.mode = COPY$2;
- /* falls through */
- case COPY$2:
- copy = state.length;
- if (copy) {
- if (copy > have) { copy = have; }
- if (copy > left) { copy = left; }
- if (copy === 0) { break inf_leave; }
- //--- zmemcpy(put, next, copy); ---
- output.set(input.subarray(next, next + copy), put);
- //---//
- have -= copy;
- next += copy;
- left -= copy;
- put += copy;
- state.length -= copy;
- break;
- }
- //Tracev((stderr, "inflate: stored end\n"));
- state.mode = TYPE$3;
- break;
- case TABLE$2:
- //=== NEEDBITS(14); */
- while (bits < 14) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;
- //--- DROPBITS(5) ---//
- hold >>>= 5;
- bits -= 5;
- //---//
- state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;
- //--- DROPBITS(5) ---//
- hold >>>= 5;
- bits -= 5;
- //---//
- state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;
- //--- DROPBITS(4) ---//
- hold >>>= 4;
- bits -= 4;
- //---//
-//#ifndef PKZIP_BUG_WORKAROUND
- if (state.nlen > 286 || state.ndist > 30) {
- strm.msg = 'too many length or distance symbols';
- state.mode = BAD$3;
- break;
- }
-//#endif
- //Tracev((stderr, "inflate: table sizes ok\n"));
- state.have = 0;
- state.mode = LENLENS$2;
- /* falls through */
- case LENLENS$2:
- while (state.have < state.ncode) {
- //=== NEEDBITS(3);
- while (bits < 3) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);
- //--- DROPBITS(3) ---//
- hold >>>= 3;
- bits -= 3;
- //---//
- }
- while (state.have < 19) {
- state.lens[order[state.have++]] = 0;
- }
- // We have separate tables & no pointers. 2 commented lines below not needed.
- //state.next = state.codes;
- //state.lencode = state.next;
- // Switch to use dynamic table
- state.lencode = state.lendyn;
- state.lenbits = 7;
-
- opts = { bits: state.lenbits };
- ret = inftrees$2(CODES$3, state.lens, 0, 19, state.lencode, 0, state.work, opts);
- state.lenbits = opts.bits;
-
- if (ret) {
- strm.msg = 'invalid code lengths set';
- state.mode = BAD$3;
- break;
- }
- //Tracev((stderr, "inflate: code lengths ok\n"));
- state.have = 0;
- state.mode = CODELENS$2;
- /* falls through */
- case CODELENS$2:
- while (state.have < state.nlen + state.ndist) {
- for (;;) {
- here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/
- here_bits = here >>> 24;
- here_op = (here >>> 16) & 0xff;
- here_val = here & 0xffff;
-
- if ((here_bits) <= bits) { break; }
- //--- PULLBYTE() ---//
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- //---//
- }
- if (here_val < 16) {
- //--- DROPBITS(here.bits) ---//
- hold >>>= here_bits;
- bits -= here_bits;
- //---//
- state.lens[state.have++] = here_val;
- }
- else {
- if (here_val === 16) {
- //=== NEEDBITS(here.bits + 2);
- n = here_bits + 2;
- while (bits < n) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- //--- DROPBITS(here.bits) ---//
- hold >>>= here_bits;
- bits -= here_bits;
- //---//
- if (state.have === 0) {
- strm.msg = 'invalid bit length repeat';
- state.mode = BAD$3;
- break;
- }
- len = state.lens[state.have - 1];
- copy = 3 + (hold & 0x03);//BITS(2);
- //--- DROPBITS(2) ---//
- hold >>>= 2;
- bits -= 2;
- //---//
- }
- else if (here_val === 17) {
- //=== NEEDBITS(here.bits + 3);
- n = here_bits + 3;
- while (bits < n) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- //--- DROPBITS(here.bits) ---//
- hold >>>= here_bits;
- bits -= here_bits;
- //---//
- len = 0;
- copy = 3 + (hold & 0x07);//BITS(3);
- //--- DROPBITS(3) ---//
- hold >>>= 3;
- bits -= 3;
- //---//
- }
- else {
- //=== NEEDBITS(here.bits + 7);
- n = here_bits + 7;
- while (bits < n) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- //--- DROPBITS(here.bits) ---//
- hold >>>= here_bits;
- bits -= here_bits;
- //---//
- len = 0;
- copy = 11 + (hold & 0x7f);//BITS(7);
- //--- DROPBITS(7) ---//
- hold >>>= 7;
- bits -= 7;
- //---//
- }
- if (state.have + copy > state.nlen + state.ndist) {
- strm.msg = 'invalid bit length repeat';
- state.mode = BAD$3;
- break;
- }
- while (copy--) {
- state.lens[state.have++] = len;
- }
- }
- }
-
- /* handle error breaks in while */
- if (state.mode === BAD$3) { break; }
-
- /* check for end-of-block code (better have one) */
- if (state.lens[256] === 0) {
- strm.msg = 'invalid code -- missing end-of-block';
- state.mode = BAD$3;
- break;
- }
-
- /* build code tables -- note: do not change the lenbits or distbits
- values here (9 and 6) without reading the comments in inftrees.h
- concerning the ENOUGH constants, which depend on those values */
- state.lenbits = 9;
-
- opts = { bits: state.lenbits };
- ret = inftrees$2(LENS$3, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
- // We have separate tables & no pointers. 2 commented lines below not needed.
- // state.next_index = opts.table_index;
- state.lenbits = opts.bits;
- // state.lencode = state.next;
-
- if (ret) {
- strm.msg = 'invalid literal/lengths set';
- state.mode = BAD$3;
- break;
- }
-
- state.distbits = 6;
- //state.distcode.copy(state.codes);
- // Switch to use dynamic table
- state.distcode = state.distdyn;
- opts = { bits: state.distbits };
- ret = inftrees$2(DISTS$3, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
- // We have separate tables & no pointers. 2 commented lines below not needed.
- // state.next_index = opts.table_index;
- state.distbits = opts.bits;
- // state.distcode = state.next;
-
- if (ret) {
- strm.msg = 'invalid distances set';
- state.mode = BAD$3;
- break;
- }
- //Tracev((stderr, 'inflate: codes ok\n'));
- state.mode = LEN_$2;
- if (flush === Z_TREES$2) { break inf_leave; }
- /* falls through */
- case LEN_$2:
- state.mode = LEN$2;
- /* falls through */
- case LEN$2:
- if (have >= 6 && left >= 258) {
- //--- RESTORE() ---
- strm.next_out = put;
- strm.avail_out = left;
- strm.next_in = next;
- strm.avail_in = have;
- state.hold = hold;
- state.bits = bits;
- //---
- inffast$2(strm, _out);
- //--- LOAD() ---
- put = strm.next_out;
- output = strm.output;
- left = strm.avail_out;
- next = strm.next_in;
- input = strm.input;
- have = strm.avail_in;
- hold = state.hold;
- bits = state.bits;
- //---
-
- if (state.mode === TYPE$3) {
- state.back = -1;
- }
- break;
- }
- state.back = 0;
- for (;;) {
- here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/
- here_bits = here >>> 24;
- here_op = (here >>> 16) & 0xff;
- here_val = here & 0xffff;
-
- if (here_bits <= bits) { break; }
- //--- PULLBYTE() ---//
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- //---//
- }
- if (here_op && (here_op & 0xf0) === 0) {
- last_bits = here_bits;
- last_op = here_op;
- last_val = here_val;
- for (;;) {
- here = state.lencode[last_val +
- ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
- here_bits = here >>> 24;
- here_op = (here >>> 16) & 0xff;
- here_val = here & 0xffff;
-
- if ((last_bits + here_bits) <= bits) { break; }
- //--- PULLBYTE() ---//
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- //---//
- }
- //--- DROPBITS(last.bits) ---//
- hold >>>= last_bits;
- bits -= last_bits;
- //---//
- state.back += last_bits;
- }
- //--- DROPBITS(here.bits) ---//
- hold >>>= here_bits;
- bits -= here_bits;
- //---//
- state.back += here_bits;
- state.length = here_val;
- if (here_op === 0) {
- //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
- // "inflate: literal '%c'\n" :
- // "inflate: literal 0x%02x\n", here.val));
- state.mode = LIT$2;
- break;
- }
- if (here_op & 32) {
- //Tracevv((stderr, "inflate: end of block\n"));
- state.back = -1;
- state.mode = TYPE$3;
- break;
- }
- if (here_op & 64) {
- strm.msg = 'invalid literal/length code';
- state.mode = BAD$3;
- break;
- }
- state.extra = here_op & 15;
- state.mode = LENEXT$2;
- /* falls through */
- case LENEXT$2:
- if (state.extra) {
- //=== NEEDBITS(state.extra);
- n = state.extra;
- while (bits < n) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
- //--- DROPBITS(state.extra) ---//
- hold >>>= state.extra;
- bits -= state.extra;
- //---//
- state.back += state.extra;
- }
- //Tracevv((stderr, "inflate: length %u\n", state.length));
- state.was = state.length;
- state.mode = DIST$2;
- /* falls through */
- case DIST$2:
- for (;;) {
- here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/
- here_bits = here >>> 24;
- here_op = (here >>> 16) & 0xff;
- here_val = here & 0xffff;
-
- if ((here_bits) <= bits) { break; }
- //--- PULLBYTE() ---//
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- //---//
- }
- if ((here_op & 0xf0) === 0) {
- last_bits = here_bits;
- last_op = here_op;
- last_val = here_val;
- for (;;) {
- here = state.distcode[last_val +
- ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
- here_bits = here >>> 24;
- here_op = (here >>> 16) & 0xff;
- here_val = here & 0xffff;
-
- if ((last_bits + here_bits) <= bits) { break; }
- //--- PULLBYTE() ---//
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- //---//
- }
- //--- DROPBITS(last.bits) ---//
- hold >>>= last_bits;
- bits -= last_bits;
- //---//
- state.back += last_bits;
- }
- //--- DROPBITS(here.bits) ---//
- hold >>>= here_bits;
- bits -= here_bits;
- //---//
- state.back += here_bits;
- if (here_op & 64) {
- strm.msg = 'invalid distance code';
- state.mode = BAD$3;
- break;
- }
- state.offset = here_val;
- state.extra = (here_op) & 15;
- state.mode = DISTEXT$2;
- /* falls through */
- case DISTEXT$2:
- if (state.extra) {
- //=== NEEDBITS(state.extra);
- n = state.extra;
- while (bits < n) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
- //--- DROPBITS(state.extra) ---//
- hold >>>= state.extra;
- bits -= state.extra;
- //---//
- state.back += state.extra;
- }
-//#ifdef INFLATE_STRICT
- if (state.offset > state.dmax) {
- strm.msg = 'invalid distance too far back';
- state.mode = BAD$3;
- break;
- }
-//#endif
- //Tracevv((stderr, "inflate: distance %u\n", state.offset));
- state.mode = MATCH$2;
- /* falls through */
- case MATCH$2:
- if (left === 0) { break inf_leave; }
- copy = _out - left;
- if (state.offset > copy) { /* copy from window */
- copy = state.offset - copy;
- if (copy > state.whave) {
- if (state.sane) {
- strm.msg = 'invalid distance too far back';
- state.mode = BAD$3;
- break;
- }
-// (!) This block is disabled in zlib defaults,
-// don't enable it for binary compatibility
-//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
-// Trace((stderr, "inflate.c too far\n"));
-// copy -= state.whave;
-// if (copy > state.length) { copy = state.length; }
-// if (copy > left) { copy = left; }
-// left -= copy;
-// state.length -= copy;
-// do {
-// output[put++] = 0;
-// } while (--copy);
-// if (state.length === 0) { state.mode = LEN; }
-// break;
-//#endif
- }
- if (copy > state.wnext) {
- copy -= state.wnext;
- from = state.wsize - copy;
- }
- else {
- from = state.wnext - copy;
- }
- if (copy > state.length) { copy = state.length; }
- from_source = state.window;
- }
- else { /* copy from output */
- from_source = output;
- from = put - state.offset;
- copy = state.length;
- }
- if (copy > left) { copy = left; }
- left -= copy;
- state.length -= copy;
- do {
- output[put++] = from_source[from++];
- } while (--copy);
- if (state.length === 0) { state.mode = LEN$2; }
- break;
- case LIT$2:
- if (left === 0) { break inf_leave; }
- output[put++] = state.length;
- left--;
- state.mode = LEN$2;
- break;
- case CHECK$2:
- if (state.wrap) {
- //=== NEEDBITS(32);
- while (bits < 32) {
- if (have === 0) { break inf_leave; }
- have--;
- // Use '|' instead of '+' to make sure that result is signed
- hold |= input[next++] << bits;
- bits += 8;
- }
- //===//
- _out -= left;
- strm.total_out += _out;
- state.total += _out;
- if ((state.wrap & 4) && _out) {
- strm.adler = state.check =
- /*UPDATE_CHECK(state.check, put - _out, _out);*/
- (state.flags ? crc32_1$2(state.check, output, _out, put - _out) : adler32_1$2(state.check, output, _out, put - _out));
-
- }
- _out = left;
- // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too
- if ((state.wrap & 4) && (state.flags ? hold : zswap32$2(hold)) !== state.check) {
- strm.msg = 'incorrect data check';
- state.mode = BAD$3;
- break;
- }
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- //Tracev((stderr, "inflate: check matches trailer\n"));
- }
- state.mode = LENGTH$2;
- /* falls through */
- case LENGTH$2:
- if (state.wrap && state.flags) {
- //=== NEEDBITS(32);
- while (bits < 32) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- if ((state.wrap & 4) && hold !== (state.total & 0xffffffff)) {
- strm.msg = 'incorrect length check';
- state.mode = BAD$3;
- break;
- }
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- //Tracev((stderr, "inflate: length matches trailer\n"));
- }
- state.mode = DONE$2;
- /* falls through */
- case DONE$2:
- ret = Z_STREAM_END$1$2;
- break inf_leave;
- case BAD$3:
- ret = Z_DATA_ERROR$1$2;
- break inf_leave;
- case MEM$2:
- return Z_MEM_ERROR$1$2;
- case SYNC$2:
- /* falls through */
- default:
- return Z_STREAM_ERROR$1$2;
- }
- }
-
- // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave"
-
- /*
- Return from inflate(), updating the total counts and the check value.
- If there was no progress during the inflate() call, return a buffer
- error. Call updatewindow() to create and/or update the window state.
- Note: a memory error from inflate() is non-recoverable.
- */
-
- //--- RESTORE() ---
- strm.next_out = put;
- strm.avail_out = left;
- strm.next_in = next;
- strm.avail_in = have;
- state.hold = hold;
- state.bits = bits;
- //---
-
- if (state.wsize || (_out !== strm.avail_out && state.mode < BAD$3 &&
- (state.mode < CHECK$2 || flush !== Z_FINISH$1$2))) {
- if (updatewindow$2(strm, strm.output, strm.next_out, _out - strm.avail_out)) ;
- }
- _in -= strm.avail_in;
- _out -= strm.avail_out;
- strm.total_in += _in;
- strm.total_out += _out;
- state.total += _out;
- if ((state.wrap & 4) && _out) {
- strm.adler = state.check = /*UPDATE_CHECK(state.check, strm.next_out - _out, _out);*/
- (state.flags ? crc32_1$2(state.check, output, _out, strm.next_out - _out) : adler32_1$2(state.check, output, _out, strm.next_out - _out));
- }
- strm.data_type = state.bits + (state.last ? 64 : 0) +
- (state.mode === TYPE$3 ? 128 : 0) +
- (state.mode === LEN_$2 || state.mode === COPY_$2 ? 256 : 0);
- if (((_in === 0 && _out === 0) || flush === Z_FINISH$1$2) && ret === Z_OK$1$2) {
- ret = Z_BUF_ERROR$3;
- }
- return ret;
-};
-
-
-const inflateEnd$2 = (strm) => {
-
- if (inflateStateCheck$1(strm)) {
- return Z_STREAM_ERROR$1$2;
- }
-
- let state = strm.state;
- if (state.window) {
- state.window = null;
- }
- strm.state = null;
- return Z_OK$1$2;
-};
-
-
-const inflateGetHeader$2 = (strm, head) => {
-
- /* check state */
- if (inflateStateCheck$1(strm)) { return Z_STREAM_ERROR$1$2; }
- const state = strm.state;
- if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1$2; }
-
- /* save header structure */
- state.head = head;
- head.done = false;
- return Z_OK$1$2;
-};
-
-
-const inflateSetDictionary$2 = (strm, dictionary) => {
- const dictLength = dictionary.length;
-
- let state;
- let dictid;
- let ret;
-
- /* check state */
- if (inflateStateCheck$1(strm)) { return Z_STREAM_ERROR$1$2; }
- state = strm.state;
-
- if (state.wrap !== 0 && state.mode !== DICT$2) {
- return Z_STREAM_ERROR$1$2;
- }
-
- /* check for correct dictionary identifier */
- if (state.mode === DICT$2) {
- dictid = 1; /* adler32(0, null, 0)*/
- /* dictid = adler32(dictid, dictionary, dictLength); */
- dictid = adler32_1$2(dictid, dictionary, dictLength, 0);
- if (dictid !== state.check) {
- return Z_DATA_ERROR$1$2;
- }
- }
- /* copy dictionary to window using updatewindow(), which will amend the
- existing dictionary if appropriate */
- ret = updatewindow$2(strm, dictionary, dictLength, dictLength);
- if (ret) {
- state.mode = MEM$2;
- return Z_MEM_ERROR$1$2;
- }
- state.havedict = 1;
- // Tracev((stderr, "inflate: dictionary set\n"));
- return Z_OK$1$2;
-};
-
-
-var inflateReset_1$2 = inflateReset$2;
-var inflateReset2_1$2 = inflateReset2$2;
-var inflateResetKeep_1$2 = inflateResetKeep$2;
-var inflateInit_1$2 = inflateInit$2;
-var inflateInit2_1$2 = inflateInit2$2;
-var inflate_2$1$2 = inflate$2$2;
-var inflateEnd_1$2 = inflateEnd$2;
-var inflateGetHeader_1$2 = inflateGetHeader$2;
-var inflateSetDictionary_1$2 = inflateSetDictionary$2;
-var inflateInfo$2 = 'pako inflate (from Nodeca project)';
-
-/* Not implemented
-module.exports.inflateCodesUsed = inflateCodesUsed;
-module.exports.inflateCopy = inflateCopy;
-module.exports.inflateGetDictionary = inflateGetDictionary;
-module.exports.inflateMark = inflateMark;
-module.exports.inflatePrime = inflatePrime;
-module.exports.inflateSync = inflateSync;
-module.exports.inflateSyncPoint = inflateSyncPoint;
-module.exports.inflateUndermine = inflateUndermine;
-module.exports.inflateValidate = inflateValidate;
-*/
-
-var inflate_1$2$2 = {
- inflateReset: inflateReset_1$2,
- inflateReset2: inflateReset2_1$2,
- inflateResetKeep: inflateResetKeep_1$2,
- inflateInit: inflateInit_1$2,
- inflateInit2: inflateInit2_1$2,
- inflate: inflate_2$1$2,
- inflateEnd: inflateEnd_1$2,
- inflateGetHeader: inflateGetHeader_1$2,
- inflateSetDictionary: inflateSetDictionary_1$2,
- inflateInfo: inflateInfo$2
-};
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-// claim that you wrote the original software. If you use this software
-// in a product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-function GZheader$2() {
- /* true if compressed data believed to be text */
- this.text = 0;
- /* modification time */
- this.time = 0;
- /* extra flags (not used when writing a gzip file) */
- this.xflags = 0;
- /* operating system */
- this.os = 0;
- /* pointer to extra field or Z_NULL if none */
- this.extra = null;
- /* extra field length (valid if extra != Z_NULL) */
- this.extra_len = 0; // Actually, we don't need it in JS,
- // but leave for few code modifications
-
- //
- // Setup limits is not necessary because in js we should not preallocate memory
- // for inflate use constant limit in 65536 bytes
- //
-
- /* space at extra (only when reading header) */
- // this.extra_max = 0;
- /* pointer to zero-terminated file name or Z_NULL */
- this.name = '';
- /* space at name (only when reading header) */
- // this.name_max = 0;
- /* pointer to zero-terminated comment or Z_NULL */
- this.comment = '';
- /* space at comment (only when reading header) */
- // this.comm_max = 0;
- /* true if there was or will be a header crc */
- this.hcrc = 0;
- /* true when done reading gzip header (not used when writing a gzip file) */
- this.done = false;
-}
-
-var gzheader$2 = GZheader$2;
-
-const toString$4 = Object.prototype.toString;
-
-/* Public constants ==========================================================*/
-/* ===========================================================================*/
-
-const {
- Z_NO_FLUSH: Z_NO_FLUSH$4, Z_FINISH: Z_FINISH$5,
- Z_OK: Z_OK$5, Z_STREAM_END: Z_STREAM_END$5, Z_NEED_DICT: Z_NEED_DICT$3, Z_STREAM_ERROR: Z_STREAM_ERROR$4, Z_DATA_ERROR: Z_DATA_ERROR$4, Z_MEM_ERROR: Z_MEM_ERROR$3
-} = constants$2$2;
-
-/* ===========================================================================*/
-
-
-/**
- * class Inflate
- *
- * Generic JS-style wrapper for zlib calls. If you don't need
- * streaming behaviour - use more simple functions: [[inflate]]
- * and [[inflateRaw]].
- **/
-
-/* internal
- * inflate.chunks -> Array
- *
- * Chunks of output data, if [[Inflate#onData]] not overridden.
- **/
-
-/**
- * Inflate.result -> Uint8Array|String
- *
- * Uncompressed result, generated by default [[Inflate#onData]]
- * and [[Inflate#onEnd]] handlers. Filled after you push last chunk
- * (call [[Inflate#push]] with `Z_FINISH` / `true` param).
- **/
-
-/**
- * Inflate.err -> Number
- *
- * Error code after inflate finished. 0 (Z_OK) on success.
- * Should be checked if broken data possible.
- **/
-
-/**
- * Inflate.msg -> String
- *
- * Error message, if [[Inflate.err]] != 0
- **/
-
-
-/**
- * new Inflate(options)
- * - options (Object): zlib inflate options.
- *
- * Creates new inflator instance with specified params. Throws exception
- * on bad params. Supported options:
- *
- * - `windowBits`
- * - `dictionary`
- *
- * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
- * for more information on these.
- *
- * Additional options, for internal needs:
- *
- * - `chunkSize` - size of generated data chunks (16K by default)
- * - `raw` (Boolean) - do raw inflate
- * - `to` (String) - if equal to 'string', then result will be converted
- * from utf8 to utf16 (javascript) string. When string output requested,
- * chunk length can differ from `chunkSize`, depending on content.
- *
- * By default, when no options set, autodetect deflate/gzip data format via
- * wrapper header.
- *
- * ##### Example:
- *
- * ```javascript
- * const pako = require('pako')
- * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])
- * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);
- *
- * const inflate = new pako.Inflate({ level: 3});
- *
- * inflate.push(chunk1, false);
- * inflate.push(chunk2, true); // true -> last chunk
- *
- * if (inflate.err) { throw new Error(inflate.err); }
- *
- * console.log(inflate.result);
- * ```
- **/
-function Inflate$1$2(options) {
- this.options = common$2.assign({
- chunkSize: 1024 * 64,
- windowBits: 15,
- to: ''
- }, options || {});
-
- const opt = this.options;
-
- // Force window size for `raw` data, if not set directly,
- // because we have no header for autodetect.
- if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {
- opt.windowBits = -opt.windowBits;
- if (opt.windowBits === 0) { opt.windowBits = -15; }
- }
-
- // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate
- if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&
- !(options && options.windowBits)) {
- opt.windowBits += 32;
- }
-
- // Gzip header has no info about windows size, we can do autodetect only
- // for deflate. So, if window size not set, force it to max when gzip possible
- if ((opt.windowBits > 15) && (opt.windowBits < 48)) {
- // bit 3 (16) -> gzipped data
- // bit 4 (32) -> autodetect gzip/deflate
- if ((opt.windowBits & 15) === 0) {
- opt.windowBits |= 15;
- }
- }
-
- this.err = 0; // error code, if happens (0 = Z_OK)
- this.msg = ''; // error message
- this.ended = false; // used to avoid multiple onEnd() calls
- this.chunks = []; // chunks of compressed data
-
- this.strm = new zstream$2();
- this.strm.avail_out = 0;
-
- let status = inflate_1$2$2.inflateInit2(
- this.strm,
- opt.windowBits
- );
-
- if (status !== Z_OK$5) {
- throw new Error(messages$2[status]);
- }
-
- this.header = new gzheader$2();
-
- inflate_1$2$2.inflateGetHeader(this.strm, this.header);
-
- // Setup dictionary
- if (opt.dictionary) {
- // Convert data if needed
- if (typeof opt.dictionary === 'string') {
- opt.dictionary = strings$2.string2buf(opt.dictionary);
- } else if (toString$4.call(opt.dictionary) === '[object ArrayBuffer]') {
- opt.dictionary = new Uint8Array(opt.dictionary);
- }
- if (opt.raw) { //In raw mode we need to set the dictionary early
- status = inflate_1$2$2.inflateSetDictionary(this.strm, opt.dictionary);
- if (status !== Z_OK$5) {
- throw new Error(messages$2[status]);
- }
- }
- }
-}
-
-/**
- * Inflate#push(data[, flush_mode]) -> Boolean
- * - data (Uint8Array|ArrayBuffer): input data
- * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE
- * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH,
- * `true` means Z_FINISH.
- *
- * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with
- * new output chunks. Returns `true` on success. If end of stream detected,
- * [[Inflate#onEnd]] will be called.
- *
- * `flush_mode` is not needed for normal operation, because end of stream
- * detected automatically. You may try to use it for advanced things, but
- * this functionality was not tested.
- *
- * On fail call [[Inflate#onEnd]] with error code and return false.
- *
- * ##### Example
- *
- * ```javascript
- * push(chunk, false); // push one of data chunks
- * ...
- * push(chunk, true); // push last chunk
- * ```
- **/
-Inflate$1$2.prototype.push = function (data, flush_mode) {
- const strm = this.strm;
- const chunkSize = this.options.chunkSize;
- const dictionary = this.options.dictionary;
- let status, _flush_mode, last_avail_out;
-
- if (this.ended) return false;
-
- if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;
- else _flush_mode = flush_mode === true ? Z_FINISH$5 : Z_NO_FLUSH$4;
-
- // Convert data if needed
- if (toString$4.call(data) === '[object ArrayBuffer]') {
- strm.input = new Uint8Array(data);
- } else {
- strm.input = data;
- }
-
- strm.next_in = 0;
- strm.avail_in = strm.input.length;
-
- for (;;) {
- if (strm.avail_out === 0) {
- strm.output = new Uint8Array(chunkSize);
- strm.next_out = 0;
- strm.avail_out = chunkSize;
- }
-
- status = inflate_1$2$2.inflate(strm, _flush_mode);
-
- if (status === Z_NEED_DICT$3 && dictionary) {
- status = inflate_1$2$2.inflateSetDictionary(strm, dictionary);
-
- if (status === Z_OK$5) {
- status = inflate_1$2$2.inflate(strm, _flush_mode);
- } else if (status === Z_DATA_ERROR$4) {
- // Replace code with more verbose
- status = Z_NEED_DICT$3;
- }
- }
-
- // Skip snyc markers if more data follows and not raw mode
- while (strm.avail_in > 0 &&
- status === Z_STREAM_END$5 &&
- strm.state.wrap > 0 &&
- data[strm.next_in] !== 0)
- {
- inflate_1$2$2.inflateReset(strm);
- status = inflate_1$2$2.inflate(strm, _flush_mode);
- }
-
- switch (status) {
- case Z_STREAM_ERROR$4:
- case Z_DATA_ERROR$4:
- case Z_NEED_DICT$3:
- case Z_MEM_ERROR$3:
- this.onEnd(status);
- this.ended = true;
- return false;
- }
-
- // Remember real `avail_out` value, because we may patch out buffer content
- // to align utf8 strings boundaries.
- last_avail_out = strm.avail_out;
-
- if (strm.next_out) {
- if (strm.avail_out === 0 || status === Z_STREAM_END$5) {
-
- if (this.options.to === 'string') {
-
- let next_out_utf8 = strings$2.utf8border(strm.output, strm.next_out);
-
- let tail = strm.next_out - next_out_utf8;
- let utf8str = strings$2.buf2string(strm.output, next_out_utf8);
-
- // move tail & realign counters
- strm.next_out = tail;
- strm.avail_out = chunkSize - tail;
- if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0);
-
- this.onData(utf8str);
-
- } else {
- this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));
- }
- }
- }
-
- // Must repeat iteration if out buffer is full
- if (status === Z_OK$5 && last_avail_out === 0) continue;
-
- // Finalize if end of stream reached.
- if (status === Z_STREAM_END$5) {
- status = inflate_1$2$2.inflateEnd(this.strm);
- this.onEnd(status);
- this.ended = true;
- return true;
- }
-
- if (strm.avail_in === 0) break;
- }
-
- return true;
-};
-
-
-/**
- * Inflate#onData(chunk) -> Void
- * - chunk (Uint8Array|String): output data. When string output requested,
- * each chunk will be string.
- *
- * By default, stores data blocks in `chunks[]` property and glue
- * those in `onEnd`. Override this handler, if you need another behaviour.
- **/
-Inflate$1$2.prototype.onData = function (chunk) {
- this.chunks.push(chunk);
-};
-
-
-/**
- * Inflate#onEnd(status) -> Void
- * - status (Number): inflate status. 0 (Z_OK) on success,
- * other if not.
- *
- * Called either after you tell inflate that the input stream is
- * complete (Z_FINISH). By default - join collected chunks,
- * free memory and fill `results` / `err` properties.
- **/
-Inflate$1$2.prototype.onEnd = function (status) {
- // On success - join
- if (status === Z_OK$5) {
- if (this.options.to === 'string') {
- this.result = this.chunks.join('');
- } else {
- this.result = common$2.flattenChunks(this.chunks);
- }
- }
- this.chunks = [];
- this.err = status;
- this.msg = this.strm.msg;
-};
-
-
-/**
- * inflate(data[, options]) -> Uint8Array|String
- * - data (Uint8Array|ArrayBuffer): input data to decompress.
- * - options (Object): zlib inflate options.
- *
- * Decompress `data` with inflate/ungzip and `options`. Autodetect
- * format via wrapper header by default. That's why we don't provide
- * separate `ungzip` method.
- *
- * Supported options are:
- *
- * - windowBits
- *
- * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
- * for more information.
- *
- * Sugar (options):
- *
- * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
- * negative windowBits implicitly.
- * - `to` (String) - if equal to 'string', then result will be converted
- * from utf8 to utf16 (javascript) string. When string output requested,
- * chunk length can differ from `chunkSize`, depending on content.
- *
- *
- * ##### Example:
- *
- * ```javascript
- * const pako = require('pako');
- * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9]));
- * let output;
- *
- * try {
- * output = pako.inflate(input);
- * } catch (err) {
- * console.log(err);
- * }
- * ```
- **/
-function inflate$1$2(input, options) {
- const inflator = new Inflate$1$2(options);
-
- inflator.push(input);
-
- // That will never happens, if you don't cheat with options :)
- if (inflator.err) throw inflator.msg || messages$2[inflator.err];
-
- return inflator.result;
-}
-
-
-/**
- * inflateRaw(data[, options]) -> Uint8Array|String
- * - data (Uint8Array|ArrayBuffer): input data to decompress.
- * - options (Object): zlib inflate options.
- *
- * The same as [[inflate]], but creates raw data, without wrapper
- * (header and adler32 crc).
- **/
-function inflateRaw$1$2(input, options) {
- options = options || {};
- options.raw = true;
- return inflate$1$2(input, options);
-}
-
-
-/**
- * ungzip(data[, options]) -> Uint8Array|String
- * - data (Uint8Array|ArrayBuffer): input data to decompress.
- * - options (Object): zlib inflate options.
- *
- * Just shortcut to [[inflate]], because it autodetects format
- * by header.content. Done for convenience.
- **/
-
-
-var Inflate_1$1$2 = Inflate$1$2;
-var inflate_2$3 = inflate$1$2;
-var inflateRaw_1$1$2 = inflateRaw$1$2;
-var ungzip$1$2 = inflate$1$2;
-var constants$4 = constants$2$2;
-
-var inflate_1$1$2 = {
- Inflate: Inflate_1$1$2,
- inflate: inflate_2$3,
- inflateRaw: inflateRaw_1$1$2,
- ungzip: ungzip$1$2,
- constants: constants$4
-};
-
-const { Deflate: Deflate$2, deflate: deflate$3, deflateRaw: deflateRaw$2, gzip: gzip$2 } = deflate_1$1$1;
-
-const { Inflate: Inflate$3, inflate: inflate$4, inflateRaw: inflateRaw$3, ungzip: ungzip$3 } = inflate_1$1$2;
-var deflateRaw_1$2 = deflateRaw$2;
-var inflateRaw_1$2 = inflateRaw$3;
-var ungzip_1$2 = ungzip$3;
-
-const FEXTRA$1 = 4; // gzip spec F.EXTRA flag
-
-function isgzipped$1(data) {
- const b = ArrayBuffer.isView(data) ? data : new Uint8Array(data);
- return b[0] ===31 && b[1] === 139;
-}
-
-/**
- * Pako does not properly ungzip block compressed files if > 1 block is present. Test for bgzip and use wrapper.
- */
-function ungzip_blocks$1(data) {
- const ba = ArrayBuffer.isView(data) ? data : new Uint8Array(data);
- const b = ba[3] & FEXTRA$1;
- if (b !== 0 && ba[12] === 66 && ba[13] === 67) {
- return unbgzf$1(ba.buffer);
- } else {
- return ungzip_1$2(ba);
- }
-}
-
-// Uncompress data, assumed to be series of bgzipped blocks
-function unbgzf$1(data, lim) {
-
- const oBlockList = [];
- let ptr = 0;
- let totalSize = 0;
-
- lim = lim || data.byteLength - 18;
-
- while (ptr < lim) {
- try {
- const ba = ArrayBuffer.isView(data) ? data : new Uint8Array(data, ptr, 18);
- const xlen = (ba[11] << 8) | (ba[10]);
- const flg = ba[3];
- const fextra = flg & FEXTRA$1;
- const si1 = ba[12];
- const si2 = ba[13];
- const slen = (ba[15] << 8) | (ba[14]);
- const bsize = ((ba[17] << 8) | (ba[16])) + 1;
- const start = 12 + xlen + ptr; // Start of CDATA
- const bytesLeft = data.byteLength - start;
- const cDataSize = bsize - xlen - 19;
- if (bytesLeft < cDataSize || cDataSize <= 0) break;
-
- const a = new Uint8Array(data, start, cDataSize);
- const unc = inflateRaw_1$2(a);
-
- // const inflate = new Zlib.RawInflate(a);
- // const unc = inflate.decompress();
-
- ptr += (cDataSize - 1) + 26; //inflate.ip + 26
- totalSize += unc.byteLength;
- oBlockList.push(unc);
- } catch (e) {
- console.error(e);
- break;
- }
- }
-
- // Concatenate decompressed blocks
- if (oBlockList.length === 1) {
- return oBlockList[0];
- } else {
- const out = new Uint8Array(totalSize);
- let cursor = 0;
- for (let i = 0; i < oBlockList.length; ++i) {
- var b = new Uint8Array(oBlockList[i]);
- arrayCopy$1(b, 0, out, cursor, b.length);
- cursor += b.length;
- }
- return out;
- }
-}
-
-// From Thomas Down's zlib implementation
-
-const testArray$1 = new Uint8Array(1);
-const hasSubarray$1 = (typeof testArray$1.subarray === 'function');
-
-function arrayCopy$1(src, srcOffset, dest, destOffset, count) {
- if (count === 0) {
- return;
- }
- if (!src) {
- throw "Undef src";
- } else if (!dest) {
- throw "Undef dest";
- }
- if (srcOffset === 0 && count === src.length) {
- arrayCopy_fast$1(src, dest, destOffset);
- } else if (hasSubarray$1) {
- arrayCopy_fast$1(src.subarray(srcOffset, srcOffset + count), dest, destOffset);
- } else if (src.BYTES_PER_ELEMENT === 1 && count > 100) {
- arrayCopy_fast$1(new Uint8Array(src.buffer, src.byteOffset + srcOffset, count), dest, destOffset);
- } else {
- arrayCopy_slow$1(src, srcOffset, dest, destOffset, count);
- }
-}
-
-function arrayCopy_slow$1(src, srcOffset, dest, destOffset, count) {
- for (let i = 0; i < count; ++i) {
- dest[destOffset + i] = src[srcOffset + i];
- }
-}
-
-function arrayCopy_fast$1(src, dest, destOffset) {
- dest.set(src, destOffset);
-}
-
-
-/**
- * Compress string and encode in a url safe form
- * @param s
- */
-function compressString$1(str) {
-
- const bytes = new Uint8Array(str.length);
- for (var i = 0; i < str.length; i++) {
- bytes[i] = str.charCodeAt(i);
- }
- const compressedBytes = new deflateRaw_1$2(bytes); // UInt8Arry
- const compressedString = String.fromCharCode.apply(null, compressedBytes); // Convert to string
- let enc = btoa(compressedString);
- return enc.replace(/\+/g, '.').replace(/\//g, '_').replace(/=/g, '-'); // URL safe
-}
-
-/**
- * Uncompress the url-safe encoded compressed string, presumably created by compressString above
- *
- * @param enc
- * @returns {string}
- */
-function uncompressString$1(enc) {
-
- enc = enc.replace(/\./g, '+').replace(/_/g, '/').replace(/-/g, '=');
-
- const compressedString = atob(enc);
- const compressedBytes = [];
- for (let i = 0; i < compressedString.length; i++) {
- compressedBytes.push(compressedString.charCodeAt(i));
- }
- //const bytes = new Zlib.RawInflate(compressedBytes).decompress();
- const bytes = inflateRaw_1$2(compressedBytes);
-
- let str = '';
- for (let b of bytes) {
- str += String.fromCharCode(b);
- }
- return str;
-}
-
-
-/**
- * @param dataURI
- * @returns {Array|Uint8Array}
- */
-function decodeDataURI$2(dataURI, gzip) {
-
- const split = dataURI.split(',');
- const info = split[0].split(':')[1];
- let dataString = split[1];
-
- if (info.indexOf('base64') >= 0) {
- dataString = atob(dataString);
-
- const bytes = new Uint8Array(dataString.length);
- for (let i = 0; i < dataString.length; i++) {
- bytes[i] = dataString.charCodeAt(i);
- }
-
- let plain;
- if (gzip || info.indexOf('gzip') > 0) {
- plain = ungzip_1$2(bytes);
- } else {
- plain = bytes;
- }
- return plain
- } else {
- return decodeURIComponent(dataString); // URL encoded string -- not currently used or tested
- }
-}
-
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2016-2017 The Regents of the University of California
- * Author: Jim Robinson
- *
- * 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.
- */
-const IGVMath$1 = {
-
- lerp: (v0, v1, t) => {
- return (1 - t) * v0 + t * v1;
- },
-
- mean: function (array) {
-
- var t = 0, n = 0,
- i;
- for (i = 0; i < array.length; i++) {
- if (!isNaN(array[i])) {
- t += array[i];
- n++;
- }
- }
- return n > 0 ? t / n : 0;
- },
-
- meanAndStdev: function (array) {
-
- var v, t = 0, t2 = 0, n = 0, i;
-
- for (i = 0; i < array.length; i++) {
-
- v = array[i];
-
- if (!isNaN(v)) {
- t += v;
- t2 += v * v;
- n++;
- }
- }
- return n > 0 ? {mean: t / n, stdev: Math.sqrt(t2 - t * t / n)} : {mean: 0, stdev: 0};
- },
-
- median: function (numbers) {
- // median of [3, 5, 4, 4, 1, 1, 2, 3] = 3
- var median = 0, numsLen = numbers.length;
- numbers.sort();
-
- if (
- numsLen % 2 === 0 // is even
- ) {
- // average of two middle numbers
- median = (numbers[numsLen / 2 - 1] + numbers[numsLen / 2]) / 2;
- } else { // is odd
- // middle number only
- median = numbers[(numsLen - 1) / 2];
- }
-
- return median;
- },
-
- // Fast percentile function for "p" near edges. This needs profiled for p in middle (e.g. median)
- percentile: function (array, p) {
-
- if (array.length === 0) return undefined;
-
- var k = Math.floor(array.length * ((100 - p) / 100));
- if (k === 0) {
- array.sort(function (a, b) {
- return b - a
- });
- return array[k];
- } else {
- return selectElement$1(array, k);
- }
-
- },
-
-
- clamp: function (value, min, max) {
- return Math.min(Math.max(value, min), max);
- },
-
- log2: function (x) {
- return Math.log(x) / Math.LN2;
- }
-
-};
-
-function selectElement$1(array, k) {
-
- // Credit Steve Hanov http://stevehanov.ca/blog/index.php?id=122
- var heap = new BinaryHeap$1(),
- i;
-
- for (i = 0; i < array.length; i++) {
-
- var item = array[i];
-
- // If we have not yet found k items, or the current item is larger than
- // the smallest item on the heap, add current item
- if (heap.content.length < k || item > heap.content[0]) {
- // If the heap is full, remove the smallest element on the heap.
- if (heap.content.length === k) {
- heap.pop();
- }
- heap.push(item);
- }
- }
-
- return heap.content[0];
-}
-
-
-function BinaryHeap$1() {
- this.content = [];
-}
-
-BinaryHeap$1.prototype = {
- push: function (element) {
- // Add the new element to the end of the array.
- this.content.push(element);
- // Allow it to bubble up.
- this.bubbleUp(this.content.length - 1);
- },
-
- pop: function () {
- // Store the first element so we can return it later.
- var result = this.content[0];
- // Get the element at the end of the array.
- var end = this.content.pop();
- // If there are any elements left, put the end element at the
- // start, and let it sink down.
- if (this.content.length > 0) {
- this.content[0] = end;
- this.sinkDown(0);
- }
- return result;
- },
-
- remove: function (node) {
- var length = this.content.length;
- // To remove a value, we must search through the array to find
- // it.
- for (var i = 0; i < length; i++) {
- if (this.content[i] !== node) continue;
- // When it is found, the process seen in 'pop' is repeated
- // to fill up the hole.
- var end = this.content.pop();
- // If the element we popped was the one we needed to remove,
- // we're done.
- if (i === length - 1) break;
- // Otherwise, we replace the removed element with the popped
- // one, and allow it to float up or sink down as appropriate.
- this.content[i] = end;
- this.bubbleUp(i);
- this.sinkDown(i);
- break;
- }
- },
-
- size: function () {
- return this.content.length;
- },
-
- bubbleUp: function (n) {
- // Fetch the element that has to be moved.
- var element = this.content[n], score = element;
- // When at 0, an element can not go up any further.
- while (n > 0) {
- // Compute the parent element's index, and fetch it.
- var parentN = Math.floor((n + 1) / 2) - 1,
- parent = this.content[parentN];
- // If the parent has a lesser score, things are in order and we
- // are done.
- if (score >= parent)
- break;
-
- // Otherwise, swap the parent with the current element and
- // continue.
- this.content[parentN] = element;
- this.content[n] = parent;
- n = parentN;
- }
- },
-
- sinkDown: function (n) {
- // Look up the target element and its score.
- var length = this.content.length,
- element = this.content[n],
- elemScore = element;
-
- while (true) {
- // Compute the indices of the child elements.
- var child2N = (n + 1) * 2, child1N = child2N - 1;
- // This is used to store the new position of the element,
- // if any.
- var swap = null;
- // If the first child exists (is inside the array)...
- if (child1N < length) {
- // Look it up and compute its score.
- var child1 = this.content[child1N],
- child1Score = child1;
- // If the score is less than our element's, we need to swap.
- if (child1Score < elemScore)
- swap = child1N;
- }
- // Do the same checks for the other child.
- if (child2N < length) {
- var child2 = this.content[child2N],
- child2Score = child2;
- if (child2Score < (swap == null ? elemScore : child1Score))
- swap = child2N;
- }
-
- // No need to swap further, we are done.
- if (swap == null) break;
-
- // Otherwise, swap and continue.
- this.content[n] = this.content[swap];
- this.content[swap] = element;
- n = swap;
- }
- }
-};
-
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2014 Broad Institute
- *
- * 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.
- */
-
-function _random$1(min, max) {
- return Math.random() * (max - min) + min;
-}
-
-const IGVColor$1 = {
-
- rgbListFromHSV: () => {
-
- let s = 1;
- let accumulation = [];
- for (let v = 1; v >= 0.5; v -= .1) {
- for (let h = 0; h < 1; h += 1 / 28) {
- const r = "rgb(" + IGVColor$1.hsvToRgb(h, s, v).join(",") + ")";
- accumulation.push(r);
- }
- }
-
- // add black
- accumulation.pop();
- accumulation.push(IGVColor$1.rgbColor(16, 16, 16));
-
- return accumulation;
- },
-
- rgbToHex: function (rgb) {
- rgb = rgb.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i);
- return (rgb && rgb.length === 4) ? "#" +
- ("0" + parseInt(rgb[1], 10).toString(16)).slice(-2) +
- ("0" + parseInt(rgb[2], 10).toString(16)).slice(-2) +
- ("0" + parseInt(rgb[3], 10).toString(16)).slice(-2) : '';
- },
-
- hexToRgb: function (hex) {
-
- var cooked = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
-
- if (null === cooked) {
- return undefined;
- }
-
- return "rgb(" + parseInt(cooked[1], 16) + "," + parseInt(cooked[2], 16) + "," + parseInt(cooked[3], 16) + ")";
- },
-
- /**
- * Converts an HSV color value to RGB. Conversion formula
- * adapted from http://en.wikipedia.org/wiki/HSV_color_space.
- * Assumes h, s, and v are contained in the set [0, 1] and
- * returns r, g, and b in the set [0, 255].
- *
- * Credit: https://gist.githubusercontent.com/mjackson/5311256
- *
- * @param h The hue
- * @param s The saturation
- * @param v The value
- * @return Array The RGB representation
- */
- hsvToRgb: function (h, s, v) {
- var r, g, b;
-
- var i = Math.floor(h * 6);
- var f = h * 6 - i;
- var p = v * (1 - s);
- var q = v * (1 - f * s);
- var t = v * (1 - (1 - f) * s);
-
- switch (i % 6) {
- case 0:
- r = v, g = t, b = p;
- break;
- case 1:
- r = q, g = v, b = p;
- break;
- case 2:
- r = p, g = v, b = t;
- break;
- case 3:
- r = p, g = q, b = v;
- break;
- case 4:
- r = t, g = p, b = v;
- break;
- case 5:
- r = v, g = p, b = q;
- break;
- }
-
- return [Math.floor(r * 255), Math.floor(g * 255), Math.floor(b * 255)];
- },
-
- /**
- * Converts an HSL color value to RGB. Conversion formula
- * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
- * Assumes h, s, and l are contained in the set [0, 1] and
- * returns r, g, and b in the set [0, 255].
- *
- * Credit: https://gist.githubusercontent.com/mjackson/5311256
- *
- * @param h The hue
- * @param s The saturation
- * @param l The lightness
- * @return Array The RGB representation
- */
- hslToRgb: function (h, s, l) {
- var r, g, b;
-
- if (s === 0) {
- r = g = b = l; // achromatic
- } else {
-
-
- var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
- var p = 2 * l - q;
-
- r = IGVColor$1.hue2rgb(p, q, h + 1 / 3);
- g = IGVColor$1.hue2rgb(p, q, h);
- b = IGVColor$1.hue2rgb(p, q, h - 1 / 3);
- }
-
- return [r * 255, g * 255, b * 255];
- },
-
- hue2rgb: (p, q, t) => {
- if (t < 0) t += 1;
- if (t > 1) t -= 1;
- if (t < 1 / 6) return p + (q - p) * 6 * t;
- if (t < 1 / 2) return q;
- if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
- return p;
- },
-
- rgbaColor: function (r, g, b, a) {
-
- r = IGVMath$1.clamp(r, 0, 255);
- g = IGVMath$1.clamp(g, 0, 255);
- b = IGVMath$1.clamp(b, 0, 255);
- a = IGVMath$1.clamp(a, 0.0, 1.0);
-
- return "rgba(" + r + "," + g + "," + b + "," + a + ")";
- },
-
- rgbColor: function (r, g, b) {
-
- r = IGVMath$1.clamp(r, 0, 255);
- g = IGVMath$1.clamp(g, 0, 255);
- b = IGVMath$1.clamp(b, 0, 255);
-
- return "rgb(" + r + "," + g + "," + b + ")";
- },
-
- greyScale: function (value) {
-
- var grey = IGVMath$1.clamp(value, 0, 255);
-
- return "rgb(" + grey + "," + grey + "," + grey + ")";
- },
-
- randomGrey: function (min, max) {
-
- min = IGVMath$1.clamp(min, 0, 255);
- max = IGVMath$1.clamp(max, 0, 255);
-
- var g = Math.round(_random$1(min, max)).toString(10);
-
- return "rgb(" + g + "," + g + "," + g + ")";
- },
-
- randomRGB: function (min, max) {
-
- min = IGVMath$1.clamp(min, 0, 255);
- max = IGVMath$1.clamp(max, 0, 255);
-
- var r = Math.round(_random$1(min, max)).toString(10);
- var g = Math.round(_random$1(min, max)).toString(10);
- var b = Math.round(_random$1(min, max)).toString(10);
-
- return "rgb(" + r + "," + g + "," + b + ")";
- },
-
- randomRGBConstantAlpha: function (min, max, alpha) {
-
- min = IGVMath$1.clamp(min, 0, 255);
- max = IGVMath$1.clamp(max, 0, 255);
-
- var r = Math.round(_random$1(min, max)).toString(10);
- var g = Math.round(_random$1(min, max)).toString(10);
- var b = Math.round(_random$1(min, max)).toString(10);
-
- return "rgba(" + r + "," + g + "," + b + "," + alpha + ")";
- },
-
- addAlpha: function (color, alpha) {
-
- if(color === "0" || color === ".") {
- color = "rgb(0,0,0)";
- } else {
- const c = this.colorNameToHex(color);
- if (c) {
- color = c;
- }
- }
-
- var isHex = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(color);
-
- if (color.startsWith("rgba")) {
- const idx = color.lastIndexOf(",");
- return color.substring(0, idx+1) + alpha.toString() + ")";
- }
-
- if (isHex) {
- color = IGVColor$1.hexToRgb(color);
- }
-
- if (color.startsWith("rgb")) {
- return color.replace("rgb", "rgba").replace(")", ", " + alpha + ")");
- } else {
- console.log(color + " is not an rgb style string");
- return color;
- }
- },
-
- rgbComponents: function (color) {
-
- if(color === "0" || color === ".") {
- return [0,0,0];
- }
- const isHex = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(color);
- if (isHex) {
- color = IGVColor$1.hexToRgb(color);
- } else {
- if(!color.startsWith("rgb")) {
- const hex = this.colorNameToHex(color);
- color = this.hexToRgb(hex);
- }
- }
-
- if (color.startsWith("rgb(")) {
- return color.substring(4, color.length-1).split(",").map(s => Number.parseInt(s.trim()));
- } else if (color.startsWith("rgba(")) {
- return color.substring(5, color.length-1).split(",").map((s, i) => {
- s = s.trim();
- return i === 3 ? Number.parseFloat(s) : Number.parseInt(s)
- });
- }
- else {
- throw Error("Unrecognized color string: color");
- }
- },
-
- /**
- *
- * @param dest RGB components as an array
- * @param src RGB components as an array
- * @param alpha alpha transparancy in the range 0-1
- * @returns {}
- */
- getCompositeColor: function (dest, src, alpha) {
-
- var r = Math.floor(alpha * src[0] + (1 - alpha) * dest[0]),
- g = Math.floor(alpha * src[1] + (1 - alpha) * dest[1]),
- b = Math.floor(alpha * src[2] + (1 - alpha) * dest[2]);
-
- return "rgb(" + r + "," + g + "," + b + ")";
-
- },
-
-
- createColorString: function (str) {
- // Excel will quote color strings, strip all quotes
- str = stripQuotes$2(str);
-
- if (str.includes(",")) {
- return str.startsWith("rgb") ? str : "rgb(" + str + ")";
- } else {
- return str;
- }
- },
-
- darkenLighten: function (color, amt) {
-
- let src;
- let hexColor = this.colorNameToHex(color);
- if(hexColor) {
- src = IGVColor$1.hexToRgb(hexColor);
- } else {
- src = color.startsWith('rgb(') ? color : IGVColor$1.hexToRgb(color);
- }
-
- const components = src.replace(")", "").substring(4).split(",");
-
- const r = Math.max(0, Math.min(255, Number.parseInt(components[0].trim()) + amt));
- const g = Math.max(0, Math.min(255, Number.parseInt(components[1].trim()) + amt));
- const b = Math.max(0, Math.min(255, Number.parseInt(components[2].trim()) + amt));
-
- return 'rgb(' + r.toString() + ',' + g.toString() + ',' + b.toString() + ')';
-
- },
-
- /**
- * Convert html/css color name to hex value. Adapted from https://gist.github.com/mxfh/4719348
- * @param colorName
- * @returns {*}
- */
- colorNameToHex: function (colorName) { // color list from http://stackoverflow.com/q/1573053/731179 with added gray/gray
- const definedColorNames = {
- "aliceblue": "#f0f8ff",
- "antiquewhite": "#faebd7",
- "aqua": "#00ffff",
- "aquamarine": "#7fffd4",
- "azure": "#f0ffff",
- "beige": "#f5f5dc",
- "bisque": "#ffe4c4",
- "black": "#000000",
- "blanchedalmond": "#ffebcd",
- "blue": "#0000ff",
- "blueviolet": "#8a2be2",
- "brown": "#a52a2a",
- "burlywood": "#deb887",
- "cadetblue": "#5f9ea0",
- "chartreuse": "#7fff00",
- "chocolate": "#d2691e",
- "coral": "#ff7f50",
- "cornflowerblue": "#6495ed",
- "cornsilk": "#fff8dc",
- "crimson": "#dc143c",
- "cyan": "#00ffff",
- "darkblue": "#00008b",
- "darkcyan": "#008b8b",
- "darkgoldenrod": "#b8860b",
- "darkgray": "#a9a9a9",
- "darkgreen": "#006400",
- "darkkhaki": "#bdb76b",
- "darkmagenta": "#8b008b",
- "darkolivegreen": "#556b2f",
- "darkorange": "#ff8c00",
- "darkorchid": "#9932cc",
- "darkred": "#8b0000",
- "darksalmon": "#e9967a",
- "darkseagreen": "#8fbc8f",
- "darkslateblue": "#483d8b",
- "darkslategray": "#2f4f4f",
- "darkturquoise": "#00ced1",
- "darkviolet": "#9400d3",
- "deeppink": "#ff1493",
- "deepskyblue": "#00bfff",
- "dimgray": "#696969",
- "dodgerblue": "#1e90ff",
- "firebrick": "#b22222",
- "floralwhite": "#fffaf0",
- "forestgreen": "#228b22",
- "fuchsia": "#ff00ff",
- "gainsboro": "#dcdcdc",
- "ghostwhite": "#f8f8ff",
- "gold": "#ffd700",
- "goldenrod": "#daa520",
- "gray": "#808080",
- "green": "#008000",
- "greenyellow": "#adff2f",
- "honeydew": "#f0fff0",
- "hotpink": "#ff69b4",
- "indianred ": "#cd5c5c",
- "indigo ": "#4b0082",
- "ivory": "#fffff0",
- "khaki": "#f0e68c",
- "lavender": "#e6e6fa",
- "lavenderblush": "#fff0f5",
- "lawngreen": "#7cfc00",
- "lemonchiffon": "#fffacd",
- "lightblue": "#add8e6",
- "lightcoral": "#f08080",
- "lightcyan": "#e0ffff",
- "lightgoldenrodyellow": "#fafad2",
- "lightgrey": "#d3d3d3",
- "lightgreen": "#90ee90",
- "lightpink": "#ffb6c1",
- "lightsalmon": "#ffa07a",
- "lightseagreen": "#20b2aa",
- "lightskyblue": "#87cefa",
- "lightslategray": "#778899",
- "lightsteelblue": "#b0c4de",
- "lightyellow": "#ffffe0",
- "lime": "#00ff00",
- "limegreen": "#32cd32",
- "linen": "#faf0e6",
- "magenta": "#ff00ff",
- "maroon": "#800000",
- "mediumaquamarine": "#66cdaa",
- "mediumblue": "#0000cd",
- "mediumorchid": "#ba55d3",
- "mediumpurple": "#9370d8",
- "mediumseagreen": "#3cb371",
- "mediumslateblue": "#7b68ee",
- "mediumspringgreen": "#00fa9a",
- "mediumturquoise": "#48d1cc",
- "mediumvioletred": "#c71585",
- "midnightblue": "#191970",
- "mintcream": "#f5fffa",
- "mistyrose": "#ffe4e1",
- "moccasin": "#ffe4b5",
- "navajowhite": "#ffdead",
- "navy": "#000080",
- "oldlace": "#fdf5e6",
- "olive": "#808000",
- "olivedrab": "#6b8e23",
- "orange": "#ffa500",
- "orangered": "#ff4500",
- "orchid": "#da70d6",
- "palegoldenrod": "#eee8aa",
- "palegreen": "#98fb98",
- "paleturquoise": "#afeeee",
- "palevioletred": "#d87093",
- "papayawhip": "#ffefd5",
- "peachpuff": "#ffdab9",
- "peru": "#cd853f",
- "pink": "#ffc0cb",
- "plum": "#dda0dd",
- "powderblue": "#b0e0e6",
- "purple": "#800080",
- "red": "#ff0000",
- "rosybrown": "#bc8f8f",
- "royalblue": "#4169e1",
- "saddlebrown": "#8b4513",
- "salmon": "#fa8072",
- "sandybrown": "#f4a460",
- "seagreen": "#2e8b57",
- "seashell": "#fff5ee",
- "sienna": "#a0522d",
- "silver": "#c0c0c0",
- "skyblue": "#87ceeb",
- "slateblue": "#6a5acd",
- "slategray": "#708090",
- "snow": "#fffafa",
- "springgreen": "#00ff7f",
- "steelblue": "#4682b4",
- "tan": "#d2b48c",
- "teal": "#008080",
- "thistle": "#d8bfd8",
- "tomato": "#ff6347",
- "turquoise": "#40e0d0",
- "violet": "#ee82ee",
- "wheat": "#f5deb3",
- "white": "#ffffff",
- "whitesmoke": "#f5f5f5",
- "yellow": "#ffff00",
- "yellowgreen": "#9acd32",
- "darkgrey": "#a9a9a9",
- "darkslategrey": "#2f4f4f",
- "dimgrey": "#696969",
- "grey": "#808080",
- "lightgray": "#d3d3d3",
- "lightslategrey": "#778899",
- "slategrey": "#708090"
- };
- return definedColorNames[colorName];
- }
-};
-
-// Support for oauth token based authorization
-// This class supports explicit setting of an oauth token either globally or for specific hosts.
-//
-// The variable oauth.google.access_token, which becomes igv.oauth.google.access_token on ES5 conversion is
-// supported for backward compatibility
-
-const DEFAULT_HOST$1 = "googleapis";
-
-class Oauth$1 {
-
- constructor() {
- this.oauthTokens = {};
- }
-
-
- setToken(token, host) {
- host = host || DEFAULT_HOST$1;
- this.oauthTokens[host] = token;
- }
-
- getToken(host) {
- host = host || DEFAULT_HOST$1;
- let token;
- for (let key of Object.keys(this.oauthTokens)) {
- const regex = wildcardToRegExp$1(key);
- if (regex.test(host)) {
- token = this.oauthTokens[key];
- break
- }
- }
- return token
- }
-
- removeToken(host) {
- host = host || DEFAULT_HOST$1;
- for (let key of Object.keys(this.oauthTokens)) {
- const regex = wildcardToRegExp$1(key);
- if (regex.test(host)) {
- this.oauthTokens[key] = undefined;
- }
- }
- }
-
- // Special object for google -- legacy support
- // google: {
- // setToken: function (token) {
- // oauth.setToken(token);
- // }
- // }
-}
-
-
-/**
- * Creates a RegExp from the given string, converting asterisks to .* expressions,
- * and escaping all other characters.
- *
- * credit https://gist.github.com/donmccurdy/6d073ce2c6f3951312dfa45da14a420f
- */
-function wildcardToRegExp$1(s) {
- return new RegExp('^' + s.split(/\*+/).map(regExpEscape$1).join('.*') + '$')
-}
-
-/**
- * RegExp-escapes all characters in the given string.
- *
- * credit https://gist.github.com/donmccurdy/6d073ce2c6f3951312dfa45da14a420f
- */
-function regExpEscape$1(s) {
- return s.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&')
-}
-
-function isGoogleURL$2(url) {
- return (url.includes("googleapis") && !url.includes("urlshortener")) ||
- isGoogleStorageURL$2(url) ||
- isGoogleDriveURL$2(url)
-}
-
-function isGoogleStorageURL$2(url) {
- return url.startsWith("gs://") ||
- url.startsWith("https://www.googleapis.com/storage") ||
- url.startsWith("https://storage.cloud.google.com") ||
- url.startsWith("https://storage.googleapis.com");
-}
-
-function isGoogleDriveURL$2(url) {
- return url.indexOf("drive.google.com") >= 0 || url.indexOf("www.googleapis.com/drive") > 0
-}
-
-/**
- * Translate gs:// urls to https
- * See https://cloud.google.com/storage/docs/json_api/v1
- * @param gsUrl
- * @returns {string|*}
- */
-function translateGoogleCloudURL$1(gsUrl) {
-
- let {bucket, object} = parseBucketName$1(gsUrl);
- object = encode$1(object);
-
- const qIdx = gsUrl.indexOf('?');
- const paramString = (qIdx > 0) ? gsUrl.substring(qIdx) + "&alt=media" : "?alt=media";
-
- return `https://storage.googleapis.com/storage/v1/b/${bucket}/o/${object}${paramString}`
-}
-
-/**
- * Parse a google bucket and object name from a google storage URL. Known forms include
- *
- * gs://BUCKET_NAME/OBJECT_NAME
- * https://storage.googleapis.com/BUCKET_NAME/OBJECT_NAME
- * https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/o/OBJECT_NAME
- * https://www.googleapis.com/storage/v1/b/BUCKET_NAME/o/OBJECT_NAME"
- * https://storage.googleapis.com/download/storage/v1/b/BUCKET_NAME/o/OBJECT_NAME
- *
- * @param url
- */
-function parseBucketName$1(url) {
-
- let bucket;
- let object;
-
- if (url.startsWith("gs://")) {
- const i = url.indexOf('/', 5);
- if (i >= 0) {
- bucket = url.substring(5, i);
- const qIdx = url.indexOf('?');
- object = (qIdx < 0) ? url.substring(i + 1) : url.substring(i + 1, qIdx);
- }
-
- } else if (url.startsWith("https://storage.googleapis.com") || url.startsWith("https://storage.cloud.google.com")) {
- const bucketIdx = url.indexOf("/v1/b/", 8);
- if (bucketIdx > 0) {
- const objIdx = url.indexOf("/o/", bucketIdx);
- if (objIdx > 0) {
- const queryIdx = url.indexOf("?", objIdx);
- bucket = url.substring(bucketIdx + 6, objIdx);
- object = queryIdx > 0 ? url.substring(objIdx + 3, queryIdx) : url.substring(objIdx + 3);
- }
-
- } else {
- const idx1 = url.indexOf("/", 8);
- const idx2 = url.indexOf("/", idx1+1);
- const idx3 = url.indexOf("?", idx2);
- if (idx2 > 0) {
- bucket = url.substring(idx1+1, idx2);
- object = idx3 < 0 ? url.substring(idx2+1) : url.substring(idx2+1, idx3);
- }
- }
-
- } else if (url.startsWith("https://www.googleapis.com/storage/v1/b")) {
- const bucketIdx = url.indexOf("/v1/b/", 8);
- const objIdx = url.indexOf("/o/", bucketIdx);
- if (objIdx > 0) {
- const queryIdx = url.indexOf("?", objIdx);
- bucket = url.substring(bucketIdx + 6, objIdx);
- object = queryIdx > 0 ? url.substring(objIdx + 3, queryIdx) : url.substring(objIdx + 3);
- }
- }
-
- if (bucket && object) {
- return {
- bucket, object
- }
- } else {
- throw Error(`Unrecognized Google Storage URI: ${url}`)
- }
-
-}
-
-/**
- * Percent a GCS object name. See https://cloud.google.com/storage/docs/request-endpoints
- * Specific characters to encode:
- * !, #, $, &, ', (, ), *, +, ,, /, :, ;, =, ?, @, [, ], and space characters.
- * @param obj
- */
-
-function encode$1(objectName) {
-
- let result = '';
- objectName.split('').forEach(function(letter) {
- if(encodings$3.has(letter)) {
- result += encodings$3.get(letter);
- } else {
- result += letter;
- }
- });
- return result;
-}
-
-// %23 %24 %25 %26 %27 %28 %29 %2A %2B %2C %2F %3A %3B %3D %3F %40 %5B %5D
-const encodings$3 = new Map();
-encodings$3.set("!", "%21");
-encodings$3.set("#", "%23");
-encodings$3.set("$", "%24");
-encodings$3.set("%", "%25");
-encodings$3.set("&", "%26");
-encodings$3.set("'", "%27");
-encodings$3.set("(", "%28");
-encodings$3.set(")", "%29");
-encodings$3.set("*", "%2A");
-encodings$3.set("+", "%2B");
-encodings$3.set(",", "%2C");
-encodings$3.set("/", "%2F");
-encodings$3.set(":", "%3A");
-encodings$3.set(";", "%3B");
-encodings$3.set("=", "%3D");
-encodings$3.set("?", "%3F");
-encodings$3.set("@", "%40");
-encodings$3.set("[", "%5B");
-encodings$3.set("]", "%5D");
-encodings$3.set(" ", "%20");
-
-// Convenience functions for the gapi oAuth library.
-
-function isInitialized$1() {
- return window.google && window.google.igv
-}
-
-/**
- * Return the current access token if the user is signed in, or undefined otherwise. This function does not
- * attempt a signIn or request any specfic scopes.
- *
- * @returns access_token || undefined
- */
-function getCurrentAccessToken$1() {
- return (isInitialized$1() && google.igv.tokenResponse && Date.now() < google.igv.tokenExpiresAt) ?
- google.igv.tokenResponse.access_token :
- undefined
-}
-
-
-/**
- * Return a promise for an access token for the given scope. If the user hasn't authorized the scope request it
- *
- * @param scope
- * @returns {Promise}
- */
-async function getAccessToken$1(scope) {
-
- if (!isInitialized$1()) {
- throw Error("Google oAuth has not been initialized")
- }
-
- if (google.igv.tokenResponse &&
- Date.now() < google.igv.tokenExpiresAt &&
- google.accounts.oauth2.hasGrantedAllScopes(google.igv.tokenResponse, scope)) {
- return google.igv.tokenResponse.access_token
- } else {
- const tokenClient = google.igv.tokenClient;
- return new Promise((resolve, reject) => {
- try {
- // Settle this promise in the response callback for requestAccessToken()
- tokenClient.callback = (tokenResponse) => {
- if (tokenResponse.error !== undefined) {
- reject(tokenResponse);
- }
- google.igv.tokenResponse = tokenResponse;
- google.igv.tokenExpiresAt = Date.now() + tokenResponse.expires_in * 1000;
- resolve(tokenResponse.access_token);
- };
- tokenClient.requestAccessToken({scope});
- } catch (err) {
- console.log(err);
- }
- })
- }
-}
-
-// gapi.auth2.getAuthInstance().isSignedIn.listen(status => {
-// const user = gapi.auth2.getAuthInstance().currentUser.get()
-// queryGoogleAuthenticationStatus(user, status)
-// })
-
-function getScopeForURL$1(url) {
- if (isGoogleDriveURL$2(url)) {
- return "https://www.googleapis.com/auth/drive.readonly"
- } else if (isGoogleStorageURL$2(url)) {
- return "https://www.googleapis.com/auth/devstorage.read_only"
- } else {
- return 'https://www.googleapis.com/auth/userinfo.profile'
- }
-}
-
-function getDriveDownloadURL$2(link) {
- // Return a google drive download url for the sharable link
- //https://drive.google.com/open?id=0B-lleX9c2pZFbDJ4VVRxakJzVGM
- //https://drive.google.com/file/d/1_FC4kCeO8E3V4dJ1yIW7A0sn1yURKIX-/view?usp=sharing
- var id = getGoogleDriveFileID$2(link);
- return id ? "https://www.googleapis.com/drive/v3/files/" + id + "?alt=media&supportsTeamDrives=true" : link;
-}
-
-function getGoogleDriveFileID$2(link) {
-
- //https://drive.google.com/file/d/1_FC4kCeO8E3V4dJ1yIW7A0sn1yURKIX-/view?usp=sharing
- //https://www.googleapis.com/drive/v3/files/1w-tvo6p1SH4p1OaQSVxpkV_EJgGIstWF?alt=media&supportsTeamDrives=true"
-
- if (link.includes("/open?id=")) {
- const i1 = link.indexOf("/open?id=") + 9;
- const i2 = link.indexOf("&");
- if (i1 > 0 && i2 > i1) {
- return link.substring(i1, i2)
- } else if (i1 > 0) {
- return link.substring(i1);
- }
-
- } else if (link.includes("/file/d/")) {
- const i1 = link.indexOf("/file/d/") + 8;
- const i2 = link.lastIndexOf("/");
- return link.substring(i1, i2);
-
- } else if (link.startsWith("https://www.googleapis.com/drive")) {
- let i1 = link.indexOf("/files/");
- const i2 = link.indexOf("?");
- if (i1 > 0) {
- i1 += 7;
- return i2 > 0 ?
- link.substring(i1, i2) :
- link.substring(i1)
- }
- }
-
- throw Error("Unknown Google Drive url format: " + link);
-
-
-}
-
-// The MIT License (MIT)
-
-/**
- * @constructor
- * @param {Object} options A set op options to pass to the throttle function
- * @param {number} requestsPerSecond The amount of requests per second
- * the library will limit to
- */
-class Throttle$1 {
- constructor(options) {
- this.requestsPerSecond = options.requestsPerSecond || 10;
- this.lastStartTime = 0;
- this.queued = [];
- }
-
- /**
- * Adds a promise
- * @param {Function} async function to be executed
- * @param {Object} options A set of options.
- * @return {Promise} A promise
- */
- add(asyncFunction, options) {
-
- var self = this;
- return new Promise(function (resolve, reject) {
- self.queued.push({
- resolve: resolve,
- reject: reject,
- asyncFunction: asyncFunction,
- });
- self.dequeue();
- });
- }
-
- /**
- * Adds all the promises passed as parameters
- * @param {Function} promises An array of functions that return a promise
- * @param {Object} options A set of options.
- * @param {number} options.signal An AbortSignal object that can be used to abort the returned promise
- * @param {number} options.weight A "weight" of each operation resolving by array of promises
- * @return {Promise} A promise that succeeds when all the promises passed as options do
- */
- addAll(promises, options) {
- var addedPromises = promises.map(function (promise) {
- return this.add(promise, options);
- }.bind(this));
-
- return Promise.all(addedPromises);
- };
-
- /**
- * Dequeues a promise
- * @return {void}
- */
- dequeue() {
- if (this.queued.length > 0) {
- var now = new Date(),
- inc = (1000 / this.requestsPerSecond) + 1,
- elapsed = now - this.lastStartTime;
-
- if (elapsed >= inc) {
- this._execute();
- } else {
- // we have reached the limit, schedule a dequeue operation
- setTimeout(function () {
- this.dequeue();
- }.bind(this), inc - elapsed);
- }
- }
- }
-
- /**
- * Executes the promise
- * @private
- * @return {void}
- */
- async _execute() {
- this.lastStartTime = new Date();
- var candidate = this.queued.shift();
- const f = candidate.asyncFunction;
- try {
- const r = await f();
- candidate.resolve(r);
- } catch (e) {
- candidate.reject(e);
- }
-
- }
-
-
-}
-
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2014 Broad Institute
- *
- * 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.
- */
-
-class IGVXhr$1 {
-
- constructor() {
- this.apiKey = undefined;
- this.googleThrottle = new Throttle$1({
- requestsPerSecond: 8
- });
- this.RANGE_WARNING_GIVEN = false;
- this.oauth = new Oauth$1();
- this.contentLengthMap = new Map();
- }
-
- setApiKey(key) {
- this.apiKey = key;
- }
-
- async loadArrayBuffer(url, options) {
- options = options || {};
- if (!options.responseType) {
- options.responseType = "arraybuffer";
- }
- if (isFile$2(url)) {
- return this._loadFileSlice(url, options)
- } else {
- return this.load(url, options)
- }
- }
-
- async loadJson(url, options) {
- options = options || {};
- const method = options.method || (options.sendData ? "POST" : "GET");
- if (method === "POST") {
- options.contentType = "application/json";
- }
- const result = await this.loadString(url, options);
- if (result) {
- return JSON.parse(result)
- } else {
- return result
- }
- }
-
- async loadString(path, options) {
- options = options || {};
- if (path instanceof File) {
- return this._loadStringFromFile(path, options)
- } else {
- return this._loadStringFromUrl(path, options)
- }
- }
-
- async load(url, options) {
-
- options = options || {};
- const urlType = typeof url;
-
- // Resolve functions, promises, and functions that return promises
- url = await (typeof url === 'function' ? url() : url);
-
- if (isFile$2(url)) {
- return this._loadFileSlice(url, options)
- } else if (typeof url.startsWith === 'function') { // Test for string
- if (url.startsWith("data:")) {
- const buffer = decodeDataURI$2(url).buffer;
- if (options.range) {
- const rangeEnd = options.range.size ? options.range.start + options.range.size : buffer.byteLength;
- return buffer.slice(options.range.start, rangeEnd)
- } else {
- return buffer
- }
- } else {
- if (url.startsWith("https://drive.google.com")) {
- url = getDriveDownloadURL$2(url);
- }
- if (isGoogleDriveURL$2(url) || url.startsWith("https://www.dropbox.com")) {
- return this.googleThrottle.add(async () => {
- return this._loadURL(url, options)
- })
- } else {
- return this._loadURL(url, options)
- }
- }
- } else {
- throw Error(`url must be either a 'File', 'string', 'function', or 'Promise'. Actual type: ${urlType}`)
- }
- }
-
- async getContentLength(url, options) {
- if (!this.contentLengthMap.has(url)) {
- options = options || {};
- options.method = 'HEAD';
- options.GET_CONTENT_LENGTH = true;
- const contentLengthString = await this._loadURL(url, options);
- const contentLength = contentLengthString ? Number.parseInt(contentLengthString) : -1;
- this.contentLengthMap.set(url, contentLength);
- }
- return this.contentLengthMap.get(url)
- }
-
- async _loadURL(url, options) {
-
- const self = this;
-
- //console.log(`${Date.now()} ${url}`)
- url = mapUrl$3(url);
-
- options = options || {};
-
- let oauthToken = options.oauthToken || this.getOauthToken(url);
- if (oauthToken) {
- oauthToken = await (typeof oauthToken === 'function' ? oauthToken() : oauthToken);
- }
-
- let contentLength = -1;
- if (options.range && !isAmazonV4Signed(url) && !isGoogleStorageSigned$1(url)) {
- contentLength = await this.getContentLength(url);
- }
-
- return new Promise(function (resolve, reject) {
-
- // Various Google tansformations
- if (isGoogleURL$2(url) && !isGoogleStorageSigned$1(url)) {
- if (isGoogleStorageURL$2(url)) {
- url = translateGoogleCloudURL$1(url);
- }
- url = addApiKey$1(url);
-
- if (isGoogleDriveURL$2(url)) {
- addTeamDrive$1(url);
- }
-
- // If we have an access token try it, but don't force a signIn or request for scopes yet
- if (!oauthToken) {
- oauthToken = getCurrentGoogleAccessToken$1();
- }
- }
-
- const headers = options.headers || {};
- if (oauthToken) {
- addOauthHeaders$1(headers, oauthToken);
- }
- const range = options.range;
-
-
- const xhr = new XMLHttpRequest();
- const sendData = options.sendData || options.body;
- const method = options.method || (sendData ? "POST" : "GET");
- const responseType = options.responseType;
- const contentType = options.contentType;
- const mimeType = options.mimeType;
-
- xhr.open(method, url);
-
- if (options.timeout) {
- xhr.timeout = options.timeout;
- }
-
- if (range) {
- let rangeEnd = "";
- if (range.size) {
- rangeEnd = range.start + range.size - 1;
- if (contentLength > 0) {
- rangeEnd = Math.min(rangeEnd, contentLength - 1);
- }
- }
- xhr.setRequestHeader("Range", "bytes=" + range.start + "-" + rangeEnd);
- // xhr.setRequestHeader("Cache-Control", "no-cache"); <= This can cause CORS issues, disabled for now
- }
- if (contentType) {
- xhr.setRequestHeader("Content-Type", contentType);
- }
- if (mimeType) {
- xhr.overrideMimeType(mimeType);
- }
- if (responseType) {
- xhr.responseType = responseType;
- }
- if (headers) {
- for (let key of Object.keys(headers)) {
- const value = headers[key];
- xhr.setRequestHeader(key, value);
- }
- }
-
- // NOTE: using withCredentials with servers that return "*" for access-allowed-origin will fail
- if (options.withCredentials === true) {
- xhr.withCredentials = true;
- }
-
- xhr.onload = async function (event) {
-
- if (options.GET_CONTENT_LENGTH) {
- resolve(xhr.getResponseHeader('content-length'));
- }
-
- // when the url points to a local file, the status is 0 but that is not an error
- if (xhr.status === 0 || (xhr.status >= 200 && xhr.status <= 300)) {
- if (range && xhr.status !== 206 && range.start !== 0) {
- // For small files a range starting at 0 can return the whole file => 200
- // Provide just the slice we asked for, throw out the rest quietly
- // If file is large warn user
- if (xhr.response.length > 100000 && !self.RANGE_WARNING_GIVEN) {
- alert(`Warning: Range header ignored for URL: ${url}. This can have severe performance impacts.`);
- }
- resolve(xhr.response.slice(range.start, range.start + range.size));
-
- } else {
- resolve(xhr.response);
- }
- } else if ((typeof gapi !== "undefined") &&
- ((xhr.status === 404 || xhr.status === 401 || xhr.status === 403) &&
- isGoogleURL$2(url)) &&
- !options.retries) {
- tryGoogleAuth();
-
- } else {
- if (xhr.status === 403) {
- handleError("Access forbidden: " + url);
- } else if (xhr.status === 416) {
- // Tried to read off the end of the file. This shouldn't happen, but if it does return an
- handleError("Unsatisfiable range");
- } else {
- handleError(xhr.status);
- }
- }
- };
-
-
- xhr.onerror = function (event) {
- if (isGoogleURL$2(url) && !options.retries) {
- tryGoogleAuth();
- } else {
- handleError("Error accessing resource: " + url + " Status: " + xhr.status);
- }
- };
-
- xhr.ontimeout = function (event) {
- handleError("Timed out");
- };
-
- xhr.onabort = function (event) {
- console.log("Aborted");
- reject(event);
- };
-
- try {
- xhr.send(sendData);
- } catch (e) {
- if (isGoogleURL$2(url) && !options.retries) {
- tryGoogleAuth();
- } else {
- handleError(e);
- }
- }
-
-
- function handleError(error) {
- if (reject) {
- reject(error);
- } else {
- throw error
- }
- }
-
- async function tryGoogleAuth() {
- try {
- const accessToken = await fetchGoogleAccessToken$1(url);
- options.retries = 1;
- options.oauthToken = accessToken;
- const response = await self.load(url, options);
- resolve(response);
- } catch (e) {
- if (e.error) {
- const msg = e.error.startsWith("popup_blocked") ?
- "Google login popup blocked by browser." :
- e.error;
- alert(msg);
- } else {
- handleError(e);
- }
- }
- }
- })
-
- }
-
- async _loadFileSlice(localfile, options) {
-
- let blob = (options && options.range) ?
- localfile.slice(options.range.start, options.range.start + options.range.size) :
- localfile;
-
- const arrayBuffer = await blob.arrayBuffer();
-
- if ("arraybuffer" === options.responseType) {
- return arrayBuffer
- } else {
- return arrayBufferToString$1(arrayBuffer)
- }
- }
-
- async _loadStringFromFile(localfile, options) {
-
- const blob = options.range ? localfile.slice(options.range.start, options.range.start + options.range.size) : localfile;
- const arrayBuffer = await blob.arrayBuffer();
- return arrayBufferToString$1(arrayBuffer)
- }
-
- async _loadStringFromUrl(url, options) {
-
- options = options || {};
- options.responseType = "arraybuffer";
- const data = await this.load(url, options);
- return arrayBufferToString$1(data)
- }
-
- /**
- * Explicity set an oAuth token for use with given host. If host is undefined token is used for google api access*
- * @param token
- * @param host
- */
- setOauthToken(token, host) {
- this.oauth.setToken(token, host);
- }
-
- /**
- * Return an oauth token for the URL if we have one. This method does not force sign-in, and the token may
- * or may not be valid. Sign-in is triggered on request failure.
- * *
- * @param url
- * @returns {*}
- */
- getOauthToken(url) {
-
- // Google is the default provider, don't try to parse host for google URLs
- const host = isGoogleURL$2(url) ?
- undefined :
- parseUri$1(url).host;
-
- // First check the explicit settings (i.e. token set through the API)
- let token = this.oauth.getToken(host);
- if (token) {
- return token
- } else if (host === undefined) {
- // Now try Google oauth tokens previously obtained. This will return undefined if google oauth is not
- // configured.
- const googleToken = getCurrentGoogleAccessToken$1();
- if (googleToken && googleToken.expires_at > Date.now()) {
- return googleToken.access_token
- }
- }
- }
-}
-
-function isGoogleStorageSigned$1(url) {
- return url.indexOf("X-Goog-Signature") > -1
-}
-
-
-/**
- * Return a Google oAuth token, triggering a sign in if required. This method should not be called until we know
- * a token is required, that is until we've tried the url and received a 401, 403, or 404.
- *
- * @param url
- * @returns the oauth token
- */
-async function fetchGoogleAccessToken$1(url) {
- if (isInitialized$1()) {
- const scope = getScopeForURL$1(url);
- const access_token = await getAccessToken$1(scope);
- return access_token
- } else {
- throw Error(
- `Authorization is required, but Google oAuth has not been initalized. Contact your site administrator for assistance.`)
- }
-}
-
-/**
- * Return the current google access token, if one exists. Do not triger signOn or request additional scopes.
- * @returns {undefined|access_token}
- */
-function getCurrentGoogleAccessToken$1() {
- if (isInitialized$1()) {
- const access_token = getCurrentAccessToken$1();
- return access_token
- } else {
- return undefined
- }
-}
-
-function addOauthHeaders$1(headers, acToken) {
- if (acToken) {
- headers["Cache-Control"] = "no-cache";
- headers["Authorization"] = "Bearer " + acToken;
- }
- return headers
-}
-
-
-function addApiKey$1(url) {
- let apiKey = igvxhr$1.apiKey;
- if (!apiKey && typeof gapi !== "undefined") {
- apiKey = gapi.apiKey;
- }
- if (apiKey !== undefined && !url.includes("key=")) {
- const paramSeparator = url.includes("?") ? "&" : "?";
- url = url + paramSeparator + "key=" + apiKey;
- }
- return url
-}
-
-function addTeamDrive$1(url) {
- if (url.includes("supportsTeamDrive")) {
- return url
- } else {
- const paramSeparator = url.includes("?") ? "&" : "?";
- url = url + paramSeparator + "supportsTeamDrive=true";
- }
-}
-
-/**
- * Perform some well-known url mappings.
- * @param url
- */
-function mapUrl$3(url) {
-
- if (url.startsWith("https://www.dropbox.com")) {
- return url.replace("//www.dropbox.com", "//dl.dropboxusercontent.com")
- } else if (url.startsWith("https://drive.google.com")) {
- return getDriveDownloadURL$2(url)
- } else if (url.includes("//www.broadinstitute.org/igvdata")) {
- return url.replace("//www.broadinstitute.org/igvdata", "//data.broadinstitute.org/igvdata")
- } else if (url.includes("//igvdata.broadinstitute.org")) {
- return url.replace("//igvdata.broadinstitute.org", "//s3.amazonaws.com/igv.broadinstitute.org")
- } else if (url.includes("//igv.genepattern.org")) {
- return url.replace("//igv.genepattern.org", "//igv-genepattern-org.s3.amazonaws.com")
- } else if (url.startsWith("ftp://ftp.ncbi.nlm.nih.gov/geo")) {
- return url.replace("ftp://", "https://")
- } else {
- return url
- }
-}
-
-
-function arrayBufferToString$1(arraybuffer) {
-
- let plain;
- if (isgzipped$1(arraybuffer)) {
- plain = ungzip_blocks$1(arraybuffer);
- } else {
- plain = new Uint8Array(arraybuffer);
- }
-
- if ('TextDecoder' in getGlobalObject$1()) {
- return new TextDecoder().decode(plain)
- } else {
- return decodeUTF8$1(plain)
- }
-}
-
-/**
- * Use when TextDecoder is not available (primarily IE).
- *
- * From: https://gist.github.com/Yaffle/5458286
- *
- * @param octets
- * @returns {string}
- */
-function decodeUTF8$1(octets) {
- var string = "";
- var i = 0;
- while (i < octets.length) {
- var octet = octets[i];
- var bytesNeeded = 0;
- var codePoint = 0;
- if (octet <= 0x7F) {
- bytesNeeded = 0;
- codePoint = octet & 0xFF;
- } else if (octet <= 0xDF) {
- bytesNeeded = 1;
- codePoint = octet & 0x1F;
- } else if (octet <= 0xEF) {
- bytesNeeded = 2;
- codePoint = octet & 0x0F;
- } else if (octet <= 0xF4) {
- bytesNeeded = 3;
- codePoint = octet & 0x07;
- }
- if (octets.length - i - bytesNeeded > 0) {
- var k = 0;
- while (k < bytesNeeded) {
- octet = octets[i + k + 1];
- codePoint = (codePoint << 6) | (octet & 0x3F);
- k += 1;
- }
- } else {
- codePoint = 0xFFFD;
- bytesNeeded = octets.length - i;
- }
- string += String.fromCodePoint(codePoint);
- i += bytesNeeded + 1;
- }
- return string
-}
-
-
-function getGlobalObject$1() {
- if (typeof self !== 'undefined') {
- return self
- }
- if (typeof global !== 'undefined') {
- return global
- } else {
- return window
- }
-}
-
-function isAmazonV4Signed(url) {
- return url.indexOf("X-Amz-Signature") > -1
-}
-
-
-const igvxhr$1 = new IGVXhr$1();
-
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2014 Broad Institute
- *
- * 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.
- */
-
-/** An implementation of an interval tree, following the explanation.
- * from CLR.
- *
- * Public interface:
- * Constructor IntervalTree
- * Insertion insert
- * Search findOverlapping
- */
-
-var BLACK$1 = 1;
-
-var NIL$1 = {};
-NIL$1.color = BLACK$1;
-NIL$1.parent = NIL$1;
-NIL$1.left = NIL$1;
-NIL$1.right = NIL$1;
-
-/*!
- * jQuery JavaScript Library v3.3.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector
- * https://jquery.com/
- *
- * Includes Sizzle.js
- * https://sizzlejs.com/
- *
- * Copyright JS Foundation and other contributors
- * Released under the MIT license
- * https://jquery.org/license
- *
- * Date: 2018-01-20T17:24Z
- */
-
-var arr = [];
-
-var document$1 = window.document;
-
-var getProto = Object.getPrototypeOf;
-
-var slice = arr.slice;
-
-var concat = arr.concat;
-
-var push = arr.push;
-
-var indexOf = arr.indexOf;
-
-var class2type = {};
-
-var toString$3 = class2type.toString;
-
-var hasOwn = class2type.hasOwnProperty;
-
-var fnToString = hasOwn.toString;
-
-var ObjectFunctionString = fnToString.call(Object);
-
-var support = {};
-
-var isFunction = function isFunction(obj) {
-
- // Support: Chrome <=57, Firefox <=52
- // In some browsers, typeof returns "function" for HTML