phyloio 2.1.0 → 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/Examples/Website/phyloio.html +73 -71
  2. package/Examples/Website/src_worker_bcn_js.phylo.js +8093 -0
  3. package/Examples/Website/src_worker_distance_js.phylo.js +6257 -0
  4. package/README.md +16 -2
  5. package/dist/phylo.js +7 -7
  6. package/dist/src_worker_bcn_js.phylo.js +2 -2
  7. package/dist/src_worker_distance_js.phylo.js +1 -1
  8. package/{src_phylo_compare → dist-jest}/phylo.js +68 -132
  9. package/{src_phylo_compare → dist-jest}/src_utils_js.phylo.js +1 -1
  10. package/dist-jest/src_worker_bcn_js.phylo.js +350 -0
  11. package/dist-jest/src_worker_distance_js.phylo.js +219 -0
  12. package/{src_phylo_compare/vendors-node_modules_biojs-io-newick_src_index_js-node_modules_minhashjs_index_js.phylo.js → dist-jest/vendors-node_modules_biojs-io-newick_src_index_js-node_modules_minhashjs_index_js-node_module-7b40e5.phylo.js} +25 -15
  13. package/package-lock.json +19607 -0
  14. package/package.json +1 -1
  15. package/rerooting.test.js +297 -0
  16. package/src/api.js +19 -9
  17. package/src/container.js +408 -64
  18. package/src/interface.css +6 -0
  19. package/src/interface.js +371 -207
  20. package/src/model.js +19 -20
  21. package/src/tmp +12 -0
  22. package/src/utils.js +31 -1
  23. package/src/viewer.js +177 -88
  24. package/src_phylo_compare/fonts/fa-brands-400.eot +0 -0
  25. package/src_phylo_compare/fonts/fa-brands-400.svg +0 -3717
  26. package/src_phylo_compare/fonts/fa-brands-400.ttf +0 -0
  27. package/src_phylo_compare/fonts/fa-brands-400.woff +0 -0
  28. package/src_phylo_compare/fonts/fa-brands-400.woff2 +0 -0
  29. package/src_phylo_compare/fonts/fa-regular-400.eot +0 -0
  30. package/src_phylo_compare/fonts/fa-regular-400.svg +0 -801
  31. package/src_phylo_compare/fonts/fa-regular-400.ttf +0 -0
  32. package/src_phylo_compare/fonts/fa-regular-400.woff +0 -0
  33. package/src_phylo_compare/fonts/fa-regular-400.woff2 +0 -0
  34. package/src_phylo_compare/fonts/fa-solid-900.eot +0 -0
  35. package/src_phylo_compare/fonts/fa-solid-900.svg +0 -5034
  36. package/src_phylo_compare/fonts/fa-solid-900.ttf +0 -0
  37. package/src_phylo_compare/fonts/fa-solid-900.woff +0 -0
  38. package/src_phylo_compare/fonts/fa-solid-900.woff2 +0 -0
  39. package/src_phylo_compare/fonts/fa-v4compatibility.ttf +0 -0
  40. package/src_phylo_compare/fonts/fa-v4compatibility.woff2 +0 -0
  41. package/src_phylo_compare/src_worker_bcn_js.phylo.js +0 -341
  42. package/src_phylo_compare/src_worker_distance_js.phylo.js +0 -227
  43. package/src_phylo_compare.zip +0 -0
  44. /package/{src_phylo_compare → dist-jest}/vendors-node_modules_d3_index_js-node_modules_file-saver_dist_FileSaver_min_js.phylo.js +0 -0
@@ -6,7 +6,6 @@
6
6
  * or disable the default devtool with "devtool: false".
7
7
  * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
8
8
  */
9
- var PhyloIO;
10
9
  /******/ (() => { // webpackBootstrap
11
10
  /******/ var __webpack_modules__ = ({
12
11
 
@@ -1229,17 +1228,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1229
1228
 
1230
1229
  /***/ }),
1231
1230
 
1232
- /***/ "./node_modules/css-loader/dist/cjs.js!./src/fontawesome-free-6.2.0-web/css/all.css":
1233
- /*!******************************************************************************************!*\
1234
- !*** ./node_modules/css-loader/dist/cjs.js!./src/fontawesome-free-6.2.0-web/css/all.css ***!
1235
- \******************************************************************************************/
1236
- /***/ ((module, __webpack_exports__, __webpack_require__) => {
1237
-
1238
- "use strict";
1239
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/getUrl.js */ \"./node_modules/css-loader/dist/runtime/getUrl.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _webfonts_fa_brands_400_woff2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../webfonts/fa-brands-400.woff2 */ \"./src/fontawesome-free-6.2.0-web/webfonts/fa-brands-400.woff2\");\n/* harmony import */ var _webfonts_fa_brands_400_ttf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../webfonts/fa-brands-400.ttf */ \"./src/fontawesome-free-6.2.0-web/webfonts/fa-brands-400.ttf\");\n/* harmony import */ var _webfonts_fa_regular_400_woff2__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../webfonts/fa-regular-400.woff2 */ \"./src/fontawesome-free-6.2.0-web/webfonts/fa-regular-400.woff2\");\n/* harmony import */ var _webfonts_fa_regular_400_ttf__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../webfonts/fa-regular-400.ttf */ \"./src/fontawesome-free-6.2.0-web/webfonts/fa-regular-400.ttf\");\n/* harmony import */ var _webfonts_fa_solid_900_woff2__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../webfonts/fa-solid-900.woff2 */ \"./src/fontawesome-free-6.2.0-web/webfonts/fa-solid-900.woff2\");\n/* harmony import */ var _webfonts_fa_solid_900_ttf__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../webfonts/fa-solid-900.ttf */ \"./src/fontawesome-free-6.2.0-web/webfonts/fa-solid-900.ttf\");\n/* harmony import */ var _webfonts_fa_v4compatibility_woff2__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../webfonts/fa-v4compatibility.woff2 */ \"./src/fontawesome-free-6.2.0-web/webfonts/fa-v4compatibility.woff2\");\n/* harmony import */ var _webfonts_fa_v4compatibility_ttf__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../webfonts/fa-v4compatibility.ttf */ \"./src/fontawesome-free-6.2.0-web/webfonts/fa-v4compatibility.ttf\");\n// Imports\n\n\n\n\n\n\n\n\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default()(function(i){return i[1]});\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_webfonts_fa_brands_400_woff2__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\nvar ___CSS_LOADER_URL_REPLACEMENT_1___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_webfonts_fa_brands_400_ttf__WEBPACK_IMPORTED_MODULE_3__[\"default\"]);\nvar ___CSS_LOADER_URL_REPLACEMENT_2___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_webfonts_fa_regular_400_woff2__WEBPACK_IMPORTED_MODULE_4__[\"default\"]);\nvar ___CSS_LOADER_URL_REPLACEMENT_3___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_webfonts_fa_regular_400_ttf__WEBPACK_IMPORTED_MODULE_5__[\"default\"]);\nvar ___CSS_LOADER_URL_REPLACEMENT_4___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_webfonts_fa_solid_900_woff2__WEBPACK_IMPORTED_MODULE_6__[\"default\"]);\nvar ___CSS_LOADER_URL_REPLACEMENT_5___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_webfonts_fa_solid_900_ttf__WEBPACK_IMPORTED_MODULE_7__[\"default\"]);\nvar ___CSS_LOADER_URL_REPLACEMENT_6___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_webfonts_fa_v4compatibility_woff2__WEBPACK_IMPORTED_MODULE_8__[\"default\"]);\nvar ___CSS_LOADER_URL_REPLACEMENT_7___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_webfonts_fa_v4compatibility_ttf__WEBPACK_IMPORTED_MODULE_9__[\"default\"]);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/*!\\n * Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com\\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\\n * Copyright 2022 Fonticons, Inc.\\n */\\n.fa {\\n font-family: var(--fa-style-family, \\\"Font Awesome 6 Free\\\");\\n font-weight: var(--fa-style, 900); }\\n\\n.fa,\\n.fa-classic,\\n.fa-sharp,\\n.fas,\\n.fa-solid,\\n.far,\\n.fa-regular,\\n.fab,\\n.fa-brands {\\n -moz-osx-font-smoothing: grayscale;\\n -webkit-font-smoothing: antialiased;\\n display: var(--fa-display, inline-block);\\n font-style: normal;\\n font-variant: normal;\\n line-height: 1;\\n text-rendering: auto; }\\n\\n.fas,\\n.fa-classic,\\n.fa-solid,\\n.far,\\n.fa-regular {\\n font-family: 'Font Awesome 6 Free'; }\\n\\n.fab,\\n.fa-brands {\\n font-family: 'Font Awesome 6 Brands'; }\\n\\n.fa-1x {\\n font-size: 1em; }\\n\\n.fa-2x {\\n font-size: 2em; }\\n\\n.fa-3x {\\n font-size: 3em; }\\n\\n.fa-4x {\\n font-size: 4em; }\\n\\n.fa-5x {\\n font-size: 5em; }\\n\\n.fa-6x {\\n font-size: 6em; }\\n\\n.fa-7x {\\n font-size: 7em; }\\n\\n.fa-8x {\\n font-size: 8em; }\\n\\n.fa-9x {\\n font-size: 9em; }\\n\\n.fa-10x {\\n font-size: 10em; }\\n\\n.fa-2xs {\\n font-size: 0.625em;\\n line-height: 0.1em;\\n vertical-align: 0.225em; }\\n\\n.fa-xs {\\n font-size: 0.75em;\\n line-height: 0.08333em;\\n vertical-align: 0.125em; }\\n\\n.fa-sm {\\n font-size: 0.875em;\\n line-height: 0.07143em;\\n vertical-align: 0.05357em; }\\n\\n.fa-lg {\\n font-size: 1.25em;\\n line-height: 0.05em;\\n vertical-align: -0.075em; }\\n\\n.fa-xl {\\n font-size: 1.5em;\\n line-height: 0.04167em;\\n vertical-align: -0.125em; }\\n\\n.fa-2xl {\\n font-size: 2em;\\n line-height: 0.03125em;\\n vertical-align: -0.1875em; }\\n\\n.fa-fw {\\n text-align: center;\\n width: 1.25em; }\\n\\n.fa-ul {\\n list-style-type: none;\\n margin-left: var(--fa-li-margin, 2.5em);\\n padding-left: 0; }\\n .fa-ul > li {\\n position: relative; }\\n\\n.fa-li {\\n left: calc(var(--fa-li-width, 2em) * -1);\\n position: absolute;\\n text-align: center;\\n width: var(--fa-li-width, 2em);\\n line-height: inherit; }\\n\\n.fa-border {\\n border-color: var(--fa-border-color, #eee);\\n border-radius: var(--fa-border-radius, 0.1em);\\n border-style: var(--fa-border-style, solid);\\n border-width: var(--fa-border-width, 0.08em);\\n padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); }\\n\\n.fa-pull-left {\\n float: left;\\n margin-right: var(--fa-pull-margin, 0.3em); }\\n\\n.fa-pull-right {\\n float: right;\\n margin-left: var(--fa-pull-margin, 0.3em); }\\n\\n.fa-beat {\\n -webkit-animation-name: fa-beat;\\n animation-name: fa-beat;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);\\n animation-timing-function: var(--fa-animation-timing, ease-in-out); }\\n\\n.fa-bounce {\\n -webkit-animation-name: fa-bounce;\\n animation-name: fa-bounce;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));\\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); }\\n\\n.fa-fade {\\n -webkit-animation-name: fa-fade;\\n animation-name: fa-fade;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }\\n\\n.fa-beat-fade {\\n -webkit-animation-name: fa-beat-fade;\\n animation-name: fa-beat-fade;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }\\n\\n.fa-flip {\\n -webkit-animation-name: fa-flip;\\n animation-name: fa-flip;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);\\n animation-timing-function: var(--fa-animation-timing, ease-in-out); }\\n\\n.fa-shake {\\n -webkit-animation-name: fa-shake;\\n animation-name: fa-shake;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, linear);\\n animation-timing-function: var(--fa-animation-timing, linear); }\\n\\n.fa-spin {\\n -webkit-animation-name: fa-spin;\\n animation-name: fa-spin;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 2s);\\n animation-duration: var(--fa-animation-duration, 2s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, linear);\\n animation-timing-function: var(--fa-animation-timing, linear); }\\n\\n.fa-spin-reverse {\\n --fa-animation-direction: reverse; }\\n\\n.fa-pulse,\\n.fa-spin-pulse {\\n -webkit-animation-name: fa-spin;\\n animation-name: fa-spin;\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, steps(8));\\n animation-timing-function: var(--fa-animation-timing, steps(8)); }\\n\\n@media (prefers-reduced-motion: reduce) {\\n .fa-beat,\\n .fa-bounce,\\n .fa-fade,\\n .fa-beat-fade,\\n .fa-flip,\\n .fa-pulse,\\n .fa-shake,\\n .fa-spin,\\n .fa-spin-pulse {\\n -webkit-animation-delay: -1ms;\\n animation-delay: -1ms;\\n -webkit-animation-duration: 1ms;\\n animation-duration: 1ms;\\n -webkit-animation-iteration-count: 1;\\n animation-iteration-count: 1;\\n transition-delay: 0s;\\n transition-duration: 0s; } }\\n\\n@-webkit-keyframes fa-beat {\\n 0%, 90% {\\n -webkit-transform: scale(1);\\n transform: scale(1); }\\n 45% {\\n -webkit-transform: scale(var(--fa-beat-scale, 1.25));\\n transform: scale(var(--fa-beat-scale, 1.25)); } }\\n\\n@keyframes fa-beat {\\n 0%, 90% {\\n -webkit-transform: scale(1);\\n transform: scale(1); }\\n 45% {\\n -webkit-transform: scale(var(--fa-beat-scale, 1.25));\\n transform: scale(var(--fa-beat-scale, 1.25)); } }\\n\\n@-webkit-keyframes fa-bounce {\\n 0% {\\n -webkit-transform: scale(1, 1) translateY(0);\\n transform: scale(1, 1) translateY(0); }\\n 10% {\\n -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\\n transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }\\n 30% {\\n -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\\n transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }\\n 50% {\\n -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\\n transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }\\n 57% {\\n -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\\n transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }\\n 64% {\\n -webkit-transform: scale(1, 1) translateY(0);\\n transform: scale(1, 1) translateY(0); }\\n 100% {\\n -webkit-transform: scale(1, 1) translateY(0);\\n transform: scale(1, 1) translateY(0); } }\\n\\n@keyframes fa-bounce {\\n 0% {\\n -webkit-transform: scale(1, 1) translateY(0);\\n transform: scale(1, 1) translateY(0); }\\n 10% {\\n -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\\n transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }\\n 30% {\\n -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\\n transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }\\n 50% {\\n -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\\n transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }\\n 57% {\\n -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\\n transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }\\n 64% {\\n -webkit-transform: scale(1, 1) translateY(0);\\n transform: scale(1, 1) translateY(0); }\\n 100% {\\n -webkit-transform: scale(1, 1) translateY(0);\\n transform: scale(1, 1) translateY(0); } }\\n\\n@-webkit-keyframes fa-fade {\\n 50% {\\n opacity: var(--fa-fade-opacity, 0.4); } }\\n\\n@keyframes fa-fade {\\n 50% {\\n opacity: var(--fa-fade-opacity, 0.4); } }\\n\\n@-webkit-keyframes fa-beat-fade {\\n 0%, 100% {\\n opacity: var(--fa-beat-fade-opacity, 0.4);\\n -webkit-transform: scale(1);\\n transform: scale(1); }\\n 50% {\\n opacity: 1;\\n -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));\\n transform: scale(var(--fa-beat-fade-scale, 1.125)); } }\\n\\n@keyframes fa-beat-fade {\\n 0%, 100% {\\n opacity: var(--fa-beat-fade-opacity, 0.4);\\n -webkit-transform: scale(1);\\n transform: scale(1); }\\n 50% {\\n opacity: 1;\\n -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));\\n transform: scale(var(--fa-beat-fade-scale, 1.125)); } }\\n\\n@-webkit-keyframes fa-flip {\\n 50% {\\n -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\\n transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }\\n\\n@keyframes fa-flip {\\n 50% {\\n -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\\n transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }\\n\\n@-webkit-keyframes fa-shake {\\n 0% {\\n -webkit-transform: rotate(-15deg);\\n transform: rotate(-15deg); }\\n 4% {\\n -webkit-transform: rotate(15deg);\\n transform: rotate(15deg); }\\n 8%, 24% {\\n -webkit-transform: rotate(-18deg);\\n transform: rotate(-18deg); }\\n 12%, 28% {\\n -webkit-transform: rotate(18deg);\\n transform: rotate(18deg); }\\n 16% {\\n -webkit-transform: rotate(-22deg);\\n transform: rotate(-22deg); }\\n 20% {\\n -webkit-transform: rotate(22deg);\\n transform: rotate(22deg); }\\n 32% {\\n -webkit-transform: rotate(-12deg);\\n transform: rotate(-12deg); }\\n 36% {\\n -webkit-transform: rotate(12deg);\\n transform: rotate(12deg); }\\n 40%, 100% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg); } }\\n\\n@keyframes fa-shake {\\n 0% {\\n -webkit-transform: rotate(-15deg);\\n transform: rotate(-15deg); }\\n 4% {\\n -webkit-transform: rotate(15deg);\\n transform: rotate(15deg); }\\n 8%, 24% {\\n -webkit-transform: rotate(-18deg);\\n transform: rotate(-18deg); }\\n 12%, 28% {\\n -webkit-transform: rotate(18deg);\\n transform: rotate(18deg); }\\n 16% {\\n -webkit-transform: rotate(-22deg);\\n transform: rotate(-22deg); }\\n 20% {\\n -webkit-transform: rotate(22deg);\\n transform: rotate(22deg); }\\n 32% {\\n -webkit-transform: rotate(-12deg);\\n transform: rotate(-12deg); }\\n 36% {\\n -webkit-transform: rotate(12deg);\\n transform: rotate(12deg); }\\n 40%, 100% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg); } }\\n\\n@-webkit-keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg); }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg); } }\\n\\n@keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg); }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg); } }\\n\\n.fa-rotate-90 {\\n -webkit-transform: rotate(90deg);\\n transform: rotate(90deg); }\\n\\n.fa-rotate-180 {\\n -webkit-transform: rotate(180deg);\\n transform: rotate(180deg); }\\n\\n.fa-rotate-270 {\\n -webkit-transform: rotate(270deg);\\n transform: rotate(270deg); }\\n\\n.fa-flip-horizontal {\\n -webkit-transform: scale(-1, 1);\\n transform: scale(-1, 1); }\\n\\n.fa-flip-vertical {\\n -webkit-transform: scale(1, -1);\\n transform: scale(1, -1); }\\n\\n.fa-flip-both,\\n.fa-flip-horizontal.fa-flip-vertical {\\n -webkit-transform: scale(-1, -1);\\n transform: scale(-1, -1); }\\n\\n.fa-rotate-by {\\n -webkit-transform: rotate(var(--fa-rotate-angle, none));\\n transform: rotate(var(--fa-rotate-angle, none)); }\\n\\n.fa-stack {\\n display: inline-block;\\n height: 2em;\\n line-height: 2em;\\n position: relative;\\n vertical-align: middle;\\n width: 2.5em; }\\n\\n.fa-stack-1x,\\n.fa-stack-2x {\\n left: 0;\\n position: absolute;\\n text-align: center;\\n width: 100%;\\n z-index: var(--fa-stack-z-index, auto); }\\n\\n.fa-stack-1x {\\n line-height: inherit; }\\n\\n.fa-stack-2x {\\n font-size: 2em; }\\n\\n.fa-inverse {\\n color: var(--fa-inverse, #fff); }\\n\\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\\nreaders do not read off random characters that represent icons */\\n.fa-0::before {\\n content: \\\"\\\\30\\\"; }\\n\\n.fa-1::before {\\n content: \\\"\\\\31\\\"; }\\n\\n.fa-2::before {\\n content: \\\"\\\\32\\\"; }\\n\\n.fa-3::before {\\n content: \\\"\\\\33\\\"; }\\n\\n.fa-4::before {\\n content: \\\"\\\\34\\\"; }\\n\\n.fa-5::before {\\n content: \\\"\\\\35\\\"; }\\n\\n.fa-6::before {\\n content: \\\"\\\\36\\\"; }\\n\\n.fa-7::before {\\n content: \\\"\\\\37\\\"; }\\n\\n.fa-8::before {\\n content: \\\"\\\\38\\\"; }\\n\\n.fa-9::before {\\n content: \\\"\\\\39\\\"; }\\n\\n.fa-fill-drip::before {\\n content: \\\"\\\\f576\\\"; }\\n\\n.fa-arrows-to-circle::before {\\n content: \\\"\\\\e4bd\\\"; }\\n\\n.fa-circle-chevron-right::before {\\n content: \\\"\\\\f138\\\"; }\\n\\n.fa-chevron-circle-right::before {\\n content: \\\"\\\\f138\\\"; }\\n\\n.fa-at::before {\\n content: \\\"\\\\40\\\"; }\\n\\n.fa-trash-can::before {\\n content: \\\"\\\\f2ed\\\"; }\\n\\n.fa-trash-alt::before {\\n content: \\\"\\\\f2ed\\\"; }\\n\\n.fa-text-height::before {\\n content: \\\"\\\\f034\\\"; }\\n\\n.fa-user-xmark::before {\\n content: \\\"\\\\f235\\\"; }\\n\\n.fa-user-times::before {\\n content: \\\"\\\\f235\\\"; }\\n\\n.fa-stethoscope::before {\\n content: \\\"\\\\f0f1\\\"; }\\n\\n.fa-message::before {\\n content: \\\"\\\\f27a\\\"; }\\n\\n.fa-comment-alt::before {\\n content: \\\"\\\\f27a\\\"; }\\n\\n.fa-info::before {\\n content: \\\"\\\\f129\\\"; }\\n\\n.fa-down-left-and-up-right-to-center::before {\\n content: \\\"\\\\f422\\\"; }\\n\\n.fa-compress-alt::before {\\n content: \\\"\\\\f422\\\"; }\\n\\n.fa-explosion::before {\\n content: \\\"\\\\e4e9\\\"; }\\n\\n.fa-file-lines::before {\\n content: \\\"\\\\f15c\\\"; }\\n\\n.fa-file-alt::before {\\n content: \\\"\\\\f15c\\\"; }\\n\\n.fa-file-text::before {\\n content: \\\"\\\\f15c\\\"; }\\n\\n.fa-wave-square::before {\\n content: \\\"\\\\f83e\\\"; }\\n\\n.fa-ring::before {\\n content: \\\"\\\\f70b\\\"; }\\n\\n.fa-building-un::before {\\n content: \\\"\\\\e4d9\\\"; }\\n\\n.fa-dice-three::before {\\n content: \\\"\\\\f527\\\"; }\\n\\n.fa-calendar-days::before {\\n content: \\\"\\\\f073\\\"; }\\n\\n.fa-calendar-alt::before {\\n content: \\\"\\\\f073\\\"; }\\n\\n.fa-anchor-circle-check::before {\\n content: \\\"\\\\e4aa\\\"; }\\n\\n.fa-building-circle-arrow-right::before {\\n content: \\\"\\\\e4d1\\\"; }\\n\\n.fa-volleyball::before {\\n content: \\\"\\\\f45f\\\"; }\\n\\n.fa-volleyball-ball::before {\\n content: \\\"\\\\f45f\\\"; }\\n\\n.fa-arrows-up-to-line::before {\\n content: \\\"\\\\e4c2\\\"; }\\n\\n.fa-sort-down::before {\\n content: \\\"\\\\f0dd\\\"; }\\n\\n.fa-sort-desc::before {\\n content: \\\"\\\\f0dd\\\"; }\\n\\n.fa-circle-minus::before {\\n content: \\\"\\\\f056\\\"; }\\n\\n.fa-minus-circle::before {\\n content: \\\"\\\\f056\\\"; }\\n\\n.fa-door-open::before {\\n content: \\\"\\\\f52b\\\"; }\\n\\n.fa-right-from-bracket::before {\\n content: \\\"\\\\f2f5\\\"; }\\n\\n.fa-sign-out-alt::before {\\n content: \\\"\\\\f2f5\\\"; }\\n\\n.fa-atom::before {\\n content: \\\"\\\\f5d2\\\"; }\\n\\n.fa-soap::before {\\n content: \\\"\\\\e06e\\\"; }\\n\\n.fa-icons::before {\\n content: \\\"\\\\f86d\\\"; }\\n\\n.fa-heart-music-camera-bolt::before {\\n content: \\\"\\\\f86d\\\"; }\\n\\n.fa-microphone-lines-slash::before {\\n content: \\\"\\\\f539\\\"; }\\n\\n.fa-microphone-alt-slash::before {\\n content: \\\"\\\\f539\\\"; }\\n\\n.fa-bridge-circle-check::before {\\n content: \\\"\\\\e4c9\\\"; }\\n\\n.fa-pump-medical::before {\\n content: \\\"\\\\e06a\\\"; }\\n\\n.fa-fingerprint::before {\\n content: \\\"\\\\f577\\\"; }\\n\\n.fa-hand-point-right::before {\\n content: \\\"\\\\f0a4\\\"; }\\n\\n.fa-magnifying-glass-location::before {\\n content: \\\"\\\\f689\\\"; }\\n\\n.fa-search-location::before {\\n content: \\\"\\\\f689\\\"; }\\n\\n.fa-forward-step::before {\\n content: \\\"\\\\f051\\\"; }\\n\\n.fa-step-forward::before {\\n content: \\\"\\\\f051\\\"; }\\n\\n.fa-face-smile-beam::before {\\n content: \\\"\\\\f5b8\\\"; }\\n\\n.fa-smile-beam::before {\\n content: \\\"\\\\f5b8\\\"; }\\n\\n.fa-flag-checkered::before {\\n content: \\\"\\\\f11e\\\"; }\\n\\n.fa-football::before {\\n content: \\\"\\\\f44e\\\"; }\\n\\n.fa-football-ball::before {\\n content: \\\"\\\\f44e\\\"; }\\n\\n.fa-school-circle-exclamation::before {\\n content: \\\"\\\\e56c\\\"; }\\n\\n.fa-crop::before {\\n content: \\\"\\\\f125\\\"; }\\n\\n.fa-angles-down::before {\\n content: \\\"\\\\f103\\\"; }\\n\\n.fa-angle-double-down::before {\\n content: \\\"\\\\f103\\\"; }\\n\\n.fa-users-rectangle::before {\\n content: \\\"\\\\e594\\\"; }\\n\\n.fa-people-roof::before {\\n content: \\\"\\\\e537\\\"; }\\n\\n.fa-people-line::before {\\n content: \\\"\\\\e534\\\"; }\\n\\n.fa-beer-mug-empty::before {\\n content: \\\"\\\\f0fc\\\"; }\\n\\n.fa-beer::before {\\n content: \\\"\\\\f0fc\\\"; }\\n\\n.fa-diagram-predecessor::before {\\n content: \\\"\\\\e477\\\"; }\\n\\n.fa-arrow-up-long::before {\\n content: \\\"\\\\f176\\\"; }\\n\\n.fa-long-arrow-up::before {\\n content: \\\"\\\\f176\\\"; }\\n\\n.fa-fire-flame-simple::before {\\n content: \\\"\\\\f46a\\\"; }\\n\\n.fa-burn::before {\\n content: \\\"\\\\f46a\\\"; }\\n\\n.fa-person::before {\\n content: \\\"\\\\f183\\\"; }\\n\\n.fa-male::before {\\n content: \\\"\\\\f183\\\"; }\\n\\n.fa-laptop::before {\\n content: \\\"\\\\f109\\\"; }\\n\\n.fa-file-csv::before {\\n content: \\\"\\\\f6dd\\\"; }\\n\\n.fa-menorah::before {\\n content: \\\"\\\\f676\\\"; }\\n\\n.fa-truck-plane::before {\\n content: \\\"\\\\e58f\\\"; }\\n\\n.fa-record-vinyl::before {\\n content: \\\"\\\\f8d9\\\"; }\\n\\n.fa-face-grin-stars::before {\\n content: \\\"\\\\f587\\\"; }\\n\\n.fa-grin-stars::before {\\n content: \\\"\\\\f587\\\"; }\\n\\n.fa-bong::before {\\n content: \\\"\\\\f55c\\\"; }\\n\\n.fa-spaghetti-monster-flying::before {\\n content: \\\"\\\\f67b\\\"; }\\n\\n.fa-pastafarianism::before {\\n content: \\\"\\\\f67b\\\"; }\\n\\n.fa-arrow-down-up-across-line::before {\\n content: \\\"\\\\e4af\\\"; }\\n\\n.fa-spoon::before {\\n content: \\\"\\\\f2e5\\\"; }\\n\\n.fa-utensil-spoon::before {\\n content: \\\"\\\\f2e5\\\"; }\\n\\n.fa-jar-wheat::before {\\n content: \\\"\\\\e517\\\"; }\\n\\n.fa-envelopes-bulk::before {\\n content: \\\"\\\\f674\\\"; }\\n\\n.fa-mail-bulk::before {\\n content: \\\"\\\\f674\\\"; }\\n\\n.fa-file-circle-exclamation::before {\\n content: \\\"\\\\e4eb\\\"; }\\n\\n.fa-circle-h::before {\\n content: \\\"\\\\f47e\\\"; }\\n\\n.fa-hospital-symbol::before {\\n content: \\\"\\\\f47e\\\"; }\\n\\n.fa-pager::before {\\n content: \\\"\\\\f815\\\"; }\\n\\n.fa-address-book::before {\\n content: \\\"\\\\f2b9\\\"; }\\n\\n.fa-contact-book::before {\\n content: \\\"\\\\f2b9\\\"; }\\n\\n.fa-strikethrough::before {\\n content: \\\"\\\\f0cc\\\"; }\\n\\n.fa-k::before {\\n content: \\\"\\\\4b\\\"; }\\n\\n.fa-landmark-flag::before {\\n content: \\\"\\\\e51c\\\"; }\\n\\n.fa-pencil::before {\\n content: \\\"\\\\f303\\\"; }\\n\\n.fa-pencil-alt::before {\\n content: \\\"\\\\f303\\\"; }\\n\\n.fa-backward::before {\\n content: \\\"\\\\f04a\\\"; }\\n\\n.fa-caret-right::before {\\n content: \\\"\\\\f0da\\\"; }\\n\\n.fa-comments::before {\\n content: \\\"\\\\f086\\\"; }\\n\\n.fa-paste::before {\\n content: \\\"\\\\f0ea\\\"; }\\n\\n.fa-file-clipboard::before {\\n content: \\\"\\\\f0ea\\\"; }\\n\\n.fa-code-pull-request::before {\\n content: \\\"\\\\e13c\\\"; }\\n\\n.fa-clipboard-list::before {\\n content: \\\"\\\\f46d\\\"; }\\n\\n.fa-truck-ramp-box::before {\\n content: \\\"\\\\f4de\\\"; }\\n\\n.fa-truck-loading::before {\\n content: \\\"\\\\f4de\\\"; }\\n\\n.fa-user-check::before {\\n content: \\\"\\\\f4fc\\\"; }\\n\\n.fa-vial-virus::before {\\n content: \\\"\\\\e597\\\"; }\\n\\n.fa-sheet-plastic::before {\\n content: \\\"\\\\e571\\\"; }\\n\\n.fa-blog::before {\\n content: \\\"\\\\f781\\\"; }\\n\\n.fa-user-ninja::before {\\n content: \\\"\\\\f504\\\"; }\\n\\n.fa-person-arrow-up-from-line::before {\\n content: \\\"\\\\e539\\\"; }\\n\\n.fa-scroll-torah::before {\\n content: \\\"\\\\f6a0\\\"; }\\n\\n.fa-torah::before {\\n content: \\\"\\\\f6a0\\\"; }\\n\\n.fa-broom-ball::before {\\n content: \\\"\\\\f458\\\"; }\\n\\n.fa-quidditch::before {\\n content: \\\"\\\\f458\\\"; }\\n\\n.fa-quidditch-broom-ball::before {\\n content: \\\"\\\\f458\\\"; }\\n\\n.fa-toggle-off::before {\\n content: \\\"\\\\f204\\\"; }\\n\\n.fa-box-archive::before {\\n content: \\\"\\\\f187\\\"; }\\n\\n.fa-archive::before {\\n content: \\\"\\\\f187\\\"; }\\n\\n.fa-person-drowning::before {\\n content: \\\"\\\\e545\\\"; }\\n\\n.fa-arrow-down-9-1::before {\\n content: \\\"\\\\f886\\\"; }\\n\\n.fa-sort-numeric-desc::before {\\n content: \\\"\\\\f886\\\"; }\\n\\n.fa-sort-numeric-down-alt::before {\\n content: \\\"\\\\f886\\\"; }\\n\\n.fa-face-grin-tongue-squint::before {\\n content: \\\"\\\\f58a\\\"; }\\n\\n.fa-grin-tongue-squint::before {\\n content: \\\"\\\\f58a\\\"; }\\n\\n.fa-spray-can::before {\\n content: \\\"\\\\f5bd\\\"; }\\n\\n.fa-truck-monster::before {\\n content: \\\"\\\\f63b\\\"; }\\n\\n.fa-w::before {\\n content: \\\"\\\\57\\\"; }\\n\\n.fa-earth-africa::before {\\n content: \\\"\\\\f57c\\\"; }\\n\\n.fa-globe-africa::before {\\n content: \\\"\\\\f57c\\\"; }\\n\\n.fa-rainbow::before {\\n content: \\\"\\\\f75b\\\"; }\\n\\n.fa-circle-notch::before {\\n content: \\\"\\\\f1ce\\\"; }\\n\\n.fa-tablet-screen-button::before {\\n content: \\\"\\\\f3fa\\\"; }\\n\\n.fa-tablet-alt::before {\\n content: \\\"\\\\f3fa\\\"; }\\n\\n.fa-paw::before {\\n content: \\\"\\\\f1b0\\\"; }\\n\\n.fa-cloud::before {\\n content: \\\"\\\\f0c2\\\"; }\\n\\n.fa-trowel-bricks::before {\\n content: \\\"\\\\e58a\\\"; }\\n\\n.fa-face-flushed::before {\\n content: \\\"\\\\f579\\\"; }\\n\\n.fa-flushed::before {\\n content: \\\"\\\\f579\\\"; }\\n\\n.fa-hospital-user::before {\\n content: \\\"\\\\f80d\\\"; }\\n\\n.fa-tent-arrow-left-right::before {\\n content: \\\"\\\\e57f\\\"; }\\n\\n.fa-gavel::before {\\n content: \\\"\\\\f0e3\\\"; }\\n\\n.fa-legal::before {\\n content: \\\"\\\\f0e3\\\"; }\\n\\n.fa-binoculars::before {\\n content: \\\"\\\\f1e5\\\"; }\\n\\n.fa-microphone-slash::before {\\n content: \\\"\\\\f131\\\"; }\\n\\n.fa-box-tissue::before {\\n content: \\\"\\\\e05b\\\"; }\\n\\n.fa-motorcycle::before {\\n content: \\\"\\\\f21c\\\"; }\\n\\n.fa-bell-concierge::before {\\n content: \\\"\\\\f562\\\"; }\\n\\n.fa-concierge-bell::before {\\n content: \\\"\\\\f562\\\"; }\\n\\n.fa-pen-ruler::before {\\n content: \\\"\\\\f5ae\\\"; }\\n\\n.fa-pencil-ruler::before {\\n content: \\\"\\\\f5ae\\\"; }\\n\\n.fa-people-arrows::before {\\n content: \\\"\\\\e068\\\"; }\\n\\n.fa-people-arrows-left-right::before {\\n content: \\\"\\\\e068\\\"; }\\n\\n.fa-mars-and-venus-burst::before {\\n content: \\\"\\\\e523\\\"; }\\n\\n.fa-square-caret-right::before {\\n content: \\\"\\\\f152\\\"; }\\n\\n.fa-caret-square-right::before {\\n content: \\\"\\\\f152\\\"; }\\n\\n.fa-scissors::before {\\n content: \\\"\\\\f0c4\\\"; }\\n\\n.fa-cut::before {\\n content: \\\"\\\\f0c4\\\"; }\\n\\n.fa-sun-plant-wilt::before {\\n content: \\\"\\\\e57a\\\"; }\\n\\n.fa-toilets-portable::before {\\n content: \\\"\\\\e584\\\"; }\\n\\n.fa-hockey-puck::before {\\n content: \\\"\\\\f453\\\"; }\\n\\n.fa-table::before {\\n content: \\\"\\\\f0ce\\\"; }\\n\\n.fa-magnifying-glass-arrow-right::before {\\n content: \\\"\\\\e521\\\"; }\\n\\n.fa-tachograph-digital::before {\\n content: \\\"\\\\f566\\\"; }\\n\\n.fa-digital-tachograph::before {\\n content: \\\"\\\\f566\\\"; }\\n\\n.fa-users-slash::before {\\n content: \\\"\\\\e073\\\"; }\\n\\n.fa-clover::before {\\n content: \\\"\\\\e139\\\"; }\\n\\n.fa-reply::before {\\n content: \\\"\\\\f3e5\\\"; }\\n\\n.fa-mail-reply::before {\\n content: \\\"\\\\f3e5\\\"; }\\n\\n.fa-star-and-crescent::before {\\n content: \\\"\\\\f699\\\"; }\\n\\n.fa-house-fire::before {\\n content: \\\"\\\\e50c\\\"; }\\n\\n.fa-square-minus::before {\\n content: \\\"\\\\f146\\\"; }\\n\\n.fa-minus-square::before {\\n content: \\\"\\\\f146\\\"; }\\n\\n.fa-helicopter::before {\\n content: \\\"\\\\f533\\\"; }\\n\\n.fa-compass::before {\\n content: \\\"\\\\f14e\\\"; }\\n\\n.fa-square-caret-down::before {\\n content: \\\"\\\\f150\\\"; }\\n\\n.fa-caret-square-down::before {\\n content: \\\"\\\\f150\\\"; }\\n\\n.fa-file-circle-question::before {\\n content: \\\"\\\\e4ef\\\"; }\\n\\n.fa-laptop-code::before {\\n content: \\\"\\\\f5fc\\\"; }\\n\\n.fa-swatchbook::before {\\n content: \\\"\\\\f5c3\\\"; }\\n\\n.fa-prescription-bottle::before {\\n content: \\\"\\\\f485\\\"; }\\n\\n.fa-bars::before {\\n content: \\\"\\\\f0c9\\\"; }\\n\\n.fa-navicon::before {\\n content: \\\"\\\\f0c9\\\"; }\\n\\n.fa-people-group::before {\\n content: \\\"\\\\e533\\\"; }\\n\\n.fa-hourglass-end::before {\\n content: \\\"\\\\f253\\\"; }\\n\\n.fa-hourglass-3::before {\\n content: \\\"\\\\f253\\\"; }\\n\\n.fa-heart-crack::before {\\n content: \\\"\\\\f7a9\\\"; }\\n\\n.fa-heart-broken::before {\\n content: \\\"\\\\f7a9\\\"; }\\n\\n.fa-square-up-right::before {\\n content: \\\"\\\\f360\\\"; }\\n\\n.fa-external-link-square-alt::before {\\n content: \\\"\\\\f360\\\"; }\\n\\n.fa-face-kiss-beam::before {\\n content: \\\"\\\\f597\\\"; }\\n\\n.fa-kiss-beam::before {\\n content: \\\"\\\\f597\\\"; }\\n\\n.fa-film::before {\\n content: \\\"\\\\f008\\\"; }\\n\\n.fa-ruler-horizontal::before {\\n content: \\\"\\\\f547\\\"; }\\n\\n.fa-people-robbery::before {\\n content: \\\"\\\\e536\\\"; }\\n\\n.fa-lightbulb::before {\\n content: \\\"\\\\f0eb\\\"; }\\n\\n.fa-caret-left::before {\\n content: \\\"\\\\f0d9\\\"; }\\n\\n.fa-circle-exclamation::before {\\n content: \\\"\\\\f06a\\\"; }\\n\\n.fa-exclamation-circle::before {\\n content: \\\"\\\\f06a\\\"; }\\n\\n.fa-school-circle-xmark::before {\\n content: \\\"\\\\e56d\\\"; }\\n\\n.fa-arrow-right-from-bracket::before {\\n content: \\\"\\\\f08b\\\"; }\\n\\n.fa-sign-out::before {\\n content: \\\"\\\\f08b\\\"; }\\n\\n.fa-circle-chevron-down::before {\\n content: \\\"\\\\f13a\\\"; }\\n\\n.fa-chevron-circle-down::before {\\n content: \\\"\\\\f13a\\\"; }\\n\\n.fa-unlock-keyhole::before {\\n content: \\\"\\\\f13e\\\"; }\\n\\n.fa-unlock-alt::before {\\n content: \\\"\\\\f13e\\\"; }\\n\\n.fa-cloud-showers-heavy::before {\\n content: \\\"\\\\f740\\\"; }\\n\\n.fa-headphones-simple::before {\\n content: \\\"\\\\f58f\\\"; }\\n\\n.fa-headphones-alt::before {\\n content: \\\"\\\\f58f\\\"; }\\n\\n.fa-sitemap::before {\\n content: \\\"\\\\f0e8\\\"; }\\n\\n.fa-circle-dollar-to-slot::before {\\n content: \\\"\\\\f4b9\\\"; }\\n\\n.fa-donate::before {\\n content: \\\"\\\\f4b9\\\"; }\\n\\n.fa-memory::before {\\n content: \\\"\\\\f538\\\"; }\\n\\n.fa-road-spikes::before {\\n content: \\\"\\\\e568\\\"; }\\n\\n.fa-fire-burner::before {\\n content: \\\"\\\\e4f1\\\"; }\\n\\n.fa-flag::before {\\n content: \\\"\\\\f024\\\"; }\\n\\n.fa-hanukiah::before {\\n content: \\\"\\\\f6e6\\\"; }\\n\\n.fa-feather::before {\\n content: \\\"\\\\f52d\\\"; }\\n\\n.fa-volume-low::before {\\n content: \\\"\\\\f027\\\"; }\\n\\n.fa-volume-down::before {\\n content: \\\"\\\\f027\\\"; }\\n\\n.fa-comment-slash::before {\\n content: \\\"\\\\f4b3\\\"; }\\n\\n.fa-cloud-sun-rain::before {\\n content: \\\"\\\\f743\\\"; }\\n\\n.fa-compress::before {\\n content: \\\"\\\\f066\\\"; }\\n\\n.fa-wheat-awn::before {\\n content: \\\"\\\\e2cd\\\"; }\\n\\n.fa-wheat-alt::before {\\n content: \\\"\\\\e2cd\\\"; }\\n\\n.fa-ankh::before {\\n content: \\\"\\\\f644\\\"; }\\n\\n.fa-hands-holding-child::before {\\n content: \\\"\\\\e4fa\\\"; }\\n\\n.fa-asterisk::before {\\n content: \\\"\\\\2a\\\"; }\\n\\n.fa-square-check::before {\\n content: \\\"\\\\f14a\\\"; }\\n\\n.fa-check-square::before {\\n content: \\\"\\\\f14a\\\"; }\\n\\n.fa-peseta-sign::before {\\n content: \\\"\\\\e221\\\"; }\\n\\n.fa-heading::before {\\n content: \\\"\\\\f1dc\\\"; }\\n\\n.fa-header::before {\\n content: \\\"\\\\f1dc\\\"; }\\n\\n.fa-ghost::before {\\n content: \\\"\\\\f6e2\\\"; }\\n\\n.fa-list::before {\\n content: \\\"\\\\f03a\\\"; }\\n\\n.fa-list-squares::before {\\n content: \\\"\\\\f03a\\\"; }\\n\\n.fa-square-phone-flip::before {\\n content: \\\"\\\\f87b\\\"; }\\n\\n.fa-phone-square-alt::before {\\n content: \\\"\\\\f87b\\\"; }\\n\\n.fa-cart-plus::before {\\n content: \\\"\\\\f217\\\"; }\\n\\n.fa-gamepad::before {\\n content: \\\"\\\\f11b\\\"; }\\n\\n.fa-circle-dot::before {\\n content: \\\"\\\\f192\\\"; }\\n\\n.fa-dot-circle::before {\\n content: \\\"\\\\f192\\\"; }\\n\\n.fa-face-dizzy::before {\\n content: \\\"\\\\f567\\\"; }\\n\\n.fa-dizzy::before {\\n content: \\\"\\\\f567\\\"; }\\n\\n.fa-egg::before {\\n content: \\\"\\\\f7fb\\\"; }\\n\\n.fa-house-medical-circle-xmark::before {\\n content: \\\"\\\\e513\\\"; }\\n\\n.fa-campground::before {\\n content: \\\"\\\\f6bb\\\"; }\\n\\n.fa-folder-plus::before {\\n content: \\\"\\\\f65e\\\"; }\\n\\n.fa-futbol::before {\\n content: \\\"\\\\f1e3\\\"; }\\n\\n.fa-futbol-ball::before {\\n content: \\\"\\\\f1e3\\\"; }\\n\\n.fa-soccer-ball::before {\\n content: \\\"\\\\f1e3\\\"; }\\n\\n.fa-paintbrush::before {\\n content: \\\"\\\\f1fc\\\"; }\\n\\n.fa-paint-brush::before {\\n content: \\\"\\\\f1fc\\\"; }\\n\\n.fa-lock::before {\\n content: \\\"\\\\f023\\\"; }\\n\\n.fa-gas-pump::before {\\n content: \\\"\\\\f52f\\\"; }\\n\\n.fa-hot-tub-person::before {\\n content: \\\"\\\\f593\\\"; }\\n\\n.fa-hot-tub::before {\\n content: \\\"\\\\f593\\\"; }\\n\\n.fa-map-location::before {\\n content: \\\"\\\\f59f\\\"; }\\n\\n.fa-map-marked::before {\\n content: \\\"\\\\f59f\\\"; }\\n\\n.fa-house-flood-water::before {\\n content: \\\"\\\\e50e\\\"; }\\n\\n.fa-tree::before {\\n content: \\\"\\\\f1bb\\\"; }\\n\\n.fa-bridge-lock::before {\\n content: \\\"\\\\e4cc\\\"; }\\n\\n.fa-sack-dollar::before {\\n content: \\\"\\\\f81d\\\"; }\\n\\n.fa-pen-to-square::before {\\n content: \\\"\\\\f044\\\"; }\\n\\n.fa-edit::before {\\n content: \\\"\\\\f044\\\"; }\\n\\n.fa-car-side::before {\\n content: \\\"\\\\f5e4\\\"; }\\n\\n.fa-share-nodes::before {\\n content: \\\"\\\\f1e0\\\"; }\\n\\n.fa-share-alt::before {\\n content: \\\"\\\\f1e0\\\"; }\\n\\n.fa-heart-circle-minus::before {\\n content: \\\"\\\\e4ff\\\"; }\\n\\n.fa-hourglass-half::before {\\n content: \\\"\\\\f252\\\"; }\\n\\n.fa-hourglass-2::before {\\n content: \\\"\\\\f252\\\"; }\\n\\n.fa-microscope::before {\\n content: \\\"\\\\f610\\\"; }\\n\\n.fa-sink::before {\\n content: \\\"\\\\e06d\\\"; }\\n\\n.fa-bag-shopping::before {\\n content: \\\"\\\\f290\\\"; }\\n\\n.fa-shopping-bag::before {\\n content: \\\"\\\\f290\\\"; }\\n\\n.fa-arrow-down-z-a::before {\\n content: \\\"\\\\f881\\\"; }\\n\\n.fa-sort-alpha-desc::before {\\n content: \\\"\\\\f881\\\"; }\\n\\n.fa-sort-alpha-down-alt::before {\\n content: \\\"\\\\f881\\\"; }\\n\\n.fa-mitten::before {\\n content: \\\"\\\\f7b5\\\"; }\\n\\n.fa-person-rays::before {\\n content: \\\"\\\\e54d\\\"; }\\n\\n.fa-users::before {\\n content: \\\"\\\\f0c0\\\"; }\\n\\n.fa-eye-slash::before {\\n content: \\\"\\\\f070\\\"; }\\n\\n.fa-flask-vial::before {\\n content: \\\"\\\\e4f3\\\"; }\\n\\n.fa-hand::before {\\n content: \\\"\\\\f256\\\"; }\\n\\n.fa-hand-paper::before {\\n content: \\\"\\\\f256\\\"; }\\n\\n.fa-om::before {\\n content: \\\"\\\\f679\\\"; }\\n\\n.fa-worm::before {\\n content: \\\"\\\\e599\\\"; }\\n\\n.fa-house-circle-xmark::before {\\n content: \\\"\\\\e50b\\\"; }\\n\\n.fa-plug::before {\\n content: \\\"\\\\f1e6\\\"; }\\n\\n.fa-chevron-up::before {\\n content: \\\"\\\\f077\\\"; }\\n\\n.fa-hand-spock::before {\\n content: \\\"\\\\f259\\\"; }\\n\\n.fa-stopwatch::before {\\n content: \\\"\\\\f2f2\\\"; }\\n\\n.fa-face-kiss::before {\\n content: \\\"\\\\f596\\\"; }\\n\\n.fa-kiss::before {\\n content: \\\"\\\\f596\\\"; }\\n\\n.fa-bridge-circle-xmark::before {\\n content: \\\"\\\\e4cb\\\"; }\\n\\n.fa-face-grin-tongue::before {\\n content: \\\"\\\\f589\\\"; }\\n\\n.fa-grin-tongue::before {\\n content: \\\"\\\\f589\\\"; }\\n\\n.fa-chess-bishop::before {\\n content: \\\"\\\\f43a\\\"; }\\n\\n.fa-face-grin-wink::before {\\n content: \\\"\\\\f58c\\\"; }\\n\\n.fa-grin-wink::before {\\n content: \\\"\\\\f58c\\\"; }\\n\\n.fa-ear-deaf::before {\\n content: \\\"\\\\f2a4\\\"; }\\n\\n.fa-deaf::before {\\n content: \\\"\\\\f2a4\\\"; }\\n\\n.fa-deafness::before {\\n content: \\\"\\\\f2a4\\\"; }\\n\\n.fa-hard-of-hearing::before {\\n content: \\\"\\\\f2a4\\\"; }\\n\\n.fa-road-circle-check::before {\\n content: \\\"\\\\e564\\\"; }\\n\\n.fa-dice-five::before {\\n content: \\\"\\\\f523\\\"; }\\n\\n.fa-square-rss::before {\\n content: \\\"\\\\f143\\\"; }\\n\\n.fa-rss-square::before {\\n content: \\\"\\\\f143\\\"; }\\n\\n.fa-land-mine-on::before {\\n content: \\\"\\\\e51b\\\"; }\\n\\n.fa-i-cursor::before {\\n content: \\\"\\\\f246\\\"; }\\n\\n.fa-stamp::before {\\n content: \\\"\\\\f5bf\\\"; }\\n\\n.fa-stairs::before {\\n content: \\\"\\\\e289\\\"; }\\n\\n.fa-i::before {\\n content: \\\"\\\\49\\\"; }\\n\\n.fa-hryvnia-sign::before {\\n content: \\\"\\\\f6f2\\\"; }\\n\\n.fa-hryvnia::before {\\n content: \\\"\\\\f6f2\\\"; }\\n\\n.fa-pills::before {\\n content: \\\"\\\\f484\\\"; }\\n\\n.fa-face-grin-wide::before {\\n content: \\\"\\\\f581\\\"; }\\n\\n.fa-grin-alt::before {\\n content: \\\"\\\\f581\\\"; }\\n\\n.fa-tooth::before {\\n content: \\\"\\\\f5c9\\\"; }\\n\\n.fa-v::before {\\n content: \\\"\\\\56\\\"; }\\n\\n.fa-bicycle::before {\\n content: \\\"\\\\f206\\\"; }\\n\\n.fa-staff-snake::before {\\n content: \\\"\\\\e579\\\"; }\\n\\n.fa-rod-asclepius::before {\\n content: \\\"\\\\e579\\\"; }\\n\\n.fa-rod-snake::before {\\n content: \\\"\\\\e579\\\"; }\\n\\n.fa-staff-aesculapius::before {\\n content: \\\"\\\\e579\\\"; }\\n\\n.fa-head-side-cough-slash::before {\\n content: \\\"\\\\e062\\\"; }\\n\\n.fa-truck-medical::before {\\n content: \\\"\\\\f0f9\\\"; }\\n\\n.fa-ambulance::before {\\n content: \\\"\\\\f0f9\\\"; }\\n\\n.fa-wheat-awn-circle-exclamation::before {\\n content: \\\"\\\\e598\\\"; }\\n\\n.fa-snowman::before {\\n content: \\\"\\\\f7d0\\\"; }\\n\\n.fa-mortar-pestle::before {\\n content: \\\"\\\\f5a7\\\"; }\\n\\n.fa-road-barrier::before {\\n content: \\\"\\\\e562\\\"; }\\n\\n.fa-school::before {\\n content: \\\"\\\\f549\\\"; }\\n\\n.fa-igloo::before {\\n content: \\\"\\\\f7ae\\\"; }\\n\\n.fa-joint::before {\\n content: \\\"\\\\f595\\\"; }\\n\\n.fa-angle-right::before {\\n content: \\\"\\\\f105\\\"; }\\n\\n.fa-horse::before {\\n content: \\\"\\\\f6f0\\\"; }\\n\\n.fa-q::before {\\n content: \\\"\\\\51\\\"; }\\n\\n.fa-g::before {\\n content: \\\"\\\\47\\\"; }\\n\\n.fa-notes-medical::before {\\n content: \\\"\\\\f481\\\"; }\\n\\n.fa-temperature-half::before {\\n content: \\\"\\\\f2c9\\\"; }\\n\\n.fa-temperature-2::before {\\n content: \\\"\\\\f2c9\\\"; }\\n\\n.fa-thermometer-2::before {\\n content: \\\"\\\\f2c9\\\"; }\\n\\n.fa-thermometer-half::before {\\n content: \\\"\\\\f2c9\\\"; }\\n\\n.fa-dong-sign::before {\\n content: \\\"\\\\e169\\\"; }\\n\\n.fa-capsules::before {\\n content: \\\"\\\\f46b\\\"; }\\n\\n.fa-poo-storm::before {\\n content: \\\"\\\\f75a\\\"; }\\n\\n.fa-poo-bolt::before {\\n content: \\\"\\\\f75a\\\"; }\\n\\n.fa-face-frown-open::before {\\n content: \\\"\\\\f57a\\\"; }\\n\\n.fa-frown-open::before {\\n content: \\\"\\\\f57a\\\"; }\\n\\n.fa-hand-point-up::before {\\n content: \\\"\\\\f0a6\\\"; }\\n\\n.fa-money-bill::before {\\n content: \\\"\\\\f0d6\\\"; }\\n\\n.fa-bookmark::before {\\n content: \\\"\\\\f02e\\\"; }\\n\\n.fa-align-justify::before {\\n content: \\\"\\\\f039\\\"; }\\n\\n.fa-umbrella-beach::before {\\n content: \\\"\\\\f5ca\\\"; }\\n\\n.fa-helmet-un::before {\\n content: \\\"\\\\e503\\\"; }\\n\\n.fa-bullseye::before {\\n content: \\\"\\\\f140\\\"; }\\n\\n.fa-bacon::before {\\n content: \\\"\\\\f7e5\\\"; }\\n\\n.fa-hand-point-down::before {\\n content: \\\"\\\\f0a7\\\"; }\\n\\n.fa-arrow-up-from-bracket::before {\\n content: \\\"\\\\e09a\\\"; }\\n\\n.fa-folder::before {\\n content: \\\"\\\\f07b\\\"; }\\n\\n.fa-folder-blank::before {\\n content: \\\"\\\\f07b\\\"; }\\n\\n.fa-file-waveform::before {\\n content: \\\"\\\\f478\\\"; }\\n\\n.fa-file-medical-alt::before {\\n content: \\\"\\\\f478\\\"; }\\n\\n.fa-radiation::before {\\n content: \\\"\\\\f7b9\\\"; }\\n\\n.fa-chart-simple::before {\\n content: \\\"\\\\e473\\\"; }\\n\\n.fa-mars-stroke::before {\\n content: \\\"\\\\f229\\\"; }\\n\\n.fa-vial::before {\\n content: \\\"\\\\f492\\\"; }\\n\\n.fa-gauge::before {\\n content: \\\"\\\\f624\\\"; }\\n\\n.fa-dashboard::before {\\n content: \\\"\\\\f624\\\"; }\\n\\n.fa-gauge-med::before {\\n content: \\\"\\\\f624\\\"; }\\n\\n.fa-tachometer-alt-average::before {\\n content: \\\"\\\\f624\\\"; }\\n\\n.fa-wand-magic-sparkles::before {\\n content: \\\"\\\\e2ca\\\"; }\\n\\n.fa-magic-wand-sparkles::before {\\n content: \\\"\\\\e2ca\\\"; }\\n\\n.fa-e::before {\\n content: \\\"\\\\45\\\"; }\\n\\n.fa-pen-clip::before {\\n content: \\\"\\\\f305\\\"; }\\n\\n.fa-pen-alt::before {\\n content: \\\"\\\\f305\\\"; }\\n\\n.fa-bridge-circle-exclamation::before {\\n content: \\\"\\\\e4ca\\\"; }\\n\\n.fa-user::before {\\n content: \\\"\\\\f007\\\"; }\\n\\n.fa-school-circle-check::before {\\n content: \\\"\\\\e56b\\\"; }\\n\\n.fa-dumpster::before {\\n content: \\\"\\\\f793\\\"; }\\n\\n.fa-van-shuttle::before {\\n content: \\\"\\\\f5b6\\\"; }\\n\\n.fa-shuttle-van::before {\\n content: \\\"\\\\f5b6\\\"; }\\n\\n.fa-building-user::before {\\n content: \\\"\\\\e4da\\\"; }\\n\\n.fa-square-caret-left::before {\\n content: \\\"\\\\f191\\\"; }\\n\\n.fa-caret-square-left::before {\\n content: \\\"\\\\f191\\\"; }\\n\\n.fa-highlighter::before {\\n content: \\\"\\\\f591\\\"; }\\n\\n.fa-key::before {\\n content: \\\"\\\\f084\\\"; }\\n\\n.fa-bullhorn::before {\\n content: \\\"\\\\f0a1\\\"; }\\n\\n.fa-globe::before {\\n content: \\\"\\\\f0ac\\\"; }\\n\\n.fa-synagogue::before {\\n content: \\\"\\\\f69b\\\"; }\\n\\n.fa-person-half-dress::before {\\n content: \\\"\\\\e548\\\"; }\\n\\n.fa-road-bridge::before {\\n content: \\\"\\\\e563\\\"; }\\n\\n.fa-location-arrow::before {\\n content: \\\"\\\\f124\\\"; }\\n\\n.fa-c::before {\\n content: \\\"\\\\43\\\"; }\\n\\n.fa-tablet-button::before {\\n content: \\\"\\\\f10a\\\"; }\\n\\n.fa-building-lock::before {\\n content: \\\"\\\\e4d6\\\"; }\\n\\n.fa-pizza-slice::before {\\n content: \\\"\\\\f818\\\"; }\\n\\n.fa-money-bill-wave::before {\\n content: \\\"\\\\f53a\\\"; }\\n\\n.fa-chart-area::before {\\n content: \\\"\\\\f1fe\\\"; }\\n\\n.fa-area-chart::before {\\n content: \\\"\\\\f1fe\\\"; }\\n\\n.fa-house-flag::before {\\n content: \\\"\\\\e50d\\\"; }\\n\\n.fa-person-circle-minus::before {\\n content: \\\"\\\\e540\\\"; }\\n\\n.fa-ban::before {\\n content: \\\"\\\\f05e\\\"; }\\n\\n.fa-cancel::before {\\n content: \\\"\\\\f05e\\\"; }\\n\\n.fa-camera-rotate::before {\\n content: \\\"\\\\e0d8\\\"; }\\n\\n.fa-spray-can-sparkles::before {\\n content: \\\"\\\\f5d0\\\"; }\\n\\n.fa-air-freshener::before {\\n content: \\\"\\\\f5d0\\\"; }\\n\\n.fa-star::before {\\n content: \\\"\\\\f005\\\"; }\\n\\n.fa-repeat::before {\\n content: \\\"\\\\f363\\\"; }\\n\\n.fa-cross::before {\\n content: \\\"\\\\f654\\\"; }\\n\\n.fa-box::before {\\n content: \\\"\\\\f466\\\"; }\\n\\n.fa-venus-mars::before {\\n content: \\\"\\\\f228\\\"; }\\n\\n.fa-arrow-pointer::before {\\n content: \\\"\\\\f245\\\"; }\\n\\n.fa-mouse-pointer::before {\\n content: \\\"\\\\f245\\\"; }\\n\\n.fa-maximize::before {\\n content: \\\"\\\\f31e\\\"; }\\n\\n.fa-expand-arrows-alt::before {\\n content: \\\"\\\\f31e\\\"; }\\n\\n.fa-charging-station::before {\\n content: \\\"\\\\f5e7\\\"; }\\n\\n.fa-shapes::before {\\n content: \\\"\\\\f61f\\\"; }\\n\\n.fa-triangle-circle-square::before {\\n content: \\\"\\\\f61f\\\"; }\\n\\n.fa-shuffle::before {\\n content: \\\"\\\\f074\\\"; }\\n\\n.fa-random::before {\\n content: \\\"\\\\f074\\\"; }\\n\\n.fa-person-running::before {\\n content: \\\"\\\\f70c\\\"; }\\n\\n.fa-running::before {\\n content: \\\"\\\\f70c\\\"; }\\n\\n.fa-mobile-retro::before {\\n content: \\\"\\\\e527\\\"; }\\n\\n.fa-grip-lines-vertical::before {\\n content: \\\"\\\\f7a5\\\"; }\\n\\n.fa-spider::before {\\n content: \\\"\\\\f717\\\"; }\\n\\n.fa-hands-bound::before {\\n content: \\\"\\\\e4f9\\\"; }\\n\\n.fa-file-invoice-dollar::before {\\n content: \\\"\\\\f571\\\"; }\\n\\n.fa-plane-circle-exclamation::before {\\n content: \\\"\\\\e556\\\"; }\\n\\n.fa-x-ray::before {\\n content: \\\"\\\\f497\\\"; }\\n\\n.fa-spell-check::before {\\n content: \\\"\\\\f891\\\"; }\\n\\n.fa-slash::before {\\n content: \\\"\\\\f715\\\"; }\\n\\n.fa-computer-mouse::before {\\n content: \\\"\\\\f8cc\\\"; }\\n\\n.fa-mouse::before {\\n content: \\\"\\\\f8cc\\\"; }\\n\\n.fa-arrow-right-to-bracket::before {\\n content: \\\"\\\\f090\\\"; }\\n\\n.fa-sign-in::before {\\n content: \\\"\\\\f090\\\"; }\\n\\n.fa-shop-slash::before {\\n content: \\\"\\\\e070\\\"; }\\n\\n.fa-store-alt-slash::before {\\n content: \\\"\\\\e070\\\"; }\\n\\n.fa-server::before {\\n content: \\\"\\\\f233\\\"; }\\n\\n.fa-virus-covid-slash::before {\\n content: \\\"\\\\e4a9\\\"; }\\n\\n.fa-shop-lock::before {\\n content: \\\"\\\\e4a5\\\"; }\\n\\n.fa-hourglass-start::before {\\n content: \\\"\\\\f251\\\"; }\\n\\n.fa-hourglass-1::before {\\n content: \\\"\\\\f251\\\"; }\\n\\n.fa-blender-phone::before {\\n content: \\\"\\\\f6b6\\\"; }\\n\\n.fa-building-wheat::before {\\n content: \\\"\\\\e4db\\\"; }\\n\\n.fa-person-breastfeeding::before {\\n content: \\\"\\\\e53a\\\"; }\\n\\n.fa-right-to-bracket::before {\\n content: \\\"\\\\f2f6\\\"; }\\n\\n.fa-sign-in-alt::before {\\n content: \\\"\\\\f2f6\\\"; }\\n\\n.fa-venus::before {\\n content: \\\"\\\\f221\\\"; }\\n\\n.fa-passport::before {\\n content: \\\"\\\\f5ab\\\"; }\\n\\n.fa-heart-pulse::before {\\n content: \\\"\\\\f21e\\\"; }\\n\\n.fa-heartbeat::before {\\n content: \\\"\\\\f21e\\\"; }\\n\\n.fa-people-carry-box::before {\\n content: \\\"\\\\f4ce\\\"; }\\n\\n.fa-people-carry::before {\\n content: \\\"\\\\f4ce\\\"; }\\n\\n.fa-temperature-high::before {\\n content: \\\"\\\\f769\\\"; }\\n\\n.fa-microchip::before {\\n content: \\\"\\\\f2db\\\"; }\\n\\n.fa-crown::before {\\n content: \\\"\\\\f521\\\"; }\\n\\n.fa-weight-hanging::before {\\n content: \\\"\\\\f5cd\\\"; }\\n\\n.fa-xmarks-lines::before {\\n content: \\\"\\\\e59a\\\"; }\\n\\n.fa-file-prescription::before {\\n content: \\\"\\\\f572\\\"; }\\n\\n.fa-weight-scale::before {\\n content: \\\"\\\\f496\\\"; }\\n\\n.fa-weight::before {\\n content: \\\"\\\\f496\\\"; }\\n\\n.fa-user-group::before {\\n content: \\\"\\\\f500\\\"; }\\n\\n.fa-user-friends::before {\\n content: \\\"\\\\f500\\\"; }\\n\\n.fa-arrow-up-a-z::before {\\n content: \\\"\\\\f15e\\\"; }\\n\\n.fa-sort-alpha-up::before {\\n content: \\\"\\\\f15e\\\"; }\\n\\n.fa-chess-knight::before {\\n content: \\\"\\\\f441\\\"; }\\n\\n.fa-face-laugh-squint::before {\\n content: \\\"\\\\f59b\\\"; }\\n\\n.fa-laugh-squint::before {\\n content: \\\"\\\\f59b\\\"; }\\n\\n.fa-wheelchair::before {\\n content: \\\"\\\\f193\\\"; }\\n\\n.fa-circle-arrow-up::before {\\n content: \\\"\\\\f0aa\\\"; }\\n\\n.fa-arrow-circle-up::before {\\n content: \\\"\\\\f0aa\\\"; }\\n\\n.fa-toggle-on::before {\\n content: \\\"\\\\f205\\\"; }\\n\\n.fa-person-walking::before {\\n content: \\\"\\\\f554\\\"; }\\n\\n.fa-walking::before {\\n content: \\\"\\\\f554\\\"; }\\n\\n.fa-l::before {\\n content: \\\"\\\\4c\\\"; }\\n\\n.fa-fire::before {\\n content: \\\"\\\\f06d\\\"; }\\n\\n.fa-bed-pulse::before {\\n content: \\\"\\\\f487\\\"; }\\n\\n.fa-procedures::before {\\n content: \\\"\\\\f487\\\"; }\\n\\n.fa-shuttle-space::before {\\n content: \\\"\\\\f197\\\"; }\\n\\n.fa-space-shuttle::before {\\n content: \\\"\\\\f197\\\"; }\\n\\n.fa-face-laugh::before {\\n content: \\\"\\\\f599\\\"; }\\n\\n.fa-laugh::before {\\n content: \\\"\\\\f599\\\"; }\\n\\n.fa-folder-open::before {\\n content: \\\"\\\\f07c\\\"; }\\n\\n.fa-heart-circle-plus::before {\\n content: \\\"\\\\e500\\\"; }\\n\\n.fa-code-fork::before {\\n content: \\\"\\\\e13b\\\"; }\\n\\n.fa-city::before {\\n content: \\\"\\\\f64f\\\"; }\\n\\n.fa-microphone-lines::before {\\n content: \\\"\\\\f3c9\\\"; }\\n\\n.fa-microphone-alt::before {\\n content: \\\"\\\\f3c9\\\"; }\\n\\n.fa-pepper-hot::before {\\n content: \\\"\\\\f816\\\"; }\\n\\n.fa-unlock::before {\\n content: \\\"\\\\f09c\\\"; }\\n\\n.fa-colon-sign::before {\\n content: \\\"\\\\e140\\\"; }\\n\\n.fa-headset::before {\\n content: \\\"\\\\f590\\\"; }\\n\\n.fa-store-slash::before {\\n content: \\\"\\\\e071\\\"; }\\n\\n.fa-road-circle-xmark::before {\\n content: \\\"\\\\e566\\\"; }\\n\\n.fa-user-minus::before {\\n content: \\\"\\\\f503\\\"; }\\n\\n.fa-mars-stroke-up::before {\\n content: \\\"\\\\f22a\\\"; }\\n\\n.fa-mars-stroke-v::before {\\n content: \\\"\\\\f22a\\\"; }\\n\\n.fa-champagne-glasses::before {\\n content: \\\"\\\\f79f\\\"; }\\n\\n.fa-glass-cheers::before {\\n content: \\\"\\\\f79f\\\"; }\\n\\n.fa-clipboard::before {\\n content: \\\"\\\\f328\\\"; }\\n\\n.fa-house-circle-exclamation::before {\\n content: \\\"\\\\e50a\\\"; }\\n\\n.fa-file-arrow-up::before {\\n content: \\\"\\\\f574\\\"; }\\n\\n.fa-file-upload::before {\\n content: \\\"\\\\f574\\\"; }\\n\\n.fa-wifi::before {\\n content: \\\"\\\\f1eb\\\"; }\\n\\n.fa-wifi-3::before {\\n content: \\\"\\\\f1eb\\\"; }\\n\\n.fa-wifi-strong::before {\\n content: \\\"\\\\f1eb\\\"; }\\n\\n.fa-bath::before {\\n content: \\\"\\\\f2cd\\\"; }\\n\\n.fa-bathtub::before {\\n content: \\\"\\\\f2cd\\\"; }\\n\\n.fa-underline::before {\\n content: \\\"\\\\f0cd\\\"; }\\n\\n.fa-user-pen::before {\\n content: \\\"\\\\f4ff\\\"; }\\n\\n.fa-user-edit::before {\\n content: \\\"\\\\f4ff\\\"; }\\n\\n.fa-signature::before {\\n content: \\\"\\\\f5b7\\\"; }\\n\\n.fa-stroopwafel::before {\\n content: \\\"\\\\f551\\\"; }\\n\\n.fa-bold::before {\\n content: \\\"\\\\f032\\\"; }\\n\\n.fa-anchor-lock::before {\\n content: \\\"\\\\e4ad\\\"; }\\n\\n.fa-building-ngo::before {\\n content: \\\"\\\\e4d7\\\"; }\\n\\n.fa-manat-sign::before {\\n content: \\\"\\\\e1d5\\\"; }\\n\\n.fa-not-equal::before {\\n content: \\\"\\\\f53e\\\"; }\\n\\n.fa-border-top-left::before {\\n content: \\\"\\\\f853\\\"; }\\n\\n.fa-border-style::before {\\n content: \\\"\\\\f853\\\"; }\\n\\n.fa-map-location-dot::before {\\n content: \\\"\\\\f5a0\\\"; }\\n\\n.fa-map-marked-alt::before {\\n content: \\\"\\\\f5a0\\\"; }\\n\\n.fa-jedi::before {\\n content: \\\"\\\\f669\\\"; }\\n\\n.fa-square-poll-vertical::before {\\n content: \\\"\\\\f681\\\"; }\\n\\n.fa-poll::before {\\n content: \\\"\\\\f681\\\"; }\\n\\n.fa-mug-hot::before {\\n content: \\\"\\\\f7b6\\\"; }\\n\\n.fa-car-battery::before {\\n content: \\\"\\\\f5df\\\"; }\\n\\n.fa-battery-car::before {\\n content: \\\"\\\\f5df\\\"; }\\n\\n.fa-gift::before {\\n content: \\\"\\\\f06b\\\"; }\\n\\n.fa-dice-two::before {\\n content: \\\"\\\\f528\\\"; }\\n\\n.fa-chess-queen::before {\\n content: \\\"\\\\f445\\\"; }\\n\\n.fa-glasses::before {\\n content: \\\"\\\\f530\\\"; }\\n\\n.fa-chess-board::before {\\n content: \\\"\\\\f43c\\\"; }\\n\\n.fa-building-circle-check::before {\\n content: \\\"\\\\e4d2\\\"; }\\n\\n.fa-person-chalkboard::before {\\n content: \\\"\\\\e53d\\\"; }\\n\\n.fa-mars-stroke-right::before {\\n content: \\\"\\\\f22b\\\"; }\\n\\n.fa-mars-stroke-h::before {\\n content: \\\"\\\\f22b\\\"; }\\n\\n.fa-hand-back-fist::before {\\n content: \\\"\\\\f255\\\"; }\\n\\n.fa-hand-rock::before {\\n content: \\\"\\\\f255\\\"; }\\n\\n.fa-square-caret-up::before {\\n content: \\\"\\\\f151\\\"; }\\n\\n.fa-caret-square-up::before {\\n content: \\\"\\\\f151\\\"; }\\n\\n.fa-cloud-showers-water::before {\\n content: \\\"\\\\e4e4\\\"; }\\n\\n.fa-chart-bar::before {\\n content: \\\"\\\\f080\\\"; }\\n\\n.fa-bar-chart::before {\\n content: \\\"\\\\f080\\\"; }\\n\\n.fa-hands-bubbles::before {\\n content: \\\"\\\\e05e\\\"; }\\n\\n.fa-hands-wash::before {\\n content: \\\"\\\\e05e\\\"; }\\n\\n.fa-less-than-equal::before {\\n content: \\\"\\\\f537\\\"; }\\n\\n.fa-train::before {\\n content: \\\"\\\\f238\\\"; }\\n\\n.fa-eye-low-vision::before {\\n content: \\\"\\\\f2a8\\\"; }\\n\\n.fa-low-vision::before {\\n content: \\\"\\\\f2a8\\\"; }\\n\\n.fa-crow::before {\\n content: \\\"\\\\f520\\\"; }\\n\\n.fa-sailboat::before {\\n content: \\\"\\\\e445\\\"; }\\n\\n.fa-window-restore::before {\\n content: \\\"\\\\f2d2\\\"; }\\n\\n.fa-square-plus::before {\\n content: \\\"\\\\f0fe\\\"; }\\n\\n.fa-plus-square::before {\\n content: \\\"\\\\f0fe\\\"; }\\n\\n.fa-torii-gate::before {\\n content: \\\"\\\\f6a1\\\"; }\\n\\n.fa-frog::before {\\n content: \\\"\\\\f52e\\\"; }\\n\\n.fa-bucket::before {\\n content: \\\"\\\\e4cf\\\"; }\\n\\n.fa-image::before {\\n content: \\\"\\\\f03e\\\"; }\\n\\n.fa-microphone::before {\\n content: \\\"\\\\f130\\\"; }\\n\\n.fa-cow::before {\\n content: \\\"\\\\f6c8\\\"; }\\n\\n.fa-caret-up::before {\\n content: \\\"\\\\f0d8\\\"; }\\n\\n.fa-screwdriver::before {\\n content: \\\"\\\\f54a\\\"; }\\n\\n.fa-folder-closed::before {\\n content: \\\"\\\\e185\\\"; }\\n\\n.fa-house-tsunami::before {\\n content: \\\"\\\\e515\\\"; }\\n\\n.fa-square-nfi::before {\\n content: \\\"\\\\e576\\\"; }\\n\\n.fa-arrow-up-from-ground-water::before {\\n content: \\\"\\\\e4b5\\\"; }\\n\\n.fa-martini-glass::before {\\n content: \\\"\\\\f57b\\\"; }\\n\\n.fa-glass-martini-alt::before {\\n content: \\\"\\\\f57b\\\"; }\\n\\n.fa-rotate-left::before {\\n content: \\\"\\\\f2ea\\\"; }\\n\\n.fa-rotate-back::before {\\n content: \\\"\\\\f2ea\\\"; }\\n\\n.fa-rotate-backward::before {\\n content: \\\"\\\\f2ea\\\"; }\\n\\n.fa-undo-alt::before {\\n content: \\\"\\\\f2ea\\\"; }\\n\\n.fa-table-columns::before {\\n content: \\\"\\\\f0db\\\"; }\\n\\n.fa-columns::before {\\n content: \\\"\\\\f0db\\\"; }\\n\\n.fa-lemon::before {\\n content: \\\"\\\\f094\\\"; }\\n\\n.fa-head-side-mask::before {\\n content: \\\"\\\\e063\\\"; }\\n\\n.fa-handshake::before {\\n content: \\\"\\\\f2b5\\\"; }\\n\\n.fa-gem::before {\\n content: \\\"\\\\f3a5\\\"; }\\n\\n.fa-dolly::before {\\n content: \\\"\\\\f472\\\"; }\\n\\n.fa-dolly-box::before {\\n content: \\\"\\\\f472\\\"; }\\n\\n.fa-smoking::before {\\n content: \\\"\\\\f48d\\\"; }\\n\\n.fa-minimize::before {\\n content: \\\"\\\\f78c\\\"; }\\n\\n.fa-compress-arrows-alt::before {\\n content: \\\"\\\\f78c\\\"; }\\n\\n.fa-monument::before {\\n content: \\\"\\\\f5a6\\\"; }\\n\\n.fa-snowplow::before {\\n content: \\\"\\\\f7d2\\\"; }\\n\\n.fa-angles-right::before {\\n content: \\\"\\\\f101\\\"; }\\n\\n.fa-angle-double-right::before {\\n content: \\\"\\\\f101\\\"; }\\n\\n.fa-cannabis::before {\\n content: \\\"\\\\f55f\\\"; }\\n\\n.fa-circle-play::before {\\n content: \\\"\\\\f144\\\"; }\\n\\n.fa-play-circle::before {\\n content: \\\"\\\\f144\\\"; }\\n\\n.fa-tablets::before {\\n content: \\\"\\\\f490\\\"; }\\n\\n.fa-ethernet::before {\\n content: \\\"\\\\f796\\\"; }\\n\\n.fa-euro-sign::before {\\n content: \\\"\\\\f153\\\"; }\\n\\n.fa-eur::before {\\n content: \\\"\\\\f153\\\"; }\\n\\n.fa-euro::before {\\n content: \\\"\\\\f153\\\"; }\\n\\n.fa-chair::before {\\n content: \\\"\\\\f6c0\\\"; }\\n\\n.fa-circle-check::before {\\n content: \\\"\\\\f058\\\"; }\\n\\n.fa-check-circle::before {\\n content: \\\"\\\\f058\\\"; }\\n\\n.fa-circle-stop::before {\\n content: \\\"\\\\f28d\\\"; }\\n\\n.fa-stop-circle::before {\\n content: \\\"\\\\f28d\\\"; }\\n\\n.fa-compass-drafting::before {\\n content: \\\"\\\\f568\\\"; }\\n\\n.fa-drafting-compass::before {\\n content: \\\"\\\\f568\\\"; }\\n\\n.fa-plate-wheat::before {\\n content: \\\"\\\\e55a\\\"; }\\n\\n.fa-icicles::before {\\n content: \\\"\\\\f7ad\\\"; }\\n\\n.fa-person-shelter::before {\\n content: \\\"\\\\e54f\\\"; }\\n\\n.fa-neuter::before {\\n content: \\\"\\\\f22c\\\"; }\\n\\n.fa-id-badge::before {\\n content: \\\"\\\\f2c1\\\"; }\\n\\n.fa-marker::before {\\n content: \\\"\\\\f5a1\\\"; }\\n\\n.fa-face-laugh-beam::before {\\n content: \\\"\\\\f59a\\\"; }\\n\\n.fa-laugh-beam::before {\\n content: \\\"\\\\f59a\\\"; }\\n\\n.fa-helicopter-symbol::before {\\n content: \\\"\\\\e502\\\"; }\\n\\n.fa-universal-access::before {\\n content: \\\"\\\\f29a\\\"; }\\n\\n.fa-circle-chevron-up::before {\\n content: \\\"\\\\f139\\\"; }\\n\\n.fa-chevron-circle-up::before {\\n content: \\\"\\\\f139\\\"; }\\n\\n.fa-lari-sign::before {\\n content: \\\"\\\\e1c8\\\"; }\\n\\n.fa-volcano::before {\\n content: \\\"\\\\f770\\\"; }\\n\\n.fa-person-walking-dashed-line-arrow-right::before {\\n content: \\\"\\\\e553\\\"; }\\n\\n.fa-sterling-sign::before {\\n content: \\\"\\\\f154\\\"; }\\n\\n.fa-gbp::before {\\n content: \\\"\\\\f154\\\"; }\\n\\n.fa-pound-sign::before {\\n content: \\\"\\\\f154\\\"; }\\n\\n.fa-viruses::before {\\n content: \\\"\\\\e076\\\"; }\\n\\n.fa-square-person-confined::before {\\n content: \\\"\\\\e577\\\"; }\\n\\n.fa-user-tie::before {\\n content: \\\"\\\\f508\\\"; }\\n\\n.fa-arrow-down-long::before {\\n content: \\\"\\\\f175\\\"; }\\n\\n.fa-long-arrow-down::before {\\n content: \\\"\\\\f175\\\"; }\\n\\n.fa-tent-arrow-down-to-line::before {\\n content: \\\"\\\\e57e\\\"; }\\n\\n.fa-certificate::before {\\n content: \\\"\\\\f0a3\\\"; }\\n\\n.fa-reply-all::before {\\n content: \\\"\\\\f122\\\"; }\\n\\n.fa-mail-reply-all::before {\\n content: \\\"\\\\f122\\\"; }\\n\\n.fa-suitcase::before {\\n content: \\\"\\\\f0f2\\\"; }\\n\\n.fa-person-skating::before {\\n content: \\\"\\\\f7c5\\\"; }\\n\\n.fa-skating::before {\\n content: \\\"\\\\f7c5\\\"; }\\n\\n.fa-filter-circle-dollar::before {\\n content: \\\"\\\\f662\\\"; }\\n\\n.fa-funnel-dollar::before {\\n content: \\\"\\\\f662\\\"; }\\n\\n.fa-camera-retro::before {\\n content: \\\"\\\\f083\\\"; }\\n\\n.fa-circle-arrow-down::before {\\n content: \\\"\\\\f0ab\\\"; }\\n\\n.fa-arrow-circle-down::before {\\n content: \\\"\\\\f0ab\\\"; }\\n\\n.fa-file-import::before {\\n content: \\\"\\\\f56f\\\"; }\\n\\n.fa-arrow-right-to-file::before {\\n content: \\\"\\\\f56f\\\"; }\\n\\n.fa-square-arrow-up-right::before {\\n content: \\\"\\\\f14c\\\"; }\\n\\n.fa-external-link-square::before {\\n content: \\\"\\\\f14c\\\"; }\\n\\n.fa-box-open::before {\\n content: \\\"\\\\f49e\\\"; }\\n\\n.fa-scroll::before {\\n content: \\\"\\\\f70e\\\"; }\\n\\n.fa-spa::before {\\n content: \\\"\\\\f5bb\\\"; }\\n\\n.fa-location-pin-lock::before {\\n content: \\\"\\\\e51f\\\"; }\\n\\n.fa-pause::before {\\n content: \\\"\\\\f04c\\\"; }\\n\\n.fa-hill-avalanche::before {\\n content: \\\"\\\\e507\\\"; }\\n\\n.fa-temperature-empty::before {\\n content: \\\"\\\\f2cb\\\"; }\\n\\n.fa-temperature-0::before {\\n content: \\\"\\\\f2cb\\\"; }\\n\\n.fa-thermometer-0::before {\\n content: \\\"\\\\f2cb\\\"; }\\n\\n.fa-thermometer-empty::before {\\n content: \\\"\\\\f2cb\\\"; }\\n\\n.fa-bomb::before {\\n content: \\\"\\\\f1e2\\\"; }\\n\\n.fa-registered::before {\\n content: \\\"\\\\f25d\\\"; }\\n\\n.fa-address-card::before {\\n content: \\\"\\\\f2bb\\\"; }\\n\\n.fa-contact-card::before {\\n content: \\\"\\\\f2bb\\\"; }\\n\\n.fa-vcard::before {\\n content: \\\"\\\\f2bb\\\"; }\\n\\n.fa-scale-unbalanced-flip::before {\\n content: \\\"\\\\f516\\\"; }\\n\\n.fa-balance-scale-right::before {\\n content: \\\"\\\\f516\\\"; }\\n\\n.fa-subscript::before {\\n content: \\\"\\\\f12c\\\"; }\\n\\n.fa-diamond-turn-right::before {\\n content: \\\"\\\\f5eb\\\"; }\\n\\n.fa-directions::before {\\n content: \\\"\\\\f5eb\\\"; }\\n\\n.fa-burst::before {\\n content: \\\"\\\\e4dc\\\"; }\\n\\n.fa-house-laptop::before {\\n content: \\\"\\\\e066\\\"; }\\n\\n.fa-laptop-house::before {\\n content: \\\"\\\\e066\\\"; }\\n\\n.fa-face-tired::before {\\n content: \\\"\\\\f5c8\\\"; }\\n\\n.fa-tired::before {\\n content: \\\"\\\\f5c8\\\"; }\\n\\n.fa-money-bills::before {\\n content: \\\"\\\\e1f3\\\"; }\\n\\n.fa-smog::before {\\n content: \\\"\\\\f75f\\\"; }\\n\\n.fa-crutch::before {\\n content: \\\"\\\\f7f7\\\"; }\\n\\n.fa-cloud-arrow-up::before {\\n content: \\\"\\\\f0ee\\\"; }\\n\\n.fa-cloud-upload::before {\\n content: \\\"\\\\f0ee\\\"; }\\n\\n.fa-cloud-upload-alt::before {\\n content: \\\"\\\\f0ee\\\"; }\\n\\n.fa-palette::before {\\n content: \\\"\\\\f53f\\\"; }\\n\\n.fa-arrows-turn-right::before {\\n content: \\\"\\\\e4c0\\\"; }\\n\\n.fa-vest::before {\\n content: \\\"\\\\e085\\\"; }\\n\\n.fa-ferry::before {\\n content: \\\"\\\\e4ea\\\"; }\\n\\n.fa-arrows-down-to-people::before {\\n content: \\\"\\\\e4b9\\\"; }\\n\\n.fa-seedling::before {\\n content: \\\"\\\\f4d8\\\"; }\\n\\n.fa-sprout::before {\\n content: \\\"\\\\f4d8\\\"; }\\n\\n.fa-left-right::before {\\n content: \\\"\\\\f337\\\"; }\\n\\n.fa-arrows-alt-h::before {\\n content: \\\"\\\\f337\\\"; }\\n\\n.fa-boxes-packing::before {\\n content: \\\"\\\\e4c7\\\"; }\\n\\n.fa-circle-arrow-left::before {\\n content: \\\"\\\\f0a8\\\"; }\\n\\n.fa-arrow-circle-left::before {\\n content: \\\"\\\\f0a8\\\"; }\\n\\n.fa-group-arrows-rotate::before {\\n content: \\\"\\\\e4f6\\\"; }\\n\\n.fa-bowl-food::before {\\n content: \\\"\\\\e4c6\\\"; }\\n\\n.fa-candy-cane::before {\\n content: \\\"\\\\f786\\\"; }\\n\\n.fa-arrow-down-wide-short::before {\\n content: \\\"\\\\f160\\\"; }\\n\\n.fa-sort-amount-asc::before {\\n content: \\\"\\\\f160\\\"; }\\n\\n.fa-sort-amount-down::before {\\n content: \\\"\\\\f160\\\"; }\\n\\n.fa-cloud-bolt::before {\\n content: \\\"\\\\f76c\\\"; }\\n\\n.fa-thunderstorm::before {\\n content: \\\"\\\\f76c\\\"; }\\n\\n.fa-text-slash::before {\\n content: \\\"\\\\f87d\\\"; }\\n\\n.fa-remove-format::before {\\n content: \\\"\\\\f87d\\\"; }\\n\\n.fa-face-smile-wink::before {\\n content: \\\"\\\\f4da\\\"; }\\n\\n.fa-smile-wink::before {\\n content: \\\"\\\\f4da\\\"; }\\n\\n.fa-file-word::before {\\n content: \\\"\\\\f1c2\\\"; }\\n\\n.fa-file-powerpoint::before {\\n content: \\\"\\\\f1c4\\\"; }\\n\\n.fa-arrows-left-right::before {\\n content: \\\"\\\\f07e\\\"; }\\n\\n.fa-arrows-h::before {\\n content: \\\"\\\\f07e\\\"; }\\n\\n.fa-house-lock::before {\\n content: \\\"\\\\e510\\\"; }\\n\\n.fa-cloud-arrow-down::before {\\n content: \\\"\\\\f0ed\\\"; }\\n\\n.fa-cloud-download::before {\\n content: \\\"\\\\f0ed\\\"; }\\n\\n.fa-cloud-download-alt::before {\\n content: \\\"\\\\f0ed\\\"; }\\n\\n.fa-children::before {\\n content: \\\"\\\\e4e1\\\"; }\\n\\n.fa-chalkboard::before {\\n content: \\\"\\\\f51b\\\"; }\\n\\n.fa-blackboard::before {\\n content: \\\"\\\\f51b\\\"; }\\n\\n.fa-user-large-slash::before {\\n content: \\\"\\\\f4fa\\\"; }\\n\\n.fa-user-alt-slash::before {\\n content: \\\"\\\\f4fa\\\"; }\\n\\n.fa-envelope-open::before {\\n content: \\\"\\\\f2b6\\\"; }\\n\\n.fa-handshake-simple-slash::before {\\n content: \\\"\\\\e05f\\\"; }\\n\\n.fa-handshake-alt-slash::before {\\n content: \\\"\\\\e05f\\\"; }\\n\\n.fa-mattress-pillow::before {\\n content: \\\"\\\\e525\\\"; }\\n\\n.fa-guarani-sign::before {\\n content: \\\"\\\\e19a\\\"; }\\n\\n.fa-arrows-rotate::before {\\n content: \\\"\\\\f021\\\"; }\\n\\n.fa-refresh::before {\\n content: \\\"\\\\f021\\\"; }\\n\\n.fa-sync::before {\\n content: \\\"\\\\f021\\\"; }\\n\\n.fa-fire-extinguisher::before {\\n content: \\\"\\\\f134\\\"; }\\n\\n.fa-cruzeiro-sign::before {\\n content: \\\"\\\\e152\\\"; }\\n\\n.fa-greater-than-equal::before {\\n content: \\\"\\\\f532\\\"; }\\n\\n.fa-shield-halved::before {\\n content: \\\"\\\\f3ed\\\"; }\\n\\n.fa-shield-alt::before {\\n content: \\\"\\\\f3ed\\\"; }\\n\\n.fa-book-atlas::before {\\n content: \\\"\\\\f558\\\"; }\\n\\n.fa-atlas::before {\\n content: \\\"\\\\f558\\\"; }\\n\\n.fa-virus::before {\\n content: \\\"\\\\e074\\\"; }\\n\\n.fa-envelope-circle-check::before {\\n content: \\\"\\\\e4e8\\\"; }\\n\\n.fa-layer-group::before {\\n content: \\\"\\\\f5fd\\\"; }\\n\\n.fa-arrows-to-dot::before {\\n content: \\\"\\\\e4be\\\"; }\\n\\n.fa-archway::before {\\n content: \\\"\\\\f557\\\"; }\\n\\n.fa-heart-circle-check::before {\\n content: \\\"\\\\e4fd\\\"; }\\n\\n.fa-house-chimney-crack::before {\\n content: \\\"\\\\f6f1\\\"; }\\n\\n.fa-house-damage::before {\\n content: \\\"\\\\f6f1\\\"; }\\n\\n.fa-file-zipper::before {\\n content: \\\"\\\\f1c6\\\"; }\\n\\n.fa-file-archive::before {\\n content: \\\"\\\\f1c6\\\"; }\\n\\n.fa-square::before {\\n content: \\\"\\\\f0c8\\\"; }\\n\\n.fa-martini-glass-empty::before {\\n content: \\\"\\\\f000\\\"; }\\n\\n.fa-glass-martini::before {\\n content: \\\"\\\\f000\\\"; }\\n\\n.fa-couch::before {\\n content: \\\"\\\\f4b8\\\"; }\\n\\n.fa-cedi-sign::before {\\n content: \\\"\\\\e0df\\\"; }\\n\\n.fa-italic::before {\\n content: \\\"\\\\f033\\\"; }\\n\\n.fa-church::before {\\n content: \\\"\\\\f51d\\\"; }\\n\\n.fa-comments-dollar::before {\\n content: \\\"\\\\f653\\\"; }\\n\\n.fa-democrat::before {\\n content: \\\"\\\\f747\\\"; }\\n\\n.fa-z::before {\\n content: \\\"\\\\5a\\\"; }\\n\\n.fa-person-skiing::before {\\n content: \\\"\\\\f7c9\\\"; }\\n\\n.fa-skiing::before {\\n content: \\\"\\\\f7c9\\\"; }\\n\\n.fa-road-lock::before {\\n content: \\\"\\\\e567\\\"; }\\n\\n.fa-a::before {\\n content: \\\"\\\\41\\\"; }\\n\\n.fa-temperature-arrow-down::before {\\n content: \\\"\\\\e03f\\\"; }\\n\\n.fa-temperature-down::before {\\n content: \\\"\\\\e03f\\\"; }\\n\\n.fa-feather-pointed::before {\\n content: \\\"\\\\f56b\\\"; }\\n\\n.fa-feather-alt::before {\\n content: \\\"\\\\f56b\\\"; }\\n\\n.fa-p::before {\\n content: \\\"\\\\50\\\"; }\\n\\n.fa-snowflake::before {\\n content: \\\"\\\\f2dc\\\"; }\\n\\n.fa-newspaper::before {\\n content: \\\"\\\\f1ea\\\"; }\\n\\n.fa-rectangle-ad::before {\\n content: \\\"\\\\f641\\\"; }\\n\\n.fa-ad::before {\\n content: \\\"\\\\f641\\\"; }\\n\\n.fa-circle-arrow-right::before {\\n content: \\\"\\\\f0a9\\\"; }\\n\\n.fa-arrow-circle-right::before {\\n content: \\\"\\\\f0a9\\\"; }\\n\\n.fa-filter-circle-xmark::before {\\n content: \\\"\\\\e17b\\\"; }\\n\\n.fa-locust::before {\\n content: \\\"\\\\e520\\\"; }\\n\\n.fa-sort::before {\\n content: \\\"\\\\f0dc\\\"; }\\n\\n.fa-unsorted::before {\\n content: \\\"\\\\f0dc\\\"; }\\n\\n.fa-list-ol::before {\\n content: \\\"\\\\f0cb\\\"; }\\n\\n.fa-list-1-2::before {\\n content: \\\"\\\\f0cb\\\"; }\\n\\n.fa-list-numeric::before {\\n content: \\\"\\\\f0cb\\\"; }\\n\\n.fa-person-dress-burst::before {\\n content: \\\"\\\\e544\\\"; }\\n\\n.fa-money-check-dollar::before {\\n content: \\\"\\\\f53d\\\"; }\\n\\n.fa-money-check-alt::before {\\n content: \\\"\\\\f53d\\\"; }\\n\\n.fa-vector-square::before {\\n content: \\\"\\\\f5cb\\\"; }\\n\\n.fa-bread-slice::before {\\n content: \\\"\\\\f7ec\\\"; }\\n\\n.fa-language::before {\\n content: \\\"\\\\f1ab\\\"; }\\n\\n.fa-face-kiss-wink-heart::before {\\n content: \\\"\\\\f598\\\"; }\\n\\n.fa-kiss-wink-heart::before {\\n content: \\\"\\\\f598\\\"; }\\n\\n.fa-filter::before {\\n content: \\\"\\\\f0b0\\\"; }\\n\\n.fa-question::before {\\n content: \\\"\\\\3f\\\"; }\\n\\n.fa-file-signature::before {\\n content: \\\"\\\\f573\\\"; }\\n\\n.fa-up-down-left-right::before {\\n content: \\\"\\\\f0b2\\\"; }\\n\\n.fa-arrows-alt::before {\\n content: \\\"\\\\f0b2\\\"; }\\n\\n.fa-house-chimney-user::before {\\n content: \\\"\\\\e065\\\"; }\\n\\n.fa-hand-holding-heart::before {\\n content: \\\"\\\\f4be\\\"; }\\n\\n.fa-puzzle-piece::before {\\n content: \\\"\\\\f12e\\\"; }\\n\\n.fa-money-check::before {\\n content: \\\"\\\\f53c\\\"; }\\n\\n.fa-star-half-stroke::before {\\n content: \\\"\\\\f5c0\\\"; }\\n\\n.fa-star-half-alt::before {\\n content: \\\"\\\\f5c0\\\"; }\\n\\n.fa-code::before {\\n content: \\\"\\\\f121\\\"; }\\n\\n.fa-whiskey-glass::before {\\n content: \\\"\\\\f7a0\\\"; }\\n\\n.fa-glass-whiskey::before {\\n content: \\\"\\\\f7a0\\\"; }\\n\\n.fa-building-circle-exclamation::before {\\n content: \\\"\\\\e4d3\\\"; }\\n\\n.fa-magnifying-glass-chart::before {\\n content: \\\"\\\\e522\\\"; }\\n\\n.fa-arrow-up-right-from-square::before {\\n content: \\\"\\\\f08e\\\"; }\\n\\n.fa-external-link::before {\\n content: \\\"\\\\f08e\\\"; }\\n\\n.fa-cubes-stacked::before {\\n content: \\\"\\\\e4e6\\\"; }\\n\\n.fa-won-sign::before {\\n content: \\\"\\\\f159\\\"; }\\n\\n.fa-krw::before {\\n content: \\\"\\\\f159\\\"; }\\n\\n.fa-won::before {\\n content: \\\"\\\\f159\\\"; }\\n\\n.fa-virus-covid::before {\\n content: \\\"\\\\e4a8\\\"; }\\n\\n.fa-austral-sign::before {\\n content: \\\"\\\\e0a9\\\"; }\\n\\n.fa-f::before {\\n content: \\\"\\\\46\\\"; }\\n\\n.fa-leaf::before {\\n content: \\\"\\\\f06c\\\"; }\\n\\n.fa-road::before {\\n content: \\\"\\\\f018\\\"; }\\n\\n.fa-taxi::before {\\n content: \\\"\\\\f1ba\\\"; }\\n\\n.fa-cab::before {\\n content: \\\"\\\\f1ba\\\"; }\\n\\n.fa-person-circle-plus::before {\\n content: \\\"\\\\e541\\\"; }\\n\\n.fa-chart-pie::before {\\n content: \\\"\\\\f200\\\"; }\\n\\n.fa-pie-chart::before {\\n content: \\\"\\\\f200\\\"; }\\n\\n.fa-bolt-lightning::before {\\n content: \\\"\\\\e0b7\\\"; }\\n\\n.fa-sack-xmark::before {\\n content: \\\"\\\\e56a\\\"; }\\n\\n.fa-file-excel::before {\\n content: \\\"\\\\f1c3\\\"; }\\n\\n.fa-file-contract::before {\\n content: \\\"\\\\f56c\\\"; }\\n\\n.fa-fish-fins::before {\\n content: \\\"\\\\e4f2\\\"; }\\n\\n.fa-building-flag::before {\\n content: \\\"\\\\e4d5\\\"; }\\n\\n.fa-face-grin-beam::before {\\n content: \\\"\\\\f582\\\"; }\\n\\n.fa-grin-beam::before {\\n content: \\\"\\\\f582\\\"; }\\n\\n.fa-object-ungroup::before {\\n content: \\\"\\\\f248\\\"; }\\n\\n.fa-poop::before {\\n content: \\\"\\\\f619\\\"; }\\n\\n.fa-location-pin::before {\\n content: \\\"\\\\f041\\\"; }\\n\\n.fa-map-marker::before {\\n content: \\\"\\\\f041\\\"; }\\n\\n.fa-kaaba::before {\\n content: \\\"\\\\f66b\\\"; }\\n\\n.fa-toilet-paper::before {\\n content: \\\"\\\\f71e\\\"; }\\n\\n.fa-helmet-safety::before {\\n content: \\\"\\\\f807\\\"; }\\n\\n.fa-hard-hat::before {\\n content: \\\"\\\\f807\\\"; }\\n\\n.fa-hat-hard::before {\\n content: \\\"\\\\f807\\\"; }\\n\\n.fa-eject::before {\\n content: \\\"\\\\f052\\\"; }\\n\\n.fa-circle-right::before {\\n content: \\\"\\\\f35a\\\"; }\\n\\n.fa-arrow-alt-circle-right::before {\\n content: \\\"\\\\f35a\\\"; }\\n\\n.fa-plane-circle-check::before {\\n content: \\\"\\\\e555\\\"; }\\n\\n.fa-face-rolling-eyes::before {\\n content: \\\"\\\\f5a5\\\"; }\\n\\n.fa-meh-rolling-eyes::before {\\n content: \\\"\\\\f5a5\\\"; }\\n\\n.fa-object-group::before {\\n content: \\\"\\\\f247\\\"; }\\n\\n.fa-chart-line::before {\\n content: \\\"\\\\f201\\\"; }\\n\\n.fa-line-chart::before {\\n content: \\\"\\\\f201\\\"; }\\n\\n.fa-mask-ventilator::before {\\n content: \\\"\\\\e524\\\"; }\\n\\n.fa-arrow-right::before {\\n content: \\\"\\\\f061\\\"; }\\n\\n.fa-signs-post::before {\\n content: \\\"\\\\f277\\\"; }\\n\\n.fa-map-signs::before {\\n content: \\\"\\\\f277\\\"; }\\n\\n.fa-cash-register::before {\\n content: \\\"\\\\f788\\\"; }\\n\\n.fa-person-circle-question::before {\\n content: \\\"\\\\e542\\\"; }\\n\\n.fa-h::before {\\n content: \\\"\\\\48\\\"; }\\n\\n.fa-tarp::before {\\n content: \\\"\\\\e57b\\\"; }\\n\\n.fa-screwdriver-wrench::before {\\n content: \\\"\\\\f7d9\\\"; }\\n\\n.fa-tools::before {\\n content: \\\"\\\\f7d9\\\"; }\\n\\n.fa-arrows-to-eye::before {\\n content: \\\"\\\\e4bf\\\"; }\\n\\n.fa-plug-circle-bolt::before {\\n content: \\\"\\\\e55b\\\"; }\\n\\n.fa-heart::before {\\n content: \\\"\\\\f004\\\"; }\\n\\n.fa-mars-and-venus::before {\\n content: \\\"\\\\f224\\\"; }\\n\\n.fa-house-user::before {\\n content: \\\"\\\\e1b0\\\"; }\\n\\n.fa-home-user::before {\\n content: \\\"\\\\e1b0\\\"; }\\n\\n.fa-dumpster-fire::before {\\n content: \\\"\\\\f794\\\"; }\\n\\n.fa-house-crack::before {\\n content: \\\"\\\\e3b1\\\"; }\\n\\n.fa-martini-glass-citrus::before {\\n content: \\\"\\\\f561\\\"; }\\n\\n.fa-cocktail::before {\\n content: \\\"\\\\f561\\\"; }\\n\\n.fa-face-surprise::before {\\n content: \\\"\\\\f5c2\\\"; }\\n\\n.fa-surprise::before {\\n content: \\\"\\\\f5c2\\\"; }\\n\\n.fa-bottle-water::before {\\n content: \\\"\\\\e4c5\\\"; }\\n\\n.fa-circle-pause::before {\\n content: \\\"\\\\f28b\\\"; }\\n\\n.fa-pause-circle::before {\\n content: \\\"\\\\f28b\\\"; }\\n\\n.fa-toilet-paper-slash::before {\\n content: \\\"\\\\e072\\\"; }\\n\\n.fa-apple-whole::before {\\n content: \\\"\\\\f5d1\\\"; }\\n\\n.fa-apple-alt::before {\\n content: \\\"\\\\f5d1\\\"; }\\n\\n.fa-kitchen-set::before {\\n content: \\\"\\\\e51a\\\"; }\\n\\n.fa-r::before {\\n content: \\\"\\\\52\\\"; }\\n\\n.fa-temperature-quarter::before {\\n content: \\\"\\\\f2ca\\\"; }\\n\\n.fa-temperature-1::before {\\n content: \\\"\\\\f2ca\\\"; }\\n\\n.fa-thermometer-1::before {\\n content: \\\"\\\\f2ca\\\"; }\\n\\n.fa-thermometer-quarter::before {\\n content: \\\"\\\\f2ca\\\"; }\\n\\n.fa-cube::before {\\n content: \\\"\\\\f1b2\\\"; }\\n\\n.fa-bitcoin-sign::before {\\n content: \\\"\\\\e0b4\\\"; }\\n\\n.fa-shield-dog::before {\\n content: \\\"\\\\e573\\\"; }\\n\\n.fa-solar-panel::before {\\n content: \\\"\\\\f5ba\\\"; }\\n\\n.fa-lock-open::before {\\n content: \\\"\\\\f3c1\\\"; }\\n\\n.fa-elevator::before {\\n content: \\\"\\\\e16d\\\"; }\\n\\n.fa-money-bill-transfer::before {\\n content: \\\"\\\\e528\\\"; }\\n\\n.fa-money-bill-trend-up::before {\\n content: \\\"\\\\e529\\\"; }\\n\\n.fa-house-flood-water-circle-arrow-right::before {\\n content: \\\"\\\\e50f\\\"; }\\n\\n.fa-square-poll-horizontal::before {\\n content: \\\"\\\\f682\\\"; }\\n\\n.fa-poll-h::before {\\n content: \\\"\\\\f682\\\"; }\\n\\n.fa-circle::before {\\n content: \\\"\\\\f111\\\"; }\\n\\n.fa-backward-fast::before {\\n content: \\\"\\\\f049\\\"; }\\n\\n.fa-fast-backward::before {\\n content: \\\"\\\\f049\\\"; }\\n\\n.fa-recycle::before {\\n content: \\\"\\\\f1b8\\\"; }\\n\\n.fa-user-astronaut::before {\\n content: \\\"\\\\f4fb\\\"; }\\n\\n.fa-plane-slash::before {\\n content: \\\"\\\\e069\\\"; }\\n\\n.fa-trademark::before {\\n content: \\\"\\\\f25c\\\"; }\\n\\n.fa-basketball::before {\\n content: \\\"\\\\f434\\\"; }\\n\\n.fa-basketball-ball::before {\\n content: \\\"\\\\f434\\\"; }\\n\\n.fa-satellite-dish::before {\\n content: \\\"\\\\f7c0\\\"; }\\n\\n.fa-circle-up::before {\\n content: \\\"\\\\f35b\\\"; }\\n\\n.fa-arrow-alt-circle-up::before {\\n content: \\\"\\\\f35b\\\"; }\\n\\n.fa-mobile-screen-button::before {\\n content: \\\"\\\\f3cd\\\"; }\\n\\n.fa-mobile-alt::before {\\n content: \\\"\\\\f3cd\\\"; }\\n\\n.fa-volume-high::before {\\n content: \\\"\\\\f028\\\"; }\\n\\n.fa-volume-up::before {\\n content: \\\"\\\\f028\\\"; }\\n\\n.fa-users-rays::before {\\n content: \\\"\\\\e593\\\"; }\\n\\n.fa-wallet::before {\\n content: \\\"\\\\f555\\\"; }\\n\\n.fa-clipboard-check::before {\\n content: \\\"\\\\f46c\\\"; }\\n\\n.fa-file-audio::before {\\n content: \\\"\\\\f1c7\\\"; }\\n\\n.fa-burger::before {\\n content: \\\"\\\\f805\\\"; }\\n\\n.fa-hamburger::before {\\n content: \\\"\\\\f805\\\"; }\\n\\n.fa-wrench::before {\\n content: \\\"\\\\f0ad\\\"; }\\n\\n.fa-bugs::before {\\n content: \\\"\\\\e4d0\\\"; }\\n\\n.fa-rupee-sign::before {\\n content: \\\"\\\\f156\\\"; }\\n\\n.fa-rupee::before {\\n content: \\\"\\\\f156\\\"; }\\n\\n.fa-file-image::before {\\n content: \\\"\\\\f1c5\\\"; }\\n\\n.fa-circle-question::before {\\n content: \\\"\\\\f059\\\"; }\\n\\n.fa-question-circle::before {\\n content: \\\"\\\\f059\\\"; }\\n\\n.fa-plane-departure::before {\\n content: \\\"\\\\f5b0\\\"; }\\n\\n.fa-handshake-slash::before {\\n content: \\\"\\\\e060\\\"; }\\n\\n.fa-book-bookmark::before {\\n content: \\\"\\\\e0bb\\\"; }\\n\\n.fa-code-branch::before {\\n content: \\\"\\\\f126\\\"; }\\n\\n.fa-hat-cowboy::before {\\n content: \\\"\\\\f8c0\\\"; }\\n\\n.fa-bridge::before {\\n content: \\\"\\\\e4c8\\\"; }\\n\\n.fa-phone-flip::before {\\n content: \\\"\\\\f879\\\"; }\\n\\n.fa-phone-alt::before {\\n content: \\\"\\\\f879\\\"; }\\n\\n.fa-truck-front::before {\\n content: \\\"\\\\e2b7\\\"; }\\n\\n.fa-cat::before {\\n content: \\\"\\\\f6be\\\"; }\\n\\n.fa-anchor-circle-exclamation::before {\\n content: \\\"\\\\e4ab\\\"; }\\n\\n.fa-truck-field::before {\\n content: \\\"\\\\e58d\\\"; }\\n\\n.fa-route::before {\\n content: \\\"\\\\f4d7\\\"; }\\n\\n.fa-clipboard-question::before {\\n content: \\\"\\\\e4e3\\\"; }\\n\\n.fa-panorama::before {\\n content: \\\"\\\\e209\\\"; }\\n\\n.fa-comment-medical::before {\\n content: \\\"\\\\f7f5\\\"; }\\n\\n.fa-teeth-open::before {\\n content: \\\"\\\\f62f\\\"; }\\n\\n.fa-file-circle-minus::before {\\n content: \\\"\\\\e4ed\\\"; }\\n\\n.fa-tags::before {\\n content: \\\"\\\\f02c\\\"; }\\n\\n.fa-wine-glass::before {\\n content: \\\"\\\\f4e3\\\"; }\\n\\n.fa-forward-fast::before {\\n content: \\\"\\\\f050\\\"; }\\n\\n.fa-fast-forward::before {\\n content: \\\"\\\\f050\\\"; }\\n\\n.fa-face-meh-blank::before {\\n content: \\\"\\\\f5a4\\\"; }\\n\\n.fa-meh-blank::before {\\n content: \\\"\\\\f5a4\\\"; }\\n\\n.fa-square-parking::before {\\n content: \\\"\\\\f540\\\"; }\\n\\n.fa-parking::before {\\n content: \\\"\\\\f540\\\"; }\\n\\n.fa-house-signal::before {\\n content: \\\"\\\\e012\\\"; }\\n\\n.fa-bars-progress::before {\\n content: \\\"\\\\f828\\\"; }\\n\\n.fa-tasks-alt::before {\\n content: \\\"\\\\f828\\\"; }\\n\\n.fa-faucet-drip::before {\\n content: \\\"\\\\e006\\\"; }\\n\\n.fa-cart-flatbed::before {\\n content: \\\"\\\\f474\\\"; }\\n\\n.fa-dolly-flatbed::before {\\n content: \\\"\\\\f474\\\"; }\\n\\n.fa-ban-smoking::before {\\n content: \\\"\\\\f54d\\\"; }\\n\\n.fa-smoking-ban::before {\\n content: \\\"\\\\f54d\\\"; }\\n\\n.fa-terminal::before {\\n content: \\\"\\\\f120\\\"; }\\n\\n.fa-mobile-button::before {\\n content: \\\"\\\\f10b\\\"; }\\n\\n.fa-house-medical-flag::before {\\n content: \\\"\\\\e514\\\"; }\\n\\n.fa-basket-shopping::before {\\n content: \\\"\\\\f291\\\"; }\\n\\n.fa-shopping-basket::before {\\n content: \\\"\\\\f291\\\"; }\\n\\n.fa-tape::before {\\n content: \\\"\\\\f4db\\\"; }\\n\\n.fa-bus-simple::before {\\n content: \\\"\\\\f55e\\\"; }\\n\\n.fa-bus-alt::before {\\n content: \\\"\\\\f55e\\\"; }\\n\\n.fa-eye::before {\\n content: \\\"\\\\f06e\\\"; }\\n\\n.fa-face-sad-cry::before {\\n content: \\\"\\\\f5b3\\\"; }\\n\\n.fa-sad-cry::before {\\n content: \\\"\\\\f5b3\\\"; }\\n\\n.fa-audio-description::before {\\n content: \\\"\\\\f29e\\\"; }\\n\\n.fa-person-military-to-person::before {\\n content: \\\"\\\\e54c\\\"; }\\n\\n.fa-file-shield::before {\\n content: \\\"\\\\e4f0\\\"; }\\n\\n.fa-user-slash::before {\\n content: \\\"\\\\f506\\\"; }\\n\\n.fa-pen::before {\\n content: \\\"\\\\f304\\\"; }\\n\\n.fa-tower-observation::before {\\n content: \\\"\\\\e586\\\"; }\\n\\n.fa-file-code::before {\\n content: \\\"\\\\f1c9\\\"; }\\n\\n.fa-signal::before {\\n content: \\\"\\\\f012\\\"; }\\n\\n.fa-signal-5::before {\\n content: \\\"\\\\f012\\\"; }\\n\\n.fa-signal-perfect::before {\\n content: \\\"\\\\f012\\\"; }\\n\\n.fa-bus::before {\\n content: \\\"\\\\f207\\\"; }\\n\\n.fa-heart-circle-xmark::before {\\n content: \\\"\\\\e501\\\"; }\\n\\n.fa-house-chimney::before {\\n content: \\\"\\\\e3af\\\"; }\\n\\n.fa-home-lg::before {\\n content: \\\"\\\\e3af\\\"; }\\n\\n.fa-window-maximize::before {\\n content: \\\"\\\\f2d0\\\"; }\\n\\n.fa-face-frown::before {\\n content: \\\"\\\\f119\\\"; }\\n\\n.fa-frown::before {\\n content: \\\"\\\\f119\\\"; }\\n\\n.fa-prescription::before {\\n content: \\\"\\\\f5b1\\\"; }\\n\\n.fa-shop::before {\\n content: \\\"\\\\f54f\\\"; }\\n\\n.fa-store-alt::before {\\n content: \\\"\\\\f54f\\\"; }\\n\\n.fa-floppy-disk::before {\\n content: \\\"\\\\f0c7\\\"; }\\n\\n.fa-save::before {\\n content: \\\"\\\\f0c7\\\"; }\\n\\n.fa-vihara::before {\\n content: \\\"\\\\f6a7\\\"; }\\n\\n.fa-scale-unbalanced::before {\\n content: \\\"\\\\f515\\\"; }\\n\\n.fa-balance-scale-left::before {\\n content: \\\"\\\\f515\\\"; }\\n\\n.fa-sort-up::before {\\n content: \\\"\\\\f0de\\\"; }\\n\\n.fa-sort-asc::before {\\n content: \\\"\\\\f0de\\\"; }\\n\\n.fa-comment-dots::before {\\n content: \\\"\\\\f4ad\\\"; }\\n\\n.fa-commenting::before {\\n content: \\\"\\\\f4ad\\\"; }\\n\\n.fa-plant-wilt::before {\\n content: \\\"\\\\e5aa\\\"; }\\n\\n.fa-diamond::before {\\n content: \\\"\\\\f219\\\"; }\\n\\n.fa-face-grin-squint::before {\\n content: \\\"\\\\f585\\\"; }\\n\\n.fa-grin-squint::before {\\n content: \\\"\\\\f585\\\"; }\\n\\n.fa-hand-holding-dollar::before {\\n content: \\\"\\\\f4c0\\\"; }\\n\\n.fa-hand-holding-usd::before {\\n content: \\\"\\\\f4c0\\\"; }\\n\\n.fa-bacterium::before {\\n content: \\\"\\\\e05a\\\"; }\\n\\n.fa-hand-pointer::before {\\n content: \\\"\\\\f25a\\\"; }\\n\\n.fa-drum-steelpan::before {\\n content: \\\"\\\\f56a\\\"; }\\n\\n.fa-hand-scissors::before {\\n content: \\\"\\\\f257\\\"; }\\n\\n.fa-hands-praying::before {\\n content: \\\"\\\\f684\\\"; }\\n\\n.fa-praying-hands::before {\\n content: \\\"\\\\f684\\\"; }\\n\\n.fa-arrow-rotate-right::before {\\n content: \\\"\\\\f01e\\\"; }\\n\\n.fa-arrow-right-rotate::before {\\n content: \\\"\\\\f01e\\\"; }\\n\\n.fa-arrow-rotate-forward::before {\\n content: \\\"\\\\f01e\\\"; }\\n\\n.fa-redo::before {\\n content: \\\"\\\\f01e\\\"; }\\n\\n.fa-biohazard::before {\\n content: \\\"\\\\f780\\\"; }\\n\\n.fa-location-crosshairs::before {\\n content: \\\"\\\\f601\\\"; }\\n\\n.fa-location::before {\\n content: \\\"\\\\f601\\\"; }\\n\\n.fa-mars-double::before {\\n content: \\\"\\\\f227\\\"; }\\n\\n.fa-child-dress::before {\\n content: \\\"\\\\e59c\\\"; }\\n\\n.fa-users-between-lines::before {\\n content: \\\"\\\\e591\\\"; }\\n\\n.fa-lungs-virus::before {\\n content: \\\"\\\\e067\\\"; }\\n\\n.fa-face-grin-tears::before {\\n content: \\\"\\\\f588\\\"; }\\n\\n.fa-grin-tears::before {\\n content: \\\"\\\\f588\\\"; }\\n\\n.fa-phone::before {\\n content: \\\"\\\\f095\\\"; }\\n\\n.fa-calendar-xmark::before {\\n content: \\\"\\\\f273\\\"; }\\n\\n.fa-calendar-times::before {\\n content: \\\"\\\\f273\\\"; }\\n\\n.fa-child-reaching::before {\\n content: \\\"\\\\e59d\\\"; }\\n\\n.fa-head-side-virus::before {\\n content: \\\"\\\\e064\\\"; }\\n\\n.fa-user-gear::before {\\n content: \\\"\\\\f4fe\\\"; }\\n\\n.fa-user-cog::before {\\n content: \\\"\\\\f4fe\\\"; }\\n\\n.fa-arrow-up-1-9::before {\\n content: \\\"\\\\f163\\\"; }\\n\\n.fa-sort-numeric-up::before {\\n content: \\\"\\\\f163\\\"; }\\n\\n.fa-door-closed::before {\\n content: \\\"\\\\f52a\\\"; }\\n\\n.fa-shield-virus::before {\\n content: \\\"\\\\e06c\\\"; }\\n\\n.fa-dice-six::before {\\n content: \\\"\\\\f526\\\"; }\\n\\n.fa-mosquito-net::before {\\n content: \\\"\\\\e52c\\\"; }\\n\\n.fa-bridge-water::before {\\n content: \\\"\\\\e4ce\\\"; }\\n\\n.fa-person-booth::before {\\n content: \\\"\\\\f756\\\"; }\\n\\n.fa-text-width::before {\\n content: \\\"\\\\f035\\\"; }\\n\\n.fa-hat-wizard::before {\\n content: \\\"\\\\f6e8\\\"; }\\n\\n.fa-pen-fancy::before {\\n content: \\\"\\\\f5ac\\\"; }\\n\\n.fa-person-digging::before {\\n content: \\\"\\\\f85e\\\"; }\\n\\n.fa-digging::before {\\n content: \\\"\\\\f85e\\\"; }\\n\\n.fa-trash::before {\\n content: \\\"\\\\f1f8\\\"; }\\n\\n.fa-gauge-simple::before {\\n content: \\\"\\\\f629\\\"; }\\n\\n.fa-gauge-simple-med::before {\\n content: \\\"\\\\f629\\\"; }\\n\\n.fa-tachometer-average::before {\\n content: \\\"\\\\f629\\\"; }\\n\\n.fa-book-medical::before {\\n content: \\\"\\\\f7e6\\\"; }\\n\\n.fa-poo::before {\\n content: \\\"\\\\f2fe\\\"; }\\n\\n.fa-quote-right::before {\\n content: \\\"\\\\f10e\\\"; }\\n\\n.fa-quote-right-alt::before {\\n content: \\\"\\\\f10e\\\"; }\\n\\n.fa-shirt::before {\\n content: \\\"\\\\f553\\\"; }\\n\\n.fa-t-shirt::before {\\n content: \\\"\\\\f553\\\"; }\\n\\n.fa-tshirt::before {\\n content: \\\"\\\\f553\\\"; }\\n\\n.fa-cubes::before {\\n content: \\\"\\\\f1b3\\\"; }\\n\\n.fa-divide::before {\\n content: \\\"\\\\f529\\\"; }\\n\\n.fa-tenge-sign::before {\\n content: \\\"\\\\f7d7\\\"; }\\n\\n.fa-tenge::before {\\n content: \\\"\\\\f7d7\\\"; }\\n\\n.fa-headphones::before {\\n content: \\\"\\\\f025\\\"; }\\n\\n.fa-hands-holding::before {\\n content: \\\"\\\\f4c2\\\"; }\\n\\n.fa-hands-clapping::before {\\n content: \\\"\\\\e1a8\\\"; }\\n\\n.fa-republican::before {\\n content: \\\"\\\\f75e\\\"; }\\n\\n.fa-arrow-left::before {\\n content: \\\"\\\\f060\\\"; }\\n\\n.fa-person-circle-xmark::before {\\n content: \\\"\\\\e543\\\"; }\\n\\n.fa-ruler::before {\\n content: \\\"\\\\f545\\\"; }\\n\\n.fa-align-left::before {\\n content: \\\"\\\\f036\\\"; }\\n\\n.fa-dice-d6::before {\\n content: \\\"\\\\f6d1\\\"; }\\n\\n.fa-restroom::before {\\n content: \\\"\\\\f7bd\\\"; }\\n\\n.fa-j::before {\\n content: \\\"\\\\4a\\\"; }\\n\\n.fa-users-viewfinder::before {\\n content: \\\"\\\\e595\\\"; }\\n\\n.fa-file-video::before {\\n content: \\\"\\\\f1c8\\\"; }\\n\\n.fa-up-right-from-square::before {\\n content: \\\"\\\\f35d\\\"; }\\n\\n.fa-external-link-alt::before {\\n content: \\\"\\\\f35d\\\"; }\\n\\n.fa-table-cells::before {\\n content: \\\"\\\\f00a\\\"; }\\n\\n.fa-th::before {\\n content: \\\"\\\\f00a\\\"; }\\n\\n.fa-file-pdf::before {\\n content: \\\"\\\\f1c1\\\"; }\\n\\n.fa-book-bible::before {\\n content: \\\"\\\\f647\\\"; }\\n\\n.fa-bible::before {\\n content: \\\"\\\\f647\\\"; }\\n\\n.fa-o::before {\\n content: \\\"\\\\4f\\\"; }\\n\\n.fa-suitcase-medical::before {\\n content: \\\"\\\\f0fa\\\"; }\\n\\n.fa-medkit::before {\\n content: \\\"\\\\f0fa\\\"; }\\n\\n.fa-user-secret::before {\\n content: \\\"\\\\f21b\\\"; }\\n\\n.fa-otter::before {\\n content: \\\"\\\\f700\\\"; }\\n\\n.fa-person-dress::before {\\n content: \\\"\\\\f182\\\"; }\\n\\n.fa-female::before {\\n content: \\\"\\\\f182\\\"; }\\n\\n.fa-comment-dollar::before {\\n content: \\\"\\\\f651\\\"; }\\n\\n.fa-business-time::before {\\n content: \\\"\\\\f64a\\\"; }\\n\\n.fa-briefcase-clock::before {\\n content: \\\"\\\\f64a\\\"; }\\n\\n.fa-table-cells-large::before {\\n content: \\\"\\\\f009\\\"; }\\n\\n.fa-th-large::before {\\n content: \\\"\\\\f009\\\"; }\\n\\n.fa-book-tanakh::before {\\n content: \\\"\\\\f827\\\"; }\\n\\n.fa-tanakh::before {\\n content: \\\"\\\\f827\\\"; }\\n\\n.fa-phone-volume::before {\\n content: \\\"\\\\f2a0\\\"; }\\n\\n.fa-volume-control-phone::before {\\n content: \\\"\\\\f2a0\\\"; }\\n\\n.fa-hat-cowboy-side::before {\\n content: \\\"\\\\f8c1\\\"; }\\n\\n.fa-clipboard-user::before {\\n content: \\\"\\\\f7f3\\\"; }\\n\\n.fa-child::before {\\n content: \\\"\\\\f1ae\\\"; }\\n\\n.fa-lira-sign::before {\\n content: \\\"\\\\f195\\\"; }\\n\\n.fa-satellite::before {\\n content: \\\"\\\\f7bf\\\"; }\\n\\n.fa-plane-lock::before {\\n content: \\\"\\\\e558\\\"; }\\n\\n.fa-tag::before {\\n content: \\\"\\\\f02b\\\"; }\\n\\n.fa-comment::before {\\n content: \\\"\\\\f075\\\"; }\\n\\n.fa-cake-candles::before {\\n content: \\\"\\\\f1fd\\\"; }\\n\\n.fa-birthday-cake::before {\\n content: \\\"\\\\f1fd\\\"; }\\n\\n.fa-cake::before {\\n content: \\\"\\\\f1fd\\\"; }\\n\\n.fa-envelope::before {\\n content: \\\"\\\\f0e0\\\"; }\\n\\n.fa-angles-up::before {\\n content: \\\"\\\\f102\\\"; }\\n\\n.fa-angle-double-up::before {\\n content: \\\"\\\\f102\\\"; }\\n\\n.fa-paperclip::before {\\n content: \\\"\\\\f0c6\\\"; }\\n\\n.fa-arrow-right-to-city::before {\\n content: \\\"\\\\e4b3\\\"; }\\n\\n.fa-ribbon::before {\\n content: \\\"\\\\f4d6\\\"; }\\n\\n.fa-lungs::before {\\n content: \\\"\\\\f604\\\"; }\\n\\n.fa-arrow-up-9-1::before {\\n content: \\\"\\\\f887\\\"; }\\n\\n.fa-sort-numeric-up-alt::before {\\n content: \\\"\\\\f887\\\"; }\\n\\n.fa-litecoin-sign::before {\\n content: \\\"\\\\e1d3\\\"; }\\n\\n.fa-border-none::before {\\n content: \\\"\\\\f850\\\"; }\\n\\n.fa-circle-nodes::before {\\n content: \\\"\\\\e4e2\\\"; }\\n\\n.fa-parachute-box::before {\\n content: \\\"\\\\f4cd\\\"; }\\n\\n.fa-indent::before {\\n content: \\\"\\\\f03c\\\"; }\\n\\n.fa-truck-field-un::before {\\n content: \\\"\\\\e58e\\\"; }\\n\\n.fa-hourglass::before {\\n content: \\\"\\\\f254\\\"; }\\n\\n.fa-hourglass-empty::before {\\n content: \\\"\\\\f254\\\"; }\\n\\n.fa-mountain::before {\\n content: \\\"\\\\f6fc\\\"; }\\n\\n.fa-user-doctor::before {\\n content: \\\"\\\\f0f0\\\"; }\\n\\n.fa-user-md::before {\\n content: \\\"\\\\f0f0\\\"; }\\n\\n.fa-circle-info::before {\\n content: \\\"\\\\f05a\\\"; }\\n\\n.fa-info-circle::before {\\n content: \\\"\\\\f05a\\\"; }\\n\\n.fa-cloud-meatball::before {\\n content: \\\"\\\\f73b\\\"; }\\n\\n.fa-camera::before {\\n content: \\\"\\\\f030\\\"; }\\n\\n.fa-camera-alt::before {\\n content: \\\"\\\\f030\\\"; }\\n\\n.fa-square-virus::before {\\n content: \\\"\\\\e578\\\"; }\\n\\n.fa-meteor::before {\\n content: \\\"\\\\f753\\\"; }\\n\\n.fa-car-on::before {\\n content: \\\"\\\\e4dd\\\"; }\\n\\n.fa-sleigh::before {\\n content: \\\"\\\\f7cc\\\"; }\\n\\n.fa-arrow-down-1-9::before {\\n content: \\\"\\\\f162\\\"; }\\n\\n.fa-sort-numeric-asc::before {\\n content: \\\"\\\\f162\\\"; }\\n\\n.fa-sort-numeric-down::before {\\n content: \\\"\\\\f162\\\"; }\\n\\n.fa-hand-holding-droplet::before {\\n content: \\\"\\\\f4c1\\\"; }\\n\\n.fa-hand-holding-water::before {\\n content: \\\"\\\\f4c1\\\"; }\\n\\n.fa-water::before {\\n content: \\\"\\\\f773\\\"; }\\n\\n.fa-calendar-check::before {\\n content: \\\"\\\\f274\\\"; }\\n\\n.fa-braille::before {\\n content: \\\"\\\\f2a1\\\"; }\\n\\n.fa-prescription-bottle-medical::before {\\n content: \\\"\\\\f486\\\"; }\\n\\n.fa-prescription-bottle-alt::before {\\n content: \\\"\\\\f486\\\"; }\\n\\n.fa-landmark::before {\\n content: \\\"\\\\f66f\\\"; }\\n\\n.fa-truck::before {\\n content: \\\"\\\\f0d1\\\"; }\\n\\n.fa-crosshairs::before {\\n content: \\\"\\\\f05b\\\"; }\\n\\n.fa-person-cane::before {\\n content: \\\"\\\\e53c\\\"; }\\n\\n.fa-tent::before {\\n content: \\\"\\\\e57d\\\"; }\\n\\n.fa-vest-patches::before {\\n content: \\\"\\\\e086\\\"; }\\n\\n.fa-check-double::before {\\n content: \\\"\\\\f560\\\"; }\\n\\n.fa-arrow-down-a-z::before {\\n content: \\\"\\\\f15d\\\"; }\\n\\n.fa-sort-alpha-asc::before {\\n content: \\\"\\\\f15d\\\"; }\\n\\n.fa-sort-alpha-down::before {\\n content: \\\"\\\\f15d\\\"; }\\n\\n.fa-money-bill-wheat::before {\\n content: \\\"\\\\e52a\\\"; }\\n\\n.fa-cookie::before {\\n content: \\\"\\\\f563\\\"; }\\n\\n.fa-arrow-rotate-left::before {\\n content: \\\"\\\\f0e2\\\"; }\\n\\n.fa-arrow-left-rotate::before {\\n content: \\\"\\\\f0e2\\\"; }\\n\\n.fa-arrow-rotate-back::before {\\n content: \\\"\\\\f0e2\\\"; }\\n\\n.fa-arrow-rotate-backward::before {\\n content: \\\"\\\\f0e2\\\"; }\\n\\n.fa-undo::before {\\n content: \\\"\\\\f0e2\\\"; }\\n\\n.fa-hard-drive::before {\\n content: \\\"\\\\f0a0\\\"; }\\n\\n.fa-hdd::before {\\n content: \\\"\\\\f0a0\\\"; }\\n\\n.fa-face-grin-squint-tears::before {\\n content: \\\"\\\\f586\\\"; }\\n\\n.fa-grin-squint-tears::before {\\n content: \\\"\\\\f586\\\"; }\\n\\n.fa-dumbbell::before {\\n content: \\\"\\\\f44b\\\"; }\\n\\n.fa-rectangle-list::before {\\n content: \\\"\\\\f022\\\"; }\\n\\n.fa-list-alt::before {\\n content: \\\"\\\\f022\\\"; }\\n\\n.fa-tarp-droplet::before {\\n content: \\\"\\\\e57c\\\"; }\\n\\n.fa-house-medical-circle-check::before {\\n content: \\\"\\\\e511\\\"; }\\n\\n.fa-person-skiing-nordic::before {\\n content: \\\"\\\\f7ca\\\"; }\\n\\n.fa-skiing-nordic::before {\\n content: \\\"\\\\f7ca\\\"; }\\n\\n.fa-calendar-plus::before {\\n content: \\\"\\\\f271\\\"; }\\n\\n.fa-plane-arrival::before {\\n content: \\\"\\\\f5af\\\"; }\\n\\n.fa-circle-left::before {\\n content: \\\"\\\\f359\\\"; }\\n\\n.fa-arrow-alt-circle-left::before {\\n content: \\\"\\\\f359\\\"; }\\n\\n.fa-train-subway::before {\\n content: \\\"\\\\f239\\\"; }\\n\\n.fa-subway::before {\\n content: \\\"\\\\f239\\\"; }\\n\\n.fa-chart-gantt::before {\\n content: \\\"\\\\e0e4\\\"; }\\n\\n.fa-indian-rupee-sign::before {\\n content: \\\"\\\\e1bc\\\"; }\\n\\n.fa-indian-rupee::before {\\n content: \\\"\\\\e1bc\\\"; }\\n\\n.fa-inr::before {\\n content: \\\"\\\\e1bc\\\"; }\\n\\n.fa-crop-simple::before {\\n content: \\\"\\\\f565\\\"; }\\n\\n.fa-crop-alt::before {\\n content: \\\"\\\\f565\\\"; }\\n\\n.fa-money-bill-1::before {\\n content: \\\"\\\\f3d1\\\"; }\\n\\n.fa-money-bill-alt::before {\\n content: \\\"\\\\f3d1\\\"; }\\n\\n.fa-left-long::before {\\n content: \\\"\\\\f30a\\\"; }\\n\\n.fa-long-arrow-alt-left::before {\\n content: \\\"\\\\f30a\\\"; }\\n\\n.fa-dna::before {\\n content: \\\"\\\\f471\\\"; }\\n\\n.fa-virus-slash::before {\\n content: \\\"\\\\e075\\\"; }\\n\\n.fa-minus::before {\\n content: \\\"\\\\f068\\\"; }\\n\\n.fa-subtract::before {\\n content: \\\"\\\\f068\\\"; }\\n\\n.fa-child-rifle::before {\\n content: \\\"\\\\e4e0\\\"; }\\n\\n.fa-chess::before {\\n content: \\\"\\\\f439\\\"; }\\n\\n.fa-arrow-left-long::before {\\n content: \\\"\\\\f177\\\"; }\\n\\n.fa-long-arrow-left::before {\\n content: \\\"\\\\f177\\\"; }\\n\\n.fa-plug-circle-check::before {\\n content: \\\"\\\\e55c\\\"; }\\n\\n.fa-street-view::before {\\n content: \\\"\\\\f21d\\\"; }\\n\\n.fa-franc-sign::before {\\n content: \\\"\\\\e18f\\\"; }\\n\\n.fa-volume-off::before {\\n content: \\\"\\\\f026\\\"; }\\n\\n.fa-hands-asl-interpreting::before {\\n content: \\\"\\\\f2a3\\\"; }\\n\\n.fa-american-sign-language-interpreting::before {\\n content: \\\"\\\\f2a3\\\"; }\\n\\n.fa-asl-interpreting::before {\\n content: \\\"\\\\f2a3\\\"; }\\n\\n.fa-hands-american-sign-language-interpreting::before {\\n content: \\\"\\\\f2a3\\\"; }\\n\\n.fa-gear::before {\\n content: \\\"\\\\f013\\\"; }\\n\\n.fa-cog::before {\\n content: \\\"\\\\f013\\\"; }\\n\\n.fa-droplet-slash::before {\\n content: \\\"\\\\f5c7\\\"; }\\n\\n.fa-tint-slash::before {\\n content: \\\"\\\\f5c7\\\"; }\\n\\n.fa-mosque::before {\\n content: \\\"\\\\f678\\\"; }\\n\\n.fa-mosquito::before {\\n content: \\\"\\\\e52b\\\"; }\\n\\n.fa-star-of-david::before {\\n content: \\\"\\\\f69a\\\"; }\\n\\n.fa-person-military-rifle::before {\\n content: \\\"\\\\e54b\\\"; }\\n\\n.fa-cart-shopping::before {\\n content: \\\"\\\\f07a\\\"; }\\n\\n.fa-shopping-cart::before {\\n content: \\\"\\\\f07a\\\"; }\\n\\n.fa-vials::before {\\n content: \\\"\\\\f493\\\"; }\\n\\n.fa-plug-circle-plus::before {\\n content: \\\"\\\\e55f\\\"; }\\n\\n.fa-place-of-worship::before {\\n content: \\\"\\\\f67f\\\"; }\\n\\n.fa-grip-vertical::before {\\n content: \\\"\\\\f58e\\\"; }\\n\\n.fa-arrow-turn-up::before {\\n content: \\\"\\\\f148\\\"; }\\n\\n.fa-level-up::before {\\n content: \\\"\\\\f148\\\"; }\\n\\n.fa-u::before {\\n content: \\\"\\\\55\\\"; }\\n\\n.fa-square-root-variable::before {\\n content: \\\"\\\\f698\\\"; }\\n\\n.fa-square-root-alt::before {\\n content: \\\"\\\\f698\\\"; }\\n\\n.fa-clock::before {\\n content: \\\"\\\\f017\\\"; }\\n\\n.fa-clock-four::before {\\n content: \\\"\\\\f017\\\"; }\\n\\n.fa-backward-step::before {\\n content: \\\"\\\\f048\\\"; }\\n\\n.fa-step-backward::before {\\n content: \\\"\\\\f048\\\"; }\\n\\n.fa-pallet::before {\\n content: \\\"\\\\f482\\\"; }\\n\\n.fa-faucet::before {\\n content: \\\"\\\\e005\\\"; }\\n\\n.fa-baseball-bat-ball::before {\\n content: \\\"\\\\f432\\\"; }\\n\\n.fa-s::before {\\n content: \\\"\\\\53\\\"; }\\n\\n.fa-timeline::before {\\n content: \\\"\\\\e29c\\\"; }\\n\\n.fa-keyboard::before {\\n content: \\\"\\\\f11c\\\"; }\\n\\n.fa-caret-down::before {\\n content: \\\"\\\\f0d7\\\"; }\\n\\n.fa-house-chimney-medical::before {\\n content: \\\"\\\\f7f2\\\"; }\\n\\n.fa-clinic-medical::before {\\n content: \\\"\\\\f7f2\\\"; }\\n\\n.fa-temperature-three-quarters::before {\\n content: \\\"\\\\f2c8\\\"; }\\n\\n.fa-temperature-3::before {\\n content: \\\"\\\\f2c8\\\"; }\\n\\n.fa-thermometer-3::before {\\n content: \\\"\\\\f2c8\\\"; }\\n\\n.fa-thermometer-three-quarters::before {\\n content: \\\"\\\\f2c8\\\"; }\\n\\n.fa-mobile-screen::before {\\n content: \\\"\\\\f3cf\\\"; }\\n\\n.fa-mobile-android-alt::before {\\n content: \\\"\\\\f3cf\\\"; }\\n\\n.fa-plane-up::before {\\n content: \\\"\\\\e22d\\\"; }\\n\\n.fa-piggy-bank::before {\\n content: \\\"\\\\f4d3\\\"; }\\n\\n.fa-battery-half::before {\\n content: \\\"\\\\f242\\\"; }\\n\\n.fa-battery-3::before {\\n content: \\\"\\\\f242\\\"; }\\n\\n.fa-mountain-city::before {\\n content: \\\"\\\\e52e\\\"; }\\n\\n.fa-coins::before {\\n content: \\\"\\\\f51e\\\"; }\\n\\n.fa-khanda::before {\\n content: \\\"\\\\f66d\\\"; }\\n\\n.fa-sliders::before {\\n content: \\\"\\\\f1de\\\"; }\\n\\n.fa-sliders-h::before {\\n content: \\\"\\\\f1de\\\"; }\\n\\n.fa-folder-tree::before {\\n content: \\\"\\\\f802\\\"; }\\n\\n.fa-network-wired::before {\\n content: \\\"\\\\f6ff\\\"; }\\n\\n.fa-map-pin::before {\\n content: \\\"\\\\f276\\\"; }\\n\\n.fa-hamsa::before {\\n content: \\\"\\\\f665\\\"; }\\n\\n.fa-cent-sign::before {\\n content: \\\"\\\\e3f5\\\"; }\\n\\n.fa-flask::before {\\n content: \\\"\\\\f0c3\\\"; }\\n\\n.fa-person-pregnant::before {\\n content: \\\"\\\\e31e\\\"; }\\n\\n.fa-wand-sparkles::before {\\n content: \\\"\\\\f72b\\\"; }\\n\\n.fa-ellipsis-vertical::before {\\n content: \\\"\\\\f142\\\"; }\\n\\n.fa-ellipsis-v::before {\\n content: \\\"\\\\f142\\\"; }\\n\\n.fa-ticket::before {\\n content: \\\"\\\\f145\\\"; }\\n\\n.fa-power-off::before {\\n content: \\\"\\\\f011\\\"; }\\n\\n.fa-right-long::before {\\n content: \\\"\\\\f30b\\\"; }\\n\\n.fa-long-arrow-alt-right::before {\\n content: \\\"\\\\f30b\\\"; }\\n\\n.fa-flag-usa::before {\\n content: \\\"\\\\f74d\\\"; }\\n\\n.fa-laptop-file::before {\\n content: \\\"\\\\e51d\\\"; }\\n\\n.fa-tty::before {\\n content: \\\"\\\\f1e4\\\"; }\\n\\n.fa-teletype::before {\\n content: \\\"\\\\f1e4\\\"; }\\n\\n.fa-diagram-next::before {\\n content: \\\"\\\\e476\\\"; }\\n\\n.fa-person-rifle::before {\\n content: \\\"\\\\e54e\\\"; }\\n\\n.fa-house-medical-circle-exclamation::before {\\n content: \\\"\\\\e512\\\"; }\\n\\n.fa-closed-captioning::before {\\n content: \\\"\\\\f20a\\\"; }\\n\\n.fa-person-hiking::before {\\n content: \\\"\\\\f6ec\\\"; }\\n\\n.fa-hiking::before {\\n content: \\\"\\\\f6ec\\\"; }\\n\\n.fa-venus-double::before {\\n content: \\\"\\\\f226\\\"; }\\n\\n.fa-images::before {\\n content: \\\"\\\\f302\\\"; }\\n\\n.fa-calculator::before {\\n content: \\\"\\\\f1ec\\\"; }\\n\\n.fa-people-pulling::before {\\n content: \\\"\\\\e535\\\"; }\\n\\n.fa-n::before {\\n content: \\\"\\\\4e\\\"; }\\n\\n.fa-cable-car::before {\\n content: \\\"\\\\f7da\\\"; }\\n\\n.fa-tram::before {\\n content: \\\"\\\\f7da\\\"; }\\n\\n.fa-cloud-rain::before {\\n content: \\\"\\\\f73d\\\"; }\\n\\n.fa-building-circle-xmark::before {\\n content: \\\"\\\\e4d4\\\"; }\\n\\n.fa-ship::before {\\n content: \\\"\\\\f21a\\\"; }\\n\\n.fa-arrows-down-to-line::before {\\n content: \\\"\\\\e4b8\\\"; }\\n\\n.fa-download::before {\\n content: \\\"\\\\f019\\\"; }\\n\\n.fa-face-grin::before {\\n content: \\\"\\\\f580\\\"; }\\n\\n.fa-grin::before {\\n content: \\\"\\\\f580\\\"; }\\n\\n.fa-delete-left::before {\\n content: \\\"\\\\f55a\\\"; }\\n\\n.fa-backspace::before {\\n content: \\\"\\\\f55a\\\"; }\\n\\n.fa-eye-dropper::before {\\n content: \\\"\\\\f1fb\\\"; }\\n\\n.fa-eye-dropper-empty::before {\\n content: \\\"\\\\f1fb\\\"; }\\n\\n.fa-eyedropper::before {\\n content: \\\"\\\\f1fb\\\"; }\\n\\n.fa-file-circle-check::before {\\n content: \\\"\\\\e5a0\\\"; }\\n\\n.fa-forward::before {\\n content: \\\"\\\\f04e\\\"; }\\n\\n.fa-mobile::before {\\n content: \\\"\\\\f3ce\\\"; }\\n\\n.fa-mobile-android::before {\\n content: \\\"\\\\f3ce\\\"; }\\n\\n.fa-mobile-phone::before {\\n content: \\\"\\\\f3ce\\\"; }\\n\\n.fa-face-meh::before {\\n content: \\\"\\\\f11a\\\"; }\\n\\n.fa-meh::before {\\n content: \\\"\\\\f11a\\\"; }\\n\\n.fa-align-center::before {\\n content: \\\"\\\\f037\\\"; }\\n\\n.fa-book-skull::before {\\n content: \\\"\\\\f6b7\\\"; }\\n\\n.fa-book-dead::before {\\n content: \\\"\\\\f6b7\\\"; }\\n\\n.fa-id-card::before {\\n content: \\\"\\\\f2c2\\\"; }\\n\\n.fa-drivers-license::before {\\n content: \\\"\\\\f2c2\\\"; }\\n\\n.fa-outdent::before {\\n content: \\\"\\\\f03b\\\"; }\\n\\n.fa-dedent::before {\\n content: \\\"\\\\f03b\\\"; }\\n\\n.fa-heart-circle-exclamation::before {\\n content: \\\"\\\\e4fe\\\"; }\\n\\n.fa-house::before {\\n content: \\\"\\\\f015\\\"; }\\n\\n.fa-home::before {\\n content: \\\"\\\\f015\\\"; }\\n\\n.fa-home-alt::before {\\n content: \\\"\\\\f015\\\"; }\\n\\n.fa-home-lg-alt::before {\\n content: \\\"\\\\f015\\\"; }\\n\\n.fa-calendar-week::before {\\n content: \\\"\\\\f784\\\"; }\\n\\n.fa-laptop-medical::before {\\n content: \\\"\\\\f812\\\"; }\\n\\n.fa-b::before {\\n content: \\\"\\\\42\\\"; }\\n\\n.fa-file-medical::before {\\n content: \\\"\\\\f477\\\"; }\\n\\n.fa-dice-one::before {\\n content: \\\"\\\\f525\\\"; }\\n\\n.fa-kiwi-bird::before {\\n content: \\\"\\\\f535\\\"; }\\n\\n.fa-arrow-right-arrow-left::before {\\n content: \\\"\\\\f0ec\\\"; }\\n\\n.fa-exchange::before {\\n content: \\\"\\\\f0ec\\\"; }\\n\\n.fa-rotate-right::before {\\n content: \\\"\\\\f2f9\\\"; }\\n\\n.fa-redo-alt::before {\\n content: \\\"\\\\f2f9\\\"; }\\n\\n.fa-rotate-forward::before {\\n content: \\\"\\\\f2f9\\\"; }\\n\\n.fa-utensils::before {\\n content: \\\"\\\\f2e7\\\"; }\\n\\n.fa-cutlery::before {\\n content: \\\"\\\\f2e7\\\"; }\\n\\n.fa-arrow-up-wide-short::before {\\n content: \\\"\\\\f161\\\"; }\\n\\n.fa-sort-amount-up::before {\\n content: \\\"\\\\f161\\\"; }\\n\\n.fa-mill-sign::before {\\n content: \\\"\\\\e1ed\\\"; }\\n\\n.fa-bowl-rice::before {\\n content: \\\"\\\\e2eb\\\"; }\\n\\n.fa-skull::before {\\n content: \\\"\\\\f54c\\\"; }\\n\\n.fa-tower-broadcast::before {\\n content: \\\"\\\\f519\\\"; }\\n\\n.fa-broadcast-tower::before {\\n content: \\\"\\\\f519\\\"; }\\n\\n.fa-truck-pickup::before {\\n content: \\\"\\\\f63c\\\"; }\\n\\n.fa-up-long::before {\\n content: \\\"\\\\f30c\\\"; }\\n\\n.fa-long-arrow-alt-up::before {\\n content: \\\"\\\\f30c\\\"; }\\n\\n.fa-stop::before {\\n content: \\\"\\\\f04d\\\"; }\\n\\n.fa-code-merge::before {\\n content: \\\"\\\\f387\\\"; }\\n\\n.fa-upload::before {\\n content: \\\"\\\\f093\\\"; }\\n\\n.fa-hurricane::before {\\n content: \\\"\\\\f751\\\"; }\\n\\n.fa-mound::before {\\n content: \\\"\\\\e52d\\\"; }\\n\\n.fa-toilet-portable::before {\\n content: \\\"\\\\e583\\\"; }\\n\\n.fa-compact-disc::before {\\n content: \\\"\\\\f51f\\\"; }\\n\\n.fa-file-arrow-down::before {\\n content: \\\"\\\\f56d\\\"; }\\n\\n.fa-file-download::before {\\n content: \\\"\\\\f56d\\\"; }\\n\\n.fa-caravan::before {\\n content: \\\"\\\\f8ff\\\"; }\\n\\n.fa-shield-cat::before {\\n content: \\\"\\\\e572\\\"; }\\n\\n.fa-bolt::before {\\n content: \\\"\\\\f0e7\\\"; }\\n\\n.fa-zap::before {\\n content: \\\"\\\\f0e7\\\"; }\\n\\n.fa-glass-water::before {\\n content: \\\"\\\\e4f4\\\"; }\\n\\n.fa-oil-well::before {\\n content: \\\"\\\\e532\\\"; }\\n\\n.fa-vault::before {\\n content: \\\"\\\\e2c5\\\"; }\\n\\n.fa-mars::before {\\n content: \\\"\\\\f222\\\"; }\\n\\n.fa-toilet::before {\\n content: \\\"\\\\f7d8\\\"; }\\n\\n.fa-plane-circle-xmark::before {\\n content: \\\"\\\\e557\\\"; }\\n\\n.fa-yen-sign::before {\\n content: \\\"\\\\f157\\\"; }\\n\\n.fa-cny::before {\\n content: \\\"\\\\f157\\\"; }\\n\\n.fa-jpy::before {\\n content: \\\"\\\\f157\\\"; }\\n\\n.fa-rmb::before {\\n content: \\\"\\\\f157\\\"; }\\n\\n.fa-yen::before {\\n content: \\\"\\\\f157\\\"; }\\n\\n.fa-ruble-sign::before {\\n content: \\\"\\\\f158\\\"; }\\n\\n.fa-rouble::before {\\n content: \\\"\\\\f158\\\"; }\\n\\n.fa-rub::before {\\n content: \\\"\\\\f158\\\"; }\\n\\n.fa-ruble::before {\\n content: \\\"\\\\f158\\\"; }\\n\\n.fa-sun::before {\\n content: \\\"\\\\f185\\\"; }\\n\\n.fa-guitar::before {\\n content: \\\"\\\\f7a6\\\"; }\\n\\n.fa-face-laugh-wink::before {\\n content: \\\"\\\\f59c\\\"; }\\n\\n.fa-laugh-wink::before {\\n content: \\\"\\\\f59c\\\"; }\\n\\n.fa-horse-head::before {\\n content: \\\"\\\\f7ab\\\"; }\\n\\n.fa-bore-hole::before {\\n content: \\\"\\\\e4c3\\\"; }\\n\\n.fa-industry::before {\\n content: \\\"\\\\f275\\\"; }\\n\\n.fa-circle-down::before {\\n content: \\\"\\\\f358\\\"; }\\n\\n.fa-arrow-alt-circle-down::before {\\n content: \\\"\\\\f358\\\"; }\\n\\n.fa-arrows-turn-to-dots::before {\\n content: \\\"\\\\e4c1\\\"; }\\n\\n.fa-florin-sign::before {\\n content: \\\"\\\\e184\\\"; }\\n\\n.fa-arrow-down-short-wide::before {\\n content: \\\"\\\\f884\\\"; }\\n\\n.fa-sort-amount-desc::before {\\n content: \\\"\\\\f884\\\"; }\\n\\n.fa-sort-amount-down-alt::before {\\n content: \\\"\\\\f884\\\"; }\\n\\n.fa-less-than::before {\\n content: \\\"\\\\3c\\\"; }\\n\\n.fa-angle-down::before {\\n content: \\\"\\\\f107\\\"; }\\n\\n.fa-car-tunnel::before {\\n content: \\\"\\\\e4de\\\"; }\\n\\n.fa-head-side-cough::before {\\n content: \\\"\\\\e061\\\"; }\\n\\n.fa-grip-lines::before {\\n content: \\\"\\\\f7a4\\\"; }\\n\\n.fa-thumbs-down::before {\\n content: \\\"\\\\f165\\\"; }\\n\\n.fa-user-lock::before {\\n content: \\\"\\\\f502\\\"; }\\n\\n.fa-arrow-right-long::before {\\n content: \\\"\\\\f178\\\"; }\\n\\n.fa-long-arrow-right::before {\\n content: \\\"\\\\f178\\\"; }\\n\\n.fa-anchor-circle-xmark::before {\\n content: \\\"\\\\e4ac\\\"; }\\n\\n.fa-ellipsis::before {\\n content: \\\"\\\\f141\\\"; }\\n\\n.fa-ellipsis-h::before {\\n content: \\\"\\\\f141\\\"; }\\n\\n.fa-chess-pawn::before {\\n content: \\\"\\\\f443\\\"; }\\n\\n.fa-kit-medical::before {\\n content: \\\"\\\\f479\\\"; }\\n\\n.fa-first-aid::before {\\n content: \\\"\\\\f479\\\"; }\\n\\n.fa-person-through-window::before {\\n content: \\\"\\\\e5a9\\\"; }\\n\\n.fa-toolbox::before {\\n content: \\\"\\\\f552\\\"; }\\n\\n.fa-hands-holding-circle::before {\\n content: \\\"\\\\e4fb\\\"; }\\n\\n.fa-bug::before {\\n content: \\\"\\\\f188\\\"; }\\n\\n.fa-credit-card::before {\\n content: \\\"\\\\f09d\\\"; }\\n\\n.fa-credit-card-alt::before {\\n content: \\\"\\\\f09d\\\"; }\\n\\n.fa-car::before {\\n content: \\\"\\\\f1b9\\\"; }\\n\\n.fa-automobile::before {\\n content: \\\"\\\\f1b9\\\"; }\\n\\n.fa-hand-holding-hand::before {\\n content: \\\"\\\\e4f7\\\"; }\\n\\n.fa-book-open-reader::before {\\n content: \\\"\\\\f5da\\\"; }\\n\\n.fa-book-reader::before {\\n content: \\\"\\\\f5da\\\"; }\\n\\n.fa-mountain-sun::before {\\n content: \\\"\\\\e52f\\\"; }\\n\\n.fa-arrows-left-right-to-line::before {\\n content: \\\"\\\\e4ba\\\"; }\\n\\n.fa-dice-d20::before {\\n content: \\\"\\\\f6cf\\\"; }\\n\\n.fa-truck-droplet::before {\\n content: \\\"\\\\e58c\\\"; }\\n\\n.fa-file-circle-xmark::before {\\n content: \\\"\\\\e5a1\\\"; }\\n\\n.fa-temperature-arrow-up::before {\\n content: \\\"\\\\e040\\\"; }\\n\\n.fa-temperature-up::before {\\n content: \\\"\\\\e040\\\"; }\\n\\n.fa-medal::before {\\n content: \\\"\\\\f5a2\\\"; }\\n\\n.fa-bed::before {\\n content: \\\"\\\\f236\\\"; }\\n\\n.fa-square-h::before {\\n content: \\\"\\\\f0fd\\\"; }\\n\\n.fa-h-square::before {\\n content: \\\"\\\\f0fd\\\"; }\\n\\n.fa-podcast::before {\\n content: \\\"\\\\f2ce\\\"; }\\n\\n.fa-temperature-full::before {\\n content: \\\"\\\\f2c7\\\"; }\\n\\n.fa-temperature-4::before {\\n content: \\\"\\\\f2c7\\\"; }\\n\\n.fa-thermometer-4::before {\\n content: \\\"\\\\f2c7\\\"; }\\n\\n.fa-thermometer-full::before {\\n content: \\\"\\\\f2c7\\\"; }\\n\\n.fa-bell::before {\\n content: \\\"\\\\f0f3\\\"; }\\n\\n.fa-superscript::before {\\n content: \\\"\\\\f12b\\\"; }\\n\\n.fa-plug-circle-xmark::before {\\n content: \\\"\\\\e560\\\"; }\\n\\n.fa-star-of-life::before {\\n content: \\\"\\\\f621\\\"; }\\n\\n.fa-phone-slash::before {\\n content: \\\"\\\\f3dd\\\"; }\\n\\n.fa-paint-roller::before {\\n content: \\\"\\\\f5aa\\\"; }\\n\\n.fa-handshake-angle::before {\\n content: \\\"\\\\f4c4\\\"; }\\n\\n.fa-hands-helping::before {\\n content: \\\"\\\\f4c4\\\"; }\\n\\n.fa-location-dot::before {\\n content: \\\"\\\\f3c5\\\"; }\\n\\n.fa-map-marker-alt::before {\\n content: \\\"\\\\f3c5\\\"; }\\n\\n.fa-file::before {\\n content: \\\"\\\\f15b\\\"; }\\n\\n.fa-greater-than::before {\\n content: \\\"\\\\3e\\\"; }\\n\\n.fa-person-swimming::before {\\n content: \\\"\\\\f5c4\\\"; }\\n\\n.fa-swimmer::before {\\n content: \\\"\\\\f5c4\\\"; }\\n\\n.fa-arrow-down::before {\\n content: \\\"\\\\f063\\\"; }\\n\\n.fa-droplet::before {\\n content: \\\"\\\\f043\\\"; }\\n\\n.fa-tint::before {\\n content: \\\"\\\\f043\\\"; }\\n\\n.fa-eraser::before {\\n content: \\\"\\\\f12d\\\"; }\\n\\n.fa-earth-americas::before {\\n content: \\\"\\\\f57d\\\"; }\\n\\n.fa-earth::before {\\n content: \\\"\\\\f57d\\\"; }\\n\\n.fa-earth-america::before {\\n content: \\\"\\\\f57d\\\"; }\\n\\n.fa-globe-americas::before {\\n content: \\\"\\\\f57d\\\"; }\\n\\n.fa-person-burst::before {\\n content: \\\"\\\\e53b\\\"; }\\n\\n.fa-dove::before {\\n content: \\\"\\\\f4ba\\\"; }\\n\\n.fa-battery-empty::before {\\n content: \\\"\\\\f244\\\"; }\\n\\n.fa-battery-0::before {\\n content: \\\"\\\\f244\\\"; }\\n\\n.fa-socks::before {\\n content: \\\"\\\\f696\\\"; }\\n\\n.fa-inbox::before {\\n content: \\\"\\\\f01c\\\"; }\\n\\n.fa-section::before {\\n content: \\\"\\\\e447\\\"; }\\n\\n.fa-gauge-high::before {\\n content: \\\"\\\\f625\\\"; }\\n\\n.fa-tachometer-alt::before {\\n content: \\\"\\\\f625\\\"; }\\n\\n.fa-tachometer-alt-fast::before {\\n content: \\\"\\\\f625\\\"; }\\n\\n.fa-envelope-open-text::before {\\n content: \\\"\\\\f658\\\"; }\\n\\n.fa-hospital::before {\\n content: \\\"\\\\f0f8\\\"; }\\n\\n.fa-hospital-alt::before {\\n content: \\\"\\\\f0f8\\\"; }\\n\\n.fa-hospital-wide::before {\\n content: \\\"\\\\f0f8\\\"; }\\n\\n.fa-wine-bottle::before {\\n content: \\\"\\\\f72f\\\"; }\\n\\n.fa-chess-rook::before {\\n content: \\\"\\\\f447\\\"; }\\n\\n.fa-bars-staggered::before {\\n content: \\\"\\\\f550\\\"; }\\n\\n.fa-reorder::before {\\n content: \\\"\\\\f550\\\"; }\\n\\n.fa-stream::before {\\n content: \\\"\\\\f550\\\"; }\\n\\n.fa-dharmachakra::before {\\n content: \\\"\\\\f655\\\"; }\\n\\n.fa-hotdog::before {\\n content: \\\"\\\\f80f\\\"; }\\n\\n.fa-person-walking-with-cane::before {\\n content: \\\"\\\\f29d\\\"; }\\n\\n.fa-blind::before {\\n content: \\\"\\\\f29d\\\"; }\\n\\n.fa-drum::before {\\n content: \\\"\\\\f569\\\"; }\\n\\n.fa-ice-cream::before {\\n content: \\\"\\\\f810\\\"; }\\n\\n.fa-heart-circle-bolt::before {\\n content: \\\"\\\\e4fc\\\"; }\\n\\n.fa-fax::before {\\n content: \\\"\\\\f1ac\\\"; }\\n\\n.fa-paragraph::before {\\n content: \\\"\\\\f1dd\\\"; }\\n\\n.fa-check-to-slot::before {\\n content: \\\"\\\\f772\\\"; }\\n\\n.fa-vote-yea::before {\\n content: \\\"\\\\f772\\\"; }\\n\\n.fa-star-half::before {\\n content: \\\"\\\\f089\\\"; }\\n\\n.fa-boxes-stacked::before {\\n content: \\\"\\\\f468\\\"; }\\n\\n.fa-boxes::before {\\n content: \\\"\\\\f468\\\"; }\\n\\n.fa-boxes-alt::before {\\n content: \\\"\\\\f468\\\"; }\\n\\n.fa-link::before {\\n content: \\\"\\\\f0c1\\\"; }\\n\\n.fa-chain::before {\\n content: \\\"\\\\f0c1\\\"; }\\n\\n.fa-ear-listen::before {\\n content: \\\"\\\\f2a2\\\"; }\\n\\n.fa-assistive-listening-systems::before {\\n content: \\\"\\\\f2a2\\\"; }\\n\\n.fa-tree-city::before {\\n content: \\\"\\\\e587\\\"; }\\n\\n.fa-play::before {\\n content: \\\"\\\\f04b\\\"; }\\n\\n.fa-font::before {\\n content: \\\"\\\\f031\\\"; }\\n\\n.fa-rupiah-sign::before {\\n content: \\\"\\\\e23d\\\"; }\\n\\n.fa-magnifying-glass::before {\\n content: \\\"\\\\f002\\\"; }\\n\\n.fa-search::before {\\n content: \\\"\\\\f002\\\"; }\\n\\n.fa-table-tennis-paddle-ball::before {\\n content: \\\"\\\\f45d\\\"; }\\n\\n.fa-ping-pong-paddle-ball::before {\\n content: \\\"\\\\f45d\\\"; }\\n\\n.fa-table-tennis::before {\\n content: \\\"\\\\f45d\\\"; }\\n\\n.fa-person-dots-from-line::before {\\n content: \\\"\\\\f470\\\"; }\\n\\n.fa-diagnoses::before {\\n content: \\\"\\\\f470\\\"; }\\n\\n.fa-trash-can-arrow-up::before {\\n content: \\\"\\\\f82a\\\"; }\\n\\n.fa-trash-restore-alt::before {\\n content: \\\"\\\\f82a\\\"; }\\n\\n.fa-naira-sign::before {\\n content: \\\"\\\\e1f6\\\"; }\\n\\n.fa-cart-arrow-down::before {\\n content: \\\"\\\\f218\\\"; }\\n\\n.fa-walkie-talkie::before {\\n content: \\\"\\\\f8ef\\\"; }\\n\\n.fa-file-pen::before {\\n content: \\\"\\\\f31c\\\"; }\\n\\n.fa-file-edit::before {\\n content: \\\"\\\\f31c\\\"; }\\n\\n.fa-receipt::before {\\n content: \\\"\\\\f543\\\"; }\\n\\n.fa-square-pen::before {\\n content: \\\"\\\\f14b\\\"; }\\n\\n.fa-pen-square::before {\\n content: \\\"\\\\f14b\\\"; }\\n\\n.fa-pencil-square::before {\\n content: \\\"\\\\f14b\\\"; }\\n\\n.fa-suitcase-rolling::before {\\n content: \\\"\\\\f5c1\\\"; }\\n\\n.fa-person-circle-exclamation::before {\\n content: \\\"\\\\e53f\\\"; }\\n\\n.fa-chevron-down::before {\\n content: \\\"\\\\f078\\\"; }\\n\\n.fa-battery-full::before {\\n content: \\\"\\\\f240\\\"; }\\n\\n.fa-battery::before {\\n content: \\\"\\\\f240\\\"; }\\n\\n.fa-battery-5::before {\\n content: \\\"\\\\f240\\\"; }\\n\\n.fa-skull-crossbones::before {\\n content: \\\"\\\\f714\\\"; }\\n\\n.fa-code-compare::before {\\n content: \\\"\\\\e13a\\\"; }\\n\\n.fa-list-ul::before {\\n content: \\\"\\\\f0ca\\\"; }\\n\\n.fa-list-dots::before {\\n content: \\\"\\\\f0ca\\\"; }\\n\\n.fa-school-lock::before {\\n content: \\\"\\\\e56f\\\"; }\\n\\n.fa-tower-cell::before {\\n content: \\\"\\\\e585\\\"; }\\n\\n.fa-down-long::before {\\n content: \\\"\\\\f309\\\"; }\\n\\n.fa-long-arrow-alt-down::before {\\n content: \\\"\\\\f309\\\"; }\\n\\n.fa-ranking-star::before {\\n content: \\\"\\\\e561\\\"; }\\n\\n.fa-chess-king::before {\\n content: \\\"\\\\f43f\\\"; }\\n\\n.fa-person-harassing::before {\\n content: \\\"\\\\e549\\\"; }\\n\\n.fa-brazilian-real-sign::before {\\n content: \\\"\\\\e46c\\\"; }\\n\\n.fa-landmark-dome::before {\\n content: \\\"\\\\f752\\\"; }\\n\\n.fa-landmark-alt::before {\\n content: \\\"\\\\f752\\\"; }\\n\\n.fa-arrow-up::before {\\n content: \\\"\\\\f062\\\"; }\\n\\n.fa-tv::before {\\n content: \\\"\\\\f26c\\\"; }\\n\\n.fa-television::before {\\n content: \\\"\\\\f26c\\\"; }\\n\\n.fa-tv-alt::before {\\n content: \\\"\\\\f26c\\\"; }\\n\\n.fa-shrimp::before {\\n content: \\\"\\\\e448\\\"; }\\n\\n.fa-list-check::before {\\n content: \\\"\\\\f0ae\\\"; }\\n\\n.fa-tasks::before {\\n content: \\\"\\\\f0ae\\\"; }\\n\\n.fa-jug-detergent::before {\\n content: \\\"\\\\e519\\\"; }\\n\\n.fa-circle-user::before {\\n content: \\\"\\\\f2bd\\\"; }\\n\\n.fa-user-circle::before {\\n content: \\\"\\\\f2bd\\\"; }\\n\\n.fa-user-shield::before {\\n content: \\\"\\\\f505\\\"; }\\n\\n.fa-wind::before {\\n content: \\\"\\\\f72e\\\"; }\\n\\n.fa-car-burst::before {\\n content: \\\"\\\\f5e1\\\"; }\\n\\n.fa-car-crash::before {\\n content: \\\"\\\\f5e1\\\"; }\\n\\n.fa-y::before {\\n content: \\\"\\\\59\\\"; }\\n\\n.fa-person-snowboarding::before {\\n content: \\\"\\\\f7ce\\\"; }\\n\\n.fa-snowboarding::before {\\n content: \\\"\\\\f7ce\\\"; }\\n\\n.fa-truck-fast::before {\\n content: \\\"\\\\f48b\\\"; }\\n\\n.fa-shipping-fast::before {\\n content: \\\"\\\\f48b\\\"; }\\n\\n.fa-fish::before {\\n content: \\\"\\\\f578\\\"; }\\n\\n.fa-user-graduate::before {\\n content: \\\"\\\\f501\\\"; }\\n\\n.fa-circle-half-stroke::before {\\n content: \\\"\\\\f042\\\"; }\\n\\n.fa-adjust::before {\\n content: \\\"\\\\f042\\\"; }\\n\\n.fa-clapperboard::before {\\n content: \\\"\\\\e131\\\"; }\\n\\n.fa-circle-radiation::before {\\n content: \\\"\\\\f7ba\\\"; }\\n\\n.fa-radiation-alt::before {\\n content: \\\"\\\\f7ba\\\"; }\\n\\n.fa-baseball::before {\\n content: \\\"\\\\f433\\\"; }\\n\\n.fa-baseball-ball::before {\\n content: \\\"\\\\f433\\\"; }\\n\\n.fa-jet-fighter-up::before {\\n content: \\\"\\\\e518\\\"; }\\n\\n.fa-diagram-project::before {\\n content: \\\"\\\\f542\\\"; }\\n\\n.fa-project-diagram::before {\\n content: \\\"\\\\f542\\\"; }\\n\\n.fa-copy::before {\\n content: \\\"\\\\f0c5\\\"; }\\n\\n.fa-volume-xmark::before {\\n content: \\\"\\\\f6a9\\\"; }\\n\\n.fa-volume-mute::before {\\n content: \\\"\\\\f6a9\\\"; }\\n\\n.fa-volume-times::before {\\n content: \\\"\\\\f6a9\\\"; }\\n\\n.fa-hand-sparkles::before {\\n content: \\\"\\\\e05d\\\"; }\\n\\n.fa-grip::before {\\n content: \\\"\\\\f58d\\\"; }\\n\\n.fa-grip-horizontal::before {\\n content: \\\"\\\\f58d\\\"; }\\n\\n.fa-share-from-square::before {\\n content: \\\"\\\\f14d\\\"; }\\n\\n.fa-share-square::before {\\n content: \\\"\\\\f14d\\\"; }\\n\\n.fa-gun::before {\\n content: \\\"\\\\e19b\\\"; }\\n\\n.fa-square-phone::before {\\n content: \\\"\\\\f098\\\"; }\\n\\n.fa-phone-square::before {\\n content: \\\"\\\\f098\\\"; }\\n\\n.fa-plus::before {\\n content: \\\"\\\\2b\\\"; }\\n\\n.fa-add::before {\\n content: \\\"\\\\2b\\\"; }\\n\\n.fa-expand::before {\\n content: \\\"\\\\f065\\\"; }\\n\\n.fa-computer::before {\\n content: \\\"\\\\e4e5\\\"; }\\n\\n.fa-xmark::before {\\n content: \\\"\\\\f00d\\\"; }\\n\\n.fa-close::before {\\n content: \\\"\\\\f00d\\\"; }\\n\\n.fa-multiply::before {\\n content: \\\"\\\\f00d\\\"; }\\n\\n.fa-remove::before {\\n content: \\\"\\\\f00d\\\"; }\\n\\n.fa-times::before {\\n content: \\\"\\\\f00d\\\"; }\\n\\n.fa-arrows-up-down-left-right::before {\\n content: \\\"\\\\f047\\\"; }\\n\\n.fa-arrows::before {\\n content: \\\"\\\\f047\\\"; }\\n\\n.fa-chalkboard-user::before {\\n content: \\\"\\\\f51c\\\"; }\\n\\n.fa-chalkboard-teacher::before {\\n content: \\\"\\\\f51c\\\"; }\\n\\n.fa-peso-sign::before {\\n content: \\\"\\\\e222\\\"; }\\n\\n.fa-building-shield::before {\\n content: \\\"\\\\e4d8\\\"; }\\n\\n.fa-baby::before {\\n content: \\\"\\\\f77c\\\"; }\\n\\n.fa-users-line::before {\\n content: \\\"\\\\e592\\\"; }\\n\\n.fa-quote-left::before {\\n content: \\\"\\\\f10d\\\"; }\\n\\n.fa-quote-left-alt::before {\\n content: \\\"\\\\f10d\\\"; }\\n\\n.fa-tractor::before {\\n content: \\\"\\\\f722\\\"; }\\n\\n.fa-trash-arrow-up::before {\\n content: \\\"\\\\f829\\\"; }\\n\\n.fa-trash-restore::before {\\n content: \\\"\\\\f829\\\"; }\\n\\n.fa-arrow-down-up-lock::before {\\n content: \\\"\\\\e4b0\\\"; }\\n\\n.fa-lines-leaning::before {\\n content: \\\"\\\\e51e\\\"; }\\n\\n.fa-ruler-combined::before {\\n content: \\\"\\\\f546\\\"; }\\n\\n.fa-copyright::before {\\n content: \\\"\\\\f1f9\\\"; }\\n\\n.fa-equals::before {\\n content: \\\"\\\\3d\\\"; }\\n\\n.fa-blender::before {\\n content: \\\"\\\\f517\\\"; }\\n\\n.fa-teeth::before {\\n content: \\\"\\\\f62e\\\"; }\\n\\n.fa-shekel-sign::before {\\n content: \\\"\\\\f20b\\\"; }\\n\\n.fa-ils::before {\\n content: \\\"\\\\f20b\\\"; }\\n\\n.fa-shekel::before {\\n content: \\\"\\\\f20b\\\"; }\\n\\n.fa-sheqel::before {\\n content: \\\"\\\\f20b\\\"; }\\n\\n.fa-sheqel-sign::before {\\n content: \\\"\\\\f20b\\\"; }\\n\\n.fa-map::before {\\n content: \\\"\\\\f279\\\"; }\\n\\n.fa-rocket::before {\\n content: \\\"\\\\f135\\\"; }\\n\\n.fa-photo-film::before {\\n content: \\\"\\\\f87c\\\"; }\\n\\n.fa-photo-video::before {\\n content: \\\"\\\\f87c\\\"; }\\n\\n.fa-folder-minus::before {\\n content: \\\"\\\\f65d\\\"; }\\n\\n.fa-store::before {\\n content: \\\"\\\\f54e\\\"; }\\n\\n.fa-arrow-trend-up::before {\\n content: \\\"\\\\e098\\\"; }\\n\\n.fa-plug-circle-minus::before {\\n content: \\\"\\\\e55e\\\"; }\\n\\n.fa-sign-hanging::before {\\n content: \\\"\\\\f4d9\\\"; }\\n\\n.fa-sign::before {\\n content: \\\"\\\\f4d9\\\"; }\\n\\n.fa-bezier-curve::before {\\n content: \\\"\\\\f55b\\\"; }\\n\\n.fa-bell-slash::before {\\n content: \\\"\\\\f1f6\\\"; }\\n\\n.fa-tablet::before {\\n content: \\\"\\\\f3fb\\\"; }\\n\\n.fa-tablet-android::before {\\n content: \\\"\\\\f3fb\\\"; }\\n\\n.fa-school-flag::before {\\n content: \\\"\\\\e56e\\\"; }\\n\\n.fa-fill::before {\\n content: \\\"\\\\f575\\\"; }\\n\\n.fa-angle-up::before {\\n content: \\\"\\\\f106\\\"; }\\n\\n.fa-drumstick-bite::before {\\n content: \\\"\\\\f6d7\\\"; }\\n\\n.fa-holly-berry::before {\\n content: \\\"\\\\f7aa\\\"; }\\n\\n.fa-chevron-left::before {\\n content: \\\"\\\\f053\\\"; }\\n\\n.fa-bacteria::before {\\n content: \\\"\\\\e059\\\"; }\\n\\n.fa-hand-lizard::before {\\n content: \\\"\\\\f258\\\"; }\\n\\n.fa-disease::before {\\n content: \\\"\\\\f7fa\\\"; }\\n\\n.fa-briefcase-medical::before {\\n content: \\\"\\\\f469\\\"; }\\n\\n.fa-genderless::before {\\n content: \\\"\\\\f22d\\\"; }\\n\\n.fa-chevron-right::before {\\n content: \\\"\\\\f054\\\"; }\\n\\n.fa-retweet::before {\\n content: \\\"\\\\f079\\\"; }\\n\\n.fa-car-rear::before {\\n content: \\\"\\\\f5de\\\"; }\\n\\n.fa-car-alt::before {\\n content: \\\"\\\\f5de\\\"; }\\n\\n.fa-pump-soap::before {\\n content: \\\"\\\\e06b\\\"; }\\n\\n.fa-video-slash::before {\\n content: \\\"\\\\f4e2\\\"; }\\n\\n.fa-battery-quarter::before {\\n content: \\\"\\\\f243\\\"; }\\n\\n.fa-battery-2::before {\\n content: \\\"\\\\f243\\\"; }\\n\\n.fa-radio::before {\\n content: \\\"\\\\f8d7\\\"; }\\n\\n.fa-baby-carriage::before {\\n content: \\\"\\\\f77d\\\"; }\\n\\n.fa-carriage-baby::before {\\n content: \\\"\\\\f77d\\\"; }\\n\\n.fa-traffic-light::before {\\n content: \\\"\\\\f637\\\"; }\\n\\n.fa-thermometer::before {\\n content: \\\"\\\\f491\\\"; }\\n\\n.fa-vr-cardboard::before {\\n content: \\\"\\\\f729\\\"; }\\n\\n.fa-hand-middle-finger::before {\\n content: \\\"\\\\f806\\\"; }\\n\\n.fa-percent::before {\\n content: \\\"\\\\25\\\"; }\\n\\n.fa-percentage::before {\\n content: \\\"\\\\25\\\"; }\\n\\n.fa-truck-moving::before {\\n content: \\\"\\\\f4df\\\"; }\\n\\n.fa-glass-water-droplet::before {\\n content: \\\"\\\\e4f5\\\"; }\\n\\n.fa-display::before {\\n content: \\\"\\\\e163\\\"; }\\n\\n.fa-face-smile::before {\\n content: \\\"\\\\f118\\\"; }\\n\\n.fa-smile::before {\\n content: \\\"\\\\f118\\\"; }\\n\\n.fa-thumbtack::before {\\n content: \\\"\\\\f08d\\\"; }\\n\\n.fa-thumb-tack::before {\\n content: \\\"\\\\f08d\\\"; }\\n\\n.fa-trophy::before {\\n content: \\\"\\\\f091\\\"; }\\n\\n.fa-person-praying::before {\\n content: \\\"\\\\f683\\\"; }\\n\\n.fa-pray::before {\\n content: \\\"\\\\f683\\\"; }\\n\\n.fa-hammer::before {\\n content: \\\"\\\\f6e3\\\"; }\\n\\n.fa-hand-peace::before {\\n content: \\\"\\\\f25b\\\"; }\\n\\n.fa-rotate::before {\\n content: \\\"\\\\f2f1\\\"; }\\n\\n.fa-sync-alt::before {\\n content: \\\"\\\\f2f1\\\"; }\\n\\n.fa-spinner::before {\\n content: \\\"\\\\f110\\\"; }\\n\\n.fa-robot::before {\\n content: \\\"\\\\f544\\\"; }\\n\\n.fa-peace::before {\\n content: \\\"\\\\f67c\\\"; }\\n\\n.fa-gears::before {\\n content: \\\"\\\\f085\\\"; }\\n\\n.fa-cogs::before {\\n content: \\\"\\\\f085\\\"; }\\n\\n.fa-warehouse::before {\\n content: \\\"\\\\f494\\\"; }\\n\\n.fa-arrow-up-right-dots::before {\\n content: \\\"\\\\e4b7\\\"; }\\n\\n.fa-splotch::before {\\n content: \\\"\\\\f5bc\\\"; }\\n\\n.fa-face-grin-hearts::before {\\n content: \\\"\\\\f584\\\"; }\\n\\n.fa-grin-hearts::before {\\n content: \\\"\\\\f584\\\"; }\\n\\n.fa-dice-four::before {\\n content: \\\"\\\\f524\\\"; }\\n\\n.fa-sim-card::before {\\n content: \\\"\\\\f7c4\\\"; }\\n\\n.fa-transgender::before {\\n content: \\\"\\\\f225\\\"; }\\n\\n.fa-transgender-alt::before {\\n content: \\\"\\\\f225\\\"; }\\n\\n.fa-mercury::before {\\n content: \\\"\\\\f223\\\"; }\\n\\n.fa-arrow-turn-down::before {\\n content: \\\"\\\\f149\\\"; }\\n\\n.fa-level-down::before {\\n content: \\\"\\\\f149\\\"; }\\n\\n.fa-person-falling-burst::before {\\n content: \\\"\\\\e547\\\"; }\\n\\n.fa-award::before {\\n content: \\\"\\\\f559\\\"; }\\n\\n.fa-ticket-simple::before {\\n content: \\\"\\\\f3ff\\\"; }\\n\\n.fa-ticket-alt::before {\\n content: \\\"\\\\f3ff\\\"; }\\n\\n.fa-building::before {\\n content: \\\"\\\\f1ad\\\"; }\\n\\n.fa-angles-left::before {\\n content: \\\"\\\\f100\\\"; }\\n\\n.fa-angle-double-left::before {\\n content: \\\"\\\\f100\\\"; }\\n\\n.fa-qrcode::before {\\n content: \\\"\\\\f029\\\"; }\\n\\n.fa-clock-rotate-left::before {\\n content: \\\"\\\\f1da\\\"; }\\n\\n.fa-history::before {\\n content: \\\"\\\\f1da\\\"; }\\n\\n.fa-face-grin-beam-sweat::before {\\n content: \\\"\\\\f583\\\"; }\\n\\n.fa-grin-beam-sweat::before {\\n content: \\\"\\\\f583\\\"; }\\n\\n.fa-file-export::before {\\n content: \\\"\\\\f56e\\\"; }\\n\\n.fa-arrow-right-from-file::before {\\n content: \\\"\\\\f56e\\\"; }\\n\\n.fa-shield::before {\\n content: \\\"\\\\f132\\\"; }\\n\\n.fa-shield-blank::before {\\n content: \\\"\\\\f132\\\"; }\\n\\n.fa-arrow-up-short-wide::before {\\n content: \\\"\\\\f885\\\"; }\\n\\n.fa-sort-amount-up-alt::before {\\n content: \\\"\\\\f885\\\"; }\\n\\n.fa-house-medical::before {\\n content: \\\"\\\\e3b2\\\"; }\\n\\n.fa-golf-ball-tee::before {\\n content: \\\"\\\\f450\\\"; }\\n\\n.fa-golf-ball::before {\\n content: \\\"\\\\f450\\\"; }\\n\\n.fa-circle-chevron-left::before {\\n content: \\\"\\\\f137\\\"; }\\n\\n.fa-chevron-circle-left::before {\\n content: \\\"\\\\f137\\\"; }\\n\\n.fa-house-chimney-window::before {\\n content: \\\"\\\\e00d\\\"; }\\n\\n.fa-pen-nib::before {\\n content: \\\"\\\\f5ad\\\"; }\\n\\n.fa-tent-arrow-turn-left::before {\\n content: \\\"\\\\e580\\\"; }\\n\\n.fa-tents::before {\\n content: \\\"\\\\e582\\\"; }\\n\\n.fa-wand-magic::before {\\n content: \\\"\\\\f0d0\\\"; }\\n\\n.fa-magic::before {\\n content: \\\"\\\\f0d0\\\"; }\\n\\n.fa-dog::before {\\n content: \\\"\\\\f6d3\\\"; }\\n\\n.fa-carrot::before {\\n content: \\\"\\\\f787\\\"; }\\n\\n.fa-moon::before {\\n content: \\\"\\\\f186\\\"; }\\n\\n.fa-wine-glass-empty::before {\\n content: \\\"\\\\f5ce\\\"; }\\n\\n.fa-wine-glass-alt::before {\\n content: \\\"\\\\f5ce\\\"; }\\n\\n.fa-cheese::before {\\n content: \\\"\\\\f7ef\\\"; }\\n\\n.fa-yin-yang::before {\\n content: \\\"\\\\f6ad\\\"; }\\n\\n.fa-music::before {\\n content: \\\"\\\\f001\\\"; }\\n\\n.fa-code-commit::before {\\n content: \\\"\\\\f386\\\"; }\\n\\n.fa-temperature-low::before {\\n content: \\\"\\\\f76b\\\"; }\\n\\n.fa-person-biking::before {\\n content: \\\"\\\\f84a\\\"; }\\n\\n.fa-biking::before {\\n content: \\\"\\\\f84a\\\"; }\\n\\n.fa-broom::before {\\n content: \\\"\\\\f51a\\\"; }\\n\\n.fa-shield-heart::before {\\n content: \\\"\\\\e574\\\"; }\\n\\n.fa-gopuram::before {\\n content: \\\"\\\\f664\\\"; }\\n\\n.fa-earth-oceania::before {\\n content: \\\"\\\\e47b\\\"; }\\n\\n.fa-globe-oceania::before {\\n content: \\\"\\\\e47b\\\"; }\\n\\n.fa-square-xmark::before {\\n content: \\\"\\\\f2d3\\\"; }\\n\\n.fa-times-square::before {\\n content: \\\"\\\\f2d3\\\"; }\\n\\n.fa-xmark-square::before {\\n content: \\\"\\\\f2d3\\\"; }\\n\\n.fa-hashtag::before {\\n content: \\\"\\\\23\\\"; }\\n\\n.fa-up-right-and-down-left-from-center::before {\\n content: \\\"\\\\f424\\\"; }\\n\\n.fa-expand-alt::before {\\n content: \\\"\\\\f424\\\"; }\\n\\n.fa-oil-can::before {\\n content: \\\"\\\\f613\\\"; }\\n\\n.fa-t::before {\\n content: \\\"\\\\54\\\"; }\\n\\n.fa-hippo::before {\\n content: \\\"\\\\f6ed\\\"; }\\n\\n.fa-chart-column::before {\\n content: \\\"\\\\e0e3\\\"; }\\n\\n.fa-infinity::before {\\n content: \\\"\\\\f534\\\"; }\\n\\n.fa-vial-circle-check::before {\\n content: \\\"\\\\e596\\\"; }\\n\\n.fa-person-arrow-down-to-line::before {\\n content: \\\"\\\\e538\\\"; }\\n\\n.fa-voicemail::before {\\n content: \\\"\\\\f897\\\"; }\\n\\n.fa-fan::before {\\n content: \\\"\\\\f863\\\"; }\\n\\n.fa-person-walking-luggage::before {\\n content: \\\"\\\\e554\\\"; }\\n\\n.fa-up-down::before {\\n content: \\\"\\\\f338\\\"; }\\n\\n.fa-arrows-alt-v::before {\\n content: \\\"\\\\f338\\\"; }\\n\\n.fa-cloud-moon-rain::before {\\n content: \\\"\\\\f73c\\\"; }\\n\\n.fa-calendar::before {\\n content: \\\"\\\\f133\\\"; }\\n\\n.fa-trailer::before {\\n content: \\\"\\\\e041\\\"; }\\n\\n.fa-bahai::before {\\n content: \\\"\\\\f666\\\"; }\\n\\n.fa-haykal::before {\\n content: \\\"\\\\f666\\\"; }\\n\\n.fa-sd-card::before {\\n content: \\\"\\\\f7c2\\\"; }\\n\\n.fa-dragon::before {\\n content: \\\"\\\\f6d5\\\"; }\\n\\n.fa-shoe-prints::before {\\n content: \\\"\\\\f54b\\\"; }\\n\\n.fa-circle-plus::before {\\n content: \\\"\\\\f055\\\"; }\\n\\n.fa-plus-circle::before {\\n content: \\\"\\\\f055\\\"; }\\n\\n.fa-face-grin-tongue-wink::before {\\n content: \\\"\\\\f58b\\\"; }\\n\\n.fa-grin-tongue-wink::before {\\n content: \\\"\\\\f58b\\\"; }\\n\\n.fa-hand-holding::before {\\n content: \\\"\\\\f4bd\\\"; }\\n\\n.fa-plug-circle-exclamation::before {\\n content: \\\"\\\\e55d\\\"; }\\n\\n.fa-link-slash::before {\\n content: \\\"\\\\f127\\\"; }\\n\\n.fa-chain-broken::before {\\n content: \\\"\\\\f127\\\"; }\\n\\n.fa-chain-slash::before {\\n content: \\\"\\\\f127\\\"; }\\n\\n.fa-unlink::before {\\n content: \\\"\\\\f127\\\"; }\\n\\n.fa-clone::before {\\n content: \\\"\\\\f24d\\\"; }\\n\\n.fa-person-walking-arrow-loop-left::before {\\n content: \\\"\\\\e551\\\"; }\\n\\n.fa-arrow-up-z-a::before {\\n content: \\\"\\\\f882\\\"; }\\n\\n.fa-sort-alpha-up-alt::before {\\n content: \\\"\\\\f882\\\"; }\\n\\n.fa-fire-flame-curved::before {\\n content: \\\"\\\\f7e4\\\"; }\\n\\n.fa-fire-alt::before {\\n content: \\\"\\\\f7e4\\\"; }\\n\\n.fa-tornado::before {\\n content: \\\"\\\\f76f\\\"; }\\n\\n.fa-file-circle-plus::before {\\n content: \\\"\\\\e494\\\"; }\\n\\n.fa-book-quran::before {\\n content: \\\"\\\\f687\\\"; }\\n\\n.fa-quran::before {\\n content: \\\"\\\\f687\\\"; }\\n\\n.fa-anchor::before {\\n content: \\\"\\\\f13d\\\"; }\\n\\n.fa-border-all::before {\\n content: \\\"\\\\f84c\\\"; }\\n\\n.fa-face-angry::before {\\n content: \\\"\\\\f556\\\"; }\\n\\n.fa-angry::before {\\n content: \\\"\\\\f556\\\"; }\\n\\n.fa-cookie-bite::before {\\n content: \\\"\\\\f564\\\"; }\\n\\n.fa-arrow-trend-down::before {\\n content: \\\"\\\\e097\\\"; }\\n\\n.fa-rss::before {\\n content: \\\"\\\\f09e\\\"; }\\n\\n.fa-feed::before {\\n content: \\\"\\\\f09e\\\"; }\\n\\n.fa-draw-polygon::before {\\n content: \\\"\\\\f5ee\\\"; }\\n\\n.fa-scale-balanced::before {\\n content: \\\"\\\\f24e\\\"; }\\n\\n.fa-balance-scale::before {\\n content: \\\"\\\\f24e\\\"; }\\n\\n.fa-gauge-simple-high::before {\\n content: \\\"\\\\f62a\\\"; }\\n\\n.fa-tachometer::before {\\n content: \\\"\\\\f62a\\\"; }\\n\\n.fa-tachometer-fast::before {\\n content: \\\"\\\\f62a\\\"; }\\n\\n.fa-shower::before {\\n content: \\\"\\\\f2cc\\\"; }\\n\\n.fa-desktop::before {\\n content: \\\"\\\\f390\\\"; }\\n\\n.fa-desktop-alt::before {\\n content: \\\"\\\\f390\\\"; }\\n\\n.fa-m::before {\\n content: \\\"\\\\4d\\\"; }\\n\\n.fa-table-list::before {\\n content: \\\"\\\\f00b\\\"; }\\n\\n.fa-th-list::before {\\n content: \\\"\\\\f00b\\\"; }\\n\\n.fa-comment-sms::before {\\n content: \\\"\\\\f7cd\\\"; }\\n\\n.fa-sms::before {\\n content: \\\"\\\\f7cd\\\"; }\\n\\n.fa-book::before {\\n content: \\\"\\\\f02d\\\"; }\\n\\n.fa-user-plus::before {\\n content: \\\"\\\\f234\\\"; }\\n\\n.fa-check::before {\\n content: \\\"\\\\f00c\\\"; }\\n\\n.fa-battery-three-quarters::before {\\n content: \\\"\\\\f241\\\"; }\\n\\n.fa-battery-4::before {\\n content: \\\"\\\\f241\\\"; }\\n\\n.fa-house-circle-check::before {\\n content: \\\"\\\\e509\\\"; }\\n\\n.fa-angle-left::before {\\n content: \\\"\\\\f104\\\"; }\\n\\n.fa-diagram-successor::before {\\n content: \\\"\\\\e47a\\\"; }\\n\\n.fa-truck-arrow-right::before {\\n content: \\\"\\\\e58b\\\"; }\\n\\n.fa-arrows-split-up-and-left::before {\\n content: \\\"\\\\e4bc\\\"; }\\n\\n.fa-hand-fist::before {\\n content: \\\"\\\\f6de\\\"; }\\n\\n.fa-fist-raised::before {\\n content: \\\"\\\\f6de\\\"; }\\n\\n.fa-cloud-moon::before {\\n content: \\\"\\\\f6c3\\\"; }\\n\\n.fa-briefcase::before {\\n content: \\\"\\\\f0b1\\\"; }\\n\\n.fa-person-falling::before {\\n content: \\\"\\\\e546\\\"; }\\n\\n.fa-image-portrait::before {\\n content: \\\"\\\\f3e0\\\"; }\\n\\n.fa-portrait::before {\\n content: \\\"\\\\f3e0\\\"; }\\n\\n.fa-user-tag::before {\\n content: \\\"\\\\f507\\\"; }\\n\\n.fa-rug::before {\\n content: \\\"\\\\e569\\\"; }\\n\\n.fa-earth-europe::before {\\n content: \\\"\\\\f7a2\\\"; }\\n\\n.fa-globe-europe::before {\\n content: \\\"\\\\f7a2\\\"; }\\n\\n.fa-cart-flatbed-suitcase::before {\\n content: \\\"\\\\f59d\\\"; }\\n\\n.fa-luggage-cart::before {\\n content: \\\"\\\\f59d\\\"; }\\n\\n.fa-rectangle-xmark::before {\\n content: \\\"\\\\f410\\\"; }\\n\\n.fa-rectangle-times::before {\\n content: \\\"\\\\f410\\\"; }\\n\\n.fa-times-rectangle::before {\\n content: \\\"\\\\f410\\\"; }\\n\\n.fa-window-close::before {\\n content: \\\"\\\\f410\\\"; }\\n\\n.fa-baht-sign::before {\\n content: \\\"\\\\e0ac\\\"; }\\n\\n.fa-book-open::before {\\n content: \\\"\\\\f518\\\"; }\\n\\n.fa-book-journal-whills::before {\\n content: \\\"\\\\f66a\\\"; }\\n\\n.fa-journal-whills::before {\\n content: \\\"\\\\f66a\\\"; }\\n\\n.fa-handcuffs::before {\\n content: \\\"\\\\e4f8\\\"; }\\n\\n.fa-triangle-exclamation::before {\\n content: \\\"\\\\f071\\\"; }\\n\\n.fa-exclamation-triangle::before {\\n content: \\\"\\\\f071\\\"; }\\n\\n.fa-warning::before {\\n content: \\\"\\\\f071\\\"; }\\n\\n.fa-database::before {\\n content: \\\"\\\\f1c0\\\"; }\\n\\n.fa-share::before {\\n content: \\\"\\\\f064\\\"; }\\n\\n.fa-arrow-turn-right::before {\\n content: \\\"\\\\f064\\\"; }\\n\\n.fa-mail-forward::before {\\n content: \\\"\\\\f064\\\"; }\\n\\n.fa-bottle-droplet::before {\\n content: \\\"\\\\e4c4\\\"; }\\n\\n.fa-mask-face::before {\\n content: \\\"\\\\e1d7\\\"; }\\n\\n.fa-hill-rockslide::before {\\n content: \\\"\\\\e508\\\"; }\\n\\n.fa-right-left::before {\\n content: \\\"\\\\f362\\\"; }\\n\\n.fa-exchange-alt::before {\\n content: \\\"\\\\f362\\\"; }\\n\\n.fa-paper-plane::before {\\n content: \\\"\\\\f1d8\\\"; }\\n\\n.fa-road-circle-exclamation::before {\\n content: \\\"\\\\e565\\\"; }\\n\\n.fa-dungeon::before {\\n content: \\\"\\\\f6d9\\\"; }\\n\\n.fa-align-right::before {\\n content: \\\"\\\\f038\\\"; }\\n\\n.fa-money-bill-1-wave::before {\\n content: \\\"\\\\f53b\\\"; }\\n\\n.fa-money-bill-wave-alt::before {\\n content: \\\"\\\\f53b\\\"; }\\n\\n.fa-life-ring::before {\\n content: \\\"\\\\f1cd\\\"; }\\n\\n.fa-hands::before {\\n content: \\\"\\\\f2a7\\\"; }\\n\\n.fa-sign-language::before {\\n content: \\\"\\\\f2a7\\\"; }\\n\\n.fa-signing::before {\\n content: \\\"\\\\f2a7\\\"; }\\n\\n.fa-calendar-day::before {\\n content: \\\"\\\\f783\\\"; }\\n\\n.fa-water-ladder::before {\\n content: \\\"\\\\f5c5\\\"; }\\n\\n.fa-ladder-water::before {\\n content: \\\"\\\\f5c5\\\"; }\\n\\n.fa-swimming-pool::before {\\n content: \\\"\\\\f5c5\\\"; }\\n\\n.fa-arrows-up-down::before {\\n content: \\\"\\\\f07d\\\"; }\\n\\n.fa-arrows-v::before {\\n content: \\\"\\\\f07d\\\"; }\\n\\n.fa-face-grimace::before {\\n content: \\\"\\\\f57f\\\"; }\\n\\n.fa-grimace::before {\\n content: \\\"\\\\f57f\\\"; }\\n\\n.fa-wheelchair-move::before {\\n content: \\\"\\\\e2ce\\\"; }\\n\\n.fa-wheelchair-alt::before {\\n content: \\\"\\\\e2ce\\\"; }\\n\\n.fa-turn-down::before {\\n content: \\\"\\\\f3be\\\"; }\\n\\n.fa-level-down-alt::before {\\n content: \\\"\\\\f3be\\\"; }\\n\\n.fa-person-walking-arrow-right::before {\\n content: \\\"\\\\e552\\\"; }\\n\\n.fa-square-envelope::before {\\n content: \\\"\\\\f199\\\"; }\\n\\n.fa-envelope-square::before {\\n content: \\\"\\\\f199\\\"; }\\n\\n.fa-dice::before {\\n content: \\\"\\\\f522\\\"; }\\n\\n.fa-bowling-ball::before {\\n content: \\\"\\\\f436\\\"; }\\n\\n.fa-brain::before {\\n content: \\\"\\\\f5dc\\\"; }\\n\\n.fa-bandage::before {\\n content: \\\"\\\\f462\\\"; }\\n\\n.fa-band-aid::before {\\n content: \\\"\\\\f462\\\"; }\\n\\n.fa-calendar-minus::before {\\n content: \\\"\\\\f272\\\"; }\\n\\n.fa-circle-xmark::before {\\n content: \\\"\\\\f057\\\"; }\\n\\n.fa-times-circle::before {\\n content: \\\"\\\\f057\\\"; }\\n\\n.fa-xmark-circle::before {\\n content: \\\"\\\\f057\\\"; }\\n\\n.fa-gifts::before {\\n content: \\\"\\\\f79c\\\"; }\\n\\n.fa-hotel::before {\\n content: \\\"\\\\f594\\\"; }\\n\\n.fa-earth-asia::before {\\n content: \\\"\\\\f57e\\\"; }\\n\\n.fa-globe-asia::before {\\n content: \\\"\\\\f57e\\\"; }\\n\\n.fa-id-card-clip::before {\\n content: \\\"\\\\f47f\\\"; }\\n\\n.fa-id-card-alt::before {\\n content: \\\"\\\\f47f\\\"; }\\n\\n.fa-magnifying-glass-plus::before {\\n content: \\\"\\\\f00e\\\"; }\\n\\n.fa-search-plus::before {\\n content: \\\"\\\\f00e\\\"; }\\n\\n.fa-thumbs-up::before {\\n content: \\\"\\\\f164\\\"; }\\n\\n.fa-user-clock::before {\\n content: \\\"\\\\f4fd\\\"; }\\n\\n.fa-hand-dots::before {\\n content: \\\"\\\\f461\\\"; }\\n\\n.fa-allergies::before {\\n content: \\\"\\\\f461\\\"; }\\n\\n.fa-file-invoice::before {\\n content: \\\"\\\\f570\\\"; }\\n\\n.fa-window-minimize::before {\\n content: \\\"\\\\f2d1\\\"; }\\n\\n.fa-mug-saucer::before {\\n content: \\\"\\\\f0f4\\\"; }\\n\\n.fa-coffee::before {\\n content: \\\"\\\\f0f4\\\"; }\\n\\n.fa-brush::before {\\n content: \\\"\\\\f55d\\\"; }\\n\\n.fa-mask::before {\\n content: \\\"\\\\f6fa\\\"; }\\n\\n.fa-magnifying-glass-minus::before {\\n content: \\\"\\\\f010\\\"; }\\n\\n.fa-search-minus::before {\\n content: \\\"\\\\f010\\\"; }\\n\\n.fa-ruler-vertical::before {\\n content: \\\"\\\\f548\\\"; }\\n\\n.fa-user-large::before {\\n content: \\\"\\\\f406\\\"; }\\n\\n.fa-user-alt::before {\\n content: \\\"\\\\f406\\\"; }\\n\\n.fa-train-tram::before {\\n content: \\\"\\\\e5b4\\\"; }\\n\\n.fa-user-nurse::before {\\n content: \\\"\\\\f82f\\\"; }\\n\\n.fa-syringe::before {\\n content: \\\"\\\\f48e\\\"; }\\n\\n.fa-cloud-sun::before {\\n content: \\\"\\\\f6c4\\\"; }\\n\\n.fa-stopwatch-20::before {\\n content: \\\"\\\\e06f\\\"; }\\n\\n.fa-square-full::before {\\n content: \\\"\\\\f45c\\\"; }\\n\\n.fa-magnet::before {\\n content: \\\"\\\\f076\\\"; }\\n\\n.fa-jar::before {\\n content: \\\"\\\\e516\\\"; }\\n\\n.fa-note-sticky::before {\\n content: \\\"\\\\f249\\\"; }\\n\\n.fa-sticky-note::before {\\n content: \\\"\\\\f249\\\"; }\\n\\n.fa-bug-slash::before {\\n content: \\\"\\\\e490\\\"; }\\n\\n.fa-arrow-up-from-water-pump::before {\\n content: \\\"\\\\e4b6\\\"; }\\n\\n.fa-bone::before {\\n content: \\\"\\\\f5d7\\\"; }\\n\\n.fa-user-injured::before {\\n content: \\\"\\\\f728\\\"; }\\n\\n.fa-face-sad-tear::before {\\n content: \\\"\\\\f5b4\\\"; }\\n\\n.fa-sad-tear::before {\\n content: \\\"\\\\f5b4\\\"; }\\n\\n.fa-plane::before {\\n content: \\\"\\\\f072\\\"; }\\n\\n.fa-tent-arrows-down::before {\\n content: \\\"\\\\e581\\\"; }\\n\\n.fa-exclamation::before {\\n content: \\\"\\\\21\\\"; }\\n\\n.fa-arrows-spin::before {\\n content: \\\"\\\\e4bb\\\"; }\\n\\n.fa-print::before {\\n content: \\\"\\\\f02f\\\"; }\\n\\n.fa-turkish-lira-sign::before {\\n content: \\\"\\\\e2bb\\\"; }\\n\\n.fa-try::before {\\n content: \\\"\\\\e2bb\\\"; }\\n\\n.fa-turkish-lira::before {\\n content: \\\"\\\\e2bb\\\"; }\\n\\n.fa-dollar-sign::before {\\n content: \\\"\\\\24\\\"; }\\n\\n.fa-dollar::before {\\n content: \\\"\\\\24\\\"; }\\n\\n.fa-usd::before {\\n content: \\\"\\\\24\\\"; }\\n\\n.fa-x::before {\\n content: \\\"\\\\58\\\"; }\\n\\n.fa-magnifying-glass-dollar::before {\\n content: \\\"\\\\f688\\\"; }\\n\\n.fa-search-dollar::before {\\n content: \\\"\\\\f688\\\"; }\\n\\n.fa-users-gear::before {\\n content: \\\"\\\\f509\\\"; }\\n\\n.fa-users-cog::before {\\n content: \\\"\\\\f509\\\"; }\\n\\n.fa-person-military-pointing::before {\\n content: \\\"\\\\e54a\\\"; }\\n\\n.fa-building-columns::before {\\n content: \\\"\\\\f19c\\\"; }\\n\\n.fa-bank::before {\\n content: \\\"\\\\f19c\\\"; }\\n\\n.fa-institution::before {\\n content: \\\"\\\\f19c\\\"; }\\n\\n.fa-museum::before {\\n content: \\\"\\\\f19c\\\"; }\\n\\n.fa-university::before {\\n content: \\\"\\\\f19c\\\"; }\\n\\n.fa-umbrella::before {\\n content: \\\"\\\\f0e9\\\"; }\\n\\n.fa-trowel::before {\\n content: \\\"\\\\e589\\\"; }\\n\\n.fa-d::before {\\n content: \\\"\\\\44\\\"; }\\n\\n.fa-stapler::before {\\n content: \\\"\\\\e5af\\\"; }\\n\\n.fa-masks-theater::before {\\n content: \\\"\\\\f630\\\"; }\\n\\n.fa-theater-masks::before {\\n content: \\\"\\\\f630\\\"; }\\n\\n.fa-kip-sign::before {\\n content: \\\"\\\\e1c4\\\"; }\\n\\n.fa-hand-point-left::before {\\n content: \\\"\\\\f0a5\\\"; }\\n\\n.fa-handshake-simple::before {\\n content: \\\"\\\\f4c6\\\"; }\\n\\n.fa-handshake-alt::before {\\n content: \\\"\\\\f4c6\\\"; }\\n\\n.fa-jet-fighter::before {\\n content: \\\"\\\\f0fb\\\"; }\\n\\n.fa-fighter-jet::before {\\n content: \\\"\\\\f0fb\\\"; }\\n\\n.fa-square-share-nodes::before {\\n content: \\\"\\\\f1e1\\\"; }\\n\\n.fa-share-alt-square::before {\\n content: \\\"\\\\f1e1\\\"; }\\n\\n.fa-barcode::before {\\n content: \\\"\\\\f02a\\\"; }\\n\\n.fa-plus-minus::before {\\n content: \\\"\\\\e43c\\\"; }\\n\\n.fa-video::before {\\n content: \\\"\\\\f03d\\\"; }\\n\\n.fa-video-camera::before {\\n content: \\\"\\\\f03d\\\"; }\\n\\n.fa-graduation-cap::before {\\n content: \\\"\\\\f19d\\\"; }\\n\\n.fa-mortar-board::before {\\n content: \\\"\\\\f19d\\\"; }\\n\\n.fa-hand-holding-medical::before {\\n content: \\\"\\\\e05c\\\"; }\\n\\n.fa-person-circle-check::before {\\n content: \\\"\\\\e53e\\\"; }\\n\\n.fa-turn-up::before {\\n content: \\\"\\\\f3bf\\\"; }\\n\\n.fa-level-up-alt::before {\\n content: \\\"\\\\f3bf\\\"; }\\n\\n.sr-only,\\n.fa-sr-only {\\n position: absolute;\\n width: 1px;\\n height: 1px;\\n padding: 0;\\n margin: -1px;\\n overflow: hidden;\\n clip: rect(0, 0, 0, 0);\\n white-space: nowrap;\\n border-width: 0; }\\n\\n.sr-only-focusable:not(:focus),\\n.fa-sr-only-focusable:not(:focus) {\\n position: absolute;\\n width: 1px;\\n height: 1px;\\n padding: 0;\\n margin: -1px;\\n overflow: hidden;\\n clip: rect(0, 0, 0, 0);\\n white-space: nowrap;\\n border-width: 0; }\\n:root, :host {\\n --fa-style-family-brands: 'Font Awesome 6 Brands';\\n --fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; }\\n\\n@font-face {\\n font-family: 'Font Awesome 6 Brands';\\n font-style: normal;\\n font-weight: 400;\\n font-display: block;\\n src: url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \") format(\\\"woff2\\\"), url(\" + ___CSS_LOADER_URL_REPLACEMENT_1___ + \") format(\\\"truetype\\\"); }\\n\\n.fab,\\n.fa-brands {\\n font-weight: 400; }\\n\\n.fa-monero:before {\\n content: \\\"\\\\f3d0\\\"; }\\n\\n.fa-hooli:before {\\n content: \\\"\\\\f427\\\"; }\\n\\n.fa-yelp:before {\\n content: \\\"\\\\f1e9\\\"; }\\n\\n.fa-cc-visa:before {\\n content: \\\"\\\\f1f0\\\"; }\\n\\n.fa-lastfm:before {\\n content: \\\"\\\\f202\\\"; }\\n\\n.fa-shopware:before {\\n content: \\\"\\\\f5b5\\\"; }\\n\\n.fa-creative-commons-nc:before {\\n content: \\\"\\\\f4e8\\\"; }\\n\\n.fa-aws:before {\\n content: \\\"\\\\f375\\\"; }\\n\\n.fa-redhat:before {\\n content: \\\"\\\\f7bc\\\"; }\\n\\n.fa-yoast:before {\\n content: \\\"\\\\f2b1\\\"; }\\n\\n.fa-cloudflare:before {\\n content: \\\"\\\\e07d\\\"; }\\n\\n.fa-ups:before {\\n content: \\\"\\\\f7e0\\\"; }\\n\\n.fa-wpexplorer:before {\\n content: \\\"\\\\f2de\\\"; }\\n\\n.fa-dyalog:before {\\n content: \\\"\\\\f399\\\"; }\\n\\n.fa-bity:before {\\n content: \\\"\\\\f37a\\\"; }\\n\\n.fa-stackpath:before {\\n content: \\\"\\\\f842\\\"; }\\n\\n.fa-buysellads:before {\\n content: \\\"\\\\f20d\\\"; }\\n\\n.fa-first-order:before {\\n content: \\\"\\\\f2b0\\\"; }\\n\\n.fa-modx:before {\\n content: \\\"\\\\f285\\\"; }\\n\\n.fa-guilded:before {\\n content: \\\"\\\\e07e\\\"; }\\n\\n.fa-vnv:before {\\n content: \\\"\\\\f40b\\\"; }\\n\\n.fa-square-js:before {\\n content: \\\"\\\\f3b9\\\"; }\\n\\n.fa-js-square:before {\\n content: \\\"\\\\f3b9\\\"; }\\n\\n.fa-microsoft:before {\\n content: \\\"\\\\f3ca\\\"; }\\n\\n.fa-qq:before {\\n content: \\\"\\\\f1d6\\\"; }\\n\\n.fa-orcid:before {\\n content: \\\"\\\\f8d2\\\"; }\\n\\n.fa-java:before {\\n content: \\\"\\\\f4e4\\\"; }\\n\\n.fa-invision:before {\\n content: \\\"\\\\f7b0\\\"; }\\n\\n.fa-creative-commons-pd-alt:before {\\n content: \\\"\\\\f4ed\\\"; }\\n\\n.fa-centercode:before {\\n content: \\\"\\\\f380\\\"; }\\n\\n.fa-glide-g:before {\\n content: \\\"\\\\f2a6\\\"; }\\n\\n.fa-drupal:before {\\n content: \\\"\\\\f1a9\\\"; }\\n\\n.fa-hire-a-helper:before {\\n content: \\\"\\\\f3b0\\\"; }\\n\\n.fa-creative-commons-by:before {\\n content: \\\"\\\\f4e7\\\"; }\\n\\n.fa-unity:before {\\n content: \\\"\\\\e049\\\"; }\\n\\n.fa-whmcs:before {\\n content: \\\"\\\\f40d\\\"; }\\n\\n.fa-rocketchat:before {\\n content: \\\"\\\\f3e8\\\"; }\\n\\n.fa-vk:before {\\n content: \\\"\\\\f189\\\"; }\\n\\n.fa-untappd:before {\\n content: \\\"\\\\f405\\\"; }\\n\\n.fa-mailchimp:before {\\n content: \\\"\\\\f59e\\\"; }\\n\\n.fa-css3-alt:before {\\n content: \\\"\\\\f38b\\\"; }\\n\\n.fa-square-reddit:before {\\n content: \\\"\\\\f1a2\\\"; }\\n\\n.fa-reddit-square:before {\\n content: \\\"\\\\f1a2\\\"; }\\n\\n.fa-vimeo-v:before {\\n content: \\\"\\\\f27d\\\"; }\\n\\n.fa-contao:before {\\n content: \\\"\\\\f26d\\\"; }\\n\\n.fa-square-font-awesome:before {\\n content: \\\"\\\\e5ad\\\"; }\\n\\n.fa-deskpro:before {\\n content: \\\"\\\\f38f\\\"; }\\n\\n.fa-sistrix:before {\\n content: \\\"\\\\f3ee\\\"; }\\n\\n.fa-square-instagram:before {\\n content: \\\"\\\\e055\\\"; }\\n\\n.fa-instagram-square:before {\\n content: \\\"\\\\e055\\\"; }\\n\\n.fa-battle-net:before {\\n content: \\\"\\\\f835\\\"; }\\n\\n.fa-the-red-yeti:before {\\n content: \\\"\\\\f69d\\\"; }\\n\\n.fa-square-hacker-news:before {\\n content: \\\"\\\\f3af\\\"; }\\n\\n.fa-hacker-news-square:before {\\n content: \\\"\\\\f3af\\\"; }\\n\\n.fa-edge:before {\\n content: \\\"\\\\f282\\\"; }\\n\\n.fa-napster:before {\\n content: \\\"\\\\f3d2\\\"; }\\n\\n.fa-square-snapchat:before {\\n content: \\\"\\\\f2ad\\\"; }\\n\\n.fa-snapchat-square:before {\\n content: \\\"\\\\f2ad\\\"; }\\n\\n.fa-google-plus-g:before {\\n content: \\\"\\\\f0d5\\\"; }\\n\\n.fa-artstation:before {\\n content: \\\"\\\\f77a\\\"; }\\n\\n.fa-markdown:before {\\n content: \\\"\\\\f60f\\\"; }\\n\\n.fa-sourcetree:before {\\n content: \\\"\\\\f7d3\\\"; }\\n\\n.fa-google-plus:before {\\n content: \\\"\\\\f2b3\\\"; }\\n\\n.fa-diaspora:before {\\n content: \\\"\\\\f791\\\"; }\\n\\n.fa-foursquare:before {\\n content: \\\"\\\\f180\\\"; }\\n\\n.fa-stack-overflow:before {\\n content: \\\"\\\\f16c\\\"; }\\n\\n.fa-github-alt:before {\\n content: \\\"\\\\f113\\\"; }\\n\\n.fa-phoenix-squadron:before {\\n content: \\\"\\\\f511\\\"; }\\n\\n.fa-pagelines:before {\\n content: \\\"\\\\f18c\\\"; }\\n\\n.fa-algolia:before {\\n content: \\\"\\\\f36c\\\"; }\\n\\n.fa-red-river:before {\\n content: \\\"\\\\f3e3\\\"; }\\n\\n.fa-creative-commons-sa:before {\\n content: \\\"\\\\f4ef\\\"; }\\n\\n.fa-safari:before {\\n content: \\\"\\\\f267\\\"; }\\n\\n.fa-google:before {\\n content: \\\"\\\\f1a0\\\"; }\\n\\n.fa-square-font-awesome-stroke:before {\\n content: \\\"\\\\f35c\\\"; }\\n\\n.fa-font-awesome-alt:before {\\n content: \\\"\\\\f35c\\\"; }\\n\\n.fa-atlassian:before {\\n content: \\\"\\\\f77b\\\"; }\\n\\n.fa-linkedin-in:before {\\n content: \\\"\\\\f0e1\\\"; }\\n\\n.fa-digital-ocean:before {\\n content: \\\"\\\\f391\\\"; }\\n\\n.fa-nimblr:before {\\n content: \\\"\\\\f5a8\\\"; }\\n\\n.fa-chromecast:before {\\n content: \\\"\\\\f838\\\"; }\\n\\n.fa-evernote:before {\\n content: \\\"\\\\f839\\\"; }\\n\\n.fa-hacker-news:before {\\n content: \\\"\\\\f1d4\\\"; }\\n\\n.fa-creative-commons-sampling:before {\\n content: \\\"\\\\f4f0\\\"; }\\n\\n.fa-adversal:before {\\n content: \\\"\\\\f36a\\\"; }\\n\\n.fa-creative-commons:before {\\n content: \\\"\\\\f25e\\\"; }\\n\\n.fa-watchman-monitoring:before {\\n content: \\\"\\\\e087\\\"; }\\n\\n.fa-fonticons:before {\\n content: \\\"\\\\f280\\\"; }\\n\\n.fa-weixin:before {\\n content: \\\"\\\\f1d7\\\"; }\\n\\n.fa-shirtsinbulk:before {\\n content: \\\"\\\\f214\\\"; }\\n\\n.fa-codepen:before {\\n content: \\\"\\\\f1cb\\\"; }\\n\\n.fa-git-alt:before {\\n content: \\\"\\\\f841\\\"; }\\n\\n.fa-lyft:before {\\n content: \\\"\\\\f3c3\\\"; }\\n\\n.fa-rev:before {\\n content: \\\"\\\\f5b2\\\"; }\\n\\n.fa-windows:before {\\n content: \\\"\\\\f17a\\\"; }\\n\\n.fa-wizards-of-the-coast:before {\\n content: \\\"\\\\f730\\\"; }\\n\\n.fa-square-viadeo:before {\\n content: \\\"\\\\f2aa\\\"; }\\n\\n.fa-viadeo-square:before {\\n content: \\\"\\\\f2aa\\\"; }\\n\\n.fa-meetup:before {\\n content: \\\"\\\\f2e0\\\"; }\\n\\n.fa-centos:before {\\n content: \\\"\\\\f789\\\"; }\\n\\n.fa-adn:before {\\n content: \\\"\\\\f170\\\"; }\\n\\n.fa-cloudsmith:before {\\n content: \\\"\\\\f384\\\"; }\\n\\n.fa-pied-piper-alt:before {\\n content: \\\"\\\\f1a8\\\"; }\\n\\n.fa-square-dribbble:before {\\n content: \\\"\\\\f397\\\"; }\\n\\n.fa-dribbble-square:before {\\n content: \\\"\\\\f397\\\"; }\\n\\n.fa-codiepie:before {\\n content: \\\"\\\\f284\\\"; }\\n\\n.fa-node:before {\\n content: \\\"\\\\f419\\\"; }\\n\\n.fa-mix:before {\\n content: \\\"\\\\f3cb\\\"; }\\n\\n.fa-steam:before {\\n content: \\\"\\\\f1b6\\\"; }\\n\\n.fa-cc-apple-pay:before {\\n content: \\\"\\\\f416\\\"; }\\n\\n.fa-scribd:before {\\n content: \\\"\\\\f28a\\\"; }\\n\\n.fa-openid:before {\\n content: \\\"\\\\f19b\\\"; }\\n\\n.fa-instalod:before {\\n content: \\\"\\\\e081\\\"; }\\n\\n.fa-expeditedssl:before {\\n content: \\\"\\\\f23e\\\"; }\\n\\n.fa-sellcast:before {\\n content: \\\"\\\\f2da\\\"; }\\n\\n.fa-square-twitter:before {\\n content: \\\"\\\\f081\\\"; }\\n\\n.fa-twitter-square:before {\\n content: \\\"\\\\f081\\\"; }\\n\\n.fa-r-project:before {\\n content: \\\"\\\\f4f7\\\"; }\\n\\n.fa-delicious:before {\\n content: \\\"\\\\f1a5\\\"; }\\n\\n.fa-freebsd:before {\\n content: \\\"\\\\f3a4\\\"; }\\n\\n.fa-vuejs:before {\\n content: \\\"\\\\f41f\\\"; }\\n\\n.fa-accusoft:before {\\n content: \\\"\\\\f369\\\"; }\\n\\n.fa-ioxhost:before {\\n content: \\\"\\\\f208\\\"; }\\n\\n.fa-fonticons-fi:before {\\n content: \\\"\\\\f3a2\\\"; }\\n\\n.fa-app-store:before {\\n content: \\\"\\\\f36f\\\"; }\\n\\n.fa-cc-mastercard:before {\\n content: \\\"\\\\f1f1\\\"; }\\n\\n.fa-itunes-note:before {\\n content: \\\"\\\\f3b5\\\"; }\\n\\n.fa-golang:before {\\n content: \\\"\\\\e40f\\\"; }\\n\\n.fa-kickstarter:before {\\n content: \\\"\\\\f3bb\\\"; }\\n\\n.fa-grav:before {\\n content: \\\"\\\\f2d6\\\"; }\\n\\n.fa-weibo:before {\\n content: \\\"\\\\f18a\\\"; }\\n\\n.fa-uncharted:before {\\n content: \\\"\\\\e084\\\"; }\\n\\n.fa-firstdraft:before {\\n content: \\\"\\\\f3a1\\\"; }\\n\\n.fa-square-youtube:before {\\n content: \\\"\\\\f431\\\"; }\\n\\n.fa-youtube-square:before {\\n content: \\\"\\\\f431\\\"; }\\n\\n.fa-wikipedia-w:before {\\n content: \\\"\\\\f266\\\"; }\\n\\n.fa-wpressr:before {\\n content: \\\"\\\\f3e4\\\"; }\\n\\n.fa-rendact:before {\\n content: \\\"\\\\f3e4\\\"; }\\n\\n.fa-angellist:before {\\n content: \\\"\\\\f209\\\"; }\\n\\n.fa-galactic-republic:before {\\n content: \\\"\\\\f50c\\\"; }\\n\\n.fa-nfc-directional:before {\\n content: \\\"\\\\e530\\\"; }\\n\\n.fa-skype:before {\\n content: \\\"\\\\f17e\\\"; }\\n\\n.fa-joget:before {\\n content: \\\"\\\\f3b7\\\"; }\\n\\n.fa-fedora:before {\\n content: \\\"\\\\f798\\\"; }\\n\\n.fa-stripe-s:before {\\n content: \\\"\\\\f42a\\\"; }\\n\\n.fa-meta:before {\\n content: \\\"\\\\e49b\\\"; }\\n\\n.fa-laravel:before {\\n content: \\\"\\\\f3bd\\\"; }\\n\\n.fa-hotjar:before {\\n content: \\\"\\\\f3b1\\\"; }\\n\\n.fa-bluetooth-b:before {\\n content: \\\"\\\\f294\\\"; }\\n\\n.fa-sticker-mule:before {\\n content: \\\"\\\\f3f7\\\"; }\\n\\n.fa-creative-commons-zero:before {\\n content: \\\"\\\\f4f3\\\"; }\\n\\n.fa-hips:before {\\n content: \\\"\\\\f452\\\"; }\\n\\n.fa-behance:before {\\n content: \\\"\\\\f1b4\\\"; }\\n\\n.fa-reddit:before {\\n content: \\\"\\\\f1a1\\\"; }\\n\\n.fa-discord:before {\\n content: \\\"\\\\f392\\\"; }\\n\\n.fa-chrome:before {\\n content: \\\"\\\\f268\\\"; }\\n\\n.fa-app-store-ios:before {\\n content: \\\"\\\\f370\\\"; }\\n\\n.fa-cc-discover:before {\\n content: \\\"\\\\f1f2\\\"; }\\n\\n.fa-wpbeginner:before {\\n content: \\\"\\\\f297\\\"; }\\n\\n.fa-confluence:before {\\n content: \\\"\\\\f78d\\\"; }\\n\\n.fa-mdb:before {\\n content: \\\"\\\\f8ca\\\"; }\\n\\n.fa-dochub:before {\\n content: \\\"\\\\f394\\\"; }\\n\\n.fa-accessible-icon:before {\\n content: \\\"\\\\f368\\\"; }\\n\\n.fa-ebay:before {\\n content: \\\"\\\\f4f4\\\"; }\\n\\n.fa-amazon:before {\\n content: \\\"\\\\f270\\\"; }\\n\\n.fa-unsplash:before {\\n content: \\\"\\\\e07c\\\"; }\\n\\n.fa-yarn:before {\\n content: \\\"\\\\f7e3\\\"; }\\n\\n.fa-square-steam:before {\\n content: \\\"\\\\f1b7\\\"; }\\n\\n.fa-steam-square:before {\\n content: \\\"\\\\f1b7\\\"; }\\n\\n.fa-500px:before {\\n content: \\\"\\\\f26e\\\"; }\\n\\n.fa-square-vimeo:before {\\n content: \\\"\\\\f194\\\"; }\\n\\n.fa-vimeo-square:before {\\n content: \\\"\\\\f194\\\"; }\\n\\n.fa-asymmetrik:before {\\n content: \\\"\\\\f372\\\"; }\\n\\n.fa-font-awesome:before {\\n content: \\\"\\\\f2b4\\\"; }\\n\\n.fa-font-awesome-flag:before {\\n content: \\\"\\\\f2b4\\\"; }\\n\\n.fa-font-awesome-logo-full:before {\\n content: \\\"\\\\f2b4\\\"; }\\n\\n.fa-gratipay:before {\\n content: \\\"\\\\f184\\\"; }\\n\\n.fa-apple:before {\\n content: \\\"\\\\f179\\\"; }\\n\\n.fa-hive:before {\\n content: \\\"\\\\e07f\\\"; }\\n\\n.fa-gitkraken:before {\\n content: \\\"\\\\f3a6\\\"; }\\n\\n.fa-keybase:before {\\n content: \\\"\\\\f4f5\\\"; }\\n\\n.fa-apple-pay:before {\\n content: \\\"\\\\f415\\\"; }\\n\\n.fa-padlet:before {\\n content: \\\"\\\\e4a0\\\"; }\\n\\n.fa-amazon-pay:before {\\n content: \\\"\\\\f42c\\\"; }\\n\\n.fa-square-github:before {\\n content: \\\"\\\\f092\\\"; }\\n\\n.fa-github-square:before {\\n content: \\\"\\\\f092\\\"; }\\n\\n.fa-stumbleupon:before {\\n content: \\\"\\\\f1a4\\\"; }\\n\\n.fa-fedex:before {\\n content: \\\"\\\\f797\\\"; }\\n\\n.fa-phoenix-framework:before {\\n content: \\\"\\\\f3dc\\\"; }\\n\\n.fa-shopify:before {\\n content: \\\"\\\\e057\\\"; }\\n\\n.fa-neos:before {\\n content: \\\"\\\\f612\\\"; }\\n\\n.fa-hackerrank:before {\\n content: \\\"\\\\f5f7\\\"; }\\n\\n.fa-researchgate:before {\\n content: \\\"\\\\f4f8\\\"; }\\n\\n.fa-swift:before {\\n content: \\\"\\\\f8e1\\\"; }\\n\\n.fa-angular:before {\\n content: \\\"\\\\f420\\\"; }\\n\\n.fa-speakap:before {\\n content: \\\"\\\\f3f3\\\"; }\\n\\n.fa-angrycreative:before {\\n content: \\\"\\\\f36e\\\"; }\\n\\n.fa-y-combinator:before {\\n content: \\\"\\\\f23b\\\"; }\\n\\n.fa-empire:before {\\n content: \\\"\\\\f1d1\\\"; }\\n\\n.fa-envira:before {\\n content: \\\"\\\\f299\\\"; }\\n\\n.fa-square-gitlab:before {\\n content: \\\"\\\\e5ae\\\"; }\\n\\n.fa-gitlab-square:before {\\n content: \\\"\\\\e5ae\\\"; }\\n\\n.fa-studiovinari:before {\\n content: \\\"\\\\f3f8\\\"; }\\n\\n.fa-pied-piper:before {\\n content: \\\"\\\\f2ae\\\"; }\\n\\n.fa-wordpress:before {\\n content: \\\"\\\\f19a\\\"; }\\n\\n.fa-product-hunt:before {\\n content: \\\"\\\\f288\\\"; }\\n\\n.fa-firefox:before {\\n content: \\\"\\\\f269\\\"; }\\n\\n.fa-linode:before {\\n content: \\\"\\\\f2b8\\\"; }\\n\\n.fa-goodreads:before {\\n content: \\\"\\\\f3a8\\\"; }\\n\\n.fa-square-odnoklassniki:before {\\n content: \\\"\\\\f264\\\"; }\\n\\n.fa-odnoklassniki-square:before {\\n content: \\\"\\\\f264\\\"; }\\n\\n.fa-jsfiddle:before {\\n content: \\\"\\\\f1cc\\\"; }\\n\\n.fa-sith:before {\\n content: \\\"\\\\f512\\\"; }\\n\\n.fa-themeisle:before {\\n content: \\\"\\\\f2b2\\\"; }\\n\\n.fa-page4:before {\\n content: \\\"\\\\f3d7\\\"; }\\n\\n.fa-hashnode:before {\\n content: \\\"\\\\e499\\\"; }\\n\\n.fa-react:before {\\n content: \\\"\\\\f41b\\\"; }\\n\\n.fa-cc-paypal:before {\\n content: \\\"\\\\f1f4\\\"; }\\n\\n.fa-squarespace:before {\\n content: \\\"\\\\f5be\\\"; }\\n\\n.fa-cc-stripe:before {\\n content: \\\"\\\\f1f5\\\"; }\\n\\n.fa-creative-commons-share:before {\\n content: \\\"\\\\f4f2\\\"; }\\n\\n.fa-bitcoin:before {\\n content: \\\"\\\\f379\\\"; }\\n\\n.fa-keycdn:before {\\n content: \\\"\\\\f3ba\\\"; }\\n\\n.fa-opera:before {\\n content: \\\"\\\\f26a\\\"; }\\n\\n.fa-itch-io:before {\\n content: \\\"\\\\f83a\\\"; }\\n\\n.fa-umbraco:before {\\n content: \\\"\\\\f8e8\\\"; }\\n\\n.fa-galactic-senate:before {\\n content: \\\"\\\\f50d\\\"; }\\n\\n.fa-ubuntu:before {\\n content: \\\"\\\\f7df\\\"; }\\n\\n.fa-draft2digital:before {\\n content: \\\"\\\\f396\\\"; }\\n\\n.fa-stripe:before {\\n content: \\\"\\\\f429\\\"; }\\n\\n.fa-houzz:before {\\n content: \\\"\\\\f27c\\\"; }\\n\\n.fa-gg:before {\\n content: \\\"\\\\f260\\\"; }\\n\\n.fa-dhl:before {\\n content: \\\"\\\\f790\\\"; }\\n\\n.fa-square-pinterest:before {\\n content: \\\"\\\\f0d3\\\"; }\\n\\n.fa-pinterest-square:before {\\n content: \\\"\\\\f0d3\\\"; }\\n\\n.fa-xing:before {\\n content: \\\"\\\\f168\\\"; }\\n\\n.fa-blackberry:before {\\n content: \\\"\\\\f37b\\\"; }\\n\\n.fa-creative-commons-pd:before {\\n content: \\\"\\\\f4ec\\\"; }\\n\\n.fa-playstation:before {\\n content: \\\"\\\\f3df\\\"; }\\n\\n.fa-quinscape:before {\\n content: \\\"\\\\f459\\\"; }\\n\\n.fa-less:before {\\n content: \\\"\\\\f41d\\\"; }\\n\\n.fa-blogger-b:before {\\n content: \\\"\\\\f37d\\\"; }\\n\\n.fa-opencart:before {\\n content: \\\"\\\\f23d\\\"; }\\n\\n.fa-vine:before {\\n content: \\\"\\\\f1ca\\\"; }\\n\\n.fa-paypal:before {\\n content: \\\"\\\\f1ed\\\"; }\\n\\n.fa-gitlab:before {\\n content: \\\"\\\\f296\\\"; }\\n\\n.fa-typo3:before {\\n content: \\\"\\\\f42b\\\"; }\\n\\n.fa-reddit-alien:before {\\n content: \\\"\\\\f281\\\"; }\\n\\n.fa-yahoo:before {\\n content: \\\"\\\\f19e\\\"; }\\n\\n.fa-dailymotion:before {\\n content: \\\"\\\\e052\\\"; }\\n\\n.fa-affiliatetheme:before {\\n content: \\\"\\\\f36b\\\"; }\\n\\n.fa-pied-piper-pp:before {\\n content: \\\"\\\\f1a7\\\"; }\\n\\n.fa-bootstrap:before {\\n content: \\\"\\\\f836\\\"; }\\n\\n.fa-odnoklassniki:before {\\n content: \\\"\\\\f263\\\"; }\\n\\n.fa-nfc-symbol:before {\\n content: \\\"\\\\e531\\\"; }\\n\\n.fa-ethereum:before {\\n content: \\\"\\\\f42e\\\"; }\\n\\n.fa-speaker-deck:before {\\n content: \\\"\\\\f83c\\\"; }\\n\\n.fa-creative-commons-nc-eu:before {\\n content: \\\"\\\\f4e9\\\"; }\\n\\n.fa-patreon:before {\\n content: \\\"\\\\f3d9\\\"; }\\n\\n.fa-avianex:before {\\n content: \\\"\\\\f374\\\"; }\\n\\n.fa-ello:before {\\n content: \\\"\\\\f5f1\\\"; }\\n\\n.fa-gofore:before {\\n content: \\\"\\\\f3a7\\\"; }\\n\\n.fa-bimobject:before {\\n content: \\\"\\\\f378\\\"; }\\n\\n.fa-facebook-f:before {\\n content: \\\"\\\\f39e\\\"; }\\n\\n.fa-square-google-plus:before {\\n content: \\\"\\\\f0d4\\\"; }\\n\\n.fa-google-plus-square:before {\\n content: \\\"\\\\f0d4\\\"; }\\n\\n.fa-mandalorian:before {\\n content: \\\"\\\\f50f\\\"; }\\n\\n.fa-first-order-alt:before {\\n content: \\\"\\\\f50a\\\"; }\\n\\n.fa-osi:before {\\n content: \\\"\\\\f41a\\\"; }\\n\\n.fa-google-wallet:before {\\n content: \\\"\\\\f1ee\\\"; }\\n\\n.fa-d-and-d-beyond:before {\\n content: \\\"\\\\f6ca\\\"; }\\n\\n.fa-periscope:before {\\n content: \\\"\\\\f3da\\\"; }\\n\\n.fa-fulcrum:before {\\n content: \\\"\\\\f50b\\\"; }\\n\\n.fa-cloudscale:before {\\n content: \\\"\\\\f383\\\"; }\\n\\n.fa-forumbee:before {\\n content: \\\"\\\\f211\\\"; }\\n\\n.fa-mizuni:before {\\n content: \\\"\\\\f3cc\\\"; }\\n\\n.fa-schlix:before {\\n content: \\\"\\\\f3ea\\\"; }\\n\\n.fa-square-xing:before {\\n content: \\\"\\\\f169\\\"; }\\n\\n.fa-xing-square:before {\\n content: \\\"\\\\f169\\\"; }\\n\\n.fa-bandcamp:before {\\n content: \\\"\\\\f2d5\\\"; }\\n\\n.fa-wpforms:before {\\n content: \\\"\\\\f298\\\"; }\\n\\n.fa-cloudversify:before {\\n content: \\\"\\\\f385\\\"; }\\n\\n.fa-usps:before {\\n content: \\\"\\\\f7e1\\\"; }\\n\\n.fa-megaport:before {\\n content: \\\"\\\\f5a3\\\"; }\\n\\n.fa-magento:before {\\n content: \\\"\\\\f3c4\\\"; }\\n\\n.fa-spotify:before {\\n content: \\\"\\\\f1bc\\\"; }\\n\\n.fa-optin-monster:before {\\n content: \\\"\\\\f23c\\\"; }\\n\\n.fa-fly:before {\\n content: \\\"\\\\f417\\\"; }\\n\\n.fa-aviato:before {\\n content: \\\"\\\\f421\\\"; }\\n\\n.fa-itunes:before {\\n content: \\\"\\\\f3b4\\\"; }\\n\\n.fa-cuttlefish:before {\\n content: \\\"\\\\f38c\\\"; }\\n\\n.fa-blogger:before {\\n content: \\\"\\\\f37c\\\"; }\\n\\n.fa-flickr:before {\\n content: \\\"\\\\f16e\\\"; }\\n\\n.fa-viber:before {\\n content: \\\"\\\\f409\\\"; }\\n\\n.fa-soundcloud:before {\\n content: \\\"\\\\f1be\\\"; }\\n\\n.fa-digg:before {\\n content: \\\"\\\\f1a6\\\"; }\\n\\n.fa-tencent-weibo:before {\\n content: \\\"\\\\f1d5\\\"; }\\n\\n.fa-symfony:before {\\n content: \\\"\\\\f83d\\\"; }\\n\\n.fa-maxcdn:before {\\n content: \\\"\\\\f136\\\"; }\\n\\n.fa-etsy:before {\\n content: \\\"\\\\f2d7\\\"; }\\n\\n.fa-facebook-messenger:before {\\n content: \\\"\\\\f39f\\\"; }\\n\\n.fa-audible:before {\\n content: \\\"\\\\f373\\\"; }\\n\\n.fa-think-peaks:before {\\n content: \\\"\\\\f731\\\"; }\\n\\n.fa-bilibili:before {\\n content: \\\"\\\\e3d9\\\"; }\\n\\n.fa-erlang:before {\\n content: \\\"\\\\f39d\\\"; }\\n\\n.fa-cotton-bureau:before {\\n content: \\\"\\\\f89e\\\"; }\\n\\n.fa-dashcube:before {\\n content: \\\"\\\\f210\\\"; }\\n\\n.fa-42-group:before {\\n content: \\\"\\\\e080\\\"; }\\n\\n.fa-innosoft:before {\\n content: \\\"\\\\e080\\\"; }\\n\\n.fa-stack-exchange:before {\\n content: \\\"\\\\f18d\\\"; }\\n\\n.fa-elementor:before {\\n content: \\\"\\\\f430\\\"; }\\n\\n.fa-square-pied-piper:before {\\n content: \\\"\\\\e01e\\\"; }\\n\\n.fa-pied-piper-square:before {\\n content: \\\"\\\\e01e\\\"; }\\n\\n.fa-creative-commons-nd:before {\\n content: \\\"\\\\f4eb\\\"; }\\n\\n.fa-palfed:before {\\n content: \\\"\\\\f3d8\\\"; }\\n\\n.fa-superpowers:before {\\n content: \\\"\\\\f2dd\\\"; }\\n\\n.fa-resolving:before {\\n content: \\\"\\\\f3e7\\\"; }\\n\\n.fa-xbox:before {\\n content: \\\"\\\\f412\\\"; }\\n\\n.fa-searchengin:before {\\n content: \\\"\\\\f3eb\\\"; }\\n\\n.fa-tiktok:before {\\n content: \\\"\\\\e07b\\\"; }\\n\\n.fa-square-facebook:before {\\n content: \\\"\\\\f082\\\"; }\\n\\n.fa-facebook-square:before {\\n content: \\\"\\\\f082\\\"; }\\n\\n.fa-renren:before {\\n content: \\\"\\\\f18b\\\"; }\\n\\n.fa-linux:before {\\n content: \\\"\\\\f17c\\\"; }\\n\\n.fa-glide:before {\\n content: \\\"\\\\f2a5\\\"; }\\n\\n.fa-linkedin:before {\\n content: \\\"\\\\f08c\\\"; }\\n\\n.fa-hubspot:before {\\n content: \\\"\\\\f3b2\\\"; }\\n\\n.fa-deploydog:before {\\n content: \\\"\\\\f38e\\\"; }\\n\\n.fa-twitch:before {\\n content: \\\"\\\\f1e8\\\"; }\\n\\n.fa-ravelry:before {\\n content: \\\"\\\\f2d9\\\"; }\\n\\n.fa-mixer:before {\\n content: \\\"\\\\e056\\\"; }\\n\\n.fa-square-lastfm:before {\\n content: \\\"\\\\f203\\\"; }\\n\\n.fa-lastfm-square:before {\\n content: \\\"\\\\f203\\\"; }\\n\\n.fa-vimeo:before {\\n content: \\\"\\\\f40a\\\"; }\\n\\n.fa-mendeley:before {\\n content: \\\"\\\\f7b3\\\"; }\\n\\n.fa-uniregistry:before {\\n content: \\\"\\\\f404\\\"; }\\n\\n.fa-figma:before {\\n content: \\\"\\\\f799\\\"; }\\n\\n.fa-creative-commons-remix:before {\\n content: \\\"\\\\f4ee\\\"; }\\n\\n.fa-cc-amazon-pay:before {\\n content: \\\"\\\\f42d\\\"; }\\n\\n.fa-dropbox:before {\\n content: \\\"\\\\f16b\\\"; }\\n\\n.fa-instagram:before {\\n content: \\\"\\\\f16d\\\"; }\\n\\n.fa-cmplid:before {\\n content: \\\"\\\\e360\\\"; }\\n\\n.fa-facebook:before {\\n content: \\\"\\\\f09a\\\"; }\\n\\n.fa-gripfire:before {\\n content: \\\"\\\\f3ac\\\"; }\\n\\n.fa-jedi-order:before {\\n content: \\\"\\\\f50e\\\"; }\\n\\n.fa-uikit:before {\\n content: \\\"\\\\f403\\\"; }\\n\\n.fa-fort-awesome-alt:before {\\n content: \\\"\\\\f3a3\\\"; }\\n\\n.fa-phabricator:before {\\n content: \\\"\\\\f3db\\\"; }\\n\\n.fa-ussunnah:before {\\n content: \\\"\\\\f407\\\"; }\\n\\n.fa-earlybirds:before {\\n content: \\\"\\\\f39a\\\"; }\\n\\n.fa-trade-federation:before {\\n content: \\\"\\\\f513\\\"; }\\n\\n.fa-autoprefixer:before {\\n content: \\\"\\\\f41c\\\"; }\\n\\n.fa-whatsapp:before {\\n content: \\\"\\\\f232\\\"; }\\n\\n.fa-slideshare:before {\\n content: \\\"\\\\f1e7\\\"; }\\n\\n.fa-google-play:before {\\n content: \\\"\\\\f3ab\\\"; }\\n\\n.fa-viadeo:before {\\n content: \\\"\\\\f2a9\\\"; }\\n\\n.fa-line:before {\\n content: \\\"\\\\f3c0\\\"; }\\n\\n.fa-google-drive:before {\\n content: \\\"\\\\f3aa\\\"; }\\n\\n.fa-servicestack:before {\\n content: \\\"\\\\f3ec\\\"; }\\n\\n.fa-simplybuilt:before {\\n content: \\\"\\\\f215\\\"; }\\n\\n.fa-bitbucket:before {\\n content: \\\"\\\\f171\\\"; }\\n\\n.fa-imdb:before {\\n content: \\\"\\\\f2d8\\\"; }\\n\\n.fa-deezer:before {\\n content: \\\"\\\\e077\\\"; }\\n\\n.fa-raspberry-pi:before {\\n content: \\\"\\\\f7bb\\\"; }\\n\\n.fa-jira:before {\\n content: \\\"\\\\f7b1\\\"; }\\n\\n.fa-docker:before {\\n content: \\\"\\\\f395\\\"; }\\n\\n.fa-screenpal:before {\\n content: \\\"\\\\e570\\\"; }\\n\\n.fa-bluetooth:before {\\n content: \\\"\\\\f293\\\"; }\\n\\n.fa-gitter:before {\\n content: \\\"\\\\f426\\\"; }\\n\\n.fa-d-and-d:before {\\n content: \\\"\\\\f38d\\\"; }\\n\\n.fa-microblog:before {\\n content: \\\"\\\\e01a\\\"; }\\n\\n.fa-cc-diners-club:before {\\n content: \\\"\\\\f24c\\\"; }\\n\\n.fa-gg-circle:before {\\n content: \\\"\\\\f261\\\"; }\\n\\n.fa-pied-piper-hat:before {\\n content: \\\"\\\\f4e5\\\"; }\\n\\n.fa-kickstarter-k:before {\\n content: \\\"\\\\f3bc\\\"; }\\n\\n.fa-yandex:before {\\n content: \\\"\\\\f413\\\"; }\\n\\n.fa-readme:before {\\n content: \\\"\\\\f4d5\\\"; }\\n\\n.fa-html5:before {\\n content: \\\"\\\\f13b\\\"; }\\n\\n.fa-sellsy:before {\\n content: \\\"\\\\f213\\\"; }\\n\\n.fa-sass:before {\\n content: \\\"\\\\f41e\\\"; }\\n\\n.fa-wirsindhandwerk:before {\\n content: \\\"\\\\e2d0\\\"; }\\n\\n.fa-wsh:before {\\n content: \\\"\\\\e2d0\\\"; }\\n\\n.fa-buromobelexperte:before {\\n content: \\\"\\\\f37f\\\"; }\\n\\n.fa-salesforce:before {\\n content: \\\"\\\\f83b\\\"; }\\n\\n.fa-octopus-deploy:before {\\n content: \\\"\\\\e082\\\"; }\\n\\n.fa-medapps:before {\\n content: \\\"\\\\f3c6\\\"; }\\n\\n.fa-ns8:before {\\n content: \\\"\\\\f3d5\\\"; }\\n\\n.fa-pinterest-p:before {\\n content: \\\"\\\\f231\\\"; }\\n\\n.fa-apper:before {\\n content: \\\"\\\\f371\\\"; }\\n\\n.fa-fort-awesome:before {\\n content: \\\"\\\\f286\\\"; }\\n\\n.fa-waze:before {\\n content: \\\"\\\\f83f\\\"; }\\n\\n.fa-cc-jcb:before {\\n content: \\\"\\\\f24b\\\"; }\\n\\n.fa-snapchat:before {\\n content: \\\"\\\\f2ab\\\"; }\\n\\n.fa-snapchat-ghost:before {\\n content: \\\"\\\\f2ab\\\"; }\\n\\n.fa-fantasy-flight-games:before {\\n content: \\\"\\\\f6dc\\\"; }\\n\\n.fa-rust:before {\\n content: \\\"\\\\e07a\\\"; }\\n\\n.fa-wix:before {\\n content: \\\"\\\\f5cf\\\"; }\\n\\n.fa-square-behance:before {\\n content: \\\"\\\\f1b5\\\"; }\\n\\n.fa-behance-square:before {\\n content: \\\"\\\\f1b5\\\"; }\\n\\n.fa-supple:before {\\n content: \\\"\\\\f3f9\\\"; }\\n\\n.fa-rebel:before {\\n content: \\\"\\\\f1d0\\\"; }\\n\\n.fa-css3:before {\\n content: \\\"\\\\f13c\\\"; }\\n\\n.fa-staylinked:before {\\n content: \\\"\\\\f3f5\\\"; }\\n\\n.fa-kaggle:before {\\n content: \\\"\\\\f5fa\\\"; }\\n\\n.fa-space-awesome:before {\\n content: \\\"\\\\e5ac\\\"; }\\n\\n.fa-deviantart:before {\\n content: \\\"\\\\f1bd\\\"; }\\n\\n.fa-cpanel:before {\\n content: \\\"\\\\f388\\\"; }\\n\\n.fa-goodreads-g:before {\\n content: \\\"\\\\f3a9\\\"; }\\n\\n.fa-square-git:before {\\n content: \\\"\\\\f1d2\\\"; }\\n\\n.fa-git-square:before {\\n content: \\\"\\\\f1d2\\\"; }\\n\\n.fa-square-tumblr:before {\\n content: \\\"\\\\f174\\\"; }\\n\\n.fa-tumblr-square:before {\\n content: \\\"\\\\f174\\\"; }\\n\\n.fa-trello:before {\\n content: \\\"\\\\f181\\\"; }\\n\\n.fa-creative-commons-nc-jp:before {\\n content: \\\"\\\\f4ea\\\"; }\\n\\n.fa-get-pocket:before {\\n content: \\\"\\\\f265\\\"; }\\n\\n.fa-perbyte:before {\\n content: \\\"\\\\e083\\\"; }\\n\\n.fa-grunt:before {\\n content: \\\"\\\\f3ad\\\"; }\\n\\n.fa-weebly:before {\\n content: \\\"\\\\f5cc\\\"; }\\n\\n.fa-connectdevelop:before {\\n content: \\\"\\\\f20e\\\"; }\\n\\n.fa-leanpub:before {\\n content: \\\"\\\\f212\\\"; }\\n\\n.fa-black-tie:before {\\n content: \\\"\\\\f27e\\\"; }\\n\\n.fa-themeco:before {\\n content: \\\"\\\\f5c6\\\"; }\\n\\n.fa-python:before {\\n content: \\\"\\\\f3e2\\\"; }\\n\\n.fa-android:before {\\n content: \\\"\\\\f17b\\\"; }\\n\\n.fa-bots:before {\\n content: \\\"\\\\e340\\\"; }\\n\\n.fa-free-code-camp:before {\\n content: \\\"\\\\f2c5\\\"; }\\n\\n.fa-hornbill:before {\\n content: \\\"\\\\f592\\\"; }\\n\\n.fa-js:before {\\n content: \\\"\\\\f3b8\\\"; }\\n\\n.fa-ideal:before {\\n content: \\\"\\\\e013\\\"; }\\n\\n.fa-git:before {\\n content: \\\"\\\\f1d3\\\"; }\\n\\n.fa-dev:before {\\n content: \\\"\\\\f6cc\\\"; }\\n\\n.fa-sketch:before {\\n content: \\\"\\\\f7c6\\\"; }\\n\\n.fa-yandex-international:before {\\n content: \\\"\\\\f414\\\"; }\\n\\n.fa-cc-amex:before {\\n content: \\\"\\\\f1f3\\\"; }\\n\\n.fa-uber:before {\\n content: \\\"\\\\f402\\\"; }\\n\\n.fa-github:before {\\n content: \\\"\\\\f09b\\\"; }\\n\\n.fa-php:before {\\n content: \\\"\\\\f457\\\"; }\\n\\n.fa-alipay:before {\\n content: \\\"\\\\f642\\\"; }\\n\\n.fa-youtube:before {\\n content: \\\"\\\\f167\\\"; }\\n\\n.fa-skyatlas:before {\\n content: \\\"\\\\f216\\\"; }\\n\\n.fa-firefox-browser:before {\\n content: \\\"\\\\e007\\\"; }\\n\\n.fa-replyd:before {\\n content: \\\"\\\\f3e6\\\"; }\\n\\n.fa-suse:before {\\n content: \\\"\\\\f7d6\\\"; }\\n\\n.fa-jenkins:before {\\n content: \\\"\\\\f3b6\\\"; }\\n\\n.fa-twitter:before {\\n content: \\\"\\\\f099\\\"; }\\n\\n.fa-rockrms:before {\\n content: \\\"\\\\f3e9\\\"; }\\n\\n.fa-pinterest:before {\\n content: \\\"\\\\f0d2\\\"; }\\n\\n.fa-buffer:before {\\n content: \\\"\\\\f837\\\"; }\\n\\n.fa-npm:before {\\n content: \\\"\\\\f3d4\\\"; }\\n\\n.fa-yammer:before {\\n content: \\\"\\\\f840\\\"; }\\n\\n.fa-btc:before {\\n content: \\\"\\\\f15a\\\"; }\\n\\n.fa-dribbble:before {\\n content: \\\"\\\\f17d\\\"; }\\n\\n.fa-stumbleupon-circle:before {\\n content: \\\"\\\\f1a3\\\"; }\\n\\n.fa-internet-explorer:before {\\n content: \\\"\\\\f26b\\\"; }\\n\\n.fa-telegram:before {\\n content: \\\"\\\\f2c6\\\"; }\\n\\n.fa-telegram-plane:before {\\n content: \\\"\\\\f2c6\\\"; }\\n\\n.fa-old-republic:before {\\n content: \\\"\\\\f510\\\"; }\\n\\n.fa-square-whatsapp:before {\\n content: \\\"\\\\f40c\\\"; }\\n\\n.fa-whatsapp-square:before {\\n content: \\\"\\\\f40c\\\"; }\\n\\n.fa-node-js:before {\\n content: \\\"\\\\f3d3\\\"; }\\n\\n.fa-edge-legacy:before {\\n content: \\\"\\\\e078\\\"; }\\n\\n.fa-slack:before {\\n content: \\\"\\\\f198\\\"; }\\n\\n.fa-slack-hash:before {\\n content: \\\"\\\\f198\\\"; }\\n\\n.fa-medrt:before {\\n content: \\\"\\\\f3c8\\\"; }\\n\\n.fa-usb:before {\\n content: \\\"\\\\f287\\\"; }\\n\\n.fa-tumblr:before {\\n content: \\\"\\\\f173\\\"; }\\n\\n.fa-vaadin:before {\\n content: \\\"\\\\f408\\\"; }\\n\\n.fa-quora:before {\\n content: \\\"\\\\f2c4\\\"; }\\n\\n.fa-reacteurope:before {\\n content: \\\"\\\\f75d\\\"; }\\n\\n.fa-medium:before {\\n content: \\\"\\\\f23a\\\"; }\\n\\n.fa-medium-m:before {\\n content: \\\"\\\\f23a\\\"; }\\n\\n.fa-amilia:before {\\n content: \\\"\\\\f36d\\\"; }\\n\\n.fa-mixcloud:before {\\n content: \\\"\\\\f289\\\"; }\\n\\n.fa-flipboard:before {\\n content: \\\"\\\\f44d\\\"; }\\n\\n.fa-viacoin:before {\\n content: \\\"\\\\f237\\\"; }\\n\\n.fa-critical-role:before {\\n content: \\\"\\\\f6c9\\\"; }\\n\\n.fa-sitrox:before {\\n content: \\\"\\\\e44a\\\"; }\\n\\n.fa-discourse:before {\\n content: \\\"\\\\f393\\\"; }\\n\\n.fa-joomla:before {\\n content: \\\"\\\\f1aa\\\"; }\\n\\n.fa-mastodon:before {\\n content: \\\"\\\\f4f6\\\"; }\\n\\n.fa-airbnb:before {\\n content: \\\"\\\\f834\\\"; }\\n\\n.fa-wolf-pack-battalion:before {\\n content: \\\"\\\\f514\\\"; }\\n\\n.fa-buy-n-large:before {\\n content: \\\"\\\\f8a6\\\"; }\\n\\n.fa-gulp:before {\\n content: \\\"\\\\f3ae\\\"; }\\n\\n.fa-creative-commons-sampling-plus:before {\\n content: \\\"\\\\f4f1\\\"; }\\n\\n.fa-strava:before {\\n content: \\\"\\\\f428\\\"; }\\n\\n.fa-ember:before {\\n content: \\\"\\\\f423\\\"; }\\n\\n.fa-canadian-maple-leaf:before {\\n content: \\\"\\\\f785\\\"; }\\n\\n.fa-teamspeak:before {\\n content: \\\"\\\\f4f9\\\"; }\\n\\n.fa-pushed:before {\\n content: \\\"\\\\f3e1\\\"; }\\n\\n.fa-wordpress-simple:before {\\n content: \\\"\\\\f411\\\"; }\\n\\n.fa-nutritionix:before {\\n content: \\\"\\\\f3d6\\\"; }\\n\\n.fa-wodu:before {\\n content: \\\"\\\\e088\\\"; }\\n\\n.fa-google-pay:before {\\n content: \\\"\\\\e079\\\"; }\\n\\n.fa-intercom:before {\\n content: \\\"\\\\f7af\\\"; }\\n\\n.fa-zhihu:before {\\n content: \\\"\\\\f63f\\\"; }\\n\\n.fa-korvue:before {\\n content: \\\"\\\\f42f\\\"; }\\n\\n.fa-pix:before {\\n content: \\\"\\\\e43a\\\"; }\\n\\n.fa-steam-symbol:before {\\n content: \\\"\\\\f3f6\\\"; }\\n:root, :host {\\n --fa-style-family-classic: 'Font Awesome 6 Free';\\n --fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free'; }\\n\\n@font-face {\\n font-family: 'Font Awesome 6 Free';\\n font-style: normal;\\n font-weight: 400;\\n font-display: block;\\n src: url(\" + ___CSS_LOADER_URL_REPLACEMENT_2___ + \") format(\\\"woff2\\\"), url(\" + ___CSS_LOADER_URL_REPLACEMENT_3___ + \") format(\\\"truetype\\\"); }\\n\\n.far,\\n.fa-regular {\\n font-weight: 400; }\\n:root, :host {\\n --fa-style-family-classic: 'Font Awesome 6 Free';\\n --fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free'; }\\n\\n@font-face {\\n font-family: 'Font Awesome 6 Free';\\n font-style: normal;\\n font-weight: 900;\\n font-display: block;\\n src: url(\" + ___CSS_LOADER_URL_REPLACEMENT_4___ + \") format(\\\"woff2\\\"), url(\" + ___CSS_LOADER_URL_REPLACEMENT_5___ + \") format(\\\"truetype\\\"); }\\n\\n.fas,\\n.fa-solid {\\n font-weight: 900; }\\n@font-face {\\n font-family: 'Font Awesome 5 Brands';\\n font-display: block;\\n font-weight: 400;\\n src: url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \") format(\\\"woff2\\\"), url(\" + ___CSS_LOADER_URL_REPLACEMENT_1___ + \") format(\\\"truetype\\\"); }\\n\\n@font-face {\\n font-family: 'Font Awesome 5 Free';\\n font-display: block;\\n font-weight: 900;\\n src: url(\" + ___CSS_LOADER_URL_REPLACEMENT_4___ + \") format(\\\"woff2\\\"), url(\" + ___CSS_LOADER_URL_REPLACEMENT_5___ + \") format(\\\"truetype\\\"); }\\n\\n@font-face {\\n font-family: 'Font Awesome 5 Free';\\n font-display: block;\\n font-weight: 400;\\n src: url(\" + ___CSS_LOADER_URL_REPLACEMENT_2___ + \") format(\\\"woff2\\\"), url(\" + ___CSS_LOADER_URL_REPLACEMENT_3___ + \") format(\\\"truetype\\\"); }\\n@font-face {\\n font-family: 'FontAwesome';\\n font-display: block;\\n src: url(\" + ___CSS_LOADER_URL_REPLACEMENT_4___ + \") format(\\\"woff2\\\"), url(\" + ___CSS_LOADER_URL_REPLACEMENT_5___ + \") format(\\\"truetype\\\"); }\\n\\n@font-face {\\n font-family: 'FontAwesome';\\n font-display: block;\\n src: url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \") format(\\\"woff2\\\"), url(\" + ___CSS_LOADER_URL_REPLACEMENT_1___ + \") format(\\\"truetype\\\"); }\\n\\n@font-face {\\n font-family: 'FontAwesome';\\n font-display: block;\\n src: url(\" + ___CSS_LOADER_URL_REPLACEMENT_2___ + \") format(\\\"woff2\\\"), url(\" + ___CSS_LOADER_URL_REPLACEMENT_3___ + \") format(\\\"truetype\\\");\\n unicode-range: U+F003,U+F006,U+F014,U+F016-F017,U+F01A-F01B,U+F01D,U+F022,U+F03E,U+F044,U+F046,U+F05C-F05D,U+F06E,U+F070,U+F087-F088,U+F08A,U+F094,U+F096-F097,U+F09D,U+F0A0,U+F0A2,U+F0A4-F0A7,U+F0C5,U+F0C7,U+F0E5-F0E6,U+F0EB,U+F0F6-F0F8,U+F10C,U+F114-F115,U+F118-F11A,U+F11C-F11D,U+F133,U+F147,U+F14E,U+F150-F152,U+F185-F186,U+F18E,U+F190-F192,U+F196,U+F1C1-F1C9,U+F1D9,U+F1DB,U+F1E3,U+F1EA,U+F1F7,U+F1F9,U+F20A,U+F247-F248,U+F24A,U+F24D,U+F255-F25B,U+F25D,U+F271-F274,U+F278,U+F27B,U+F28C,U+F28E,U+F29C,U+F2B5,U+F2B7,U+F2BA,U+F2BC,U+F2BE,U+F2C0-F2C1,U+F2C3,U+F2D0,U+F2D2,U+F2D4,U+F2DC; }\\n\\n@font-face {\\n font-family: 'FontAwesome';\\n font-display: block;\\n src: url(\" + ___CSS_LOADER_URL_REPLACEMENT_6___ + \") format(\\\"woff2\\\"), url(\" + ___CSS_LOADER_URL_REPLACEMENT_7___ + \") format(\\\"truetype\\\");\\n unicode-range: U+F041,U+F047,U+F065-F066,U+F07D-F07E,U+F080,U+F08B,U+F08E,U+F090,U+F09A,U+F0AC,U+F0AE,U+F0B2,U+F0D0,U+F0D6,U+F0E4,U+F0EC,U+F10A-F10B,U+F123,U+F13E,U+F148-F149,U+F14C,U+F156,U+F15E,U+F160-F161,U+F163,U+F175-F178,U+F195,U+F1F8,U+F219,U+F27A; }\\n\", \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://PhyloIO/./src/fontawesome-free-6.2.0-web/css/all.css?./node_modules/css-loader/dist/cjs.js");
1240
-
1241
- /***/ }),
1242
-
1243
1231
  /***/ "./node_modules/css-loader/dist/cjs.js!./src/interface.css":
1244
1232
  /*!*****************************************************************!*\
1245
1233
  !*** ./node_modules/css-loader/dist/cjs.js!./src/interface.css ***!
@@ -1247,7 +1235,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1247
1235
  /***/ ((module, __webpack_exports__, __webpack_require__) => {
1248
1236
 
1249
1237
  "use strict";
1250
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__);\n// Imports\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default()(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.corner_placeholder {\\n position: absolute;\\n display: flex;\\n padding: 8px;\\n z-index:10;\\n}\\n\\n.top { top: 0; }\\n.right { right: 0; }\\n.left { left: 0; }\\n.bottom { bottom: 0 }\\n\\n.square_button{\\n border-radius: 8px;\\n border:none;\\n padding: 8px;\\n cursor: pointer;\\n background-color: rgba(239, 239, 239, 0.95);\\n color:#555;\\n width: 56px;\\n height: 56px;\\n}\\n\\n.square_button:hover{\\n background-color: #ddd;\\n}\\n\\n/* TOGGLE */\\n\\n.screen_toggle{\\n cursor: default;\\n background-color: #ffffff;\\nmargin-left: 4px;\\nborder-radius : 0px;\\n padding-bottom: 0px ;\\n padding-top: 0px ;\\n}\\n\\n.screen_toggle:hover{\\n background-color: #ffffff;\\n}\\n\\n*[id^=\\\"button_edit_name_trash\\\"]{\\n display: none;\\n border-radius: 0px;\\n background-color: #dc3545;\\n margin-left: 4px;\\n margin-right: 4px;\\n}\\n\\n*[id^=\\\"button_edit_name_check\\\"]{\\ndisplay: none;\\nborder-radius: 0px;\\nbackground-color: #198754;\\n}\\n\\n/* BRANCH SCALE */\\n\\n.scale_line{\\n stroke-width: 1.2;\\n stroke: #555;\\n}\\n\\n.scale_text{\\n\\n}\\n\\n/* SEARCH */\\n\\n.search_input{\\n border: 1px solid #ddd;\\n border-right: none;\\n border-bottom-left-radius: 4px;\\n border-top-left-radius: 4px;\\n margin: 2px;\\n margin-right: 0;\\n background-color: white;\\n border-top-right-radius : 0;\\n border-bottom-right-radius : 0;\\n /*height: 13px !important;*/\\n}\\n\\n.search_input:hover{background-color: white;}\\n\\n.search_button {\\n margin: 2px;\\n margin-left: 0 !important;\\n\\n}\\n\\n/* TOP RIGHT SUB MENU */\\n\\n.tr-buttons{\\n flex-direction: column;\\n align-self: end;\\n display: flex;}\\n\\n.tr-buttons * {\\n align-self: flex-end;\\n}\\n\\n.tr-menus{\\n display: flex;\\n flex-direction: column;\\n margin-left: 4px;\\n\\n}\\n\\n.tr-menus > div {\\n align-self: flex-end;\\n width: 100%;\\n margin: 2px;\\n background-color: rgba(239, 239, 239, 0.95);\\n display: none;\\n}\\n\\n.menu_export{\\n border-radius: 4px;\\n\\n\\n}\\n\\n\\n.menu_export > div > button {\\n background-color: white;\\n}\\n\\n/* Accordion system for settings */\\n.menu_settings{\\n border-radius: 4px;\\n background-color: #aaa;\\n overflow-y: scroll;\\n max-height:95vh;\\n scrollbar-width: none; /* Firefox */\\n -ms-overflow-style: none; /* Internet Explorer 10+ */\\n}\\n\\n.menu_settings::-webkit-scrollbar { /* WebKit */\\n width: 0;\\n height: 0;\\n}\\n\\n/* Style the buttons that are used to open and close the accordion panel */\\n.accordion {\\n background-color: #eee;\\n color: #444;\\n cursor: pointer;\\n padding: 18px;\\n width: 100%;\\n text-align: left;\\n border: none;\\n outline: none;\\n transition: 0.4s;\\n}\\n\\n/* Add a background color to the button if it is clicked on (add the .active class with JS), and when you move the mouse over it (hover) */\\n.active, .accordion:hover {\\n background-color: #ccc;\\n}\\n\\n/* Style the accordion panel. Note: hidden by default */\\n.panel {\\n background-color: rgba(250, 250, 250, 0.98) !important;\\n padding: 0 18px;\\n background-color: white;\\n max-height: 0;\\n overflow: hidden;\\n transition: max-height 0.2s ease-out;\\n\\n}\\n\\n.accordion:after {\\n content: '\\\\02795'; /* Unicode character for \\\"plus\\\" sign (+) */\\n font-size: 13px;\\n color: #777;\\n float: right;\\n margin-left: 5px;\\n}\\n\\n.active:after {\\n content: \\\"\\\\2796\\\"; /* Unicode character for \\\"minus\\\" sign (-) */\\n}\\n\\n/* SLIDER */\\n\\n.slidecontainer {\\n width: 100%; /* Width of the outside container */\\n}\\n\\n/* The slider itself */\\n.slider {\\n -webkit-appearance: none; /* Override default CSS styles */\\n appearance: none;\\n width: 100%; /* Full-width */\\n height: 12px; /* Specified height */\\n background: #d3d3d3; /* Grey background */\\n outline: none; /* Remove outline */\\n opacity: 0.7; /* Set transparency (for mouse-over effects on hover) */\\n -webkit-transition: .2s; /* 0.2 seconds transition on hover */\\n transition: opacity .2s;\\n}\\n\\n/* Mouse-over effects */\\n.slider:hover {\\n opacity: 1; /* Fully shown on mouse-over */\\n}\\n\\n/* The slider handle (use -webkit- (Chrome, Opera, Safari, Edge) and -moz- (Firefox) to override default look) */\\n.slider::-webkit-slider-thumb {\\n -webkit-appearance: none; /* Override default look */\\n appearance: none;\\n width: 12px; /* Set a specific slider handle width */\\n height: 12px; /* Slider handle height */\\n background: #04AA6D; /* Green background */\\n cursor: pointer; /* Cursor on hover */\\n}\\n\\n.slider::-moz-range-thumb {\\n width: 12px; /* Set a specific slider handle width */\\n height: 12px; /* Slider handle height */\\n background: #04AA6D; /* Green background */\\n cursor: pointer; /* Cursor on hover */\\n}\\n\\n/* TOGGLE */\\n\\n/* The switch - the box around the slider */\\n.switch {\\n position: relative;\\n display: inline-block;\\n width: 30px;\\n height: 20px;\\n}\\n\\n/* Hide default HTML checkbox */\\n.switch input {\\n opacity: 0;\\n width: 0;\\n height: 0;\\n}\\n\\n/* The slider */\\n.slider_t {\\n position: absolute;\\n cursor: pointer;\\n top: 0;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n background-color: #ccc;\\n -webkit-transition: .4s;\\n transition: .4s;\\n}\\n\\n.slider_t:before {\\n position: absolute;\\n content: \\\"\\\";\\n height: 16px;\\n width: 16px;\\n left: 2px;\\n bottom: 2px;\\n background-color: white;\\n -webkit-transition: .4s;\\n transition: .4s;\\n}\\n\\ninput:checked + .slider_t {\\n background-color: #2196F3;\\n}\\n\\ninput:focus + .slider_t {\\n box-shadow: 0 0 1px #2196F3;\\n}\\n\\ninput:checked + .slider_t:before {\\n -webkit-transform: translateX(10px);\\n -ms-transform: translateX(10px);\\n transform: translateX(10px);\\n}\\n\\n/* Rounded sliders */\\n.slider_t.round {\\n border-radius: 20px;\\n}\\n\\n.slider_t.round:before {\\n border-radius: 50%;\\n}\\n\\n\\n\\n.autocomplete {\\n /*the container must be positioned relative:*/\\n position: relative;\\n display: inline-block;\\n}\\n\\n\\n.autocomplete-items {\\n position: absolute;\\n border: none;\\n z-index: 99;\\n /*position the autocomplete items to be the same width as the container:*/\\n top: 100%;\\n left: 0;\\n padding-left: 4px;\\n padding-right: 4px;\\n right: 0;\\n}\\n.autocomplete-items div {\\n padding: 10px;\\n cursor: pointer;\\n background-color: rgba(250, 250, 250, 0.98);\\n\\n}\\n.autocomplete-items div:hover {\\n /*when hovering an item:*/\\n background-color: #e9e9e9;\\n}\\n.autocomplete-active {\\n /*when navigating through the items using the arrow keys:*/\\n background-color: DodgerBlue !important;\\n color: #ffffff;\\n}\\n\\n\\n.d3-tip {\\n font-family: Arial, Helvetica, sans-serif;\\n line-height: 1.4;\\n padding: 20px;\\n pointer-events: none !important;\\n color: #203d5d;\\n box-shadow: 0 4px 20px 4px rgba(0, 20, 60, .1), 0 4px 80px -8px rgba(0, 20, 60, .2);\\n background-color: #fff;\\n border-radius: 4px;\\n}\\n\\n/* Creates a small triangle extender for the tooltip */\\n.d3-tip:after {\\n box-sizing: border-box;\\n display: inline;\\n font-size: 10px;\\n width: 100%;\\n line-height: 1;\\n color: #fff;\\n position: absolute;\\n pointer-events: none;\\n}\\n\\n/* Northward tooltips */\\n.d3-tip.n:after {\\n content: \\\"▼\\\";\\n margin: -1px 0 0 0;\\n top: 100%;\\n left: 0;\\n text-align: center;\\n}\\n\\n/* Eastward tooltips */\\n.d3-tip.e:after {\\n content: \\\"◀\\\";\\n margin: -4px 0 0 0;\\n top: 50%;\\n left: -8px;\\n}\\n\\n/* Southward tooltips */\\n.d3-tip.s:after {\\n content: \\\"▲\\\";\\n margin: 0 0 1px 0;\\n top: -8px;\\n left: 0;\\n text-align: center;\\n}\\n\\n/* Westward tooltips */\\n.d3-tip.w:after {\\n content: \\\"▶\\\";\\n margin: -4px 0 0 -1px;\\n top: 50%;\\n left: 100%;\\n}\\n\\nbody {font-family: Arial, Helvetica, sans-serif;}\\n\\n.dropdrop{\\n position: relative;\\n display: none;\\n margin-top: -24px;\\n\\n}\\n\\n.modal{\\n z-index: 1000000000 !important;\\n}\\n\\n.dashed_button{\\n background-color: white;\\n border: 2px dashed #ddd;\\n border-radius: 50px;\\n margin:auto;\\n height: 36px;\\n margin-left: 12px;\\n}\\n\\n\\n\\n\", \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://PhyloIO/./src/interface.css?./node_modules/css-loader/dist/cjs.js");
1238
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__);\n// Imports\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default()(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.corner_placeholder {\\n position: absolute;\\n display: flex;\\n padding: 8px;\\n z-index:10;\\n}\\n\\n.top { top: 0; }\\n.right { right: 0; }\\n.left { left: 0; }\\n.bottom { bottom: 0 }\\n\\n.square_button{\\n border-radius: 8px;\\n border:none;\\n padding: 8px;\\n cursor: pointer;\\n background-color: rgba(239, 239, 239, 0.95);\\n color:#555;\\n width: 56px;\\n height: 56px;\\n}\\n\\n.square_button.mini{\\n\\n width: 42px;\\n height: 42px;\\n}\\n\\n.square_button:hover{\\n background-color: #ddd;\\n}\\n\\n/* TOGGLE */\\n\\n.screen_toggle{\\n cursor: default;\\n background-color: #ffffff;\\nmargin-left: 4px;\\nborder-radius : 0px;\\n padding-bottom: 0px ;\\n padding-top: 0px ;\\n}\\n\\n.screen_toggle:hover{\\n background-color: #ffffff;\\n}\\n\\n*[id^=\\\"button_edit_name_trash\\\"]{\\n display: none;\\n border-radius: 0px;\\n background-color: #dc3545;\\n margin-left: 4px;\\n margin-right: 4px;\\n}\\n\\n*[id^=\\\"button_edit_name_check\\\"]{\\ndisplay: none;\\nborder-radius: 0px;\\nbackground-color: #198754;\\n}\\n\\n/* BRANCH SCALE */\\n\\n.scale_line{\\n stroke-width: 1.2;\\n stroke: #555;\\n}\\n\\n.scale_text{\\n\\n}\\n\\n/* SEARCH */\\n\\n.search_input{\\n border: 1px solid #ddd;\\n border-right: none;\\n border-bottom-left-radius: 4px;\\n border-top-left-radius: 4px;\\n margin: 2px;\\n margin-right: 0;\\n background-color: white;\\n border-top-right-radius : 0;\\n border-bottom-right-radius : 0;\\n /*height: 13px !important;*/\\n}\\n\\n.search_input:hover{background-color: white;}\\n\\n.search_button {\\n margin: 2px;\\n margin-left: 0 !important;\\n\\n}\\n\\n.select_node_face{\\n margin:4px;\\n display: inline;\\n}\\n\\n/* TOP RIGHT SUB MENU */\\n\\n.tr-buttons{\\n flex-direction: column;\\n align-self: end;\\n display: flex;}\\n\\n.tr-buttons * {\\n align-self: flex-end;\\n}\\n\\n.tr-menus{\\n display: flex;\\n flex-direction: column;\\n margin-left: 4px;\\n\\n}\\n\\n.tr-menus > div {\\n align-self: flex-end;\\n width: 100%;\\n margin: 2px;\\n background-color: rgba(239, 239, 239, 0.95);\\n display: none;\\n}\\n\\n.menu_export{\\n border-radius: 4px;\\n\\n\\n}\\n\\n\\n.menu_export > div > button {\\n background-color: white;\\n}\\n\\n/* Accordion system for settings */\\n.menu_settings{\\n border-radius: 4px;\\n background-color: #aaa;\\n overflow-y: scroll;\\n max-height:95vh;\\n scrollbar-width: none; /* Firefox */\\n -ms-overflow-style: none; /* Internet Explorer 10+ */\\n}\\n\\n.menu_settings::-webkit-scrollbar { /* WebKit */\\n width: 0;\\n height: 0;\\n}\\n\\n/* Style the buttons that are used to open and close the accordion panel */\\n.accordion {\\n background-color: #eee;\\n color: #444;\\n cursor: pointer;\\n padding: 18px;\\n width: 100%;\\n text-align: left;\\n border: none;\\n outline: none;\\n transition: 0.4s;\\n}\\n\\n/* Add a background color to the button if it is clicked on (add the .active class with JS), and when you move the mouse over it (hover) */\\n.active, .accordion:hover {\\n background-color: #ccc;\\n}\\n\\n/* Style the accordion panel. Note: hidden by default */\\n.panel {\\n background-color: rgba(250, 250, 250, 0.98) !important;\\n padding: 0 18px;\\n background-color: white;\\n max-height: 0;\\n overflow: hidden;\\n transition: max-height 0.2s ease-out;\\n\\n}\\n\\n.accordion:after {\\n content: '\\\\02795'; /* Unicode character for \\\"plus\\\" sign (+) */\\n font-size: 13px;\\n color: #777;\\n float: right;\\n margin-left: 5px;\\n}\\n\\n.active:after {\\n content: \\\"\\\\2796\\\"; /* Unicode character for \\\"minus\\\" sign (-) */\\n}\\n\\n/* SLIDER */\\n\\n.slidecontainer {\\n width: 100%; /* Width of the outside container */\\n}\\n\\n/* The slider itself */\\n.slider {\\n -webkit-appearance: none; /* Override default CSS styles */\\n appearance: none;\\n width: 100%; /* Full-width */\\n height: 12px; /* Specified height */\\n background: #d3d3d3; /* Grey background */\\n outline: none; /* Remove outline */\\n opacity: 0.7; /* Set transparency (for mouse-over effects on hover) */\\n -webkit-transition: .2s; /* 0.2 seconds transition on hover */\\n transition: opacity .2s;\\n}\\n\\n/* Mouse-over effects */\\n.slider:hover {\\n opacity: 1; /* Fully shown on mouse-over */\\n}\\n\\n/* The slider handle (use -webkit- (Chrome, Opera, Safari, Edge) and -moz- (Firefox) to override default look) */\\n.slider::-webkit-slider-thumb {\\n -webkit-appearance: none; /* Override default look */\\n appearance: none;\\n width: 12px; /* Set a specific slider handle width */\\n height: 12px; /* Slider handle height */\\n background: #04AA6D; /* Green background */\\n cursor: pointer; /* Cursor on hover */\\n}\\n\\n.slider::-moz-range-thumb {\\n width: 12px; /* Set a specific slider handle width */\\n height: 12px; /* Slider handle height */\\n background: #04AA6D; /* Green background */\\n cursor: pointer; /* Cursor on hover */\\n}\\n\\n/* TOGGLE */\\n\\n/* The switch - the box around the slider */\\n.switch {\\n position: relative;\\n display: inline-block;\\n width: 30px;\\n height: 20px;\\n}\\n\\n/* Hide default HTML checkbox */\\n.switch input {\\n opacity: 0;\\n width: 0;\\n height: 0;\\n}\\n\\n/* The slider */\\n.slider_t {\\n position: absolute;\\n cursor: pointer;\\n top: 0;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n background-color: #ccc;\\n -webkit-transition: .4s;\\n transition: .4s;\\n}\\n\\n.slider_t:before {\\n position: absolute;\\n content: \\\"\\\";\\n height: 16px;\\n width: 16px;\\n left: 2px;\\n bottom: 2px;\\n background-color: white;\\n -webkit-transition: .4s;\\n transition: .4s;\\n}\\n\\ninput:checked + .slider_t {\\n background-color: #2196F3;\\n}\\n\\ninput:focus + .slider_t {\\n box-shadow: 0 0 1px #2196F3;\\n}\\n\\ninput:checked + .slider_t:before {\\n -webkit-transform: translateX(10px);\\n -ms-transform: translateX(10px);\\n transform: translateX(10px);\\n}\\n\\n/* Rounded sliders */\\n.slider_t.round {\\n border-radius: 20px;\\n}\\n\\n.slider_t.round:before {\\n border-radius: 50%;\\n}\\n\\n\\n\\n.autocomplete {\\n /*the container must be positioned relative:*/\\n position: relative;\\n display: inline-block;\\n}\\n\\n\\n.autocomplete-items {\\n position: absolute;\\n border: none;\\n z-index: 99;\\n /*position the autocomplete items to be the same width as the container:*/\\n top: 100%;\\n left: 0;\\n padding-left: 4px;\\n padding-right: 4px;\\n right: 0;\\n}\\n.autocomplete-items div {\\n padding: 10px;\\n cursor: pointer;\\n background-color: rgba(250, 250, 250, 0.98);\\n\\n}\\n.autocomplete-items div:hover {\\n /*when hovering an item:*/\\n background-color: #e9e9e9;\\n}\\n.autocomplete-active {\\n /*when navigating through the items using the arrow keys:*/\\n background-color: DodgerBlue !important;\\n color: #ffffff;\\n}\\n\\n\\n.d3-tip {\\n font-family: Arial, Helvetica, sans-serif;\\n line-height: 1.4;\\n padding: 20px;\\n pointer-events: none !important;\\n color: #203d5d;\\n box-shadow: 0 4px 20px 4px rgba(0, 20, 60, .1), 0 4px 80px -8px rgba(0, 20, 60, .2);\\n background-color: #fff;\\n border-radius: 4px;\\n}\\n\\n/* Creates a small triangle extender for the tooltip */\\n.d3-tip:after {\\n box-sizing: border-box;\\n display: inline;\\n font-size: 10px;\\n width: 100%;\\n line-height: 1;\\n color: #fff;\\n position: absolute;\\n pointer-events: none;\\n}\\n\\n/* Northward tooltips */\\n.d3-tip.n:after {\\n content: \\\"▼\\\";\\n margin: -1px 0 0 0;\\n top: 100%;\\n left: 0;\\n text-align: center;\\n}\\n\\n/* Eastward tooltips */\\n.d3-tip.e:after {\\n content: \\\"◀\\\";\\n margin: -4px 0 0 0;\\n top: 50%;\\n left: -8px;\\n}\\n\\n/* Southward tooltips */\\n.d3-tip.s:after {\\n content: \\\"▲\\\";\\n margin: 0 0 1px 0;\\n top: -8px;\\n left: 0;\\n text-align: center;\\n}\\n\\n/* Westward tooltips */\\n.d3-tip.w:after {\\n content: \\\"▶\\\";\\n margin: -4px 0 0 -1px;\\n top: 50%;\\n left: 100%;\\n}\\n\\nbody {font-family: Arial, Helvetica, sans-serif;}\\n\\n.dropdrop{\\n position: relative;\\n display: none;\\n margin-top: -24px;\\n\\n}\\n\\n.modal{\\n z-index: 1000000000 !important;\\n}\\n\\n.dashed_button{\\n background-color: white;\\n border: 2px dashed #ddd;\\n border-radius: 50px;\\n margin:auto;\\n height: 36px;\\n margin-left: 12px;\\n}\\n\\n\\n\\n\", \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://PhyloIO/./src/interface.css?./node_modules/css-loader/dist/cjs.js");
1251
1239
 
1252
1240
  /***/ }),
1253
1241
 
@@ -1284,17 +1272,6 @@ eval("\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n
1284
1272
 
1285
1273
  /***/ }),
1286
1274
 
1287
- /***/ "./node_modules/css-loader/dist/runtime/getUrl.js":
1288
- /*!********************************************************!*\
1289
- !*** ./node_modules/css-loader/dist/runtime/getUrl.js ***!
1290
- \********************************************************/
1291
- /***/ ((module) => {
1292
-
1293
- "use strict";
1294
- eval("\n\nmodule.exports = function (url, options) {\n if (!options) {\n // eslint-disable-next-line no-param-reassign\n options = {};\n } // eslint-disable-next-line no-underscore-dangle, no-param-reassign\n\n\n url = url && url.__esModule ? url.default : url;\n\n if (typeof url !== \"string\") {\n return url;\n } // If url is already wrapped in quotes, remove them\n\n\n if (/^['\"].*['\"]$/.test(url)) {\n // eslint-disable-next-line no-param-reassign\n url = url.slice(1, -1);\n }\n\n if (options.hash) {\n // eslint-disable-next-line no-param-reassign\n url += options.hash;\n } // Should url be wrapped?\n // See https://drafts.csswg.org/css-values-3/#urls\n\n\n if (/[\"'() \\t\\n]/.test(url) || options.needQuotes) {\n return \"\\\"\".concat(url.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\"), \"\\\"\");\n }\n\n return url;\n};\n\n//# sourceURL=webpack://PhyloIO/./node_modules/css-loader/dist/runtime/getUrl.js?");
1295
-
1296
- /***/ }),
1297
-
1298
1275
  /***/ "./node_modules/d3-array/src/array.js":
1299
1276
  /*!********************************************!*\
1300
1277
  !*** ./node_modules/d3-array/src/array.js ***!
@@ -7733,94 +7710,6 @@ eval("var Buffer = (__webpack_require__(/*! safe-buffer */ \"./node_modules/safe
7733
7710
 
7734
7711
  /***/ }),
7735
7712
 
7736
- /***/ "./src/fontawesome-free-6.2.0-web/webfonts/fa-brands-400.ttf":
7737
- /*!*******************************************************************!*\
7738
- !*** ./src/fontawesome-free-6.2.0-web/webfonts/fa-brands-400.ttf ***!
7739
- \*******************************************************************/
7740
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
7741
-
7742
- "use strict";
7743
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + \"fonts/fa-brands-400.ttf\");\n\n//# sourceURL=webpack://PhyloIO/./src/fontawesome-free-6.2.0-web/webfonts/fa-brands-400.ttf?");
7744
-
7745
- /***/ }),
7746
-
7747
- /***/ "./src/fontawesome-free-6.2.0-web/webfonts/fa-brands-400.woff2":
7748
- /*!*********************************************************************!*\
7749
- !*** ./src/fontawesome-free-6.2.0-web/webfonts/fa-brands-400.woff2 ***!
7750
- \*********************************************************************/
7751
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
7752
-
7753
- "use strict";
7754
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + \"fonts/fa-brands-400.woff2\");\n\n//# sourceURL=webpack://PhyloIO/./src/fontawesome-free-6.2.0-web/webfonts/fa-brands-400.woff2?");
7755
-
7756
- /***/ }),
7757
-
7758
- /***/ "./src/fontawesome-free-6.2.0-web/webfonts/fa-regular-400.ttf":
7759
- /*!********************************************************************!*\
7760
- !*** ./src/fontawesome-free-6.2.0-web/webfonts/fa-regular-400.ttf ***!
7761
- \********************************************************************/
7762
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
7763
-
7764
- "use strict";
7765
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + \"fonts/fa-regular-400.ttf\");\n\n//# sourceURL=webpack://PhyloIO/./src/fontawesome-free-6.2.0-web/webfonts/fa-regular-400.ttf?");
7766
-
7767
- /***/ }),
7768
-
7769
- /***/ "./src/fontawesome-free-6.2.0-web/webfonts/fa-regular-400.woff2":
7770
- /*!**********************************************************************!*\
7771
- !*** ./src/fontawesome-free-6.2.0-web/webfonts/fa-regular-400.woff2 ***!
7772
- \**********************************************************************/
7773
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
7774
-
7775
- "use strict";
7776
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + \"fonts/fa-regular-400.woff2\");\n\n//# sourceURL=webpack://PhyloIO/./src/fontawesome-free-6.2.0-web/webfonts/fa-regular-400.woff2?");
7777
-
7778
- /***/ }),
7779
-
7780
- /***/ "./src/fontawesome-free-6.2.0-web/webfonts/fa-solid-900.ttf":
7781
- /*!******************************************************************!*\
7782
- !*** ./src/fontawesome-free-6.2.0-web/webfonts/fa-solid-900.ttf ***!
7783
- \******************************************************************/
7784
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
7785
-
7786
- "use strict";
7787
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + \"fonts/fa-solid-900.ttf\");\n\n//# sourceURL=webpack://PhyloIO/./src/fontawesome-free-6.2.0-web/webfonts/fa-solid-900.ttf?");
7788
-
7789
- /***/ }),
7790
-
7791
- /***/ "./src/fontawesome-free-6.2.0-web/webfonts/fa-solid-900.woff2":
7792
- /*!********************************************************************!*\
7793
- !*** ./src/fontawesome-free-6.2.0-web/webfonts/fa-solid-900.woff2 ***!
7794
- \********************************************************************/
7795
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
7796
-
7797
- "use strict";
7798
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + \"fonts/fa-solid-900.woff2\");\n\n//# sourceURL=webpack://PhyloIO/./src/fontawesome-free-6.2.0-web/webfonts/fa-solid-900.woff2?");
7799
-
7800
- /***/ }),
7801
-
7802
- /***/ "./src/fontawesome-free-6.2.0-web/webfonts/fa-v4compatibility.ttf":
7803
- /*!************************************************************************!*\
7804
- !*** ./src/fontawesome-free-6.2.0-web/webfonts/fa-v4compatibility.ttf ***!
7805
- \************************************************************************/
7806
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
7807
-
7808
- "use strict";
7809
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + \"fonts/fa-v4compatibility.ttf\");\n\n//# sourceURL=webpack://PhyloIO/./src/fontawesome-free-6.2.0-web/webfonts/fa-v4compatibility.ttf?");
7810
-
7811
- /***/ }),
7812
-
7813
- /***/ "./src/fontawesome-free-6.2.0-web/webfonts/fa-v4compatibility.woff2":
7814
- /*!**************************************************************************!*\
7815
- !*** ./src/fontawesome-free-6.2.0-web/webfonts/fa-v4compatibility.woff2 ***!
7816
- \**************************************************************************/
7817
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
7818
-
7819
- "use strict";
7820
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + \"fonts/fa-v4compatibility.woff2\");\n\n//# sourceURL=webpack://PhyloIO/./src/fontawesome-free-6.2.0-web/webfonts/fa-v4compatibility.woff2?");
7821
-
7822
- /***/ }),
7823
-
7824
7713
  /***/ "./node_modules/file-saver/dist/FileSaver.min.js":
7825
7714
  /*!*******************************************************!*\
7826
7715
  !*** ./node_modules/file-saver/dist/FileSaver.min.js ***!
@@ -8486,6 +8375,16 @@ eval("/* eslint-disable node/no-deprecated-api */\n\n\n\nvar buffer = __webpack_
8486
8375
 
8487
8376
  /***/ }),
8488
8377
 
8378
+ /***/ "./node_modules/sax/lib/sax.js":
8379
+ /*!*************************************!*\
8380
+ !*** ./node_modules/sax/lib/sax.js ***!
8381
+ \*************************************/
8382
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
8383
+
8384
+ eval(";(function (sax) { // wrapper for non-node envs\n sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }\n sax.SAXParser = SAXParser\n sax.SAXStream = SAXStream\n sax.createStream = createStream\n\n // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.\n // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),\n // since that's the earliest that a buffer overrun could occur. This way, checks are\n // as rare as required, but as often as necessary to ensure never crossing this bound.\n // Furthermore, buffers are only tested at most once per write(), so passing a very\n // large string into write() might have undesirable effects, but this is manageable by\n // the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme\n // edge case, result in creating at most one complete copy of the string passed in.\n // Set to Infinity to have unlimited buffers.\n sax.MAX_BUFFER_LENGTH = 64 * 1024\n\n var buffers = [\n 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',\n 'procInstName', 'procInstBody', 'entity', 'attribName',\n 'attribValue', 'cdata', 'script'\n ]\n\n sax.EVENTS = [\n 'text',\n 'processinginstruction',\n 'sgmldeclaration',\n 'doctype',\n 'comment',\n 'opentagstart',\n 'attribute',\n 'opentag',\n 'closetag',\n 'opencdata',\n 'cdata',\n 'closecdata',\n 'error',\n 'end',\n 'ready',\n 'script',\n 'opennamespace',\n 'closenamespace'\n ]\n\n function SAXParser (strict, opt) {\n if (!(this instanceof SAXParser)) {\n return new SAXParser(strict, opt)\n }\n\n var parser = this\n clearBuffers(parser)\n parser.q = parser.c = ''\n parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH\n parser.opt = opt || {}\n parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags\n parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'\n parser.tags = []\n parser.closed = parser.closedRoot = parser.sawRoot = false\n parser.tag = parser.error = null\n parser.strict = !!strict\n parser.noscript = !!(strict || parser.opt.noscript)\n parser.state = S.BEGIN\n parser.strictEntities = parser.opt.strictEntities\n parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)\n parser.attribList = []\n\n // namespaces form a prototype chain.\n // it always points at the current tag,\n // which protos to its parent tag.\n if (parser.opt.xmlns) {\n parser.ns = Object.create(rootNS)\n }\n\n // disallow unquoted attribute values if not otherwise configured\n // and strict mode is true\n if (parser.opt.unquotedAttributeValues === undefined) {\n parser.opt.unquotedAttributeValues = !strict;\n }\n\n // mostly just for error reporting\n parser.trackPosition = parser.opt.position !== false\n if (parser.trackPosition) {\n parser.position = parser.line = parser.column = 0\n }\n emit(parser, 'onready')\n }\n\n if (!Object.create) {\n Object.create = function (o) {\n function F () {}\n F.prototype = o\n var newf = new F()\n return newf\n }\n }\n\n if (!Object.keys) {\n Object.keys = function (o) {\n var a = []\n for (var i in o) if (o.hasOwnProperty(i)) a.push(i)\n return a\n }\n }\n\n function checkBufferLength (parser) {\n var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)\n var maxActual = 0\n for (var i = 0, l = buffers.length; i < l; i++) {\n var len = parser[buffers[i]].length\n if (len > maxAllowed) {\n // Text/cdata nodes can get big, and since they're buffered,\n // we can get here under normal conditions.\n // Avoid issues by emitting the text node now,\n // so at least it won't get any bigger.\n switch (buffers[i]) {\n case 'textNode':\n closeText(parser)\n break\n\n case 'cdata':\n emitNode(parser, 'oncdata', parser.cdata)\n parser.cdata = ''\n break\n\n case 'script':\n emitNode(parser, 'onscript', parser.script)\n parser.script = ''\n break\n\n default:\n error(parser, 'Max buffer length exceeded: ' + buffers[i])\n }\n }\n maxActual = Math.max(maxActual, len)\n }\n // schedule the next check for the earliest possible buffer overrun.\n var m = sax.MAX_BUFFER_LENGTH - maxActual\n parser.bufferCheckPosition = m + parser.position\n }\n\n function clearBuffers (parser) {\n for (var i = 0, l = buffers.length; i < l; i++) {\n parser[buffers[i]] = ''\n }\n }\n\n function flushBuffers (parser) {\n closeText(parser)\n if (parser.cdata !== '') {\n emitNode(parser, 'oncdata', parser.cdata)\n parser.cdata = ''\n }\n if (parser.script !== '') {\n emitNode(parser, 'onscript', parser.script)\n parser.script = ''\n }\n }\n\n SAXParser.prototype = {\n end: function () { end(this) },\n write: write,\n resume: function () { this.error = null; return this },\n close: function () { return this.write(null) },\n flush: function () { flushBuffers(this) }\n }\n\n var Stream\n try {\n Stream = (__webpack_require__(/*! stream */ \"./node_modules/stream-browserify/index.js\").Stream)\n } catch (ex) {\n Stream = function () {}\n }\n if (!Stream) Stream = function () {}\n\n var streamWraps = sax.EVENTS.filter(function (ev) {\n return ev !== 'error' && ev !== 'end'\n })\n\n function createStream (strict, opt) {\n return new SAXStream(strict, opt)\n }\n\n function SAXStream (strict, opt) {\n if (!(this instanceof SAXStream)) {\n return new SAXStream(strict, opt)\n }\n\n Stream.apply(this)\n\n this._parser = new SAXParser(strict, opt)\n this.writable = true\n this.readable = true\n\n var me = this\n\n this._parser.onend = function () {\n me.emit('end')\n }\n\n this._parser.onerror = function (er) {\n me.emit('error', er)\n\n // if didn't throw, then means error was handled.\n // go ahead and clear error, so we can write again.\n me._parser.error = null\n }\n\n this._decoder = null\n\n streamWraps.forEach(function (ev) {\n Object.defineProperty(me, 'on' + ev, {\n get: function () {\n return me._parser['on' + ev]\n },\n set: function (h) {\n if (!h) {\n me.removeAllListeners(ev)\n me._parser['on' + ev] = h\n return h\n }\n me.on(ev, h)\n },\n enumerable: true,\n configurable: false\n })\n })\n }\n\n SAXStream.prototype = Object.create(Stream.prototype, {\n constructor: {\n value: SAXStream\n }\n })\n\n SAXStream.prototype.write = function (data) {\n if (typeof Buffer === 'function' &&\n typeof Buffer.isBuffer === 'function' &&\n Buffer.isBuffer(data)) {\n if (!this._decoder) {\n var SD = (__webpack_require__(/*! string_decoder */ \"./node_modules/string_decoder/lib/string_decoder.js\").StringDecoder)\n this._decoder = new SD('utf8')\n }\n data = this._decoder.write(data)\n }\n\n this._parser.write(data.toString())\n this.emit('data', data)\n return true\n }\n\n SAXStream.prototype.end = function (chunk) {\n if (chunk && chunk.length) {\n this.write(chunk)\n }\n this._parser.end()\n return true\n }\n\n SAXStream.prototype.on = function (ev, handler) {\n var me = this\n if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {\n me._parser['on' + ev] = function () {\n var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)\n args.splice(0, 0, ev)\n me.emit.apply(me, args)\n }\n }\n\n return Stream.prototype.on.call(me, ev, handler)\n }\n\n // this really needs to be replaced with character classes.\n // XML allows all manner of ridiculous numbers and digits.\n var CDATA = '[CDATA['\n var DOCTYPE = 'DOCTYPE'\n var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'\n var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'\n var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }\n\n // http://www.w3.org/TR/REC-xml/#NT-NameStartChar\n // This implementation works on strings, a single character at a time\n // as such, it cannot ever support astral-plane characters (10000-EFFFF)\n // without a significant breaking change to either this parser, or the\n // JavaScript language. Implementation of an emoji-capable xml parser\n // is left as an exercise for the reader.\n var nameStart = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n\n var nameBody = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040.\\d-]/\n\n var entityStart = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n var entityBody = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040.\\d-]/\n\n function isWhitespace (c) {\n return c === ' ' || c === '\\n' || c === '\\r' || c === '\\t'\n }\n\n function isQuote (c) {\n return c === '\"' || c === '\\''\n }\n\n function isAttribEnd (c) {\n return c === '>' || isWhitespace(c)\n }\n\n function isMatch (regex, c) {\n return regex.test(c)\n }\n\n function notMatch (regex, c) {\n return !isMatch(regex, c)\n }\n\n var S = 0\n sax.STATE = {\n BEGIN: S++, // leading byte order mark or whitespace\n BEGIN_WHITESPACE: S++, // leading whitespace\n TEXT: S++, // general stuff\n TEXT_ENTITY: S++, // &amp and such.\n OPEN_WAKA: S++, // <\n SGML_DECL: S++, // <!BLARG\n SGML_DECL_QUOTED: S++, // <!BLARG foo \"bar\n DOCTYPE: S++, // <!DOCTYPE\n DOCTYPE_QUOTED: S++, // <!DOCTYPE \"//blah\n DOCTYPE_DTD: S++, // <!DOCTYPE \"//blah\" [ ...\n DOCTYPE_DTD_QUOTED: S++, // <!DOCTYPE \"//blah\" [ \"foo\n COMMENT_STARTING: S++, // <!-\n COMMENT: S++, // <!--\n COMMENT_ENDING: S++, // <!-- blah -\n COMMENT_ENDED: S++, // <!-- blah --\n CDATA: S++, // <![CDATA[ something\n CDATA_ENDING: S++, // ]\n CDATA_ENDING_2: S++, // ]]\n PROC_INST: S++, // <?hi\n PROC_INST_BODY: S++, // <?hi there\n PROC_INST_ENDING: S++, // <?hi \"there\" ?\n OPEN_TAG: S++, // <strong\n OPEN_TAG_SLASH: S++, // <strong /\n ATTRIB: S++, // <a\n ATTRIB_NAME: S++, // <a foo\n ATTRIB_NAME_SAW_WHITE: S++, // <a foo _\n ATTRIB_VALUE: S++, // <a foo=\n ATTRIB_VALUE_QUOTED: S++, // <a foo=\"bar\n ATTRIB_VALUE_CLOSED: S++, // <a foo=\"bar\"\n ATTRIB_VALUE_UNQUOTED: S++, // <a foo=bar\n ATTRIB_VALUE_ENTITY_Q: S++, // <foo bar=\"&quot;\"\n ATTRIB_VALUE_ENTITY_U: S++, // <foo bar=&quot\n CLOSE_TAG: S++, // </a\n CLOSE_TAG_SAW_WHITE: S++, // </a >\n SCRIPT: S++, // <script> ...\n SCRIPT_ENDING: S++ // <script> ... <\n }\n\n sax.XML_ENTITIES = {\n 'amp': '&',\n 'gt': '>',\n 'lt': '<',\n 'quot': '\"',\n 'apos': \"'\"\n }\n\n sax.ENTITIES = {\n 'amp': '&',\n 'gt': '>',\n 'lt': '<',\n 'quot': '\"',\n 'apos': \"'\",\n 'AElig': 198,\n 'Aacute': 193,\n 'Acirc': 194,\n 'Agrave': 192,\n 'Aring': 197,\n 'Atilde': 195,\n 'Auml': 196,\n 'Ccedil': 199,\n 'ETH': 208,\n 'Eacute': 201,\n 'Ecirc': 202,\n 'Egrave': 200,\n 'Euml': 203,\n 'Iacute': 205,\n 'Icirc': 206,\n 'Igrave': 204,\n 'Iuml': 207,\n 'Ntilde': 209,\n 'Oacute': 211,\n 'Ocirc': 212,\n 'Ograve': 210,\n 'Oslash': 216,\n 'Otilde': 213,\n 'Ouml': 214,\n 'THORN': 222,\n 'Uacute': 218,\n 'Ucirc': 219,\n 'Ugrave': 217,\n 'Uuml': 220,\n 'Yacute': 221,\n 'aacute': 225,\n 'acirc': 226,\n 'aelig': 230,\n 'agrave': 224,\n 'aring': 229,\n 'atilde': 227,\n 'auml': 228,\n 'ccedil': 231,\n 'eacute': 233,\n 'ecirc': 234,\n 'egrave': 232,\n 'eth': 240,\n 'euml': 235,\n 'iacute': 237,\n 'icirc': 238,\n 'igrave': 236,\n 'iuml': 239,\n 'ntilde': 241,\n 'oacute': 243,\n 'ocirc': 244,\n 'ograve': 242,\n 'oslash': 248,\n 'otilde': 245,\n 'ouml': 246,\n 'szlig': 223,\n 'thorn': 254,\n 'uacute': 250,\n 'ucirc': 251,\n 'ugrave': 249,\n 'uuml': 252,\n 'yacute': 253,\n 'yuml': 255,\n 'copy': 169,\n 'reg': 174,\n 'nbsp': 160,\n 'iexcl': 161,\n 'cent': 162,\n 'pound': 163,\n 'curren': 164,\n 'yen': 165,\n 'brvbar': 166,\n 'sect': 167,\n 'uml': 168,\n 'ordf': 170,\n 'laquo': 171,\n 'not': 172,\n 'shy': 173,\n 'macr': 175,\n 'deg': 176,\n 'plusmn': 177,\n 'sup1': 185,\n 'sup2': 178,\n 'sup3': 179,\n 'acute': 180,\n 'micro': 181,\n 'para': 182,\n 'middot': 183,\n 'cedil': 184,\n 'ordm': 186,\n 'raquo': 187,\n 'frac14': 188,\n 'frac12': 189,\n 'frac34': 190,\n 'iquest': 191,\n 'times': 215,\n 'divide': 247,\n 'OElig': 338,\n 'oelig': 339,\n 'Scaron': 352,\n 'scaron': 353,\n 'Yuml': 376,\n 'fnof': 402,\n 'circ': 710,\n 'tilde': 732,\n 'Alpha': 913,\n 'Beta': 914,\n 'Gamma': 915,\n 'Delta': 916,\n 'Epsilon': 917,\n 'Zeta': 918,\n 'Eta': 919,\n 'Theta': 920,\n 'Iota': 921,\n 'Kappa': 922,\n 'Lambda': 923,\n 'Mu': 924,\n 'Nu': 925,\n 'Xi': 926,\n 'Omicron': 927,\n 'Pi': 928,\n 'Rho': 929,\n 'Sigma': 931,\n 'Tau': 932,\n 'Upsilon': 933,\n 'Phi': 934,\n 'Chi': 935,\n 'Psi': 936,\n 'Omega': 937,\n 'alpha': 945,\n 'beta': 946,\n 'gamma': 947,\n 'delta': 948,\n 'epsilon': 949,\n 'zeta': 950,\n 'eta': 951,\n 'theta': 952,\n 'iota': 953,\n 'kappa': 954,\n 'lambda': 955,\n 'mu': 956,\n 'nu': 957,\n 'xi': 958,\n 'omicron': 959,\n 'pi': 960,\n 'rho': 961,\n 'sigmaf': 962,\n 'sigma': 963,\n 'tau': 964,\n 'upsilon': 965,\n 'phi': 966,\n 'chi': 967,\n 'psi': 968,\n 'omega': 969,\n 'thetasym': 977,\n 'upsih': 978,\n 'piv': 982,\n 'ensp': 8194,\n 'emsp': 8195,\n 'thinsp': 8201,\n 'zwnj': 8204,\n 'zwj': 8205,\n 'lrm': 8206,\n 'rlm': 8207,\n 'ndash': 8211,\n 'mdash': 8212,\n 'lsquo': 8216,\n 'rsquo': 8217,\n 'sbquo': 8218,\n 'ldquo': 8220,\n 'rdquo': 8221,\n 'bdquo': 8222,\n 'dagger': 8224,\n 'Dagger': 8225,\n 'bull': 8226,\n 'hellip': 8230,\n 'permil': 8240,\n 'prime': 8242,\n 'Prime': 8243,\n 'lsaquo': 8249,\n 'rsaquo': 8250,\n 'oline': 8254,\n 'frasl': 8260,\n 'euro': 8364,\n 'image': 8465,\n 'weierp': 8472,\n 'real': 8476,\n 'trade': 8482,\n 'alefsym': 8501,\n 'larr': 8592,\n 'uarr': 8593,\n 'rarr': 8594,\n 'darr': 8595,\n 'harr': 8596,\n 'crarr': 8629,\n 'lArr': 8656,\n 'uArr': 8657,\n 'rArr': 8658,\n 'dArr': 8659,\n 'hArr': 8660,\n 'forall': 8704,\n 'part': 8706,\n 'exist': 8707,\n 'empty': 8709,\n 'nabla': 8711,\n 'isin': 8712,\n 'notin': 8713,\n 'ni': 8715,\n 'prod': 8719,\n 'sum': 8721,\n 'minus': 8722,\n 'lowast': 8727,\n 'radic': 8730,\n 'prop': 8733,\n 'infin': 8734,\n 'ang': 8736,\n 'and': 8743,\n 'or': 8744,\n 'cap': 8745,\n 'cup': 8746,\n 'int': 8747,\n 'there4': 8756,\n 'sim': 8764,\n 'cong': 8773,\n 'asymp': 8776,\n 'ne': 8800,\n 'equiv': 8801,\n 'le': 8804,\n 'ge': 8805,\n 'sub': 8834,\n 'sup': 8835,\n 'nsub': 8836,\n 'sube': 8838,\n 'supe': 8839,\n 'oplus': 8853,\n 'otimes': 8855,\n 'perp': 8869,\n 'sdot': 8901,\n 'lceil': 8968,\n 'rceil': 8969,\n 'lfloor': 8970,\n 'rfloor': 8971,\n 'lang': 9001,\n 'rang': 9002,\n 'loz': 9674,\n 'spades': 9824,\n 'clubs': 9827,\n 'hearts': 9829,\n 'diams': 9830\n }\n\n Object.keys(sax.ENTITIES).forEach(function (key) {\n var e = sax.ENTITIES[key]\n var s = typeof e === 'number' ? String.fromCharCode(e) : e\n sax.ENTITIES[key] = s\n })\n\n for (var s in sax.STATE) {\n sax.STATE[sax.STATE[s]] = s\n }\n\n // shorthand\n S = sax.STATE\n\n function emit (parser, event, data) {\n parser[event] && parser[event](data)\n }\n\n function emitNode (parser, nodeType, data) {\n if (parser.textNode) closeText(parser)\n emit(parser, nodeType, data)\n }\n\n function closeText (parser) {\n parser.textNode = textopts(parser.opt, parser.textNode)\n if (parser.textNode) emit(parser, 'ontext', parser.textNode)\n parser.textNode = ''\n }\n\n function textopts (opt, text) {\n if (opt.trim) text = text.trim()\n if (opt.normalize) text = text.replace(/\\s+/g, ' ')\n return text\n }\n\n function error (parser, er) {\n closeText(parser)\n if (parser.trackPosition) {\n er += '\\nLine: ' + parser.line +\n '\\nColumn: ' + parser.column +\n '\\nChar: ' + parser.c\n }\n er = new Error(er)\n parser.error = er\n emit(parser, 'onerror', er)\n return parser\n }\n\n function end (parser) {\n if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag')\n if ((parser.state !== S.BEGIN) &&\n (parser.state !== S.BEGIN_WHITESPACE) &&\n (parser.state !== S.TEXT)) {\n error(parser, 'Unexpected end')\n }\n closeText(parser)\n parser.c = ''\n parser.closed = true\n emit(parser, 'onend')\n SAXParser.call(parser, parser.strict, parser.opt)\n return parser\n }\n\n function strictFail (parser, message) {\n if (typeof parser !== 'object' || !(parser instanceof SAXParser)) {\n throw new Error('bad call to strictFail')\n }\n if (parser.strict) {\n error(parser, message)\n }\n }\n\n function newTag (parser) {\n if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()\n var parent = parser.tags[parser.tags.length - 1] || parser\n var tag = parser.tag = { name: parser.tagName, attributes: {} }\n\n // will be overridden if tag contails an xmlns=\"foo\" or xmlns:foo=\"bar\"\n if (parser.opt.xmlns) {\n tag.ns = parent.ns\n }\n parser.attribList.length = 0\n emitNode(parser, 'onopentagstart', tag)\n }\n\n function qname (name, attribute) {\n var i = name.indexOf(':')\n var qualName = i < 0 ? [ '', name ] : name.split(':')\n var prefix = qualName[0]\n var local = qualName[1]\n\n // <x \"xmlns\"=\"http://foo\">\n if (attribute && name === 'xmlns') {\n prefix = 'xmlns'\n local = ''\n }\n\n return { prefix: prefix, local: local }\n }\n\n function attrib (parser) {\n if (!parser.strict) {\n parser.attribName = parser.attribName[parser.looseCase]()\n }\n\n if (parser.attribList.indexOf(parser.attribName) !== -1 ||\n parser.tag.attributes.hasOwnProperty(parser.attribName)) {\n parser.attribName = parser.attribValue = ''\n return\n }\n\n if (parser.opt.xmlns) {\n var qn = qname(parser.attribName, true)\n var prefix = qn.prefix\n var local = qn.local\n\n if (prefix === 'xmlns') {\n // namespace binding attribute. push the binding into scope\n if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) {\n strictFail(parser,\n 'xml: prefix must be bound to ' + XML_NAMESPACE + '\\n' +\n 'Actual: ' + parser.attribValue)\n } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) {\n strictFail(parser,\n 'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\\n' +\n 'Actual: ' + parser.attribValue)\n } else {\n var tag = parser.tag\n var parent = parser.tags[parser.tags.length - 1] || parser\n if (tag.ns === parent.ns) {\n tag.ns = Object.create(parent.ns)\n }\n tag.ns[local] = parser.attribValue\n }\n }\n\n // defer onattribute events until all attributes have been seen\n // so any new bindings can take effect. preserve attribute order\n // so deferred events can be emitted in document order\n parser.attribList.push([parser.attribName, parser.attribValue])\n } else {\n // in non-xmlns mode, we can emit the event right away\n parser.tag.attributes[parser.attribName] = parser.attribValue\n emitNode(parser, 'onattribute', {\n name: parser.attribName,\n value: parser.attribValue\n })\n }\n\n parser.attribName = parser.attribValue = ''\n }\n\n function openTag (parser, selfClosing) {\n if (parser.opt.xmlns) {\n // emit namespace binding events\n var tag = parser.tag\n\n // add namespace info to tag\n var qn = qname(parser.tagName)\n tag.prefix = qn.prefix\n tag.local = qn.local\n tag.uri = tag.ns[qn.prefix] || ''\n\n if (tag.prefix && !tag.uri) {\n strictFail(parser, 'Unbound namespace prefix: ' +\n JSON.stringify(parser.tagName))\n tag.uri = qn.prefix\n }\n\n var parent = parser.tags[parser.tags.length - 1] || parser\n if (tag.ns && parent.ns !== tag.ns) {\n Object.keys(tag.ns).forEach(function (p) {\n emitNode(parser, 'onopennamespace', {\n prefix: p,\n uri: tag.ns[p]\n })\n })\n }\n\n // handle deferred onattribute events\n // Note: do not apply default ns to attributes:\n // http://www.w3.org/TR/REC-xml-names/#defaulting\n for (var i = 0, l = parser.attribList.length; i < l; i++) {\n var nv = parser.attribList[i]\n var name = nv[0]\n var value = nv[1]\n var qualName = qname(name, true)\n var prefix = qualName.prefix\n var local = qualName.local\n var uri = prefix === '' ? '' : (tag.ns[prefix] || '')\n var a = {\n name: name,\n value: value,\n prefix: prefix,\n local: local,\n uri: uri\n }\n\n // if there's any attributes with an undefined namespace,\n // then fail on them now.\n if (prefix && prefix !== 'xmlns' && !uri) {\n strictFail(parser, 'Unbound namespace prefix: ' +\n JSON.stringify(prefix))\n a.uri = prefix\n }\n parser.tag.attributes[name] = a\n emitNode(parser, 'onattribute', a)\n }\n parser.attribList.length = 0\n }\n\n parser.tag.isSelfClosing = !!selfClosing\n\n // process the tag\n parser.sawRoot = true\n parser.tags.push(parser.tag)\n emitNode(parser, 'onopentag', parser.tag)\n if (!selfClosing) {\n // special case for <script> in non-strict mode.\n if (!parser.noscript && parser.tagName.toLowerCase() === 'script') {\n parser.state = S.SCRIPT\n } else {\n parser.state = S.TEXT\n }\n parser.tag = null\n parser.tagName = ''\n }\n parser.attribName = parser.attribValue = ''\n parser.attribList.length = 0\n }\n\n function closeTag (parser) {\n if (!parser.tagName) {\n strictFail(parser, 'Weird empty close tag.')\n parser.textNode += '</>'\n parser.state = S.TEXT\n return\n }\n\n if (parser.script) {\n if (parser.tagName !== 'script') {\n parser.script += '</' + parser.tagName + '>'\n parser.tagName = ''\n parser.state = S.SCRIPT\n return\n }\n emitNode(parser, 'onscript', parser.script)\n parser.script = ''\n }\n\n // first make sure that the closing tag actually exists.\n // <a><b></c></b></a> will close everything, otherwise.\n var t = parser.tags.length\n var tagName = parser.tagName\n if (!parser.strict) {\n tagName = tagName[parser.looseCase]()\n }\n var closeTo = tagName\n while (t--) {\n var close = parser.tags[t]\n if (close.name !== closeTo) {\n // fail the first time in strict mode\n strictFail(parser, 'Unexpected close tag')\n } else {\n break\n }\n }\n\n // didn't find it. we already failed for strict, so just abort.\n if (t < 0) {\n strictFail(parser, 'Unmatched closing tag: ' + parser.tagName)\n parser.textNode += '</' + parser.tagName + '>'\n parser.state = S.TEXT\n return\n }\n parser.tagName = tagName\n var s = parser.tags.length\n while (s-- > t) {\n var tag = parser.tag = parser.tags.pop()\n parser.tagName = parser.tag.name\n emitNode(parser, 'onclosetag', parser.tagName)\n\n var x = {}\n for (var i in tag.ns) {\n x[i] = tag.ns[i]\n }\n\n var parent = parser.tags[parser.tags.length - 1] || parser\n if (parser.opt.xmlns && tag.ns !== parent.ns) {\n // remove namespace bindings introduced by tag\n Object.keys(tag.ns).forEach(function (p) {\n var n = tag.ns[p]\n emitNode(parser, 'onclosenamespace', { prefix: p, uri: n })\n })\n }\n }\n if (t === 0) parser.closedRoot = true\n parser.tagName = parser.attribValue = parser.attribName = ''\n parser.attribList.length = 0\n parser.state = S.TEXT\n }\n\n function parseEntity (parser) {\n var entity = parser.entity\n var entityLC = entity.toLowerCase()\n var num\n var numStr = ''\n\n if (parser.ENTITIES[entity]) {\n return parser.ENTITIES[entity]\n }\n if (parser.ENTITIES[entityLC]) {\n return parser.ENTITIES[entityLC]\n }\n entity = entityLC\n if (entity.charAt(0) === '#') {\n if (entity.charAt(1) === 'x') {\n entity = entity.slice(2)\n num = parseInt(entity, 16)\n numStr = num.toString(16)\n } else {\n entity = entity.slice(1)\n num = parseInt(entity, 10)\n numStr = num.toString(10)\n }\n }\n entity = entity.replace(/^0+/, '')\n if (isNaN(num) || numStr.toLowerCase() !== entity) {\n strictFail(parser, 'Invalid character entity')\n return '&' + parser.entity + ';'\n }\n\n return String.fromCodePoint(num)\n }\n\n function beginWhiteSpace (parser, c) {\n if (c === '<') {\n parser.state = S.OPEN_WAKA\n parser.startTagPosition = parser.position\n } else if (!isWhitespace(c)) {\n // have to process this as a text node.\n // weird, but happens.\n strictFail(parser, 'Non-whitespace before first tag.')\n parser.textNode = c\n parser.state = S.TEXT\n }\n }\n\n function charAt (chunk, i) {\n var result = ''\n if (i < chunk.length) {\n result = chunk.charAt(i)\n }\n return result\n }\n\n function write (chunk) {\n var parser = this\n if (this.error) {\n throw this.error\n }\n if (parser.closed) {\n return error(parser,\n 'Cannot write after close. Assign an onready handler.')\n }\n if (chunk === null) {\n return end(parser)\n }\n if (typeof chunk === 'object') {\n chunk = chunk.toString()\n }\n var i = 0\n var c = ''\n while (true) {\n c = charAt(chunk, i++)\n parser.c = c\n\n if (!c) {\n break\n }\n\n if (parser.trackPosition) {\n parser.position++\n if (c === '\\n') {\n parser.line++\n parser.column = 0\n } else {\n parser.column++\n }\n }\n\n switch (parser.state) {\n case S.BEGIN:\n parser.state = S.BEGIN_WHITESPACE\n if (c === '\\uFEFF') {\n continue\n }\n beginWhiteSpace(parser, c)\n continue\n\n case S.BEGIN_WHITESPACE:\n beginWhiteSpace(parser, c)\n continue\n\n case S.TEXT:\n if (parser.sawRoot && !parser.closedRoot) {\n var starti = i - 1\n while (c && c !== '<' && c !== '&') {\n c = charAt(chunk, i++)\n if (c && parser.trackPosition) {\n parser.position++\n if (c === '\\n') {\n parser.line++\n parser.column = 0\n } else {\n parser.column++\n }\n }\n }\n parser.textNode += chunk.substring(starti, i - 1)\n }\n if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {\n parser.state = S.OPEN_WAKA\n parser.startTagPosition = parser.position\n } else {\n if (!isWhitespace(c) && (!parser.sawRoot || parser.closedRoot)) {\n strictFail(parser, 'Text data outside of root node.')\n }\n if (c === '&') {\n parser.state = S.TEXT_ENTITY\n } else {\n parser.textNode += c\n }\n }\n continue\n\n case S.SCRIPT:\n // only non-strict\n if (c === '<') {\n parser.state = S.SCRIPT_ENDING\n } else {\n parser.script += c\n }\n continue\n\n case S.SCRIPT_ENDING:\n if (c === '/') {\n parser.state = S.CLOSE_TAG\n } else {\n parser.script += '<' + c\n parser.state = S.SCRIPT\n }\n continue\n\n case S.OPEN_WAKA:\n // either a /, ?, !, or text is coming next.\n if (c === '!') {\n parser.state = S.SGML_DECL\n parser.sgmlDecl = ''\n } else if (isWhitespace(c)) {\n // wait for it...\n } else if (isMatch(nameStart, c)) {\n parser.state = S.OPEN_TAG\n parser.tagName = c\n } else if (c === '/') {\n parser.state = S.CLOSE_TAG\n parser.tagName = ''\n } else if (c === '?') {\n parser.state = S.PROC_INST\n parser.procInstName = parser.procInstBody = ''\n } else {\n strictFail(parser, 'Unencoded <')\n // if there was some whitespace, then add that in.\n if (parser.startTagPosition + 1 < parser.position) {\n var pad = parser.position - parser.startTagPosition\n c = new Array(pad).join(' ') + c\n }\n parser.textNode += '<' + c\n parser.state = S.TEXT\n }\n continue\n\n case S.SGML_DECL:\n if (parser.sgmlDecl + c === '--') {\n parser.state = S.COMMENT\n parser.comment = ''\n parser.sgmlDecl = ''\n continue;\n }\n\n if (parser.doctype && parser.doctype !== true && parser.sgmlDecl) {\n parser.state = S.DOCTYPE_DTD\n parser.doctype += '<!' + parser.sgmlDecl + c\n parser.sgmlDecl = ''\n } else if ((parser.sgmlDecl + c).toUpperCase() === CDATA) {\n emitNode(parser, 'onopencdata')\n parser.state = S.CDATA\n parser.sgmlDecl = ''\n parser.cdata = ''\n } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) {\n parser.state = S.DOCTYPE\n if (parser.doctype || parser.sawRoot) {\n strictFail(parser,\n 'Inappropriately located doctype declaration')\n }\n parser.doctype = ''\n parser.sgmlDecl = ''\n } else if (c === '>') {\n emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl)\n parser.sgmlDecl = ''\n parser.state = S.TEXT\n } else if (isQuote(c)) {\n parser.state = S.SGML_DECL_QUOTED\n parser.sgmlDecl += c\n } else {\n parser.sgmlDecl += c\n }\n continue\n\n case S.SGML_DECL_QUOTED:\n if (c === parser.q) {\n parser.state = S.SGML_DECL\n parser.q = ''\n }\n parser.sgmlDecl += c\n continue\n\n case S.DOCTYPE:\n if (c === '>') {\n parser.state = S.TEXT\n emitNode(parser, 'ondoctype', parser.doctype)\n parser.doctype = true // just remember that we saw it.\n } else {\n parser.doctype += c\n if (c === '[') {\n parser.state = S.DOCTYPE_DTD\n } else if (isQuote(c)) {\n parser.state = S.DOCTYPE_QUOTED\n parser.q = c\n }\n }\n continue\n\n case S.DOCTYPE_QUOTED:\n parser.doctype += c\n if (c === parser.q) {\n parser.q = ''\n parser.state = S.DOCTYPE\n }\n continue\n\n case S.DOCTYPE_DTD:\n if (c === ']') {\n parser.doctype += c\n parser.state = S.DOCTYPE\n } else if (c === '<') {\n parser.state = S.OPEN_WAKA\n parser.startTagPosition = parser.position\n } else if (isQuote(c)) {\n parser.doctype += c\n parser.state = S.DOCTYPE_DTD_QUOTED\n parser.q = c\n } else {\n parser.doctype += c\n }\n continue\n\n case S.DOCTYPE_DTD_QUOTED:\n parser.doctype += c\n if (c === parser.q) {\n parser.state = S.DOCTYPE_DTD\n parser.q = ''\n }\n continue\n\n case S.COMMENT:\n if (c === '-') {\n parser.state = S.COMMENT_ENDING\n } else {\n parser.comment += c\n }\n continue\n\n case S.COMMENT_ENDING:\n if (c === '-') {\n parser.state = S.COMMENT_ENDED\n parser.comment = textopts(parser.opt, parser.comment)\n if (parser.comment) {\n emitNode(parser, 'oncomment', parser.comment)\n }\n parser.comment = ''\n } else {\n parser.comment += '-' + c\n parser.state = S.COMMENT\n }\n continue\n\n case S.COMMENT_ENDED:\n if (c !== '>') {\n strictFail(parser, 'Malformed comment')\n // allow <!-- blah -- bloo --> in non-strict mode,\n // which is a comment of \" blah -- bloo \"\n parser.comment += '--' + c\n parser.state = S.COMMENT\n } else if (parser.doctype && parser.doctype !== true) {\n parser.state = S.DOCTYPE_DTD\n } else {\n parser.state = S.TEXT\n }\n continue\n\n case S.CDATA:\n if (c === ']') {\n parser.state = S.CDATA_ENDING\n } else {\n parser.cdata += c\n }\n continue\n\n case S.CDATA_ENDING:\n if (c === ']') {\n parser.state = S.CDATA_ENDING_2\n } else {\n parser.cdata += ']' + c\n parser.state = S.CDATA\n }\n continue\n\n case S.CDATA_ENDING_2:\n if (c === '>') {\n if (parser.cdata) {\n emitNode(parser, 'oncdata', parser.cdata)\n }\n emitNode(parser, 'onclosecdata')\n parser.cdata = ''\n parser.state = S.TEXT\n } else if (c === ']') {\n parser.cdata += ']'\n } else {\n parser.cdata += ']]' + c\n parser.state = S.CDATA\n }\n continue\n\n case S.PROC_INST:\n if (c === '?') {\n parser.state = S.PROC_INST_ENDING\n } else if (isWhitespace(c)) {\n parser.state = S.PROC_INST_BODY\n } else {\n parser.procInstName += c\n }\n continue\n\n case S.PROC_INST_BODY:\n if (!parser.procInstBody && isWhitespace(c)) {\n continue\n } else if (c === '?') {\n parser.state = S.PROC_INST_ENDING\n } else {\n parser.procInstBody += c\n }\n continue\n\n case S.PROC_INST_ENDING:\n if (c === '>') {\n emitNode(parser, 'onprocessinginstruction', {\n name: parser.procInstName,\n body: parser.procInstBody\n })\n parser.procInstName = parser.procInstBody = ''\n parser.state = S.TEXT\n } else {\n parser.procInstBody += '?' + c\n parser.state = S.PROC_INST_BODY\n }\n continue\n\n case S.OPEN_TAG:\n if (isMatch(nameBody, c)) {\n parser.tagName += c\n } else {\n newTag(parser)\n if (c === '>') {\n openTag(parser)\n } else if (c === '/') {\n parser.state = S.OPEN_TAG_SLASH\n } else {\n if (!isWhitespace(c)) {\n strictFail(parser, 'Invalid character in tag name')\n }\n parser.state = S.ATTRIB\n }\n }\n continue\n\n case S.OPEN_TAG_SLASH:\n if (c === '>') {\n openTag(parser, true)\n closeTag(parser)\n } else {\n strictFail(parser, 'Forward-slash in opening tag not followed by >')\n parser.state = S.ATTRIB\n }\n continue\n\n case S.ATTRIB:\n // haven't read the attribute name yet.\n if (isWhitespace(c)) {\n continue\n } else if (c === '>') {\n openTag(parser)\n } else if (c === '/') {\n parser.state = S.OPEN_TAG_SLASH\n } else if (isMatch(nameStart, c)) {\n parser.attribName = c\n parser.attribValue = ''\n parser.state = S.ATTRIB_NAME\n } else {\n strictFail(parser, 'Invalid attribute name')\n }\n continue\n\n case S.ATTRIB_NAME:\n if (c === '=') {\n parser.state = S.ATTRIB_VALUE\n } else if (c === '>') {\n strictFail(parser, 'Attribute without value')\n parser.attribValue = parser.attribName\n attrib(parser)\n openTag(parser)\n } else if (isWhitespace(c)) {\n parser.state = S.ATTRIB_NAME_SAW_WHITE\n } else if (isMatch(nameBody, c)) {\n parser.attribName += c\n } else {\n strictFail(parser, 'Invalid attribute name')\n }\n continue\n\n case S.ATTRIB_NAME_SAW_WHITE:\n if (c === '=') {\n parser.state = S.ATTRIB_VALUE\n } else if (isWhitespace(c)) {\n continue\n } else {\n strictFail(parser, 'Attribute without value')\n parser.tag.attributes[parser.attribName] = ''\n parser.attribValue = ''\n emitNode(parser, 'onattribute', {\n name: parser.attribName,\n value: ''\n })\n parser.attribName = ''\n if (c === '>') {\n openTag(parser)\n } else if (isMatch(nameStart, c)) {\n parser.attribName = c\n parser.state = S.ATTRIB_NAME\n } else {\n strictFail(parser, 'Invalid attribute name')\n parser.state = S.ATTRIB\n }\n }\n continue\n\n case S.ATTRIB_VALUE:\n if (isWhitespace(c)) {\n continue\n } else if (isQuote(c)) {\n parser.q = c\n parser.state = S.ATTRIB_VALUE_QUOTED\n } else {\n if (!parser.opt.unquotedAttributeValues) {\n error(parser, 'Unquoted attribute value')\n }\n parser.state = S.ATTRIB_VALUE_UNQUOTED\n parser.attribValue = c\n }\n continue\n\n case S.ATTRIB_VALUE_QUOTED:\n if (c !== parser.q) {\n if (c === '&') {\n parser.state = S.ATTRIB_VALUE_ENTITY_Q\n } else {\n parser.attribValue += c\n }\n continue\n }\n attrib(parser)\n parser.q = ''\n parser.state = S.ATTRIB_VALUE_CLOSED\n continue\n\n case S.ATTRIB_VALUE_CLOSED:\n if (isWhitespace(c)) {\n parser.state = S.ATTRIB\n } else if (c === '>') {\n openTag(parser)\n } else if (c === '/') {\n parser.state = S.OPEN_TAG_SLASH\n } else if (isMatch(nameStart, c)) {\n strictFail(parser, 'No whitespace between attributes')\n parser.attribName = c\n parser.attribValue = ''\n parser.state = S.ATTRIB_NAME\n } else {\n strictFail(parser, 'Invalid attribute name')\n }\n continue\n\n case S.ATTRIB_VALUE_UNQUOTED:\n if (!isAttribEnd(c)) {\n if (c === '&') {\n parser.state = S.ATTRIB_VALUE_ENTITY_U\n } else {\n parser.attribValue += c\n }\n continue\n }\n attrib(parser)\n if (c === '>') {\n openTag(parser)\n } else {\n parser.state = S.ATTRIB\n }\n continue\n\n case S.CLOSE_TAG:\n if (!parser.tagName) {\n if (isWhitespace(c)) {\n continue\n } else if (notMatch(nameStart, c)) {\n if (parser.script) {\n parser.script += '</' + c\n parser.state = S.SCRIPT\n } else {\n strictFail(parser, 'Invalid tagname in closing tag.')\n }\n } else {\n parser.tagName = c\n }\n } else if (c === '>') {\n closeTag(parser)\n } else if (isMatch(nameBody, c)) {\n parser.tagName += c\n } else if (parser.script) {\n parser.script += '</' + parser.tagName\n parser.tagName = ''\n parser.state = S.SCRIPT\n } else {\n if (!isWhitespace(c)) {\n strictFail(parser, 'Invalid tagname in closing tag')\n }\n parser.state = S.CLOSE_TAG_SAW_WHITE\n }\n continue\n\n case S.CLOSE_TAG_SAW_WHITE:\n if (isWhitespace(c)) {\n continue\n }\n if (c === '>') {\n closeTag(parser)\n } else {\n strictFail(parser, 'Invalid characters in closing tag')\n }\n continue\n\n case S.TEXT_ENTITY:\n case S.ATTRIB_VALUE_ENTITY_Q:\n case S.ATTRIB_VALUE_ENTITY_U:\n var returnState\n var buffer\n switch (parser.state) {\n case S.TEXT_ENTITY:\n returnState = S.TEXT\n buffer = 'textNode'\n break\n\n case S.ATTRIB_VALUE_ENTITY_Q:\n returnState = S.ATTRIB_VALUE_QUOTED\n buffer = 'attribValue'\n break\n\n case S.ATTRIB_VALUE_ENTITY_U:\n returnState = S.ATTRIB_VALUE_UNQUOTED\n buffer = 'attribValue'\n break\n }\n\n if (c === ';') {\n var parsedEntity = parseEntity(parser)\n if (parser.opt.unparsedEntities && !Object.values(sax.XML_ENTITIES).includes(parsedEntity)) {\n parser.entity = ''\n parser.state = returnState\n parser.write(parsedEntity)\n } else {\n parser[buffer] += parsedEntity\n parser.entity = ''\n parser.state = returnState\n }\n } else if (isMatch(parser.entity.length ? entityBody : entityStart, c)) {\n parser.entity += c\n } else {\n strictFail(parser, 'Invalid character in entity name')\n parser[buffer] += '&' + parser.entity + c\n parser.entity = ''\n parser.state = returnState\n }\n\n continue\n\n default: /* istanbul ignore next */ {\n throw new Error(parser, 'Unknown state: ' + parser.state)\n }\n }\n } // while\n\n if (parser.position >= parser.bufferCheckPosition) {\n checkBufferLength(parser)\n }\n return parser\n }\n\n /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */\n /* istanbul ignore next */\n if (!String.fromCodePoint) {\n (function () {\n var stringFromCharCode = String.fromCharCode\n var floor = Math.floor\n var fromCodePoint = function () {\n var MAX_SIZE = 0x4000\n var codeUnits = []\n var highSurrogate\n var lowSurrogate\n var index = -1\n var length = arguments.length\n if (!length) {\n return ''\n }\n var result = ''\n while (++index < length) {\n var codePoint = Number(arguments[index])\n if (\n !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`\n codePoint < 0 || // not a valid Unicode code point\n codePoint > 0x10FFFF || // not a valid Unicode code point\n floor(codePoint) !== codePoint // not an integer\n ) {\n throw RangeError('Invalid code point: ' + codePoint)\n }\n if (codePoint <= 0xFFFF) { // BMP code point\n codeUnits.push(codePoint)\n } else { // Astral code point; split in surrogate halves\n // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n codePoint -= 0x10000\n highSurrogate = (codePoint >> 10) + 0xD800\n lowSurrogate = (codePoint % 0x400) + 0xDC00\n codeUnits.push(highSurrogate, lowSurrogate)\n }\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n result += stringFromCharCode.apply(null, codeUnits)\n codeUnits.length = 0\n }\n }\n return result\n }\n /* istanbul ignore next */\n if (Object.defineProperty) {\n Object.defineProperty(String, 'fromCodePoint', {\n value: fromCodePoint,\n configurable: true,\n writable: true\n })\n } else {\n String.fromCodePoint = fromCodePoint\n }\n }())\n }\n})( false ? 0 : exports)\n\n\n//# sourceURL=webpack://PhyloIO/./node_modules/sax/lib/sax.js?");
8385
+
8386
+ /***/ }),
8387
+
8489
8388
  /***/ "./node_modules/sha.js/hash.js":
8490
8389
  /*!*************************************!*\
8491
8390
  !*** ./node_modules/sha.js/hash.js ***!
@@ -8598,17 +8497,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
8598
8497
 
8599
8498
  /***/ }),
8600
8499
 
8601
- /***/ "./src/fontawesome-free-6.2.0-web/css/all.css":
8602
- /*!****************************************************!*\
8603
- !*** ./src/fontawesome-free-6.2.0-web/css/all.css ***!
8604
- \****************************************************/
8605
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8606
-
8607
- "use strict";
8608
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_cjs_js_all_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !!../../../node_modules/css-loader/dist/cjs.js!./all.css */ \"./node_modules/css-loader/dist/cjs.js!./src/fontawesome-free-6.2.0-web/css/all.css\");\n\n \n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_all_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"], options);\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_all_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].locals || {});\n\n//# sourceURL=webpack://PhyloIO/./src/fontawesome-free-6.2.0-web/css/all.css?");
8609
-
8610
- /***/ }),
8611
-
8612
8500
  /***/ "./src/interface.css":
8613
8501
  /*!***************************!*\
8614
8502
  !*** ./src/interface.css ***!
@@ -8670,7 +8558,7 @@ eval("\n/**\n * Module exports.\n */\n\nmodule.exports = deprecate;\n\n/**\n * M
8670
8558
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8671
8559
 
8672
8560
  "use strict";
8673
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ API)\n/* harmony export */ });\n/* harmony import */ var _container_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./container.js */ \"./src/container.js\");\n/* harmony import */ var _color_mapper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color_mapper */ \"./src/color_mapper.js\");\n/* harmony import */ var _keyboardManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./keyboardManager.js */ \"./src/keyboardManager.js\");\n/* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! file-saver */ \"./node_modules/file-saver/dist/FileSaver.min.js\");\n/* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(file_saver__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _model__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./model */ \"./src/model.js\");\n/* harmony import */ var minhashjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! minhashjs */ \"./node_modules/minhashjs/index.js\");\n\n\nconst { screen_shot } = __webpack_require__(/*! ./utils.js */ \"./src/utils.js\")\n;\n\n\n\nconst { prepare_and_run_distance } = __webpack_require__(/*! ./utils.js */ \"./src/utils.js\")\n\n// Main class of phylo.io\nclass API {\n\n constructor() {\n\n this.settings = {\n 'phylostratigraphy' : false,\n 'share_phylo': 'https://zoo.vital-it.ch/viewer/',\n 'share_post': 'https://zoo.vital-it.ch/sharing/create/',\n 'share_get': 'https://zoo.vital-it.ch/sharing/load/?session=',\n 'sync_zoom': false,\n 'syncing_zoom': false,\n 'callback_ancestral_genome_redirection' : function(taxid){console.log(taxid)},\n 'callback_stack_redirection' : function(taxid, parent_taxid){console.log(taxid, parent_taxid)},\n };\n\n this.set_default_parameters() // Settings that can be reset later on (e.g. switch single to compare mode)\n\n }\n\n set_default_parameters(){\n this.workers = {}\n this.distance_computed= {}\n this.containers = {}; // {container id -> Container() }\n this.bound_container = [] // pair of container used for distance computation\n this.session_token = null // unique session token for cloud saving\n this.session_url = null // url for cloud saving\n this.phylo_embedded = false // phylo.io website mode\n this.distance = {\n 'RF' : false,\n \"Euc\": false,\n \"clade\": false,\n \"RF_good\" : false,\n \"RF_left\" : false,\n \"RF_right\" : false,\n \"Cl_good\" : false,\n \"Cl_left\" : false,\n \"Cl_right\" : false,\n } //\n\n let default_settings = {\n 'no_distance_message': true,\n 'compute_distance': false,\n \"compareMode\" : false, // compare for each pair of tree topological similarity\n };\n this.settings = {...this.settings, ...default_settings};\n this.undoing = false // specify is we are undoing an action to prevent infinite looping\n\n this.color_scales = {}\n }\n\n get_color_scale(name) {\n if (name in this.color_scales) {\n return this.color_scales[name]\n } else {\n this.color_scales[name] = new _color_mapper__WEBPACK_IMPORTED_MODULE_1__[\"default\"]()\n return this.color_scales[name]\n }\n }\n\n set_color_scales(color_scales){\n\n\n for (const [key, value] of Object.entries(color_scales)) {\n\n var newcs = this.get_color_scale(key)\n newcs.cpt = value.cpt\n newcs.scale = value.scale\n newcs.domain_mapping = value.domain_mapping\n newcs.update()\n\n this.color_scales[key] = newcs\n }\n\n }\n\n // create and return a new container and add it the dict using its div id\n create_container(container_id){ // container_id -> str\n let c = new _container_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"](container_id, this);\n this.containers[container_id] = c;\n\n if (this.bound_container.length < 2) {this.bound_container.push(c)}\n return c;\n }\n\n // for unit testing only\n _create_model(data, settings, from_raw_data=true){\n return new _model__WEBPACK_IMPORTED_MODULE_4__[\"default\"](data, settings, from_raw_data)\n }\n\n // start the app by computing required information and starting each container\n start(recompute=false){\n\n\n var cs = Object.entries(this.containers)\n\n for (const [uid, container] of cs) {\n container.start(true)\n }\n\n var con1 = this.bound_container[0]\n var con2 = this.bound_container[1]\n\n if (this.settings.compareMode && con1.models.length > 0 && con2.models.length > 0 ){\n\n this.stop_worker('topology')\n this.compute_visible_topology_similarity(recompute)\n\n for (const [uid, container] of cs) {\n container.viewer.render(container.viewer.hierarchy);\n //container.viewer.update_collapse_level(container.models[container.current_model].settings.collapse_level, false)\n }\n\n if (this.settings.compute_distance){\n this.send_worker_distance()\n }\n\n }\n\n new _keyboardManager_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this);\n }\n\n compute_visible_topology_similarity(recompute=true){\n\n // If no container selected for comparison, takes first two\n if (this.bound_container.length < 2){\n\n let cs = Object.values(this.containers)\n\n this.bound_container = []\n this.bound_container.push(cs[0])\n this.bound_container.push(cs[1])\n }\n\n var con1 = this.bound_container[0]\n var con2 = this.bound_container[1]\n\n // check if already computed\n var todo1 = !(con2.viewer.model.settings.similarity.includes(con1.viewer.model.uid))\n var todo2 = !(con1.viewer.model.settings.similarity.includes(con2.viewer.model.uid))\n\n\n if (recompute || todo1 || todo2 ){\n\n function compute_similarity_container_pair(t1,t2){\n\n console.time(\"similarity\");\n\n // X = Intersection of T1 & T2 leaves.\n if (t1.leaves.length <= 0){\n t1.leaves = t1.get_leaves(t1.data)\n }\n if (t2.leaves.length <= 0){\n t2.leaves = t2.get_leaves(t2.data)\n }\n var common_leaves = t1.leaves.map(leaf => leaf.name).filter(value => t2.leaves.map(leaf => leaf.name).includes(value));\n console.log(\"Intersection\");\n console.timeLog(\"similarity\");\n\n // DeepLeaf with filter(X = True)\n t1.createDeepLeafList(common_leaves)\n t2.createDeepLeafList(common_leaves)\n console.log(\"DeepLeaf\");\n console.timeLog(\"similarity\");\n\n // MinHash\n t1.createMinHash()\n t2.createMinHash()\n console.log(\"MinHash\");\n console.timeLog(\"similarity\");\n\n // For all T1 & T2 Nodes compute the BCN with MinHash\n var nodes_t1 = []\n var nodes_t2 = []\n\n var forest1 = new minhashjs__WEBPACK_IMPORTED_MODULE_5__.MinHashLSHForest.MinHashLSHForest()\n var forest2 = new minhashjs__WEBPACK_IMPORTED_MODULE_5__.MinHashLSHForest.MinHashLSHForest()\n\n var cpt =0\n t1.traverse(t1.data, function(h,children){nodes_t1.push(h);forest1.add(h, h.min_hash);cpt++}, null)\n t2.traverse(t2.data, function(z,children){nodes_t2.push(z);forest2.add(z, z.min_hash);cpt++}, null)\n\n forest1.index()\n forest2.index()\n\n find_BCN(nodes_t1, forest2, t2.uid)\n find_BCN(nodes_t2, forest1, t1.uid)\n\n console.log(\"BCN done\");\n\n console.timeLog(\"similarity\");\n\n // Clean non essential datume\n t1.removeMinHash()\n t2.removeMinHash()\n\n console.timeEnd(\"similarity\");\n\n t1.settings.similarity.push(t2.uid)\n t2.settings.similarity.push(t1.uid)\n\n\n }\n\n function find_BCN(nodes_list, target_forest, target_uid){\n nodes_list.forEach((node) => {\n\n function is_leaf(str) {\n return !str.includes(\"||\");\n }\n\n var matches = target_forest.query(node.min_hash,10)\n\n var l = new Set(node.deepLeafList.filter(is_leaf))\n if (l.size > 0){\n\n var max_jacc = 0\n var BCN = null\n\n matches.forEach(e => {\n var r = new Set(e.deepLeafList.filter(is_leaf))\n\n if (r.size > 0){\n\n\n var inter = Array.from(r).filter(x => l.has(x)).length\n var union = [...new Set([...l, ...r])].length;\n\n var jj = inter/union\n\n\n\n if (jj > max_jacc){\n max_jacc = jj\n BCN = e\n }\n\n }\n\n\n\n\n\n })\n\n if (max_jacc > 0) {\n node.elementS[target_uid] = max_jacc\n if (!node.elementBCN){\n node.elementBCN = {}\n }\n node.elementBCN[target_uid] = BCN\n }\n\n\n }\n\n\n\n\n })\n }\n\n\n var time = parseInt((con1.viewer.model.leaves.length*2 + con2.viewer.model.leaves.length*2) / (40000/150))\n\n var msg = `Computing similarity... (~ ${time} seconds)`\n\n con1.message_loader = msg\n con1.viewer.interface.update_loader_message()\n\n con2.message_loader = msg\n con2.viewer.interface.update_loader_message()\n\n compute_similarity_container_pair(con1.viewer.model,con2.viewer.model)\n\n con1.viewer.render(con1.viewer.hierarchy);\n con2.viewer.render(con2.viewer.hierarchy);\n\n con1.message_loader = null\n con1.viewer.interface.update_loader_message()\n\n con2.message_loader = null\n con2.viewer.interface.update_loader_message()\n }\n\n\n }\n\n set_distance(m1,m2, distance){\n\n var tuple_key = [m1.uid, m2.uid].sort().join('---')\n\n this.distance_computed[tuple_key] = distance\n }\n\n get_distance(m1,m2){\n\n var tuple_key = [m1.uid, m2.uid].sort().join('---')\n\n\n return this.distance_computed[tuple_key]\n\n }\n\n delete_modele_distance(m){\n\n\n for (var key in this.distance_computed) {\n if (this.distance_computed.hasOwnProperty(key)) {\n\n var kd = key.split('---')\n\n if (kd[0] == m.uid || kd[kd.length -1] == m.uid){\n this.distance_computed[key] = undefined\n }\n\n\n }\n }\n\n\n\n }\n\n set_worker(key, worker){\n this.workers[key] = worker\n }\n\n stop_worker(key){\n try {\n for (const [uid, container] of this.containers) {\n container.message_loader = null\n }\n this.workers[key].terminate();\n } catch (error) {\n }\n\n\n }\n\n stop_all_workers(){\n for (const [key, worker] of Object.entries(this.workers)) {\n worker.terminate();\n }\n }\n\n get_json_pickle(){\n\n var pickle = {\n \"containers\" : [],\n 'settings' : this.settings,\n 'color_scales': this.color_scales\n }\n\n let cs = Object.values(this.containers)\n\n for (var i = 0; i < cs.length; i++) {\n\n let ms = cs[i].models\n\n let minput = []\n\n for (var j = 0; j < ms.length; j++) {\n\n var s = ms[j].settings\n\n s.labels_array_leaf= [...s.labels['leaf']];\n s.labels_array_node = [...s.labels['node']];\n\n s.colorlabels_array_leaf = [...s.colorlabels['leaf']];\n s.colorlabels_array_node = [...s.colorlabels['node']];\n\n minput.push({'settings':s, 'data':ms[j].remove_circularity(), 'zoom': ms[j].zoom })\n\n\n }\n\n pickle.containers.push({\n 'models' : minput,\n 'settings' : cs[i].settings,\n 'current_model': cs[i].current_model\n })\n\n }\n\n var string_pickle = JSON.stringify(pickle);\n\n for (var i = 0; i < cs.length; i++) {\n\n let ms = cs[i].models\n\n for (var j = 0; j < ms.length; j++) {\n\n ms[j].add_circularity_back()\n\n\n }\n\n }\n\n return string_pickle\n\n }\n\n save_session(){ // TODO not working since collapse or other info are store in circular data\n\n var blob = new Blob([this.get_json_pickle()], {type: \"text/plain;charset=utf-8\"});\n file_saver__WEBPACK_IMPORTED_MODULE_3___default().saveAs(blob, \"Session.phyloio\");\n\n }\n\n send_worker_distance(){\n\n if (!this.settings.compareMode){\n return\n }\n\n var mod1 = this.bound_container[0].models[this.bound_container[0].current_model]\n var mod2 = this.bound_container[1].models[this.bound_container[1].current_model]\n\n var distance = this.get_distance(mod1,mod2)\n\n\n if (typeof distance !== 'undefined') {\n\n this.distance = distance\n this.settings.no_distance_message = distance.no_distance_message\n\n if (this.phylo_embedded){\n this.display_distance_window()\n }\n\n return\n\n }\n\n\n var d = prepare_and_run_distance(mod1,mod2 )\n\n this.set_distance(mod1,mod2,d)\n\n this.distance = d\n\n this.settings.no_distance_message = d.no_distance_message\n\n if (this.phylo_embedded){\n this.display_distance_window()\n }\n\n }\n\n screen_shot(params){screen_shot(params)}\n\n generate_share_link(){\n\n var that = this\n var xhr = new XMLHttpRequest();\n\n xhr.onreadystatechange = function () {\n\n if (this.readyState != 4) return;\n\n else if (this.status == 201) {\n var data = JSON.parse(this.responseText);\n\n if (data.result = 'OK'){\n that.session_token = data.session\n that.session_url = that.settings.share_phylo + '?session=' + that.session_token\n }\n }\n\n else if (this.status == 413) {\n that.session_token = 'ERROR_SIZE';\n return\n }\n\n else if (this.status == 400) {\n return\n }\n };\n\n xhr.open(\"POST\", this.settings.share_post, false);\n\n xhr.setRequestHeader('Content-Type', 'application/json');\n\n var j = this.get_json_pickle()\n\n if (encodeURI(JSON.stringify(j)).split(/%..|./).length - 1 > 500000000){\n that.session_token = 'ERROR_SIZE';\n return;\n }\n\n xhr.send(j);\n\n}\n\n get_share_data(session_token, callback=null){\n\n\n var xhr = new XMLHttpRequest();\n\n xhr.onreadystatechange = function() {\n if (xhr.readyState == XMLHttpRequest.DONE) {\n var j = xhr.responseText;\n callback.apply(this,[j])\n }\n }\n\n xhr.open('GET', this.settings.share_get + session_token, false);\n xhr.send(null);\n\n\n\n }\n\n display_distance_window(){\n\n\n function create_html_distance(title, d1, d2, d3, d4, d5, d6, d7){\n\n return `<li class=\"list-group-item d-flex justify-content-between align-items-start\">\n <div class=\"ms-2 me-auto\">\n <div class=\"fw-bold\" style=\"text-align:left;\">${title}</div>\n \n <span style=\"display: flex\"><small>Left tree: ${d1}/${d2} (${d3}%) </small> </span>\n <span style=\"display: flex\"><small>Right tree: ${d4}/${d5} (${d6}%) </small> </span>\n \n \n </div>\n <span class=\"badge bg-primary rounded-pill\">${d7}</span> \n </li>`\n }\n\n\n\n var bool_distance_computed = (this.distance.RF !== false || this.distance.Euc !== false || this.distance.clade !== false || this.settings.no_distance_message !== true )\n document.getElementById(\"distance_window\").style.display = (this.settings.compareMode && bool_distance_computed ) ? 'block': 'none';\n\n var divdiv = document.getElementById(\"mydivbody\");\n\n divdiv.innerHTML = \"<ol class=\\\"list-group \\\">\\n\"\n\n\n\n\n if (this.distance.RF !== false) {\n\n divdiv.innerHTML += create_html_distance('Robinson-Foulds',\n this.distance.RF_good, this.distance.RF_left,\n Math.round(this.distance.RF_good /this.distance.RF_left*100),this.distance.RF_good, this.distance.RF_right,\n Math.round(this.distance.RF_good /this.distance.RF_right*100),this.distance.RF\n )\n\n\n\n\n }\n\n if (this.distance.clade !== false) {\n\n divdiv.innerHTML += create_html_distance('Clade',this.distance.Cl_good, this.distance.Cl_left, Math.round(this.distance.Cl_good /this.distance.Cl_left*100),\n this.distance.Cl_good, this.distance.Cl_right, Math.round(this.distance.Cl_good/this.distance.Cl_right*100), this.distance.clade\n )\n\n }\n\n\n if (this.distance.Euc !== false) {\n\n divdiv.innerHTML += \"<li class=\\\"list-group-item d-flex justify-content-between align-items-start\\\">\\n\" +\n \" <div class=\\\"ms-2 me-auto\\\">\\n\" +\n \" <div class=\\\"fw-bold\\\" style=\\\"text-align:left;\\\">Euclidian</div> </div>\\n\" +\n \" <span class=\\\"badge bg-primary rounded-pill\\\">{}</span>\\n\".format(this.distance.Euc) +\n \" </li>\"\n }\n\n\n if (this.distance.LRF !== false) {\n\n divdiv.innerHTML += \"<li class=\\\"list-group-item d-flex justify-content-between align-items-start\\\">\\n\" +\n \" <div class=\\\"ms-2 me-auto\\\">\\n\" +\n \" <div class=\\\"fw-bold\\\" style=\\\"text-align:left;\\\">Labeled RF</div> </div>\\n\" +\n \" <span class=\\\"badge bg-primary rounded-pill\\\">{}</span>\\n\".format(this.distance.LRF) +\n \" </li>\"\n }\n\n\n\n if (this.settings.no_distance_message != true) {\n divdiv.innerHTML += \"<li class=\\\"list-group-item d-flex justify-content-between align-items-start\\\">\\n\" +\n \" <div class=\\\"ms-2 me-auto\\\">\\n\" +\n \" <div class=\\\"fw-bold\\\" style=\\\"text-align:left;\\\"><strong>Warning:</strong> {}</div> </div>\\n\".format(this.settings.no_distance_message)\n \" </li>\"\n }\n\n divdiv.innerHTML += \"</ol>\"\n\n\n }\n\n}\n\n\n//# sourceURL=webpack://PhyloIO/./src/api.js?");
8561
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ API)\n/* harmony export */ });\n/* harmony import */ var _container_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./container.js */ \"./src/container.js\");\n/* harmony import */ var _color_mapper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color_mapper */ \"./src/color_mapper.js\");\n/* harmony import */ var _keyboardManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./keyboardManager.js */ \"./src/keyboardManager.js\");\n/* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! file-saver */ \"./node_modules/file-saver/dist/FileSaver.min.js\");\n/* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(file_saver__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _model__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./model */ \"./src/model.js\");\n\n\nconst { screen_shot } = __webpack_require__(/*! ./utils.js */ \"./src/utils.js\")\n;\n\n\n\n// Main class of phylo.io\nclass API {\n\n constructor() {\n\n this.settings = {\n 'version' : 1,\n 'phylostratigraphy' : false,\n 'share_phylo': ' https://beta.phylo.io/viewer/',\n 'share_post': ' https://beta.phylo.io/sharing/create/',\n 'share_get': ' https://beta.phylo.io/sharing/load/?session=',\n 'sync_zoom': false,\n 'syncing_zoom': false,\n 'callback_ancestral_genome_redirection' : function(taxid){console.log(taxid)},\n 'callback_stack_redirection' : function(taxid, parent_taxid){console.log(taxid, parent_taxid)},\n };\n\n this.set_default_parameters() // Settings that can be reset later on (e.g. switch single to compare mode)\n\n }\n\n // HELP\n\n add_help_modal(container_id){\n\n\n var mod_html = `\n <div class=\"modal\" id=\"modal_help\" tabindex=\"-1\" style=\"z-index: 2147483647 !important;\">\n <div class=\"modal-dialog modal-dialog-centered modal-xl\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Phylo.io help center</h5>\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n </div>\n <div class=\"modal-body\">\n Help section is under construction\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-primary\" data-bs-dismiss=\"modal\">Close</button>\n </div>\n </div>\n </div>\n </div>`\n\n document.getElementById(container_id).insertAdjacentHTML('afterend',mod_html)\n\n }\n\n set_default_parameters(){\n this.workers = {}\n this.distance_computed= {}\n this.containers = {}; // {container id -> Container() }\n this.bound_container = [] // pair of container used for distance computation\n this.session_token = null // unique session token for cloud saving\n this.session_url = null // url for cloud saving\n this.session_answer = null; // data from reply when generating session\n this.phylo_embedded = false // phylo.io website mode\n this.distance = {\n 'RF' : false,\n \"Euc\": false,\n \"clade\": false,\n \"RF_good\" : false,\n \"RF_left\" : false,\n \"RF_right\" : false,\n \"Cl_good\" : false,\n \"Cl_left\" : false,\n \"Cl_right\" : false,\n } //\n\n let default_settings = {\n 'no_distance_message': true,\n 'compute_distance': false,\n \"compareMode\" : false, // compare for each pair of tree topological similarity\n };\n this.settings = {...this.settings, ...default_settings};\n this.undoing = false // specify is we are undoing an action to prevent infinite looping\n\n this.color_scales = {}\n }\n\n get_color_scale(name) {\n if (name in this.color_scales) {\n return this.color_scales[name]\n } else {\n this.color_scales[name] = new _color_mapper__WEBPACK_IMPORTED_MODULE_1__[\"default\"]()\n return this.color_scales[name]\n }\n }\n\n set_color_scales(color_scales){\n\n\n for (const [key, value] of Object.entries(color_scales)) {\n\n var newcs = this.get_color_scale(key)\n newcs.cpt = value.cpt\n newcs.scale = value.scale\n newcs.domain_mapping = value.domain_mapping\n newcs.update()\n\n this.color_scales[key] = newcs\n }\n\n }\n\n // create and return a new container and add it the dict using its div id\n create_container(container_id){ // container_id -> str\n let c = new _container_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"](container_id, this);\n this.containers[container_id] = c;\n\n if (this.bound_container.length < 2) {this.bound_container.push(c)}\n\n if (Object.keys(this.containers).length == 1){\n this.add_help_modal(container_id);\n }\n\n return c;\n }\n\n // for unit testing only\n _create_model(data, settings, from_raw_data=true){\n return new _model__WEBPACK_IMPORTED_MODULE_4__[\"default\"](data, settings, from_raw_data)\n }\n\n // start the app by computing required information and starting each container\n start(recompute=false){\n\n\n var cs = Object.entries(this.containers)\n\n for (const [uid, container] of cs) {\n container.start(true)\n }\n\n var con1 = this.bound_container[0]\n var con2 = this.bound_container[1]\n\n if (this.settings.compareMode && con1.models.length > 0 && con2.models.length > 0 ){\n\n this.stop_worker('topology')\n this.compute_visible_topology_similarity(recompute)\n\n for (const [uid, container] of cs) {\n container.viewer.render(container.viewer.hierarchy);\n //container.viewer.update_collapse_level(container.models[container.current_model].settings.collapse_level, false)\n }\n\n if (this.settings.compute_distance){\n this.send_worker_distance()\n }\n\n }\n\n new _keyboardManager_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this);\n }\n\n compute_visible_topology_similarity(recompute=true){\n\n // If no container selected for comparison, takes first two\n if (this.bound_container.length < 2){\n\n let cs = Object.values(this.containers)\n\n this.bound_container = []\n this.bound_container.push(cs[0])\n this.bound_container.push(cs[1])\n }\n\n var con1 = this.bound_container[0]\n var con2 = this.bound_container[1]\n\n // check if already computed\n var todo1 = !(con2.viewer.model.settings.similarity.includes(con1.viewer.model.uid))\n var todo2 = !(con1.viewer.model.settings.similarity.includes(con2.viewer.model.uid))\n\n\n if (recompute || todo1 || todo2 ){\n\n var worker_comp = new Worker(new URL(/* worker import */ __webpack_require__.p + __webpack_require__.u(\"src_worker_bcn_js\"), __webpack_require__.b));\n\n\n worker_comp.onmessage = function(e) {\n\n var new_model1 = new _model__WEBPACK_IMPORTED_MODULE_4__[\"default\"](e.data[0].data, e.data[0].settings, false)\n new_model1.add_circularity_back()\n con1.replace_model(con1.viewer.model,new_model1)\n con1.viewer.model = new_model1\n\n con1.viewer.set_data(con1.viewer.model)\n con1.viewer.render(con1.viewer.hierarchy);\n\n\n var new_model2 = new _model__WEBPACK_IMPORTED_MODULE_4__[\"default\"](e.data[1].data, e.data[1].settings, false)\n new_model2.add_circularity_back()\n con2.replace_model(con2.viewer.model,new_model2)\n con2.viewer.model = new_model2\n con2.viewer.set_data(con2.viewer.model)\n con2.viewer.render(con2.viewer.hierarchy);\n\n\n con1.message_loader = null\n con1.viewer.interface.update_loader_message()\n\n con2.message_loader = null\n con2.viewer.interface.update_loader_message()\n\n con1.viewer.model.set_all_color_scale();\n con2.viewer.model.set_all_color_scale();\n\n }\n\n var datum = {'tree1':con1.viewer.model, 'tree2':con2.viewer.model}\n\n this.set_worker('topology',worker_comp)\n\n var time = parseInt((con1.viewer.model.leaves.length*2 + con2.viewer.model.leaves.length*2) / (40000/150))\n\n var msg = `Computing similarity... (~ ${time} seconds)`\n\n con1.message_loader = msg\n con1.viewer.interface.update_loader_message()\n\n con2.message_loader = msg\n con2.viewer.interface.update_loader_message()\n\n datum.tree1.remove_all_color_scale()\n datum.tree2.remove_all_color_scale()\n\n worker_comp.postMessage(datum);\n }\n\n\n }\n\n set_distance(m1,m2, distance){\n\n var tuple_key = [m1.uid, m2.uid].sort().join('---')\n\n this.distance_computed[tuple_key] = distance\n }\n\n get_distance(m1,m2){\n\n var tuple_key = [m1.uid, m2.uid].sort().join('---')\n\n\n return this.distance_computed[tuple_key]\n\n }\n\n delete_modele_distance(m){\n\n\n for (var key in this.distance_computed) {\n if (this.distance_computed.hasOwnProperty(key)) {\n\n var kd = key.split('---')\n\n if (kd[0] == m.uid || kd[kd.length -1] == m.uid){\n this.distance_computed[key] = undefined\n }\n\n\n }\n }\n\n\n\n }\n\n set_worker(key, worker){\n this.workers[key] = worker\n }\n\n stop_worker(key){\n try {\n for (const [uid, container] of this.containers) {\n container.message_loader = null\n }\n this.workers[key].terminate();\n } catch (error) {\n }\n\n\n }\n\n stop_all_workers(){\n for (const [key, worker] of Object.entries(this.workers)) {\n worker.terminate();\n }\n }\n\n get_json_pickle(){\n\n var pickle = {\n \"containers\" : [],\n 'settings' : this.settings,\n 'color_scales': this.color_scales\n }\n\n let cs = Object.values(this.containers)\n\n for (var i = 0; i < cs.length; i++) {\n\n let ms = cs[i].models\n\n let minput = []\n\n for (var j = 0; j < ms.length; j++) {\n\n var s = ms[j].settings\n\n s.labels_array_leaf= [...s.labels['leaf']];\n s.labels_array_node = [...s.labels['node']];\n\n s.colorlabels_array_leaf = [...s.colorlabels['leaf']];\n s.colorlabels_array_node = [...s.colorlabels['node']];\n\n minput.push({'settings':s, 'data':ms[j].remove_circularity(), 'zoom': ms[j].zoom })\n\n\n }\n\n pickle.containers.push({\n 'models' : minput,\n 'settings' : cs[i].settings,\n 'current_model': cs[i].current_model\n })\n\n }\n\n var string_pickle = JSON.stringify(pickle);\n\n for (var i = 0; i < cs.length; i++) {\n\n let ms = cs[i].models\n\n for (var j = 0; j < ms.length; j++) {\n\n ms[j].add_circularity_back()\n\n\n }\n\n }\n\n return string_pickle\n\n }\n\n save_session(){ // TODO not working since collapse or other info are store in circular data\n\n var blob = new Blob([this.get_json_pickle()], {type: \"text/plain;charset=utf-8\"});\n file_saver__WEBPACK_IMPORTED_MODULE_3___default().saveAs(blob, \"Session.phyloio\");\n\n }\n\n send_worker_distance(){\n\n if (!this.settings.compareMode){\n return\n }\n\n var mod1 = this.bound_container[0].models[this.bound_container[0].current_model]\n var mod2 = this.bound_container[1].models[this.bound_container[1].current_model]\n\n var distance = this.get_distance(mod1,mod2)\n\n\n if (typeof distance !== 'undefined') {\n\n this.distance = distance\n this.settings.no_distance_message = distance.no_distance_message\n\n if (this.phylo_embedded){\n this.display_distance_window()\n }\n\n return\n\n }\n\n var worker_distance = new Worker(new URL(/* worker import */ __webpack_require__.p + __webpack_require__.u(\"src_worker_distance_js\"), __webpack_require__.b));\n\n worker_distance.onmessage = (e) => {\n\n mod2.set_all_color_scale();\n mod1.set_all_color_scale();\n\n\n this.set_distance(mod1,mod2,e.data)\n\n this.distance = e.data\n\n this.settings.no_distance_message = e.data.no_distance_message\n\n if (this.phylo_embedded){\n this.display_distance_window()\n }\n }\n\n this.set_worker('distance',worker_distance)\n\n var datum ={'mod1':mod1, 'mod2':mod2}\n\n datum.mod1.remove_all_color_scale()\n datum.mod2.remove_all_color_scale()\n\n\n worker_distance.postMessage(datum);\n\n }\n\n screen_shot(params){screen_shot(params)}\n\n generate_share_link(callback){\n\n var that = this\n var xhr = new XMLHttpRequest();\n\n xhr.onreadystatechange = function () {\n\n if (this.readyState != 4) return;\n\n else if (this.status == 201) {\n let data = JSON.parse(this.responseText);\n that.session_answer = data;\n if (data.result === 'OK'){\n that.token = data.session;\n that.session_url = that.settings.share_phylo + '?session=' + data.session;\n }\n }\n\n else if (this.status == 413) {\n let data = JSON.parse(this.responseText);\n that.session_url = 'ERROR_SIZE';\n that.session_answer = data;\n }\n\n else if (this.status == 400) {\n let data = JSON.parse(this.responseText) | {result: \"Error\", message: \"The server does not accept this session data\"};\n that.session_answer = data\n that.session_url = \"\"\n }\n else {\n that.session_answer = {result: \"Error\", message: \"The server is currently not available.\"}\n that.session_url = \"\"\n }\n callback(that)\n };\n\n xhr.open(\"POST\", this.settings.share_post, false);\n\n xhr.setRequestHeader('Content-Type', 'application/json');\n\n var j = this.get_json_pickle()\n\n if (encodeURI(JSON.stringify(j)).split(/%..|./).length - 1 > 500000000){\n that.session_token = 'ERROR_SIZE';\n return;\n }\n\n xhr.send(j);\n\n}\n\n get_share_data(session_token, callback=null){\n\n\n var xhr = new XMLHttpRequest();\n\n xhr.onreadystatechange = function() {\n if (xhr.readyState == XMLHttpRequest.DONE) {\n var j = xhr.responseText;\n callback.apply(this,[j])\n }\n }\n\n xhr.open('GET', this.settings.share_get + session_token, false);\n xhr.send(null);\n\n\n\n }\n\n display_distance_window(){\n\n\n function create_html_distance(title, d1, d2, d3, d4, d5, d6, d7){\n\n return `<li class=\"list-group-item d-flex justify-content-between align-items-start\">\n <div class=\"ms-2 me-auto\">\n <div class=\"fw-bold\" style=\"text-align:left;\">${title}</div>\n \n <span style=\"display: flex\"><small>Left tree: ${d1}/${d2} (${d3}%) </small> </span>\n <span style=\"display: flex\"><small>Right tree: ${d4}/${d5} (${d6}%) </small> </span>\n \n \n </div>\n <span class=\"badge bg-primary rounded-pill\">${d7}</span> \n </li>`\n }\n\n\n\n var bool_distance_computed = (this.distance.RF !== false || this.distance.Euc !== false || this.distance.clade !== false || this.settings.no_distance_message !== true )\n document.getElementById(\"distance_window\").style.display = (this.settings.compareMode && bool_distance_computed ) ? 'block': 'none';\n\n var divdiv = document.getElementById(\"mydivbody\");\n\n divdiv.innerHTML = \"<ol class=\\\"list-group \\\">\\n\"\n\n\n\n\n if (this.distance.RF !== false) {\n\n divdiv.innerHTML += create_html_distance('Robinson-Foulds',\n this.distance.RF_good, this.distance.RF_left,\n Math.round(this.distance.RF_good /this.distance.RF_left*100),this.distance.RF_good, this.distance.RF_right,\n Math.round(this.distance.RF_good /this.distance.RF_right*100),this.distance.RF\n )\n\n\n\n\n }\n\n if (this.distance.clade !== false) {\n\n divdiv.innerHTML += create_html_distance('Clade',this.distance.Cl_good, this.distance.Cl_left, Math.round(this.distance.Cl_good /this.distance.Cl_left*100),\n this.distance.Cl_good, this.distance.Cl_right, Math.round(this.distance.Cl_good/this.distance.Cl_right*100), this.distance.clade\n )\n\n }\n\n\n if (this.distance.Euc !== false) {\n\n divdiv.innerHTML += \"<li class=\\\"list-group-item d-flex justify-content-between align-items-start\\\">\\n\" +\n \" <div class=\\\"ms-2 me-auto\\\">\\n\" +\n \" <div class=\\\"fw-bold\\\" style=\\\"text-align:left;\\\">Euclidian</div> </div>\\n\" +\n \" <span class=\\\"badge bg-primary rounded-pill\\\">{}</span>\\n\".format(this.distance.Euc) +\n \" </li>\"\n }\n\n\n if (this.distance.LRF !== false) {\n\n divdiv.innerHTML += \"<li class=\\\"list-group-item d-flex justify-content-between align-items-start\\\">\\n\" +\n \" <div class=\\\"ms-2 me-auto\\\">\\n\" +\n \" <div class=\\\"fw-bold\\\" style=\\\"text-align:left;\\\">Labeled RF</div> </div>\\n\" +\n \" <span class=\\\"badge bg-primary rounded-pill\\\">{}</span>\\n\".format(this.distance.LRF) +\n \" </li>\"\n }\n\n\n\n if (this.settings.no_distance_message != true) {\n divdiv.innerHTML += \"<li class=\\\"list-group-item d-flex justify-content-between align-items-start\\\">\\n\" +\n \" <div class=\\\"ms-2 me-auto\\\">\\n\" +\n \" <div class=\\\"fw-bold\\\" style=\\\"text-align:left;\\\"><strong>Warning:</strong> {}</div> </div>\\n\".format(this.settings.no_distance_message)\n \" </li>\"\n }\n\n divdiv.innerHTML += \"</ol>\"\n\n\n }\n\n}\n\n\n//# sourceURL=webpack://PhyloIO/./src/api.js?");
8674
8562
 
8675
8563
  /***/ }),
8676
8564
 
@@ -8681,7 +8569,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
8681
8569
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8682
8570
 
8683
8571
  "use strict";
8684
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Color_mapper)\n/* harmony export */ });\n/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ \"./node_modules/d3/index.js\");\n\n\n\nclass Color_mapper {\n\n constructor() {\n\n this.cpt = 1\n\n this.scale = d3__WEBPACK_IMPORTED_MODULE_0__.scaleLinear()\n .domain([0, this.cpt/2, this.cpt])\n .range([\"red\", \"green\", \"blue\"])\n\n this.domain_mapping = {}\n\n }\n\n get_color(val){\n return this.scale(this.domain_mapping[val])\n }\n\n add_value_to_map(val){\n if (!(val in this.domain_mapping)) {\n this.domain_mapping[val] = this.cpt\n this.cpt++\n }\n }\n\n update(){\n this.scale = d3__WEBPACK_IMPORTED_MODULE_0__.scaleLinear()\n .domain([0, this.cpt/2, this.cpt])\n .range([\"red\", \"green\", \"blue\"])\n }\n\n}\n\n//# sourceURL=webpack://PhyloIO/./src/color_mapper.js?");
8572
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Color_mapper)\n/* harmony export */ });\n/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ \"./node_modules/d3/index.js\");\n\n\n\nclass Color_mapper {\n\n constructor() {\n\n this.cpt = 1\n\n this.scheme = d3__WEBPACK_IMPORTED_MODULE_0__.scaleSequential(d3__WEBPACK_IMPORTED_MODULE_0__.interpolateRainbow)\n this.scheme_name = 'Viridis'\n\n this.scale = this.scheme\n .domain([0, this.cpt/2, this.cpt])\n\n this.domain_mapping = {}\n\n }\n\n get_color(val){\n return this.scale(this.domain_mapping[val])\n }\n\n add_value_to_map(val){\n if (!(val in this.domain_mapping)) {\n this.domain_mapping[val] = this.cpt\n this.cpt++\n }\n }\n\n update_scheme(val, name){\n this.scheme = val\n this.scheme_name = name\n }\n\n update(){\n this.scale = d3__WEBPACK_IMPORTED_MODULE_0__.scaleSequential(this.scheme).domain([0, this.cpt/2, this.cpt])\n\n }\n\n}\n\n//# sourceURL=webpack://PhyloIO/./src/color_mapper.js?");
8685
8573
 
8686
8574
  /***/ }),
8687
8575
 
@@ -8692,7 +8580,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
8692
8580
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8693
8581
 
8694
8582
  "use strict";
8695
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Container)\n/* harmony export */ });\n/* harmony import */ var _viewer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./viewer.js */ \"./src/viewer.js\");\n/* harmony import */ var _model_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./model.js */ \"./src/model.js\");\n/* harmony import */ var _interface__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./interface */ \"./src/interface.js\");\n/* harmony import */ var bootstrap__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! bootstrap */ \"./node_modules/bootstrap/dist/js/bootstrap.esm.js\");\n/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! d3 */ \"./node_modules/d3/index.js\");\n\n\n\n\n\nconst { build_table, save_file_as } = __webpack_require__(/*! ./utils.js */ \"./src/utils.js\")\nvar parser = __webpack_require__(/*! biojs-io-newick */ \"./node_modules/biojs-io-newick/src/index.js\");\n\n\nvar uid_container = 0 // unique id generator is bound to a single Container()\n\n// Object that bind a div with a d3 Viewer() and one or multiple Model()\nclass Container {\n get uid() {\n return this._uid;\n }\n\n constructor(container_id, api) {\n\n this._uid = uid_container++; // unique container id\n this.div_id = container_id; // related div id\n this.models = []; // list of Model()\n this.settings = {}; // per container settings\n this.current_model = 0; // current model index\n this.viewer = new _viewer_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"](this); // attach Viewer()\n this.history_actions = [] // for Undo feature\n this.api = api\n this.message_loader = null\n\n }\n\n replace_model(old_model,new_model){\n var index = this.models.indexOf(old_model);\n\n if (~index) {\n this.models[index] = new_model;\n }\n\n }\n\n add_action(name, fn_object, counter_fn, argu, refresh_interface){\n\n var refresh_interface = (typeof refresh_interface !== 'undefined') ? refresh_interface : false;\n\n if (!this.api.undoing){\n this.history_actions.push({'name': name, 'fonct':counter_fn, 'fonction_obj':fn_object, 'argu': argu, 'refresh_interface' : refresh_interface})\n }\n\n }\n\n get_last_action(){\n return this.history_actions[this.history_actions.length-1]\n }\n\n pop_last_action(){\n return this.history_actions.pop()\n }\n\n // create and add Model() configure with params\n add_tree(data, settings, from_raw_data=true){\n this.models.push(new _model_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](data, settings, from_raw_data))\n }\n\n remove_all_trees(){\n this.models = []\n }\n\n remove_current_tree(apply_change_UI){\n\n var apply_change_UI = (typeof apply_change_UI !== 'undefined') ? apply_change_UI : false;\n\n var current_model = this.models[this.current_model]\n\n const index = this.models.indexOf(current_model);\n if (index > -1) {\n this.models.splice(index, 1);\n\n if (this.current_model > this.models.length -1){\n console.log('out of index - recalibrating');\n this.current_model -= 1\n\n }\n\n if (apply_change_UI){\n if (this.models.length == 0){\n\n this.current_model = 0\n\n this.viewer.remove_data()\n this.interface = new _interface__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.viewer, this, true)\n }\n else{\n this.shift_model(0, false)\n }\n }\n\n }\n\n\n\n\n }\n\n // update the data viewer and render it\n start(rendering){\n\n\n if (this.models.length <= 0){\n this.interface = new _interface__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.viewer, this, true)\n return\n }\n\n var rendering = (typeof rendering !== 'undefined') ? rendering : false; // todo inverted ??\n\n this.viewer.set_data(this.models[this.current_model]);\n\n if (rendering){\n\n var z = this.models[this.current_model].zoom\n\n\n if (z) {\n this.viewer.set_zoom(z.k, z.x, z.y)\n }\n\n this.viewer.render(this.viewer.hierarchy);\n //this.viewer.update_collapse_level(this.models[this.current_model].settings.collapse_level)\n\n\n\n }\n\n //this.viewer.zoom_by(0.4) #STACK\n //this.viewer.render(this.viewer.hierarchy); #STACK\n\n }\n\n // shift the pointer (if possible) in the model list and update viewer model\n shift_model(offset, store_old) {\n\n\n var store_old = (typeof store_old !== 'undefined') ? store_old : true;\n\n\n if (this.current_model + offset >= 0 && this.current_model + offset <= this.models.length -1 ) {\n\n this.add_action('Change tree', this, this.shift_model, [-offset, store_old] )\n\n if (store_old){\n // store the current zoom information\n var old_m = this.models[this.current_model]\n old_m.store_zoomTransform(this.viewer.d3.zoomTransform(this.viewer.svg.node()))\n }\n\n // update new model data to viewer\n this.current_model += offset;\n var m = this.models[this.current_model]\n\n\n\n this.viewer.set_data(m)\n\n\n this.api.stop_all_workers()\n this.compute_topology_and_render_bounded_viewer(false)\n\n // apply if any stored zoom information\n var z = m.zoom\n if (z) {\n this.viewer.set_zoom(z.k, z.x, z.y)\n\n }\n\n this.viewer.render(this.viewer.hierarchy)\n\n if (this.api.settings.compute_distance && this.api.bound_container.includes(this)){\n this.api.send_worker_distance()\n }\n\n\n\n\n }\n\n }\n\n // send action trigger to model, update the data/build d3 data & render the viewer\n trigger_(action, data, node){\n\n var m = this.models[this.current_model];\n\n if (action === 'collapse') {\n this.add_action('Collapse', this, this.trigger_, [action, data, node] )\n m.collapse(data)\n this.viewer.apply_collapse_from_data_to_d3(data, node)\n this.viewer.build_d3_cluster()\n this.viewer.render(node)\n\n }\n else if (action === 'collapseAll') {\n this.add_action('Collapse All', this, this.trigger_, ['expandAll', data, node] )\n m.collapseAll(data, true)\n this.viewer.apply_collapseAll_from_data_to_d3(data, node)\n this.viewer.build_d3_cluster()\n this.viewer.render(node)\n\n }\n else if (action === 'expandAll') {\n this.add_action('Expand All', this, this.trigger_, ['collapseAll', data, node] )\n m.collapseAll(data, false)\n this.viewer.apply_expandAll_from_data_to_d3(data, node)\n this.viewer.build_d3_cluster()\n this.viewer.render(node)\n\n }\n else if (action === 'swap') {\n this.add_action('Swap', this, this.trigger_, ['unswap', data, node] )\n m.swap_subtrees(data)\n this.viewer.apply_swap_from_data_to_d3(data, node)\n this.viewer.build_d3_cluster()\n this.viewer.render(node)\n\n\n }\n else if (action === 'unswap') {\n m.unswap_subtrees(data)\n this.viewer.apply_unswap_from_data_to_d3(data, node)\n this.viewer.build_d3_cluster()\n this.viewer.render(node)\n\n\n }\n else if (action === 'reroot'){\n\n this.add_action('Reroot', this, this.trigger_, ['reroot', this.viewer.hierarchy.children[0].data, null] )\n m.reroot(data)\n m.rooted = true\n this.viewer.set_data(m)\n m.hierarchy_mockup = m.build_hierarchy_mockup()\n m.table = build_table(m.hierarchy_mockup)\n\n this.api.stop_all_workers()\n this.compute_topology_and_render_bounded_viewer(true)\n if (this.api.settings.compute_distance && this.api.bound_container.includes(this)){\n this.api.delete_modele_distance(m)\n this.api.send_worker_distance()\n }\n this.viewer.render(this.viewer.hierarchy)\n\n }\n else if (action === 'trim'){\n var untrim_data = m.trim(data.data)\n this.add_action('Trim', this, this.trigger_, ['untrim', untrim_data, null] )\n this.viewer.set_data(m)\n m.hierarchy_mockup = m.build_hierarchy_mockup()\n m.table = build_table(m.hierarchy_mockup)\n this.api.stop_all_workers()\n this.compute_topology_and_render_bounded_viewer(true)\n if (this.api.settings.compute_distance && this.api.bound_container.includes(this)){\n this.api.delete_modele_distance(m)\n this.api.send_worker_distance()\n }\n this.viewer.render(this.viewer.hierarchy)\n }\n else if (action === 'untrim'){\n m.untrim(data.parent, data.floating, data.child, data.index, data.root_mode)\n this.viewer.set_data(m)\n m.hierarchy_mockup = m.build_hierarchy_mockup()\n m.table = build_table(m.hierarchy_mockup)\n this.api.stop_all_workers()\n this.compute_topology_and_render_bounded_viewer(true)\n if (this.api.settings.compute_distance && this.api.bound_container.includes(this)){\n this.api.delete_modele_distance(m)\n this.api.send_worker_distance()\n }\n this.viewer.render(this.viewer.hierarchy)\n }\n\n }\n\n // collapse all node from depth todo create collapse/colllapse all function\n collapse_depth(depth, tree){\n\n var f\n\n var model = this.models[this.current_model];\n var viewer = this.viewer;\n\n\n if (depth == 0 ){\n\n f = function(n,c) {\n model.collapse(n.data, false)\n viewer.apply_collapse_from_data_to_d3(n.data, n)\n }\n }\n else {\n f = function(n,c){\n\n if (n.depth >= depth ){\n\n model.collapse(n.data, true)\n\n }\n else{\n model.collapse(n.data, false)\n }\n\n viewer.apply_collapse_from_data_to_d3(n.data, n)\n }\n }\n\n this.models[this.current_model].traverse_hierarchy(this.viewer.hierarchy, f )\n\n\n\n }\n\n zoom_to_node(name){\n\n if (name === ''){return}\n\n\n if(this.viewer.model.settings.multiple_search != true) {\n\n this.viewer.hierarchy.each(function (d) {\n d.data.search_path = false;\n d.data.search_node = false;\n })\n }\n\n\n function searchTree(obj,search,path){\n if(obj.data.name === search){ //if search is found return, add the object to the path and return it\n\n path.push(obj);\n return path;\n }\n else if(obj.children || obj._children){ //if children are collapsed d3 object will have them instantiated as _children\n var children = (obj.children) ? obj.children : obj._children;\n for(var i=0;i<children.length;i++){\n path.push(obj);// we assume this path is the right one\n var found = searchTree(children[i],search,path);\n if(found){// we were right, this should return the bubbled-up path from the first if statement\n return found;\n }\n else{//we were wrong, remove this parent from the path and continue iterating\n path.pop();\n }\n }\n }\n else{//not the right object, return false so it will continue to iterate in the loop\n return false;\n }\n }\n\n\n var p = searchTree(this.viewer.hierarchy, name, [])\n\n\n\n for(var i=1;i<p.length;i++){ // 1 is for skipping the root\n\n this.models[this.current_model].collapse(p[i].data, false)\n this.viewer.apply_collapse_from_data_to_d3(p[i].data, p[i])\n p[i].data.search_path = true;\n\n\n }\n\n p[p.length-1].data.search_node = true;\n\n this.viewer.set_data(this.models[this.current_model])\n this.viewer.render(this.viewer.hierarchy)\n var n= []\n this.viewer.hierarchy.each(function(d) { if (d.data.name === name){n.push(d)}})\n\n this.viewer.centerNode(n[0])\n\n\n }\n\n toggle_rooting(){\n this.models[this.current_model].rooted = !this.models[this.current_model].rooted\n this.interface = new _interface__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.viewer, this)\n this.viewer.render(this.viewer.hierarchy)\n\n if (this.api.settings.compute_distance && this.api.bound_container.includes(this)){\n this.api.delete_modele_distance(m)\n this.api.send_worker_distance()\n }\n\n }\n\n toggle_stack(){\n\n var ms = this.models[this.current_model].settings\n\n if (ms.has_histogram_data){\n\n ms.show_histogram = !ms.show_histogram;\n this.viewer.set_data(this.models[this.current_model])\n this.viewer.render(this.viewer.hierarchy)\n\n }\n\n\n\n }\n\n // INTERFACE CONTROL\n\n modify_node_size_percent(percent, axis ){\n\n var model = this.models[this.current_model]\n\n if (axis === 'vertical') {\n model.settings.tree.node_vertical_size = model.settings.tree.node_vertical_size * (1 + percent)\n }\n else if (axis === 'horizontal') {\n model.settings.tree.node_horizontal_size = model.settings.tree.node_horizontal_size * (1 + percent)\n }\n\n this.viewer.d3_cluster.nodeSize([ model.settings.tree.node_vertical_size,model.settings.tree.node_horizontal_size])\n this.viewer.build_d3_cluster()\n this.viewer.render(this.viewer.hierarchy)\n\n if (this.viewer.interface && model.settings.use_branch_lenght) {\n var k = this.viewer.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_4__.select(\"#master_g\" + this.viewer.uid).node()).k\n this.viewer.interface.update_scale_value(k);\n }\n\n }\n\n modify_node_size(axis, variation){\n\n var model = this.models[this.current_model]\n var viewer = this.viewer\n\n if (axis === 'vertical') {\n if ((model.settings.tree.node_vertical_size + variation) <= 0){return}\n model.settings.tree.node_vertical_size += variation\n }\n else if (axis === 'horizontal') {\n if ((model.settings.tree.node_horizontal_size + variation) <= 0){return}\n model.settings.tree.node_horizontal_size += variation\n }\n\n viewer.d3_cluster.nodeSize([ model.settings.tree.node_vertical_size,model.settings.tree.node_horizontal_size])\n viewer.build_d3_cluster()\n viewer.render(viewer.hierarchy)\n\n\n if (viewer.interface && model.settings.use_branch_lenght) {\n var k = viewer.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_4__.select(\"#master_g\" + viewer.uid).node()).k\n viewer.interface.update_scale_value(k);\n }\n\n }\n\n update_node_radius_percent(percent){\n\n var model = this.models[this.current_model]\n var viewer = this.viewer\n\n model.settings.tree.node_radius = model.settings.tree.node_radius * (1 + percent)\n viewer.render(viewer.hierarchy)\n }\n\n update_line_width_percent(percent){\n var model = this.models[this.current_model]\n var viewer = this.viewer\n\n model.settings.tree.line_width = model.settings.tree.line_width * (1 + percent)\n viewer.render(viewer.hierarchy)\n }\n\n update_font_size(val){\n this.viewer.model.settings.tree.font_size = val\n this.viewer.render(this.viewer.hierarchy)\n }\n\n update_font_size_node(val){\n this.viewer.model.settings.style.font_size_internal = val\n this.viewer.render(this.viewer.hierarchy)\n }\n\n update_font_size_leaf_percent(val){\n this.viewer.model.settings.tree.font_size = this.viewer.model.settings.tree.font_size * (1 + val)\n this.viewer.render(this.viewer.hierarchy)\n }\n\n update_font_size_node_percent(val){\n this.viewer.model.settings.style.font_size_internal = this.viewer.model.settings.style.font_size_internal * (1 + val)\n this.viewer.render(this.viewer.hierarchy)\n }\n\n //\n\n compute_topology_and_render_bounded_viewer(recompute=true){ // change to als eby default and deal with elementS -> one vlue instead of model uid to val\n\n // if bound container and compare mode activate, we need to update it too\n if (this.api.settings.compareMode && this.api.bound_container.includes(this)){\n\n\n\n var con1 = this.api.bound_container[0]\n var con2 = this.api.bound_container[1]\n\n\n\n if ( con1.models.length > 0 && con2.models.length > 0){\n this.api.compute_visible_topology_similarity( recompute)\n\n\n var ccc = (con1 == this) ? con2 : con1\n ccc.viewer.render(ccc.viewer.hierarchy)\n\n }\n }\n }\n\n reroot_to_compared_tree(){\n\n\n var con1 = this.api.bound_container[0]\n var con2 = this.api.bound_container[1]\n\n if (con1 && con2){\n\n if ( con1.models.length > 0 && con2.models.length > 0){\n var ccc = (con1 == this) ? con2 : con1\n var model = ccc.viewer.model\n\n var bcnode = model.data.children[0].elementBCN[this.viewer.model.uid]\n if(bcnode && bcnode.parent){\n this.trigger_(\"reroot\", bcnode)\n }\n }\n }\n }\n\n reorder_to_compared_tree(){\n\n var con1 = this.api.bound_container[0]\n var con2 = this.api.bound_container[1]\n\n if (con1 && con2){\n\n if ( con1.models.length > 0 && con2.models.length > 0){\n var ccc = (con1 == this) ? con2 : con1\n var model_reference = ccc.viewer.model\n\n\n this.viewer.model.traverse(this.viewer.model.data, null, (child,d) => {\n\n\n\n if (child.children || child._children) {\n var leaves = Array.from(child.leaves, (_, k) => _.name);\n var fixedLeaves = this.getCorrespondingNode(leaves, model_reference.data);\n\n if (leaves[0] !== fixedLeaves[0] && leaves[leaves.length - 1] !== fixedLeaves[fixedLeaves.length - 1]) {\n this.reorder_leaves(child);\n }\n }\n })\n\n this.viewer.set_data(this.viewer.model)\n this.viewer.render(this.viewer.hierarchy)\n\n }\n }\n\n }\n\n getCorrespondingNode(treeLeaves, ifixedTree) {\n\n var bestCorrespondingFixTreeLeaves = [];\n var bestCount = 0;\n\n this.viewer.model.traverse(ifixedTree, null, (child,d) => {\n\n\n if (child.children || child._children) {\n var fixedTreeLeaves = Array.from(child.leaves, (_, k) => _.name);\n var count = 0;\n for (var i = 0; i < fixedTreeLeaves.length; i++) {\n if (treeLeaves.indexOf(fixedTreeLeaves[i]) !== -1) {\n count += 1;\n }\n }\n\n if (count > bestCount) {\n bestCorrespondingFixTreeLeaves = fixedTreeLeaves;\n bestCount = count;\n }\n\n }\n\n })\n\n return bestCorrespondingFixTreeLeaves;\n }\n\n reorder_leaves(d){\n\n var bocal;\n\n if (d.children) {bocal = d.children }\n else if (d._children) {bocal = d._children }\n else {return}\n\n var e = bocal.pop()\n bocal.unshift(e)\n d.leaves = this.viewer.model.get_leaves(d)\n\n\n }\n\n create_model_from_hierarchy_node(node){\n\n var data = Object.assign({}, node.data);\n\n this.viewer.model.traverse(data, function(n,c){\n n.parent=null;\n n.leaves=null;\n n.correspondingLeaf = {}\n n.elementBCN = null})\n\n\n var data = JSON.parse(JSON.stringify(data))\n\n var model = this.viewer.model;\n this.add_tree(data, model.settings, false)\n\n this.models[this.models.length-1].add_circularity_back()\n\n this.viewer.model.add_circularity_back()\n\n this.interface = new _interface__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.viewer, this)\n\n\n\n }\n\n export_as_newick(){\n var nwk = parser.parse_json(this.viewer.model.remove_circularity())\n\n save_file_as(this.viewer.model.settings.name + \".nwk\", nwk)\n\n\n }\n\n};\n\n\n\n\n//# sourceURL=webpack://PhyloIO/./src/container.js?");
8583
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Container)\n/* harmony export */ });\n/* harmony import */ var _viewer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./viewer.js */ \"./src/viewer.js\");\n/* harmony import */ var _model_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./model.js */ \"./src/model.js\");\n/* harmony import */ var _interface__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./interface */ \"./src/interface.js\");\n/* harmony import */ var bootstrap__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! bootstrap */ \"./node_modules/bootstrap/dist/js/bootstrap.esm.js\");\n/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! d3 */ \"./node_modules/d3/index.js\");\n\n\n\n\n\nconst { build_table, save_file_as, colorDifference } = __webpack_require__(/*! ./utils.js */ \"./src/utils.js\")\nvar parser = __webpack_require__(/*! biojs-io-newick */ \"./node_modules/biojs-io-newick/src/index.js\");\n\n\nvar uid_container = 0 // unique id generator is bound to a single Container()\n\n// Object that bind a div with a d3 Viewer() and one or multiple Model()\nclass Container {\n get uid() {\n return this._uid;\n }\n\n constructor(container_id, api) {\n\n this._uid = uid_container++; // unique container id\n this.div_id = container_id; // related div id\n this.models = []; // list of Model()\n this.settings = {}; // per container settings\n this.current_model = 0; // current model index\n this.viewer = new _viewer_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"](this); // attach Viewer()\n this.history_actions = [] // for Undo feature\n this.undone_actions = [] // for Undo feature\n this.api = api\n this.message_loader = null\n\n }\n\n replace_model(old_model,new_model){\n var index = this.models.indexOf(old_model);\n\n if (~index) {\n this.models[index] = new_model;\n }\n\n }\n\n add_action(undo, redo, refresh_interface){\n\n /* undo and redo object - {'name': X, 'fonct': X, 'fonction_obj': X, 'argu': X} */\n\n if (this.api.undoing) {\n return\n }\n\n\n this.history_actions.push(\n {\n 'undo': undo,\n 'redo': redo,\n 'refresh_interface' : (typeof refresh_interface !== 'undefined') ? refresh_interface : false,\n }\n )\n\n\n }\n\n get_last_action(){\n return this.history_actions[this.history_actions.length-1]\n }\n\n pop_last_action(){\n var pop = this.history_actions.pop()\n this.undone_actions.push(pop)\n return pop\n }\n\n pop_redo_action(){\n return this.undone_actions.pop()\n }\n\n\n // create and add Model() configure with params\n add_tree(data, settings, from_raw_data=true){\n this.models.push(new _model_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](data, settings, from_raw_data))\n }\n\n remove_all_trees(){\n this.models = []\n }\n\n remove_current_tree(apply_change_UI){\n\n var apply_change_UI = (typeof apply_change_UI !== 'undefined') ? apply_change_UI : false;\n\n var current_model = this.models[this.current_model]\n\n const index = this.models.indexOf(current_model);\n if (index > -1) {\n this.models.splice(index, 1);\n\n if (this.current_model > this.models.length -1){\n console.log('out of index - recalibrating');\n this.current_model -= 1\n\n }\n\n if (apply_change_UI){\n if (this.models.length == 0){\n\n this.current_model = 0\n\n this.viewer.remove_data()\n this.interface = new _interface__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.viewer, this, true)\n }\n else{\n this.shift_model(0, false)\n }\n }\n\n }\n\n\n\n\n }\n\n // update the data viewer and render it\n start(rendering){\n\n\n if (this.models.length <= 0){\n this.interface = new _interface__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.viewer, this, true)\n return\n }\n\n var rendering = (typeof rendering !== 'undefined') ? rendering : false; // todo inverted ??\n\n this.viewer.set_data(this.models[this.current_model]);\n\n if (rendering){\n\n var z = this.models[this.current_model].zoom\n\n\n if (z) {\n this.viewer.set_zoom(z.k, z.x, z.y)\n }\n\n this.viewer.render(this.viewer.hierarchy);\n //this.viewer.update_collapse_level(this.models[this.current_model].settings.collapse_level)\n\n\n\n }\n\n //this.viewer.zoom_by(0.4) #STACK\n //this.viewer.render(this.viewer.hierarchy); #STACK\n\n }\n\n // shift the pointer (if possible) in the model list and update viewer model\n shift_model(offset, store_old) {\n\n\n var store_old = (typeof store_old !== 'undefined') ? store_old : true;\n\n\n if (this.current_model + offset >= 0 && this.current_model + offset <= this.models.length -1 ) {\n\n //this.add_action('Change tree', this, this.shift_model, [-offset, store_old] )\n\n if (store_old){\n // store the current zoom information\n var old_m = this.models[this.current_model]\n old_m.store_zoomTransform(this.viewer.d3.zoomTransform(this.viewer.svg.node()))\n }\n\n // update new model data to viewer\n this.current_model += offset;\n var m = this.models[this.current_model]\n\n\n\n this.viewer.set_data(m)\n\n\n this.api.stop_all_workers()\n this.compute_topology_and_render_bounded_viewer(false)\n\n // apply if any stored zoom information\n var z = m.zoom\n if (z) {\n this.viewer.set_zoom(z.k, z.x, z.y)\n\n }\n\n this.viewer.render(this.viewer.hierarchy)\n\n if (this.api.settings.compute_distance && this.api.bound_container.includes(this)){\n this.api.send_worker_distance()\n }\n\n\n\n\n }\n\n }\n\n // send action trigger to model, update the data/build d3 data & render the viewer\n trigger_(action, data, node){\n\n var m = this.models[this.current_model];\n\n if (action === 'collapse') {\n\n var name_undo,name_redo;\n\n if (data.children && data.collapse){\n name_undo = 'Collapse this node';\n name_redo = 'Expand this node';\n }\n else {\n name_undo = 'Expand this node';\n name_redo = 'Collapse this node';\n }\n\n var undo = {'name': name_undo, 'fonction_obj': this, 'fonct': this.trigger_, 'argu': [action, data, node]}\n var redo = {'name': name_redo, 'fonction_obj': this, 'fonct': this.trigger_, 'argu': [action, data, node]}\n this.add_action(undo, redo)\n m.collapse(data)\n this.viewer.apply_collapse_from_data_to_d3(data, node)\n this.viewer.build_d3_cluster()\n this.viewer.render(node)\n\n }\n else if (action === 'collapseAll') {\n\n var undo = {'name': 'Expand All', 'fonction_obj': this, 'fonct': this.trigger_, 'argu': ['expandAll', data, node]}\n var redo = {'name': 'Collapse All', 'fonction_obj': this, 'fonct': this.trigger_, 'argu': [action, data, node]}\n this.add_action(undo, redo)\n\n m.collapseAll(data, true)\n this.viewer.apply_collapseAll_from_data_to_d3(data, node)\n this.viewer.build_d3_cluster()\n this.viewer.render(node)\n\n }\n else if (action === 'expandAll') {\n\n var undo = {'name': 'Collapse All', 'fonction_obj': this, 'fonct': this.trigger_, 'argu': ['collapseAll', data, node]}\n var redo = {'name': 'Expand All', 'fonction_obj': this, 'fonct': this.trigger_, 'argu': [action, data, node]}\n this.add_action(undo, redo)\n\n m.collapseAll(data, false)\n this.viewer.apply_expandAll_from_data_to_d3(data, node)\n this.viewer.build_d3_cluster()\n this.viewer.render(node)\n\n }\n else if (action === 'swap') {\n\n var undo = {'name': 'Unswap', 'fonction_obj': this, 'fonct': this.trigger_, 'argu': ['unswap', data, node]}\n var redo = {'name': 'Swap', 'fonction_obj': this, 'fonct': this.trigger_, 'argu': [action, data, node]}\n this.add_action(undo, redo)\n\n m.swap_subtrees(data)\n this.viewer.apply_swap_from_data_to_d3(data, node)\n this.viewer.build_d3_cluster()\n this.viewer.render(node)\n\n\n }\n else if (action === 'unswap') {\n m.unswap_subtrees(data)\n this.viewer.apply_unswap_from_data_to_d3(data, node)\n this.viewer.build_d3_cluster()\n this.viewer.render(node)\n\n\n }\n else if (action === 'reroot'){\n\n var undo = {'name': 'Reroot', 'fonction_obj': this, 'fonct': this.trigger_, 'argu': ['reroot', this.viewer.hierarchy.children[0].data, null]}\n var redo = {'name': 'Reroot', 'fonction_obj': this, 'fonct': this.trigger_, 'argu': [action, data, node]}\n this.add_action(undo, redo)\n\n m.reroot(data)\n m.rooted = true\n this.viewer.set_data(m)\n m.hierarchy_mockup = m.build_hierarchy_mockup()\n m.table = build_table(m.hierarchy_mockup)\n\n this.api.stop_all_workers()\n this.compute_topology_and_render_bounded_viewer(true)\n if (this.api.settings.compute_distance && this.api.bound_container.includes(this)){\n this.api.delete_modele_distance(m)\n this.api.send_worker_distance()\n }\n\n this.viewer.render(this.viewer.hierarchy)\n\n this.update_highlighted_node()\n\n\n }\n else if (action === 'trim'){\n var untrim_data = m.trim(data.data)\n\n\n var undo = {'name': 'Untrim', 'fonction_obj': this, 'fonct': this.trigger_, 'argu':['untrim', untrim_data, null]}\n var redo = {'name': 'Trim', 'fonction_obj': this, 'fonct': this.trigger_, 'argu': [action, data, node]}\n this.add_action(undo, redo)\n\n this.viewer.set_data(m)\n m.hierarchy_mockup = m.build_hierarchy_mockup()\n m.table = build_table(m.hierarchy_mockup)\n this.api.stop_all_workers()\n this.compute_topology_and_render_bounded_viewer(true)\n if (this.api.settings.compute_distance && this.api.bound_container.includes(this)){\n this.api.delete_modele_distance(m)\n this.api.send_worker_distance()\n }\n this.viewer.render(this.viewer.hierarchy)\n }\n else if (action === 'untrim'){\n m.untrim(data.parent, data.floating, data.child, data.index, data.root_mode)\n this.viewer.set_data(m)\n m.hierarchy_mockup = m.build_hierarchy_mockup()\n m.table = build_table(m.hierarchy_mockup)\n this.api.stop_all_workers()\n this.compute_topology_and_render_bounded_viewer(true)\n if (this.api.settings.compute_distance && this.api.bound_container.includes(this)){\n this.api.delete_modele_distance(m)\n this.api.send_worker_distance()\n }\n this.viewer.render(this.viewer.hierarchy)\n }\n else if (action === 'force_show_label'){\n\n var undo = {'name': 'Toggle Label', 'fonction_obj': this, 'fonct': this.trigger_, 'argu': [action, data, node]}\n var redo = {'name': 'Toggle Label', 'fonction_obj': this, 'fonct': this.trigger_, 'argu': [action, data, node]}\n this.add_action(undo, redo)\n\n m.toggle_show_label(data)\n this.viewer.apply_show_label_from_data_to_d3(data, node)\n this.viewer.build_d3_cluster()\n this.viewer.render(node)\n\n\n }\n else if (action === 'BCN'){\n\n var other_container = this.api.bound_container[0] === this ? this.api.bound_container[1] : this.api.bound_container[0]\n\n // get BCN node\n var target_node = node.data.elementBCN[other_container.viewer.model.uid]\n\n if (!target_node){\n console.log('No BCN node found for this container')\n return\n }\n\n var target_hierarchy = this.getHierarchyNodeFromModelNode(target_node, other_container.viewer.hierarchy)\n\n\n other_container.expandToRoot(target_node)\n other_container.viewer.centerNode(target_hierarchy)\n\n target_node._show_BCN = true\n other_container.viewer.blinking = 6\n other_container.viewer.render(other_container.viewer.hierarchy)\n\n }\n\n }\n\n expandToRoot(node_model ) {\n\n var model = this.viewer.model;\n var hierarchy = this.viewer.hierarchy;\n\n var node = node_model\n while (node) {\n model.collapse(node, false)\n\n var node_hierarchy = this.getHierarchyNodeFromModelNode(node, hierarchy)\n this.viewer.apply_collapse_from_data_to_d3(node, node_hierarchy)\n node = node.parent; // Move to the parent node\n }\n\n }\n\n\n\n\n\n // collapse all node from depth\n collapse_depth(depth, tree){\n\n var f\n\n var model = this.models[this.current_model];\n var viewer = this.viewer;\n\n\n if (depth == 0 ){\n\n f = function(n,c) {\n model.collapse(n.data, false)\n viewer.apply_collapse_from_data_to_d3(n.data, n)\n }\n }\n else {\n f = function(n,c){\n\n if (n.depth >= depth ){\n\n model.collapse(n.data, true)\n\n }\n else{\n model.collapse(n.data, false)\n }\n\n viewer.apply_collapse_from_data_to_d3(n.data, n)\n }\n }\n\n this.models[this.current_model].traverse_hierarchy(this.viewer.hierarchy, f )\n\n\n\n }\n\n collapse_node_not_colored(){\n\n var model = this.models[this.current_model];\n var viewer = this.viewer;\n var f_pre, f_post;\n\n var is_leaf = function(node) {\n return !node.children && !node._children;\n }\n\n switch (model.settings.selected_collapse_uncolored) {\n\n case 'Leaves':\n\n f_pre = function(node, children){\n\n node.colored = false;\n node.data.colored = false;\n\n if (is_leaf(node) && node.data.extended_informations[model.settings.style.color_accessor['leaf']] !== undefined ){\n node.colored = true;\n node.data.colored = true;\n }\n\n }\n\n f_post = function(child, node){\n\n // go through node.data.leaves and check if one colored break\n var leaves = child.data.leaves ? child.data.leaves : []\n for (const leafKey in leaves) {\n const leaf = leaves[leafKey];\n if (leaf.colored) {\n return\n }\n }\n\n model.collapse(child.data, true)\n viewer.apply_collapse_from_data_to_d3(child.data, child)\n }\n\n break;\n\n case 'Nodes':\n\n var f_pre = function(node, children){\n\n node.colored = false;\n node.data.colored = false;\n\n if ( !is_leaf(node) && node.data.extended_informations[model.settings.style.color_accessor['node']] !== undefined ){\n node.colored = true;\n node.data.colored = true;\n }\n\n }\n\n var f_post = function(child, node){\n\n if (is_leaf(child)){ return }\n\n var children_list = child.children ? child.children : child._children\n\n for (const childrenListKey in children_list) {\n\n var e = children_list[childrenListKey]\n\n if (is_leaf(e)){continue}\n\n if (e.colored) {\n return\n }\n\n }\n\n model.collapse(child.data, true)\n viewer.apply_collapse_from_data_to_d3(child.data, child)\n }\n\n break;\n case 'Both':\n\n var f_pre = function(node, children){\n\n node.colored = false;\n node.data.colored = false;\n\n if ( !is_leaf(node) && node.data.extended_informations[model.settings.style.color_accessor['node']] !== undefined ){\n node.colored = true;\n node.data.colored = true;\n }\n else if (is_leaf(node) && node.data.extended_informations[model.settings.style.color_accessor['leaf']] !== undefined ){\n node.colored = true;\n node.data.colored = true;\n }\n\n }\n\n var f_post = function(child, node){\n\n if (is_leaf(child)){return}\n\n var children_list = child.children ? child.children : child._children\n\n for (const childrenListKey in children_list) {\n\n var e = children_list[childrenListKey]\n\n if (e.colored) {\n return\n }\n\n }\n\n model.collapse(child.data, true)\n viewer.apply_collapse_from_data_to_d3(child.data, child)\n }\n\n break;\n default:\n console.log('Unknown collapse option: ' + model.settings.selected_collapse_uncolored)\n return;\n\n }\n\n this.models[this.current_model].traverse_hierarchy(this.viewer.hierarchy,f_pre, f_post)\n\n }\n\n monocolored_check_and_collapse(colors,child ){\n\n var model = this.models[this.current_model]\n\n switch (colors.size) {\n case 0:\n break; // no color, do nothing\n case 1:\n model.collapse(child.data, true)\n this.viewer.apply_collapse_from_data_to_d3(child.data, child)\n break;\n default:\n // compute the all pair of colorDifference in colors. If one above 10% return\n var colorArray = Array.from(colors)\n for (let i = 0; i < colorArray.length; i++) {\n for (let j = i + 1; j < colorArray.length; j++) {\n if (colorDifference(colorArray[i], colorArray[j]) > 0.05) {\n return; // multiple colors, do not collapse\n }\n }\n }\n model.collapse(child.data, true)\n this.viewer.apply_collapse_from_data_to_d3(child.data, child)\n break\n }\n }\n\n collapse_node_same_color(){\n\n var that = this\n\n var model = this.models[this.current_model];\n var viewer = this.viewer;\n var compared_model = viewer.get_compared_model()\n var f_pre, f_post;\n\n var is_leaf = function(node) {\n return !node.children && !node._children;\n }\n\n\n switch (model.settings.selected_collapse_monocolored) {\n\n case 'Leaves':\n\n f_pre = function(node, children){\n\n node.renderedColor = false;\n node.data.renderedColor = false;\n\n if (is_leaf(node) && node.data.extended_informations[model.settings.style.color_accessor['leaf']] !== undefined ){\n node.renderedColor = viewer.get_color_label(node)\n node.data.renderedColor = viewer.get_color_label(node)\n\n }\n\n }\n\n f_post = function(child, node){\n\n var colors = new Set()\n\n var leaves = child.data.leaves ? child.data.leaves : []\n\n for (const leafKey in leaves) {\n const leaf = leaves[leafKey];\n\n if (!leaf.renderedColor) {\n continue\n }\n\n colors.add(leaf.renderedColor)\n }\n\n\n\n that.monocolored_check_and_collapse(colors,child )\n\n viewer.apply_collapse_from_data_to_d3(child.data, child)\n\n }\n\n break;\n\n case 'Nodes':\n\n f_pre = function(node, children){\n\n\n node.renderedColor = false;\n node.data.renderedColor = false;\n\n if ( !is_leaf(node) && node.data.extended_informations[model.settings.style.color_accessor['node']] !== undefined ){\n node.renderedColor = viewer.color_edge(node, compared_model);\n node.data.renderedColor = viewer.color_edge(node, compared_model);\n }\n\n }\n\n f_post = function(child, node){\n\n if (is_leaf(child)){ return }\n\n var children_list = child.children ? child.children : child._children\n\n // check if all children_list are leaf return\n if (children_list.length === 0 || children_list.every(is_leaf)) {\n return;\n }\n\n child.colors = new Set()\n\n for (const childrenListKey in children_list) {\n\n var e = children_list[childrenListKey]\n\n if (is_leaf(e)){continue}\n\n\n if (e.colors){\n child.colors = new Set([...child.colors, ...e.colors]);\n\n }\n else if (e.renderedColor){\n child.colors.add(e.renderedColor)\n }\n else{\n child.colors = new Set()\n return\n }\n\n\n }\n\n that.monocolored_check_and_collapse(child.colors,child )\n\n\n }\n\n break;\n\n case 'Both':\n\n f_pre = function(node, children){\n\n\n node.renderedColor = false;\n node.data.renderedColor = false;\n\n if ( is_leaf(node) && node.data.extended_informations[model.settings.style.color_accessor['node']] !== undefined ){\n node.renderedColor = viewer.color_edge(node, compared_model);\n node.data.renderedColor = viewer.color_edge(node, compared_model);\n }\n else if (is_leaf(node) && node.data.extended_informations[model.settings.style.color_accessor['leaf']] !== undefined ){\n node.renderedColor = viewer.get_color_label(node)\n node.data.renderedColor = viewer.get_color_label(node)\n }\n\n }\n\n f_post = function(child, node){\n\n if (is_leaf(child)){ return }\n\n var children_list = child.children ? child.children : child._children\n\n child.colors = new Set()\n\n for (const childrenListKey in children_list) {\n\n var e = children_list[childrenListKey]\n\n if (e.colors){\n child.colors = new Set([...child.colors, ...e.colors]);\n\n }\n else if (e.renderedColor){\n child.colors.add(e.renderedColor)\n }\n else{\n child.colors = new Set()\n return\n }\n\n\n\n }\n\n that.monocolored_check_and_collapse(child.colors,child )\n\n }\n\n break;\n default:\n console.log('Unknown collapse option: ' + model.settings.selected_collapse_uncolored)\n return;\n\n }\n\n this.models[this.current_model].traverse_hierarchy(this.viewer.hierarchy,f_pre, f_post)\n\n\n\n\n }\n\n highlight_node(name){\n\n if (name === ''){return}\n\n\n if(this.viewer.model.settings.multiple_search != true) {\n\n this.viewer.hierarchy.each(function (d) {\n d.data.search_path = false;\n d.data.search_node = false;\n })\n }\n\n\n function searchTree(obj,search,path){\n if(obj.data.name === search){ //if search is found return, add the object to the path and return it\n\n path.push(obj);\n return path;\n }\n else if(obj.children || obj._children){ //if children are collapsed d3 object will have them instantiated as _children\n var children = (obj.children) ? obj.children : obj._children;\n for(var i=0;i<children.length;i++){\n path.push(obj);// we assume this path is the right one\n var found = searchTree(children[i],search,path);\n if(found){// we were right, this should return the bubbled-up path from the first if statement\n return found;\n }\n else{//we were wrong, remove this parent from the path and continue iterating\n path.pop();\n }\n }\n }\n else{//not the right object, return false so it will continue to iterate in the loop\n return false;\n }\n }\n\n\n var p = searchTree(this.viewer.hierarchy, name, [])\n\n\n\n for(var i=1;i<p.length;i++){ // 1 is for skipping the root\n\n this.models[this.current_model].collapse(p[i].data, false)\n this.viewer.apply_collapse_from_data_to_d3(p[i].data, p[i])\n p[i].data.search_path = true;\n\n\n }\n\n p[p.length-1].data.search_node = true;\n\n this.viewer.set_data(this.models[this.current_model])\n this.viewer.render(this.viewer.hierarchy, 0);\n\n var n= []\n this.viewer.hierarchy.each(function(d) { if (d.data.name === name){n.push(d)}})\n\n //this.viewer.centerNode(n[0])\n\n\n }\n\n remove_highlight_node(){\n this.viewer.hierarchy.each(function(d) {\n d.data.search_path = false;\n d.data.search_node = false;\n })\n }\n\n update_highlighted_node(){\n var highlighted = []\n\n this.viewer.hierarchy.each(function(d) {\n\n d.data.search_path = false;\n\n if (d.data.search_node){\n highlighted.push(d)\n\n }\n })\n\n for (const highlightedKey in highlighted) {\n this.highlight_node(highlighted[highlightedKey].data.name)\n }\n\n\n }\n\n toggle_rooting(){\n this.models[this.current_model].rooted = !this.models[this.current_model].rooted\n this.interface = new _interface__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.viewer, this)\n this.viewer.render(this.viewer.hierarchy)\n\n if (this.api.settings.compute_distance && this.api.bound_container.includes(this)){\n this.api.delete_modele_distance(m)\n this.api.send_worker_distance()\n }\n\n }\n\n toggle_stack(){\n\n var ms = this.models[this.current_model].settings\n\n if (ms.has_histogram_data){\n\n ms.show_histogram = !ms.show_histogram;\n this.viewer.set_data(this.models[this.current_model])\n this.viewer.render(this.viewer.hierarchy)\n\n }\n\n\n\n }\n\n // INTERFACE CONTROL\n\n modify_node_size_percent(percent, axis ){\n\n var model = this.models[this.current_model]\n\n if (axis === 'vertical') {\n model.settings.tree.node_vertical_size = model.settings.tree.node_vertical_size * (1 + percent)\n }\n else if (axis === 'horizontal') {\n model.settings.tree.node_horizontal_size = model.settings.tree.node_horizontal_size * (1 + percent)\n }\n\n this.viewer.d3_cluster.nodeSize([ model.settings.tree.node_vertical_size,model.settings.tree.node_horizontal_size])\n this.viewer.build_d3_cluster()\n this.viewer.render(this.viewer.hierarchy)\n\n if (this.viewer.interface && model.settings.use_branch_lenght) {\n var k = this.viewer.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_4__.select(\"#master_g\" + this.viewer.uid).node()).k\n this.viewer.interface.update_scale_value(k);\n }\n\n }\n\n modify_node_size(axis, variation){\n\n var model = this.models[this.current_model]\n var viewer = this.viewer\n\n if (axis === 'vertical') {\n if ((model.settings.tree.node_vertical_size + variation) <= 0){return}\n model.settings.tree.node_vertical_size += variation\n }\n else if (axis === 'horizontal') {\n if ((model.settings.tree.node_horizontal_size + variation) <= 0){return}\n model.settings.tree.node_horizontal_size += variation\n }\n\n viewer.d3_cluster.nodeSize([ model.settings.tree.node_vertical_size,model.settings.tree.node_horizontal_size])\n viewer.build_d3_cluster()\n viewer.render(viewer.hierarchy)\n\n\n if (viewer.interface && model.settings.use_branch_lenght) {\n var k = viewer.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_4__.select(\"#master_g\" + viewer.uid).node()).k\n viewer.interface.update_scale_value(k);\n }\n\n }\n\n update_node_radius_percent(percent){\n\n var model = this.models[this.current_model]\n var viewer = this.viewer\n\n model.settings.tree.node_radius = model.settings.tree.node_radius * (1 + percent)\n viewer.render(viewer.hierarchy)\n }\n\n update_line_width_percent(percent){\n var model = this.models[this.current_model]\n var viewer = this.viewer\n\n model.settings.tree.line_width = model.settings.tree.line_width * (1 + percent)\n viewer.render(viewer.hierarchy)\n }\n\n update_font_size(val){\n this.viewer.model.settings.tree.font_size = val\n this.viewer.render(this.viewer.hierarchy)\n }\n\n update_font_size_node(val){\n this.viewer.model.settings.style.font_size_internal = val\n this.viewer.render(this.viewer.hierarchy)\n }\n\n update_font_size_leaf_percent(val){\n this.viewer.model.settings.tree.font_size = this.viewer.model.settings.tree.font_size * (1 + val)\n this.viewer.render(this.viewer.hierarchy)\n }\n\n update_font_size_node_percent(val){\n this.viewer.model.settings.style.font_size_internal = this.viewer.model.settings.style.font_size_internal * (1 + val)\n this.viewer.render(this.viewer.hierarchy)\n }\n\n //\n\n compute_topology_and_render_bounded_viewer(recompute=true){ // change to als eby default and deal with elementS -> one vlue instead of model uid to val\n\n // if bound container and compare mode activate, we need to update it too\n if (this.api.settings.compareMode && this.api.bound_container.includes(this)){\n\n\n\n var con1 = this.api.bound_container[0]\n var con2 = this.api.bound_container[1]\n\n\n\n if ( con1.models.length > 0 && con2.models.length > 0){\n this.api.compute_visible_topology_similarity( recompute)\n\n\n var ccc = (con1 == this) ? con2 : con1\n ccc.viewer.render(ccc.viewer.hierarchy)\n\n }\n }\n }\n\n reroot_to_compared_tree(){\n\n\n var con1 = this.api.bound_container[0]\n var con2 = this.api.bound_container[1]\n\n if (con1 && con2){\n\n if ( con1.models.length > 0 && con2.models.length > 0){\n var ccc = (con1 == this) ? con2 : con1\n var model = ccc.viewer.model\n\n var bcnode = model.data.children[0].elementBCN[this.viewer.model.uid]\n if(bcnode && bcnode.parent){\n this.trigger_(\"reroot\", bcnode)\n }\n }\n }\n }\n\n reorder_to_compared_tree(){\n\n var con1 = this.api.bound_container[0]\n var con2 = this.api.bound_container[1]\n\n if (con1 && con2){\n\n if ( con1.models.length > 0 && con2.models.length > 0){\n var ccc = (con1 == this) ? con2 : con1\n var model_reference = ccc.viewer.model\n\n\n this.viewer.model.traverse(this.viewer.model.data, null, (child,d) => {\n\n\n\n if (child.children || child._children) {\n var leaves = Array.from(child.leaves, (_, k) => _.name);\n var fixedLeaves = this.getCorrespondingNode(leaves, model_reference.data);\n\n if (leaves[0] !== fixedLeaves[0] && leaves[leaves.length - 1] !== fixedLeaves[fixedLeaves.length - 1]) {\n this.reorder_leaves(child);\n }\n }\n })\n\n this.viewer.set_data(this.viewer.model)\n this.viewer.render(this.viewer.hierarchy)\n\n }\n }\n\n }\n\n getCorrespondingNode(treeLeaves, ifixedTree) {\n\n var bestCorrespondingFixTreeLeaves = [];\n var bestCount = 0;\n\n this.viewer.model.traverse(ifixedTree, null, (child,d) => {\n\n\n if (child.children || child._children) {\n var fixedTreeLeaves = Array.from(child.leaves, (_, k) => _.name);\n var count = 0;\n for (var i = 0; i < fixedTreeLeaves.length; i++) {\n if (treeLeaves.indexOf(fixedTreeLeaves[i]) !== -1) {\n count += 1;\n }\n }\n\n if (count > bestCount) {\n bestCorrespondingFixTreeLeaves = fixedTreeLeaves;\n bestCount = count;\n }\n\n }\n\n })\n\n return bestCorrespondingFixTreeLeaves;\n }\n\n reorder_leaves(d){\n\n var bocal;\n\n if (d.children) {bocal = d.children }\n else if (d._children) {bocal = d._children }\n else {return}\n\n var e = bocal.pop()\n bocal.unshift(e)\n d.leaves = this.viewer.model.get_leaves(d)\n\n\n }\n\n create_model_from_hierarchy_node(node){\n\n var data = Object.assign({}, node.data);\n\n this.viewer.model.traverse(data, function(n,c){\n n.parent=null;\n n.leaves=null;\n n.correspondingLeaf = {}\n n.elementBCN = null})\n\n\n var data = JSON.parse(JSON.stringify(data))\n\n var model = this.viewer.model;\n this.add_tree(data, model.settings, false)\n\n this.models[this.models.length-1].add_circularity_back()\n\n this.viewer.model.add_circularity_back()\n\n this.interface = new _interface__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.viewer, this)\n\n\n\n }\n\n export_as_newick(){\n var nwk = parser.parse_json(this.viewer.model.remove_circularity())\n\n save_file_as(this.viewer.model.settings.name + \".nwk\", nwk)\n\n\n }\n\n escape_string_for_nhx(str){\n // replace ( ) [ ] , : ; as well as white space with _\n return str.replace(/[\\s\\(\\)\\[\\],:;]/g, '_')\n }\n convertToExtendedNewick(node) {\n let result = '';\n\n if (node.children) {\n const childrenNewick = node.children.map(this.convertToExtendedNewick, this).join(',');\n result += `(${childrenNewick})`;\n }\n\n result += node.name;\n\n\n if (node.extended_informations['Length'] !== undefined) {\n result += `:${node.branch_length}`;\n }\n\n var str_extended = ''\n\n for (const key in node.extended_informations) {\n if (key !== 'Length' && node.extended_informations[key] ) {\n str_extended += `:${key}=${this.escape_string_for_nhx(node.extended_informations[key])}`;\n }\n }\n\n if (str_extended !== '') {\n result += `[&&NHX${str_extended}]`\n }\n\n return result;\n }\n\n export_as_nhx(){\n var nhx = this.convertToExtendedNewick(this.viewer.model.data)\n\n save_file_as(this.viewer.model.settings.name + \".nhx\", nhx)\n\n\n }\n\n traverseAllNodes(node, callback) {\n callback(node); // Apply the callback to the current node\n const children = node.children || node._children; // Include both expanded and collapsed nodes\n if (children) {\n children.forEach((child) => this.traverseAllNodes(child, callback));\n }\n }\n\n getHierarchyNodeFromModelNode(modelNode, hierarchy) {\n let equivalentNode = null;\n\n this.traverseAllNodes(hierarchy, (d) => {\n if (d.data === modelNode) {\n equivalentNode = d;\n }\n });\n\n return equivalentNode;\n }\n\n\n\n\n};\n\n\n\n\n//# sourceURL=webpack://PhyloIO/./src/container.js?");
8696
8584
 
8697
8585
  /***/ }),
8698
8586
 
@@ -8703,7 +8591,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
8703
8591
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8704
8592
 
8705
8593
  "use strict";
8706
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ init: () => (/* binding */ init)\n/* harmony export */ });\n/* harmony import */ var bootstrap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! bootstrap */ \"./node_modules/bootstrap/dist/js/bootstrap.esm.js\");\n/* harmony import */ var bootstrap_dist_css_bootstrap_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! bootstrap/dist/css/bootstrap.css */ \"./node_modules/bootstrap/dist/css/bootstrap.css\");\n/* harmony import */ var _style_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./style.css */ \"./src/style.css\");\n/* harmony import */ var _interface_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./interface.css */ \"./src/interface.css\");\n/* harmony import */ var _progress_wizard_min_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./progress-wizard.min.css */ \"./src/progress-wizard.min.css\");\n/* harmony import */ var _fontawesome_free_6_2_0_web_css_all_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./fontawesome-free-6.2.0-web/css/all.css */ \"./src/fontawesome-free-6.2.0-web/css/all.css\");\n/* harmony import */ var _api_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./api.js */ \"./src/api.js\");\n/*\n\nPhylo.IO is build following the MVC architecture:\n- Container class (or Controller): the class that connects a single viewer (div) and the\nloaded model through user interactions.\n- Viewer class: the d3 viewer that can render any model object.\n- Model class: the data for a single tree with associated computed information (\nzoom, transform, annotated information, etc..)\n\nThe PhyloIO manage the app that can have any number of Container (associated to an unique DOM div) that each\ncontains a Viewer instance. Each Viewer (and by consequent Container) can have multiple models (trees)\n\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\nObject.values = Object.values || function(o){return Object.keys(o).map(function(k){return o[k]})};\nString.prototype.format = function () {\n var i = 0, args = arguments;\n return this.replace(/{}/g, function () {\n return typeof args[i] != 'undefined' ? args[i++] : '';\n });\n};\n\nconst init = function(){\n\n return new _api_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"]()\n}\n\n\n\n\n\n//# sourceURL=webpack://PhyloIO/./src/index.js?");
8594
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ init: () => (/* binding */ init)\n/* harmony export */ });\n/* harmony import */ var bootstrap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! bootstrap */ \"./node_modules/bootstrap/dist/js/bootstrap.esm.js\");\n/* harmony import */ var bootstrap_dist_css_bootstrap_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! bootstrap/dist/css/bootstrap.css */ \"./node_modules/bootstrap/dist/css/bootstrap.css\");\n/* harmony import */ var _style_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./style.css */ \"./src/style.css\");\n/* harmony import */ var _interface_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./interface.css */ \"./src/interface.css\");\n/* harmony import */ var _progress_wizard_min_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./progress-wizard.min.css */ \"./src/progress-wizard.min.css\");\n/* harmony import */ var _api_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./api.js */ \"./src/api.js\");\n/*\n\nPhylo.IO is build following the MVC architecture:\n- Container class (or Controller): the class that connects a single viewer (div) and the\nloaded model through user interactions.\n- Viewer class: the d3 viewer that can render any model object.\n- Model class: the data for a single tree with associated computed information (\nzoom, transform, annotated information, etc..)\n\nThe PhyloIO manage the app that can have any number of Container (associated to an unique DOM div) that each\ncontains a Viewer instance. Each Viewer (and by consequent Container) can have multiple models (trees)\n\n */\n\n\n\n\n\n\n\n\n\n\n\n\nObject.values = Object.values || function(o){return Object.keys(o).map(function(k){return o[k]})};\nString.prototype.format = function () {\n var i = 0, args = arguments;\n return this.replace(/{}/g, function () {\n return typeof args[i] != 'undefined' ? args[i++] : '';\n });\n};\n\nconst init = function(){\n\n return new _api_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]()\n}\n\n\n\n\n\n//# sourceURL=webpack://PhyloIO/./src/index.js?");
8707
8595
 
8708
8596
  /***/ }),
8709
8597
 
@@ -8714,7 +8602,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
8714
8602
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8715
8603
 
8716
8604
  "use strict";
8717
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Interface)\n/* harmony export */ });\n/* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! file-saver */ \"./node_modules/file-saver/dist/FileSaver.min.js\");\n/* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(file_saver__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3 */ \"./node_modules/d3/index.js\");\n/* harmony import */ var bootstrap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! bootstrap */ \"./node_modules/bootstrap/dist/js/bootstrap.esm.js\");\n\n\n\n\n// D3 viewer Interface that render UI elements(buttons, slider, menu)\nclass Interface {\n\n constructor(v,c, empty_mode){\n\n var empty_mode = (typeof empty_mode !== 'undefined') ? empty_mode : false;\n\n this.scale_pixel_length = 120;\n\n this.container_object = c\n this.viewer = v\n this.container_d3 = v.container_d3\n this.api = this.container_object.api\n\n //MISC\n this.dismiss_blur = false\n\n this.examples={\n \"small1\": \"((yli:1.0085614391793067,(((lel:0.2880678599618948,(cal:0.11643570498932501,ctr:0.12746420698315983):0.0877413194006926):0.12449843844102518,pst:0.20187483296288805):0.04951181210826987,(pgu:0.3208350693977453,dha:0.19121342958249643):0.0444880656387921):0.3761988962574594):0.22545281705785974,(((kla:0.32829009627835226,ago:0.35217085340006204):0.057415467336693615,(skl:0.15813405639248146,kwa:0.25658337062111586):0.04348414441988464):0.036897766465122404,(cgl:0.29957965624763355,(sca:0.24212307199678842,(sba:0.03984952076326609,(((sce:0.022286259220280224,spa:0.016875934069075366):0.01282179619059339,smi:0.03661027033511007):0.013312280806766753,sku:0.042685124078088485):0.014142671709463695):0.17548658899657893):0.03625000527459598):0.08921537612721808):0.22545281705785974):0;\",\n \"small2\": \"((sba:0.04645932805874481569,(smi:0.03315550229946162553,(spa:0.01466907419174275952,sce:0.02383733069302066895):0.01620853054082276729):0.01834962617511207497):0.06496501071301066799,(sca:0.21928497146352055047,((((ago:0.34529718349701971070,kla:0.26611733077459831520):0.04460721000595434249,(kwa:0.23458417353426505580,skl:0.38245746198409408256):0.02217438839159899949):0.02847427462232336726,(((pst:0.21220493191897629726,((cal:0.09792303271040220247,ctr:0.11778282966461572911):0.07993742108354510989,lel:0.23757786374413303321):0.09896075353236584438):0.04667831716440219020,(pgu:0.28475663985974825065,dha:0.17797706546403241346):0.04249479494672471491):0.29326816910580705278,yli:0.72911704942210797675):0.31199925135971823265):0.06946141605430436461,cgl:0.27125751484306920291):0.03678319509837457008):0.09011350505801994648,sku:3.28511106679567399524):0.0;\",\n \"big\": \"(((SOLTU34696:0.02229166687593289037,SOLLC24463:0.00709709081903918577):0.18421898265728259281,((((MEDTR17610:0.15714167879247994963,(SOYBN06937:0.02529940651188004874,SOYBN15364:0.00931421471673856902):0.03339587536636171722):0.04648572868545788189,(SOYBN40305:0.05161993270599975203,SOYBN06011:0.01868797976671805749):0.13262390593762377056):0.09574925506273131159,((POPTR14057:0.08501820169894380719,POPTR15493:0.03388172716526779982):0.04903132056086856316,(VITVI16878:0.15032892038600365048,(MANES09114:0.00455508973340297985,MANES09113:0.00000100000050002909):0.10960937493738516502):0.06005265654177237983):0.03327927635394690997):0.04169405035061653220,((((SELML14800:0.01085671843303792107,SELML05537:0.02039560840819776635):0.73478761253095836725,(((((((MUSAM01035:0.00000100000050002909,MUSAC06029:0.00000100000050002909):0.30554247145426172150,((((ARALY04176:0.03071803778508035501,ARATH04062:0.02390145058045729451):0.26881464177877639754,(ARATH20168:0.04620983006923840702,ARALY11148:0.00932022073022199457):0.20782072992434411085):0.09488068423975774823,(((SOYBN02845:0.00976170253766352886,SOYBN51173:0.02918590246006154409):0.08540209758062287937,((MEDTR41063:0.00000100000050002909,MEDTR41066:0.02017257537407208742):0.16176325397181906540,(SOYBN11067:0.03963088470198131846,SOYBN08966:0.01232745661039070031):0.08548569071631144378):0.04853822353702215431):0.14497593655405260904,(MANES12931:0.07738860904262530316,(MANES07497:0.09434645317867160208,POPTR11029:0.12695444105377301502):0.02979790056758981412):0.05775061588261572176):0.01638682789008762478):0.05403462689546538467,(((MUSAM29615:0.00000100000050002909,MUSAC32718:0.00000100000050002909):0.08299761701045121898,((MUSAM27485:0.00000100000050002909,MUSAC30588:0.00000100000050002909):0.06661990811446089067,(MUSAC19509:0.00000100000050002909,MUSAM13578:0.00000100000050002909):0.06965462171572417427):0.02546304953829388665):0.19603767643398820053,(SOLLC06707:0.01792241662639993890,SOLTU18103:0.01706502381760034368):0.18420517353108956105):0.02629729192908691893):0.18414179845688000148):0.53817024374636479589,((SELML06655:0.00000100000050002909,SELML08476:0.03320959111509765721):0.85020985387688086110,(SELML03696:0.00000100000050002909,SELML10004:0.00646896469865896381):0.70379805522375493698):0.08752580347866126265):0.06518214565099944569,(((SELML10585:0.09739496921243473437,((SELML09645:0.01874532851656703428,SELML09389:0.00461002747936521164):0.00923396102862936510,(((SELML20828:0.00466275631610225862,(((SELML20789:0.01052082189588285019,SELML01265:0.01037032025689046087):0.12574093071149400336,SELML20813:0.00000100000050002909):0.00927460510378439601,SELML09379:0.00932813396907514365):0.01397774234266347532):0.01871018274364625450,SELML09395:0.00000100000050002909):0.00000100000050002909,SELML20823:0.00463913170794102298):0.00475219553005659830):0.03038880589415450875):0.25057129550716489286,(SELML06902:0.00000100000050002909,SELML13410:0.01944383189133876144):0.69918435501807829624):0.21184059841609043096,(((SOLTU11560:0.00866375047195633470,SOLLC08801:0.03929176849985123454):0.10262341703543685634,(SOLTU05304:0.01187114169278406621,SOLLC33391:0.01633284173625539071):0.15173972504306554310):0.21239804572202647392,(((SOLLC08269:0.02116737660229363674,SOLTU10962:0.01372146392435308164):0.25856914038108191889,((((MEDTR21917:0.01799185381782565998,MEDTR21918:0.00922025508246283182):0.05573688941724050383,((SOYBN35782:0.03087107867875190509,SOYBN00680:0.01163081217349988539):0.08312081118311021033,MEDTR21916:0.15768887143629881087):0.03305450703309942284):0.01735157638851950873,((SOYBN01697:0.01802156549906810262,SOYBN46853:0.01038317775355940449):0.09530254205432765746,(SOYBN00679:0.02003726912435226451,SOYBN35783:0.03023646561760832269):0.03688686876344755838):0.02302672045433903220):0.08493744642431001746,((VITVI19452:0.12740781730937075777,((POPTR37828:0.04689316251484140774,POPTR22952:0.05970448316470000627):0.04193762972183705945,MANES11398:0.08400005523386327999):0.02628003046485331493):0.03551912761098192928,((((ARATH04782:0.00000100000050002909,ARALY08526:0.01228654282875111386):0.29212655156837918913,(ARATH15344:0.00223041658309429966,ARALY09276:0.01996073486554238163):0.13397468053224975693):0.07185417278801679852,POPTR16926:0.13312849254037534275):0.01098363254080201613,(MANES03104:0.09480815288204409719,MANES16408:0.02654262709927663472):0.03040210277567834823):0.03004035743504208933):0.01404570578236909867):0.03121249594034346958):0.05887160826170913935,(((SORBI10122:0.03323503849451007325,(MAIZE08377:0.02021590177517258030,SETIT28177:0.08805632675554768418):0.02504709626837576045):0.07287654177256396026,((BRADI21338:0.02686457952333810503,(WHEAT87462:0.01035700555682448655,(AEGTA26567:0.02910656260243310589,WHEAT48582:0.00000100000050002909):0.00625588989844735790):0.02544515824802914133):0.05168964740217039944,(ORYBR07284:0.04813817240195044506,(ORYSJ56422:0.00433527809312172531,(ORYGL06636:0.00000100000050002909,ORYSI08916:0.00431204407639125802):0.00000100000050002909):0.02653829363724803658):0.07984049213339161621):0.04976898423119274079):0.18678884266555975668,(MUSAC33499:0.00000100000050002909,MUSAM30396:0.00000100000050002909):0.08842248045116975208):0.04165816956540665389):0.09570036071387207077):0.60260647226597463533):0.10300128639879745085):0.05333874304685561757,((SELML13018:0.00000100000050002909,SELML30466:0.00477137258052293296):0.56143589685507788722,(((((PHYPA18023:1.45983872422859706219,((PHYPA12217:0.72758536297043008290,(PHYPA14615:0.22317040222409229022,PHYPA01897:0.18214443240871036611):0.11097031107740006062):0.14961122338629148643,(PHYPA08531:0.29900979623764539772,(PHYPA04376:0.25454022577299584285,(PHYPA18912:0.62398743983641291599,(PHYPA13415:0.71529981912002149613,PHYPA01014:0.26003643742515786252):0.07742794881965327225):0.38565491945027224885):0.05957449835352644774):0.09269847683225705681):0.75858844054616292318):0.07539002105126456355,((PHYPA04370:0.31660275332914461499,PHYPA05793:0.28028601507271555526):0.27571769085407782374,PHYPA28145:1.21917586572920066956):0.14066981600410852216):0.11608964301527176233,(PHYPA27115:0.42531933835658036758,(PHYPA31589:0.11675081532900566383,PHYPA04378:0.17222158017426700272):0.22477213002122817254):0.32580096131428765149):0.08974406589734822137,(((PHYPA11652:0.08450753494102389296,PHYPA31587:0.15429860569540626569):0.08729389620246855164,PHYPA04379:0.14759110818710738378):0.49200936134970701952,PHYPA11641:0.66796896516575210434):0.18230799226098934329):0.07538150349550752638,(PHYPA05231:0.11882948010610601408,PHYPA09854:0.13832190416771542041):1.05007915890183545216):0.04891086498022992335):0.04436693750603239172):0.09999942466169695066,(((MANES21353:0.07843656258111202095,POPTR03078:0.09140350201084442017):0.03941132856151274150,(((ARATH05045:0.05812548265815464105,ARALY28862:0.04021698999013888220):0.25858803601578123077,(SOLLC33983:0.41111237385610865935,(MUSAC06420:0.00000100000050002909,MUSAM01426:0.00000100000050002909):0.30877713598507794401):0.04059574780523743376):0.08460593221894585625,((SOYBN45734:0.02007143564929426971,SOYBN20022:0.02561133933208175478):0.12665765536264397828,VITVI20760:0.14512568901466627036):0.04894509511205995256):0.01780901105694476100):0.79989526243629693880,(((((((MUSAM28527:0.00000100000050002909,MUSAC31630:0.00000100000050002909):0.11781514143582931531,(MUSAC24401:0.00000100000050002909,MUSAM31539:0.00000100000050002909):0.22759820284884196839):0.25781360213390636105,(((SORBI02725:0.11543585860026051026,SETIT15331:0.15169645446581081494):0.13454550939445297786,((ORYBR24386:0.10628364006661440710,((ORYSI29698:0.00000100000050002909,ORYGL22907:0.00000100000050002909):0.00000100000050002909,ORYSJ27622:0.00438633581703788689):0.08878200480216735802):0.08345810431159335352,(BRADI03434:0.13799244964271445424,(HORVD25504:0.02166620886455744924,((TRIUA06372:0.12959511089449690657,(WHEAT32698:0.03864763690807082597,TRIUA00769:0.00135317713596018983):0.00332330737539259652):0.00464075870143152661,(WHEAT28360:0.00922554755876476597,AEGTA22609:0.00000100000050002909):0.01862772431606431189):0.02827628220152079985):0.14784094324758120798):0.07657774840354276968):0.05040432524277733278):0.23807470404558811472,((((MUSAC22475:0.00000100000050002909,MUSAM05163:0.00000100000050002909):0.25879616543111028104,(MUSAC29462:0.00000100000050002909,MUSAM23604:0.00000100000050002909):0.08534457241850162967):0.08980587516420318606,(MUSAC23213:0.00000100000050002909,MUSAM05901:0.00000100000050002909):0.20220365953842298068):0.06421223425467911805,(((SOLLC23016:0.03638597281328402600,SOLTU33038:0.03710672999887828366):0.29159362129737559366,((((((((ARALY10000:0.01016220106392523755,ARATH03249:0.02976834372087038688):0.05490653820923878381,((ARALY10002:0.01549038619041884918,ARATH03248:0.03122391175138889211):0.01458789518267716509,((ARALY16713:0.17918780086834498744,ARALY19559:0.00438957615145475245):0.02873653665739813248,ARATH25850:0.00908135915132069274):0.03407168058096569224):0.02455523248667762851):0.11014162658842005516,(ARALY12955:0.02429673062665791208,ARATH18258:0.00967455909419093554):0.10410863334016712267):0.40633050951692445407,((ARALY10003:0.01890634137244458224,ARATH03247:0.01697584690425940276):0.23155955806054623336,((ARALY29288:0.00042458426852172735,ARATH19292:0.03247589055765442295):0.08250360960924246756,(ARATH02753:0.00865066469549579699,ARALY03291:0.01449081555443989568):0.16209839577201246019):0.15608768708840575767):0.04420186725022508950):0.08484641382635919882,(POPTR09167:0.28267859137257533853,(MANES21800:0.27864093159963454482,(ARATH19291:0.00000100000050002909,ARALY29287:0.02848852333773088663):0.43319629460236386276):0.03894089730857926146):0.00000100000050002909):0.03186457471675530062,VITVI24172:0.31426671234562669754):0.00905854647086176169,(SOLTU33039:0.05816087707296611897,SOLLC23017:0.02228257830393525277):0.46113355005377754114):0.03843900357137167156,(((((MANES16527:0.20707799493124401380,(SOLLC23268:0.38025304824661310121,(SOLTU28412:0.00535624135194013185,SOLLC22105:0.05613627561101311447):0.09524303674191680891):0.12887928131447612401):0.01260972240155851243,(MANES09941:0.15645263168174200485,POPTR34479:0.12389048001495335527):0.04342295486236855823):0.07276609054885742334,(((SOYBN42202:0.02118227836288713931,SOYBN21748:0.01644615953338779066):0.24692740479443978097,MEDTR15771:0.31577361363375822112):0.02131661459480957074,(MEDTR42390:0.18078632029169158790,(SOYBN07961:0.37594291031565674199,SOYBN12455:0.03193064477323372813):0.02501370661023886305):0.02702136410198599167):0.06155412104215795405):0.09626978611305717082,(((((((((ARATH01434:0.03326402804023043808,ARALY00064:0.02999459562184841194):0.09421924133575029781,(ARALY29644:0.00203379637304447252,ARATH11101:0.01593368143997206388):0.10660883901796770756):0.22164631262628492481,((SOLTU15123:0.02410755361753252543,SOLLC27615:0.01286137629737767185):0.18825616043936321820,(SOLTU41630:0.00000100000050002909,SOLLC30182:0.01473818587608549668):0.09500375584676275242):0.17962816527417160839):0.08482781103288279667,(MANES07144:0.16203913770382263881,((SOYBN11469:0.01589453517297529858,SOYBN24966:0.02339464808929192854):0.10356474599509736534,((MEDTR08954:0.05864939370753735615,(MEDTR34621:0.00829907080829405015,MEDTR34620:0.00499994643452340067):0.05668403220200715631):0.05273462105741605344,(SOYBN51684:0.17642901646205200183,SOYBN04901:0.04125914054456694680):0.02380766330124998303):0.03158760632170121152):0.03851851133473387090):0.02315930849886935899):0.02718091095752991210,(POPTR16993:0.04940577660331951781,POPTR30799:0.05457640310787268551):0.08863894760701460096):0.02762469745444158173,(VITVI24450:0.12181582135342103324,(VITVI24449:0.06220884938171312994,(VITVI24464:0.00000100000050002909,VITVI24468:0.00712346844720962869):0.03603185331464960756):0.03975815408878824453):0.04329459094678926590):0.09176438539436139463,(((POPTR29056:0.13077457669048556110,POPTR29057:0.05267175297008459822):0.03075236009326701853,(POPTR00348:0.01655953669099122921,(POPTR00349:0.02697645280289770117,(POPTR33189:0.00000100000050002909,POPTR00144:0.00000100000050002909):0.00000100000050002909):0.00832072236514292893):0.07838168083037699851):0.23788536085482214766,((MEDTR30438:0.42136317822004920597,((MEDTR34998:0.24452848238158930716,SOYBN52677:0.18766209293093907839):0.25855905575446785916,(SOYBN49014:0.05867839907026141388,SOYBN32844:0.03581342653317994701):0.21655431189076917997):0.08773815390042381812):0.58465212659114340621,(((MANES04116:0.19401691338063234427,POPTR20093:0.18508769771064598197):0.09736567009284757823,(SOYBN11603:0.03048877614613966849,SOYBN25107:0.04153919669446339002):0.38440991156696335818):0.05515883257564905412,(POPTR20092:0.39016581191482535562,(((SOLTU13165:0.04159132887095513820,SOLLC26035:0.01757476771752396541):0.00180276329067892709,(SOLTU35076:0.00000100000050002909,(SOLLC24749:0.03395202277028106647,SOLTU35031:0.01558226242757700629):0.00804631861762039081):0.04136147442165903632):0.21271461606494213026,((SOLTU12410:0.00000100000050002909,(SOLLC25814:0.13820828413746039098,SOLTU12411:0.01799620292402752050):0.00969324716455009783):0.07820328705153896387,(SOLLC24748:0.02869551553635420194,SOLTU35030:0.04501180869005286245):0.20948390734446886707):0.20270577077823093148):0.11657674465039977174):0.13317593844878172771):0.03831849101601358248):0.03027129903572875480):0.03922875979866165264):0.01684645710782435579,(VITVI05921:0.12563325049328344374,VITVI05917:0.12520596478204715218):0.09462124288777128134):0.12775367251944327873,((MUSAM14430:0.00000100000050002909,MUSAC13763:0.00000100000050002909):0.12771273976123795335,(((ORYBR24388:0.50337366142262240931,((((ORYSI29699:0.00000100000050002909,ORYSJ27625:0.00000100000050002909):0.00000100000050002909,ORYGL22909:0.00000100000050002909):0.05549083806812468017,(BRADI03435:0.04879077134835191343,(((TRIUA08215:0.00000100000050002909,TRIUA21996:0.26295948200265867323):0.00817389315608522439,(AEGTA13309:0.06562444529583479069,WHEAT45064:0.00774167688334377515):0.00000100000050002909):0.01380935257089896222,(((WHEAT35766:0.00000100000050002909,AEGTA04524:0.00000100000050002909):0.04170615254011814793,(AEGTA33213:0.49888754849868760521,((((WHEAT22160:0.00000100000050002909,AEGTA33214:0.00906687784214987337):0.03675660265279418609,((WHEAT12004:0.02468264540695007739,TRIUA20762:0.00000100000050002909):0.01414429238908978051,WHEAT32782:0.02388174542004466855):0.00435236434194583716):0.00442687273163500095,HORVD08982:0.01562263189613093996):0.00000100000050002909,(TRIUA20761:0.01797442353088164399,AEGTA13308:0.21717138522337739448):0.00000100000050002909):0.01682333246933797460):0.00000100000050002909):0.01065485246687873644,WHEAT85085:0.04145107218113282949):0.00620667325593616225):0.09132283132833111938):0.08791813509551500705):0.03195489850186534336,(SETIT15329:0.07047114177174997052,(SORBI35374:0.03755068835215968903,MAIZE72512:0.15141617114170607961):0.02064961395275088582):0.11605603169074922565):0.09827247229610616697):0.13439659878358387046,((ORYBR24384:0.03666623653652124198,(ORYSJ27620:0.00000100000050002909,ORYGL22905:0.00434516659941436463):0.03537232336334167337):0.02291511989991039736,((MAIZE64782:0.12255768679116242625,(SORBI02724:0.09075153353677181678,SETIT15333:0.07560264449419117072):0.02320087886123306173):0.06356620741069120284,(BRADI03432:0.06195219615737228291,(HORVD25508:0.01427375674581105383,((WHEAT60407:0.00000100000050002909,AEGTA11226:0.00000100000050002909):0.02692964354303263586,TRIUA05358:0.00719803332716940653):0.00000100000050002909):0.07319329388444215101):0.02694480428233698988):0.02241696300054943011):0.36519870575419122183):0.14644337324362149966,((((MUSAC12755:0.00000100000050002909,MUSAM19743:0.00000100000050002909):0.07371963208175744131,(MUSAM05165:0.00000100000050002909,MUSAC22477:0.00000100000050002909):0.16545618048524771138):0.02447116931618892322,(MUSAC09456:0.00000100000050002909,MUSAM25853:0.00000100000050002909):0.05457371980977839682):0.04635251160636844753,((MUSAM11486:0.00000100000050002909,MUSAC17417:0.00000100000050002909):0.08485970297192710343,((MUSAC17415:0.00000100000050002909,MUSAM11484:0.00000100000050002909):0.33334399991305391220,(MUSAM31803:0.00000100000050002909,MUSAC24665:0.00000100000050002909):0.07566046214822304272):0.04431691006149920259):0.05194682509849380542):0.03666911559745159033):0.01456961455004371006):0.14985506206622983827):0.03340758602615528233):0.01255933172298845032,(VITVI24175:0.26754754006319836357,(((MEDTR42526:0.16032652036014988228,(SOYBN12535:0.03027105407316259961,SOYBN08048:0.04459494280090759571):0.07879501743940507674):0.07505689396764725352,((((MANES17118:0.57346662585280039348,(MANES12544:0.19676794187305621242,(MEDTR42524:0.15007457841664581522,SOYBN08047:0.03605790941550521961):0.09402460020059832946):0.03140011839487689971):0.01962392224388840103,(((MEDTR42514:0.09247918994835495343,MEDTR22615:0.01366432305670875307):0.09928330387283584857,(SOYBN12532:0.01036494078386980197,SOYBN08046:0.02196716485467621605):0.08169955796560558758):0.07198943302804891586,((VITVI24171:0.08664819722726199713,(((POPTR35499:0.40525100571876260247,((ARATH02754:0.09320590455013072484,ARALY03289:0.06086088394003414531):0.07885615652586927538,(ARATH19290:0.02337986454851012641,(ARALY29286:0.04717209494117403229,ARATH19288:0.03814580558053030923):0.03846693729312187365):0.10192877215205804753):0.41417766472732803207):0.16073676182087695552,((SOLLC23015:0.02694372101697084868,SOLTU33037:0.02653802323606794730):0.62199957187418364324,((SOLTU20512:0.00972271123875176162,(SOLTU20511:0.01147018644784781119,(SOLTU20513:0.02643882042012478742,SOLTU20515:0.00847805955390828168):0.03193416255995014386):0.00393787153698065429):0.03967830724138914078,((((SOLTU20514:0.16945049892412741843,SOLLC18753:0.00537086722032452044):0.00000100000050002909,SOLLC18751:0.01120267337000929557):0.00828665510820371549,SOLLC18752:0.00716802422552568694):0.00971966198421999293,SOLLC18748:0.00418184823767660859):0.00822225218720306142):0.11665217368444748269):0.07816312271988211380):0.02148922590693498266,(VITVI24169:0.02546827158878254074,(VITVI24167:0.04990519451560231079,(VITVI24184:0.03312198278353388481,(VITVI24181:0.30224729240440550981,(VITVI24177:0.01929054557240287085,((VITVI24182:0.00000100000050002909,VITVI24179:0.02106867567382362735):0.03167180870398408898,(VITVI24176:0.01969267275057362890,VITVI24180:0.02633637180363321284):0.02597636696155432995):0.00000100000050002909):0.02677990712203075913):0.02558610491879504886):0.01286942444778651704):0.03459532071023858901):0.05761190653651706434):0.03828416322048041470):0.02247322089413233276,VITVI24170:0.37661850836053661906):0.02859208169062607205):0.01287130689201141688):0.05928063733794242118,(((POPTR09170:0.00928249566138726612,POPTR09171:0.01362830117483226737):0.11097795401069124321,(MANES11727:0.01231132068132651143,MANES11726:0.02535966891397891179):0.11754186504289823589):0.04771316751350534319,(POPTR12670:0.12474531585938525291,POPTR31146:0.25446595055379106487):0.01103215326216829342):0.03032714223225285721):0.01533143610219641836,(MANES23986:0.05998852601446329202,MANES23987:0.09367903400324815999):0.06602906363494510933):0.01836632947338360036):0.02448133477151803392,(MEDTR42525:0.13691511460265232136,(SOYBN08045:0.06479718425348945932,SOYBN12534:0.04696694479745631978):0.02945549968934863330):0.11225969672461046100):0.03403827949339053444):0.01233721383218942119):0.01532854881626578673):0.04320162729338317825):0.05558940326725511638,((MANES31736:0.09777810604085424018,POPTR09168:0.18283577282268856368):0.11236611418309042087,((ARALY11467:0.03888936752086643439,ARATH05433:0.02972788478467355833):0.41420996743610127844,((SOYBN08043:0.05247574434689786932,SOYBN12531:0.05270147179584935837):0.09631960271930162243,MEDTR42513:0.14993674747835861183):0.13917114534057511976):0.01712154485486190592):0.09614297396977788956):0.06092720203940441698):0.06456712224928252974):0.11705550806939674091):0.08311322551438103667,((((SETIT15332:0.10628368765867061974,SORBI07769:0.17746843073221649223):0.13238212253032827226,((BRADI03433:0.11328188015797371890,HORVD25505:0.10975535063066788055):0.16776288152872084747,(ORYBR24385:0.11210383409748714278,((ORYSI29697:0.00000100000050002909,ORYSJ27621:0.00000100000050002909):0.00000100000050002909,ORYGL22906:0.00863506858097733837):0.05243481921101125764):0.03958836043479305872):0.06380505947748491002):0.73392444568281156592,(((BRADI25911:0.22376624706888575966,((HORVD28420:0.04133972816789235893,(WHEAT70817:0.01108882466288622914,WHEAT69921:0.04801524586326613719):0.04057905017628739980):0.21283851374492795960,BRADI25910:0.18298421028386721576):0.09725606334819790477):0.28333157001538916697,((ORYBR18897:0.11449855306039051495,((ORYSJ08762:0.00000100000050002909,ORYSI23023:0.00000100000050002909):0.01068998266261429742,ORYGL17951:0.02629761802361783168):0.04752807889957954418):0.20366728263354880180,SETIT25618:0.15219643970655943876):0.08943886650101305624):0.18916259784654348985,(((SORBI34307:0.19854749956115821941,SETIT21651:0.15111504480999468636):0.15925433731526916770,(((AEGTA26651:0.02903255429824982276,WHEAT83808:0.00000100000050002909):0.17503197160876571292,((MAIZE96631:0.09611910691411411356,(SORBI22834:0.06072956019428756708,SETIT20833:0.09321874300456664542):0.03442156993612226906):0.01669260821340538478,((TRIUA13662:0.03946045674247487811,(WHEAT52330:0.05776660877334939548,(WHEAT86773:0.00532743048250389466,AEGTA07045:0.01706992676679780149):0.00000100000050002909):0.05607798516832061819):0.02665893917150888998,HORVD23663:0.05284167798097322288):0.10922772489145500530):0.04191254724687159400):0.16454957110542003940,((SORBI02257:0.06147049404514631776,(MAIZE96650:0.11638670537737398625,SETIT20829:0.09826335381078528386):0.03068151872990982493):0.08611535254662248950,(((SETIT20832:0.07938310066649272023,SETIT20831:0.08489703161439335344):0.11500264078366927156,(MAIZE96644:0.09403094034705827831,SORBI02258:0.08634180949574422892):0.02753513034845714302):0.04039718929754703564,((WHEAT25045:0.03964513054506172557,AEGTA29018:0.28747232515061138525):0.10074830354835012658,(((((WHEAT08852:0.00000100000050002909,AEGTA29019:0.00000100000050002909):0.03722325902676116433,AEGTA29020:0.01976556200521976253):0.00603347134718825503,((TRIUA15959:0.09466630863943445440,WHEAT20495:0.14768597603717259492):0.00467495466410714454,((WHEAT65446:0.02594364243649492988,WHEAT38110:0.02098146513182690825):0.00659101893750014059,(TRIUA01828:0.14559717274205583037,TRIUA15958:0.04075243626788545293):0.00599465909884547114):0.00559920822398990350):0.00517256328758699049):0.01262375076365237873,TRIUA01286:0.02408004711105568574):0.01395035019780327054,(HORVD20872:0.01098578451738006431,HORVD05302:0.02063874355727766952):0.01863102271750660330):0.06009445017908530279):0.07507266639965004540):0.09634548124187623797):0.18733450981839830374):0.12464078965327556048):0.17929409366442500273,(((ORYBR27565:0.04310309170319372163,(ORYSJ16804:0.00464142537892024785,(ORYSI33560:0.00000100000050002909,ORYGL25925:0.00000100000050002909):0.00000100000050002909):0.03961188448467305862):0.15656295455261637350,(((BRADI00988:0.00476391111437001521,BRADI00989:0.00000100000050002909):0.20467187354703644808,BRADI15630:0.07167181318010748536):0.07709451096557318195,(WHEAT57120:0.02880284780026281730,(AEGTA19608:0.00000100000050002909,(HORVD12912:0.03808128361930788325,TRIUA04806:0.00650706260684350089):0.01248932730957088774):0.00000100000050002909):0.11439129903184673542):0.04934059931720293640):0.03754646250901938487,(BRADI15631:0.13872232419541341564,(HORVD07278:0.07725049260346161795,(TRIUA09787:0.03715911881960721336,(AEGTA10083:0.32811103361633536801,WHEAT80354:0.00089786239555732748):0.00938949191268437407):0.01976863625399532740):0.19670631464817542322):0.29458213491685558694):0.10093247659056210630):0.54345118316186735719):0.18977601405509095245):0.05157025295330795039,(((SETIT25616:0.07852315106039221837,(MAIZE06173:0.06733444043491103315,(SORBI18564:0.06516675669532950854,MAIZE66584:0.09815205600982566947):0.01488314414710101632):0.06917477120401739621):0.06047679945543893432,((ORYBR18895:0.09356013673021203181,(ORYSI23019:0.01995226433074431122,(ORYSJ08756:0.00000100000050002909,ORYGL17947:0.00000100000050002909):0.00000100000050002909):0.03687445132702502765):0.11333698691822792493,(BRADI25914:0.24966037553655898162,(WHEAT65410:0.01346895926767484493,((TRIUA05751:0.00958342138837884987,WHEAT70813:0.00000100000050002909):0.03311185057557836792,AEGTA16932:0.00967767982351243686):0.01558616683975027999):0.21100450855734623201):0.16071927687677828311):0.05689779434687595311):0.26359514352027774153,((((((ORYBR27580:0.05145045231195581603,(ORYSI33573:0.00872787187461502960,(ORYSJ16829:0.00290821604630775313,ORYGL25941:0.00289957823451919994):0.00000100000050002909):0.04185497770274457935):0.08669634333957521033,(SETIT20817:0.09654332316673008840,(SORBI10904:0.07537288338661414511,MAIZE96657:0.10383560034707478570):0.07765613274820971912):0.14373989258596550633):0.04331225638908815789,(AEGTA14407:0.21396357640882618378,(WHEAT49075:0.03742635225901538853,TRIUA17073:0.22481355191992527520):0.00000100000050002909):0.21191601840842899662):0.17902285996310970950,((ORYBR27579:0.06945899715509075423,((ORYGL25940:0.00000100000050002909,ORYSJ16828:0.00000100000050002909):0.00000100000050002909,ORYSI33572:0.00000100000050002909):0.04585702763633902473):0.13572794106610852616,((BRADI15643:0.11353281774113219149,(HORVD25688:0.09536913642604670505,((WHEAT71963:0.00000100000050002909,AEGTA06757:0.00898509776603926072):0.00442891723575507702,(WHEAT55769:0.00000100000050002909,TRIUA30371:0.01424187857255200876):0.02808541866378306065):0.08820649727989528233):0.25080997272986199631):0.10015461496007804776,((MAIZE68589:0.06784969608152634224,SORBI23124:0.06689421831480514558):0.06072688689452997168,SETIT20818:0.08250223655998115135):0.28081662195421031036):0.03415190331329334694):0.18099515830813858730):0.23828339406633486375,(((((TRIUA28261:0.00000100000050002909,WHEAT77614:0.00522012460352415733):0.01052026755137579032,WHEAT14212:0.01900931337671126625):0.00537892467272544673,WHEAT53726:0.03427952163898331794):0.01082305341106296580,(AEGTA15427:0.04656158751954651148,HORVD28399:0.05149089461177087240):0.00569082262386825383):0.16990790881276357505,((SETIT25615:0.12311182883990935688,(SORBI29267:0.02895599022920697027,MAIZE06178:0.06139925813407767080):0.08104739507434938206):0.18396741248761069865,((ORYSJ08754:0.00537134026524889712,(ORYSI23018:0.00000100000050002909,ORYGL17946:0.00000100000050002909):0.00406329179906062595):0.05999854286502422085,ORYBR18893:0.06397293409596348235):0.10346668422380561614):0.03797983181460620750):0.24990133958587135155):0.23925253305203117438,((((SORBI29268:0.05227356919765768078,(MAIZE66585:0.07675489623044472187,MAIZE06172:0.04528658852080717778):0.04941640495042282782):0.12382799873015735981,SETIT25617:0.14818171317810244214):0.27929943165305376462,((ORYBR18896:0.07419590753389222748,(ORYSI23022:0.00379711849766854910,(ORYSJ08761:0.10978693143125221876,ORYGL17950:0.01344563814004453781):0.00597586960473746407):0.07325585159068384589):0.19276665548532748162,(((HORVD28419:0.04596984122855517219,((AEGTA22182:0.00000100000050002909,WHEAT70818:0.02185908074112965019):0.02081808898138607158,(WHEAT69922:0.00000100000050002909,TRIUA14442:0.00913756995703720459):0.03482865824733673982):0.02434412174635048817):0.06443026333473295120,(HORVD28384:0.05759773530055015828,(AEGTA13517:0.00803920841303648777,(TRIUA05752:0.00000100000050002909,WHEAT39273:0.00521712108856406138):0.02662966533034783270):0.03119273092612735027):0.06885337214824652219):0.21194169365585280307,BRADI25913:0.19919830833343557530):0.10088797326520221320):0.04768688711835541300):0.22477349059093132411,((BRADI15632:0.22523659181088406811,(HORVD14906:0.05450683071876778057,(AEGTA12904:0.00000100000050002909,WHEAT14274:0.00000100000050002909):0.03721889908342769504):0.14284606075147304738):0.18649531433975805039,((((MAIZE96629:0.12229417865612347838,SORBI07264:0.06804146904928368156):0.15660089871520962990,SETIT20845:0.20059836865508490211):0.20541359029522737734,(SETIT20843:0.27853855718646863826,(SETIT20846:0.19630229880655805652,SORBI29609:0.14153813858141500726):0.14100051772267477301):0.10308325201364867962):0.09889564227595368240,(ORYBR27566:0.14928134818711108478,(ORYGL25930:0.00000100000050002909,(ORYSJ16810:0.00000100000050002909,(ORYSI33563:0.00000100000050002909,ORYSI33564:0.00000100000050002909):0.00836936205081428679):0.00829818569265527821):0.09616705606222861191):0.10112884277092673568):0.08676621583995366982):0.28813117070194893543):0.27210265692022123085):0.19598207908246487174):0.31295195999555491806):0.06897982798816415517):0.18705402992952535612,((((MANES04285:0.12809102396342048058,(POPTR35398:0.06397137367521385509,POPTR09053:0.09971463383116427326):0.06707996716399333703):0.06835412311457757240,(((ARALY24866:0.07611219986911359203,ARALY15026:0.02951860233566997935):0.02063033503687307021,ARATH03093:0.08666218447788577584):0.63638075247570258242,((MEDTR09013:0.18352185936553044865,(SOYBN12169:0.06494325341357314041,SOYBN24259:0.02854138856056501888):0.09714032590245939847):0.07812792911076180125,(MEDTR04903:0.11409216700434123004,(SOYBN22997:0.01478501927712241523,SOYBN50659:0.01775462673194045868):0.07115741312144341357):0.07794777989400249185):0.11908487576965891275):0.04740388078412241524):0.09194528558281013508,(SOLLC25539:0.24250141908759470510,(SOLLC25538:0.04050633972016133566,SOLLC25537:0.09295939090930299686):0.34009277540434990073):0.12937517660271360964):0.16950878800358334941,(((((((HORVD25108:0.00652390781678803631,(WHEAT76911:0.00000100000050002909,AEGTA04386:0.00000100000050002909):0.10477360487069939388):0.25393731138557690263,BRADI16645:0.17915000039128264886):0.06859033134266104281,(((ORYSJ06431:0.01388706125222685314,ORYSI28312:0.00977859196568739084):0.08335865941777977073,ORYBR23218:0.09547226708483877444):0.11486798143665095939,(SETIT14402:0.06305449355691006286,(MAIZE36432:0.07234254082785142315,SORBI11618:0.06568491744010958311):0.06013131251270829869):0.12189287365735004820):0.02240333271100423962):0.19929879531099886636,((((ORYGL09971:0.00438988821365675092,(ORYSI12988:0.00431545886734002217,ORYSJ30798:0.00432538371525326062):0.01311685936201942120):0.07922776893689105482,ORYBR10598:0.09040656229199227345):0.17168839822092302194,((SETIT01298:0.08266867070424761821,(MAIZE102130:0.08227597029840134912,SORBI13361:0.04506175022050269013):0.08586011082166068731):0.13460033789939085391,((ORYBR10597:0.07760596236226748046,((ORYSJ30796:0.00436490517936372925,ORYSI12987:0.00476068264444901110):0.01185171851093684905,ORYGL09970:0.00577594490990200344):0.08205012303557990272):0.17608303601621336232,(BRADI14833:0.11270235572949421909,(AEGTA10569:0.04789626742153037936,((TRIUA24825:0.00487943287423979032,WHEAT51707:0.00000100000050002909):0.05749501657107006919,(HORVD26507:0.06549282606881859370,WHEAT57481:0.01525853310575596249):0.02151149485069921499):0.01015745618935793605):0.13886462886579525877):0.07200691689499534587):0.05700688907148198509):0.20893791248844395536):0.04062771579734936883,((BRADI14835:0.44955348766375019531,(((AEGTA29856:0.00469479107038425682,WHEAT79399:0.03830812668319911324):0.01765932240119157809,TRIUA22875:0.01373661399126350872):0.07619097858445392224,(AEGTA19497:0.01701177093089568590,(WHEAT78466:0.01269519732717229281,(TRIUA22876:0.00448992266538095468,WHEAT43851:0.00000100000050002909):0.01022824027457463168):0.00805587906133016854):0.01751328239966683242):0.25361120816617449547):0.20112712000601240536,(SETIT01299:0.08374250964003029929,(MAIZE57163:0.05579303092246609003,SORBI00293:0.06982219139494250104):0.12294729382070185286):0.14774140597567320121):0.05550965349764053203):0.16501391345501570385):0.59156027821168211123,(MUSAM25306:0.00000100000050002909,MUSAC08909:0.00000100000050002909):0.56425331043823023780):0.06935179398753481272,(MUSAC17235:0.00000100000050002909,MUSAM11304:0.00000100000050002909):0.33074656626257226133):0.04113446107292954845,(MUSAC32048:0.00000100000050002909,MUSAM28945:0.00000100000050002909):0.40395029835227724835):0.11116519932884783017):0.36383795737023516548):0.15513855160898498697,(((SELML04036:0.00000100000050002909,SELML30593:0.02253800581798172387):0.73343806290509760970,((SELML32009:0.01185944579387473129,SELML25830:0.01564284217923260847):0.62496234353243873549,(((MUSAM00846:0.00000100000050002909,MUSAC05840:0.00000100000050002909):0.27767379729728347559,((((MANES31537:0.10373728244440343083,(POPTR26312:0.04902524609267987221,(POPTR17073:0.02424460350045745324,POPTR19841:0.03067210702970476002):0.05725919276272732616):0.05217826816232578463):0.01773646899821938738,((SOYBN45709:0.01976467850871522700,SOYBN20068:0.00931593700793753761):0.08882356558152308679,((SOLTU19135:0.02308697979826383404,SOLLC17663:0.01527362106607774161):0.07746500380067365688,(SOLLC14588:0.10705113654201102447,(SOLLC05546:0.02544882799719032015,SOLTU17369:0.01633887941936840171):0.35601242514875991452):0.02408651051819441294):0.19862420489319848604):0.05000377207553802911):0.01929113506021261706,VITVI05611:0.13589966418294793793):0.04057999491301594874,(ARATH21508:0.01314216671002194949,ARALY07020:0.01471697015965536294):0.24430137817921074306):0.17530343814579910089):0.12758705747720480717,((SETIT07458:0.08223267413614934740,SORBI05578:0.04285640908248434383):0.09886489818727521584,((BRADI02621:0.04319706558677083308,(HORVD26946:0.03123079674234424327,(WHEAT30637:0.00000100000050002909,AEGTA27617:0.02543652954470833685):0.03906645080991166807):0.03767712306148063989):0.07591027655908981486,(ORYBR25880:0.35980546318773182213,(ORYGL31036:0.38561322162703270955,(ORYSJ17704:0.00000100000050002909,ORYSI31590:0.00000100000050002909):0.04221454678817607165):0.03733326424170398811):0.04923224252110530025):0.04482387213923874625):0.30330798639493300461):0.42391238293699867734):0.12900733688252491449):0.25672951179217162743,(((ARATH12088:0.04345612947334916848,ARALY15180:0.01278238004773055332):0.28225191641228014605,(((SOLLC08866:0.03116105286661456295,SOLTU11652:0.03595173601233894733):0.27779696276678966793,(((MANES08542:0.06187204056805281627,MANES04002:0.06468024974113477377):0.02999104263142534851,POPTR02330:0.15197978163985234601):0.05110266224294635756,(VITVI10320:0.21088861138339548562,(((SOYBN04100:0.01701653951175300522,SOYBN05818:0.02033318006357448526):0.09272937116350643549,(SOYBN15520:0.04250480034728820744,SOYBN06739:0.02912054771531125130):0.13799826100591089384):0.05268169938475606578,MEDTR17803:0.22034338595431993135):0.10199510913397043244):0.04902372571343893010):0.06609838470913978470):0.04655835393607146017,((((((MUSAM15403:0.00000100000050002909,MUSAC14736:0.00000100000050002909):0.20600028692733854396,(MUSAM32781:0.00000100000050002909,MUSAC25643:0.00000100000050002909):0.14115274237014310832):0.08651793145117307737,((MUSAM00673:0.00000100000050002909,MUSAC05667:0.00000100000050002909):0.11158952141205510933,(MUSAC25329:0.00000100000050002909,MUSAM32467:0.00000100000050002909):0.09387903218927463878):0.10995434277929043432):0.06052700194057819560,(((MUSAM00310:0.00000100000050002909,MUSAC05304:0.00000100000050002909):0.13617504367452637482,(((MUSAC16058:0.00000100000050002909,MUSAM16725:0.00000100000050002909):0.10486022114717413745,(MUSAC34135:0.00000100000050002909,MUSAM34135:0.00000100000050002909):0.16409156328852872453):0.03858655198261457669,(MUSAC25174:0.00000100000050002909,MUSAM32312:0.00000100000050002909):0.10788142495815214450):0.00752993573947097292):0.01084418378141180188,(((((BRADI07661:0.26881884453128335188,(WHEAT50034:0.03271148716698367431,(AEGTA06624:0.24424696696338152324,HORVD17390:0.02177411956805997209):0.03785406196553546543):0.18638030109999692563):0.10981446169140147984,(((ORYSI15840:0.00000100000050002909,ORYGL12258:0.00000100000050002909):0.00000100000050002909,ORYSJ36105:0.00000100000050002909):0.27537284175231424577,((MAIZE09078:0.05434356009372160595,SORBI15382:0.10237753003433391896):0.08944045921903263918,SETIT35250:0.12215170581009912598):0.11826045417292589679):0.06548353249881462557):0.08146513048135459178,((ORYBR05841:0.10404597279528658704,(ORYSI07141:0.00410773159144801024,(ORYSJ35711:0.00000100000050002909,ORYGL05048:0.00000100000050002909):0.00000100000050002909):0.04551987923090337895):0.10576161218838060762,(SETIT32776:0.03943648086112061524,(SORBI31574:0.04111134894492661507,MAIZE23151:0.03520893854577578780):0.09070106443727682377):0.16283646104099522289):0.07836123413467779852):0.17511975411130692448,((ORYBR25645:0.04931355332983965167,(ORYSI31315:0.00835369478738797432,ORYSJ41794:0.00397326718722296364):0.04418686662609763033):0.08009020363744218107,((BRADI02810:0.05979159213351873531,(TRIUA27388:0.13259298260816299031,(HORVD25257:0.01307217327549589983,AEGTA11651:0.05044489330556417572):0.01995233262441147709):0.03516129744274204549):0.05459216916254347463,(SETIT07215:0.04708381360637253765,SORBI16057:0.03780571253328020992):0.09250629558585042600):0.04857731608863719713):0.18601242575533336043):0.13081987323926835831,((MUSAM28387:0.00000100000050002909,MUSAC31490:0.00000100000050002909):0.13809275391935840749,(MUSAM06163:0.00000100000050002909,MUSAC02514:0.00000100000050002909):0.13443733978458655143):0.11240886943371462825):0.05296458176641562210):0.11191148042352855319):0.07792882604348769227,(MAIZE50869:0.20161901399966816739,(ORYSJ13792:0.00344556629476266627,ORYGL12141:0.00000100000050002909):0.40526528156755575738):0.34137254689259671769):0.06006403217219220131,((((POPTR35027:0.05393182831209996503,POPTR04952:0.05521659134831382459):0.02201585503116876286,(MANES19609:0.02596841235999546374,MANES10538:0.09181495744289040750):0.04296697850138769814):0.02764613685628336884,((MEDTR23007:0.14861117512699956178,(SOYBN29338:0.02458418719769522864,((SOYBN13736:0.01509013228527967231,SOYBN43775:0.02145355348494341549):0.16640095219656991787,SOYBN36549:0.01028863285353836740):0.01839206753814766684):0.01622596695858928920):0.03660556882643294790,((SOLTU39089:0.00117096551526091417,SOLLC28021:0.01187029290712567423):0.22287372997554585896,(ARATH07366:0.00875683690028302222,ARALY00833:0.00000100000050002909):0.16827048768696287184):0.07244843191799404947):0.03534464371453985287):0.02000463252403119480,VITVI17808:0.08998241193148946715):0.10986619059172396395):0.13405078768268269274):0.12311481700378895665):0.98882183914734911312,(((((((WHEAT60967:0.00000100000050002909,AEGTA03722:0.03332352249727857374):0.08507743088329765280,(AEGTA03721:0.03120567159614403077,(WHEAT14055:0.00632227175877901008,TRIUA29195:0.00000100000050002909):0.04673495602798510146):0.16329576388942035337):0.15531729757554188498,(BRADI07070:0.37026291951256035118,((HORVD20994:0.12811193893398598043,(WHEAT12350:0.01969559231421251846,(WHEAT77085:0.01470223385584298013,AEGTA19716:0.06316851070386607370):0.00968132322715203539):0.05119939814746100881):0.04084095514757011408,(WHEAT24898:0.05016574049112149103,AEGTA12347:0.01995581980971198113):0.02081975473411607977):0.16869837479957952575):0.05619664667980716483):0.24831642305719148212,((SETIT14425:0.47764687327215699097,((MAIZE18162:0.09553598393514040055,SORBI25193:0.11352614105783159770):0.21191848898802437273,((SORBI35181:0.05292730142081283201,MAIZE18161:0.17432028069242672119):0.06032098126313615444,SETIT13838:0.11164201632808351539):0.11456166237898118831):0.07622478167291260598):0.14940224679826055731,((BRADI04294:0.32595916819305448264,((AEGTA18745:0.10634535983946430404,(AEGTA31075:0.04459594651531112453,(WHEAT11096:0.00000100000050002909,(WHEAT08529:0.00635692172798464974,AEGTA31072:0.04144121980447820069):0.04159188193122757837):0.04412101762037935054):0.02698704179012119744):0.16284134573657008116,(AEGTA18744:0.01195316090528342548,(TRIUA11031:0.00925297322801557805,WHEAT15146:0.01060034719047915977):0.01727983893001515739):0.13273228717604926286):0.12103778798370855296):0.09464116324714079431,(ORYBR22877:0.13523352767443408418,(ORYGL21734:0.00000100000050002909,ORYSJ43339:0.01255436389797181564):0.13884677756965096984):0.29626227185512138407):0.06436276448759868651):0.02413499568510924648):0.60968947337191503610,(((ARALY23414:0.02066749278201470558,ARATH11243:0.01399957689288938364):0.09425546221828634552,ARALY00651:0.10735033664226613370):0.40388505237973570949,((ARALY03956:0.24012169013550627161,ARALY21124:0.19633072357738970415):0.06427522303025316741,((ARATH01314:0.06647529874620333734,(ARALY03958:0.06595260696372405584,ARALY03957:0.00000100000050002909):0.06649198091038591163):0.21274165779273099264,(ARATH01313:0.06513841882889097323,ARALY03960:0.05578436753233904921):0.22023463130689255318):0.03504678664890692463):0.17391961257736873736):0.24505110983118211232):0.09555851836326578752,((MANES21561:0.67512690969040023425,((POPTR30883:0.26030484457406699583,MANES22834:0.29598774812820566327):0.07412064484319866309,(SOYBN27365:0.48410414600105500238,(VITVI08941:0.26078928529473799358,(SOLTU29411:0.51721146347862034798,SOLLC22543:0.68707100045555735690):0.06957081549371632589):0.03225955561093173107):0.07734559707383820149):0.05534749079235385533):0.08271228282775787422,(SOYBN53276:0.69961742713612240507,((MEDTR16163:0.30630307718879640211,MEDTR16156:0.31924879265458311339):0.66390538027899415052,(VITVI18229:0.54639937413730021998,SOLLC07830:0.94719796632216579635):0.16723691155378409001):0.10848114991407539764):0.14393105388568841474):0.08673670159109429789):0.18155032659242803517,(SOLTU32649:0.24228719342220669808,SOLLC03543:0.12833616651811430298):0.93228257253300017560):0.24359505812097589916):0.12373506733650779799):0.11058357764889827080):0.07068998206559712338,(PHYPA30212:0.81857794292793251145,PHYPA09708:0.39080088203220170184):0.52297803939947840046):0.03632494674845065247):0.09068896307712170923):0.07263521594265974490,(SELML17821:0.01973385479375744031,SELML01125:0.00874005985571055244):0.53914442669752848936):0.08591529231707925596):0.41641658843242934651,((MUSAM19491:0.00000100000050002909,MUSAC12503:0.00000100000050002909):0.32605151158697270874,(VITVI01671:0.23325592850007700885,(SOLLC19172:0.03908680398679684892,SOLTU20866:0.02667117357700208441):0.50668488201429251472):0.10899142519943895435):0.33614237059822776876):0.17589028901001635408,(((MUSAM33416:0.00000100000050002909,MUSAC26277:0.00000100000050002909):0.05308649677679021933,(MUSAM22433:0.00000100000050002909,MUSAC28290:0.00000100000050002909):0.10865916116839537120):0.11562652940171699867,(((ORYSI23756:0.01256242933992473415,ORYSI23267:0.00560850022995434787):0.07517652287960574498,(BRADI26138:0.18376865474644263343,((TRIUA31870:0.12653508889230044576,WHEAT63736:0.00000100000050002909):0.00345742178483259173,((HORVD28654:0.05426658531501288296,(WHEAT11407:0.00000100000050002909,AEGTA04531:0.05734732027821431988):0.00000100000050002909):0.01474230293715694806,WHEAT86670:0.01156767049293624082):0.00343543531358274801):0.02583949515618799361):0.04852184646475490165):0.03136079249069338715,(SETIT25858:0.07987162960856626637,(MAIZE47396:0.28369596669371405229,(SORBI01504:0.00000100000050002909,SORBI01242:0.00000100000050002909):0.05827541633595767490):0.02898787783404207022):0.08067073843757789631):0.36136655251411919920):0.23107011329715593240):0.19459168503719689869):0.04647901588325549505):0.33295044965727599307,ARALY22584:0.01839604238464330119,ARATH00549:0.01550155215353314284):0.0;\",\n \"stack\" : {\"children\": [{\"children\": [{\"children\": [{\"children\": [{\"id\": \"HALHT\", \"last_updated\": \"Aug 20, 2012\", \"name\": \"Haloarcula hispanica (strain ATCC 33960 / DSM 4426 / JCM 8911 / NBRC 102182 / NCIMB 2187 / VKM B-1755)\", \"nr_proteins\": 3855, \"release\": \"18-OCT-2011 (Rel. 110, Last updated, Version 2)\", \"source\": \"EBI\", \"taxid\": 634497}, {\"id\": \"HALMA\", \"last_updated\": \"Mar 25, 2014\", \"name\": \"Haloarcula marismortui (strain ATCC 43049 / DSM 3752 / JCM 8966 / VKM B-1809)\", \"nr_proteins\": 4231, \"release\": \"02-FEB-2014 (Rel. 119, Last updated, Version 9)\", \"source\": \"EBI\", \"taxid\": 272569}], \"name\": \"Haloarcula\", \"taxid\": 2237, \"nr_hogs\": 4107, \"evolutionaryEvents\": {\"gained\": 178, \"retained\": 3532, \"duplicated\": 397, \"lost\": 1508, \"duplications\": 166}}, {\"id\": \"HALMD\", \"last_updated\": \"Nov 23, 2009\", \"name\": \"Halomicrobium mukohataei (strain ATCC 700874 / DSM 12286 / JCM 9738 / NCIMB 13541)\", \"nr_proteins\": 3168, \"release\": \"03-NOV-2009 (Rel. 113, Last updated, Version 1)\", \"source\": \"Genome Reviews\", \"taxid\": 485914}, {\"id\": \"HALUD\", \"last_updated\": \"Nov 23, 2009\", \"name\": \"Halorhabdus utahensis (strain DSM 12940 / JCM 11049 / AX-2)\", \"nr_proteins\": 2998, \"release\": \"03-NOV-2009 (Rel. 113, Last updated, Version 1)\", \"source\": \"Genome Reviews\", \"taxid\": 519442}, {\"children\": [{\"id\": \"NATM8\", \"last_updated\": \"Oct 27, 2014\", \"name\": \"Natronomonas moolapensis (strain DSM 18674 / JCM 14361 / 8.8.11)\", \"nr_proteins\": 2852, \"release\": \"27-FEB-2014 (Rel. 119, Last updated, Version 4)\", \"source\": \"EBI\", \"taxid\": 268739}, {\"id\": \"NATPD\", \"last_updated\": \"Mar 25, 2014\", \"name\": \"Natronomonas pharaonis (strain ATCC 35678 / DSM 2160 / CIP 103997 / NBRC 14720 / NCIMB 2260 / Gabara)\", \"nr_proteins\": 2824, \"release\": \"07-MAR-2014 (Rel. 120, Last updated, Version 14)\", \"source\": \"EBI\", \"taxid\": 348780}], \"name\": \"Natronomonas\", \"taxid\": 63743, \"nr_hogs\": 3156, \"evolutionaryEvents\": {\"gained\": 93, \"lost\": 2294, \"duplicated\": 254, \"retained\": 2809, \"duplications\": 103}}], \"name\": \"Haloarculaceae\", \"taxid\": 1963268, \"nr_hogs\": 5206, \"evolutionaryEvents\": {\"gained\": 273, \"retained\": 4584, \"duplicated\": 349, \"lost\": 1040, \"duplications\": 163}}, {\"children\": [{\"id\": \"HALJB\", \"last_updated\": \"Dec 23, 2010\", \"name\": \"Halalkalicoccus jeotgali (strain DSM 18796 / CECT 7217 / JCM 14584 / KCTC 4019 / B3)\", \"nr_proteins\": 3779, \"release\": \"30-NOV-2010 (Rel. 127, Last updated, Version 2)\", \"source\": \"Genome Reviews\", \"taxid\": 795797}, {\"children\": [{\"id\": \"HALS3\", \"last_updated\": \"May 8, 2008\", \"name\": \"Halobacterium salinarum (strain ATCC 29341 / DSM 671 / R1)\", \"nr_proteins\": 2742, \"release\": \"29-APR-2008 (Rel. 90, Last updated, Version 1)\", \"source\": \"Genome Reviews\", \"taxid\": 478009}, {\"id\": \"HALSA\", \"last_updated\": \"Mar 25, 2014\", \"name\": \"Halobacterium salinarum (strain ATCC 700922 / JCM 11081 / NRC-1)\", \"nr_proteins\": 2418, \"release\": \"03-FEB-2014 (Rel. 119, Last updated, Version 7)\", \"source\": \"EBI\", \"taxid\": 64091}], \"name\": \"Halobacterium salinarum\", \"taxid\": 2242, \"nr_hogs\": 2540, \"evolutionaryEvents\": {\"gained\": 201, \"retained\": 2202, \"duplicated\": 137, \"lost\": 1437, \"duplications\": 62}}], \"name\": \"Halobacteriaceae\", \"taxid\": 2236, \"nr_hogs\": 3701, \"evolutionaryEvents\": {\"gained\": 13, \"retained\": 3605, \"duplicated\": 83, \"lost\": 2142, \"duplications\": 40}}], \"name\": \"Halobacteriales\", \"taxid\": 2235, \"nr_hogs\": 5787, \"evolutionaryEvents\": {\"gained\": 118, \"retained\": 5120, \"lost\": 1677, \"duplicated\": 549, \"duplications\": 228}}, {\"children\": [{\"children\": [{\"children\": [{\"id\": \"HALMT\", \"last_updated\": \"Nov 30, 2012\", \"name\": \"Haloferax mediterranei (strain ATCC 33500 / DSM 1411 / JCM 8866 / NBRC 14739 / NCIMB 2177 / R-4)\", \"nr_proteins\": 3861, \"release\": \"02-AUG-2012 (Rel. 113, Last updated, Version 3)\", \"source\": \"EBI\", \"taxid\": 523841}, {\"id\": \"HALVD\", \"last_updated\": \"Jul 20, 2010\", \"name\": \"Haloferax volcanii (strain ATCC 29605 / DSM 3757 / JCM 8879 / NBRC 14742 / NCIMB 2012 / VKM B-1768 / DS2)\", \"nr_proteins\": 3986, \"release\": \"13-JUL-2010 (Rel. 123, Last updated, Version 2)\", \"source\": \"Genome Reviews\", \"taxid\": 309800}], \"name\": \"Haloferax\", \"taxid\": 2251, \"nr_hogs\": 4166, \"evolutionaryEvents\": {\"gained\": 107, \"retained\": 3786, \"lost\": 1192, \"duplicated\": 273, \"duplications\": 108}}, {\"id\": \"HALBP\", \"last_updated\": \"Aug 20, 2012\", \"name\": \"Halogeometricum borinquense (strain ATCC 700274 / DSM 11551 / JCM 10706 / PR3)\", \"nr_proteins\": 3894, \"release\": \"24-NOV-2010 (Rel. 106, Last updated, Version 1)\", \"source\": \"EBI\", \"taxid\": 469382}, {\"children\": [{\"id\": \"HALWD\", \"last_updated\": \"Sep 26, 2006\", \"name\": \"Haloquadratum walsbyi (strain DSM 16790 / HBSQ001)\", \"nr_proteins\": 2819, \"release\": \"24-JUL-2006 (Rel. 88, Last updated, Version 2)\", \"source\": \"EBI\", \"taxid\": 362976}, {\"id\": \"HALWC\", \"last_updated\": \"Apr 2, 2012\", \"name\": \"Haloquadratum walsbyi (strain DSM 16854 / JCM 12705 / C23)\", \"nr_proteins\": 2974, \"release\": \"15-MAR-2012 (Rel. 112, Last updated, Version 4)\", \"source\": \"EBI\", \"taxid\": 768065}], \"name\": \"Haloquadratum walsbyi\", \"taxid\": 293091, \"nr_hogs\": 2819, \"evolutionaryEvents\": {\"gained\": 209, \"retained\": 2443, \"lost\": 2564, \"duplicated\": 167, \"duplications\": 79}}], \"name\": \"Haloferacaceae\", \"taxid\": 1644056, \"nr_hogs\": 5086, \"evolutionaryEvents\": {\"gained\": 222, \"duplicated\": 385, \"retained\": 4479, \"lost\": 571, \"duplications\": 174}}, {\"id\": \"HALLT\", \"last_updated\": \"Jun 22, 2009\", \"name\": \"Halorubrum lacusprofundi (strain ATCC 49239 / DSM 5036 / JCM 8891 / ACAM 34)\", \"nr_proteins\": 3493, \"release\": \"16-JUN-2009 (Rel. 107, Last updated, Version 3)\", \"source\": \"Genome Reviews\", \"taxid\": 416348}], \"name\": \"Haloferacales\", \"taxid\": 1644055, \"nr_hogs\": 5224, \"evolutionaryEvents\": {\"gained\": 94, \"retained\": 4671, \"lost\": 2155, \"duplicated\": 459, \"duplications\": 199}}, {\"children\": [{\"id\": \"HALXS\", \"last_updated\": \"Aug 20, 2012\", \"name\": \"Halopiger xanaduensis (strain DSM 18323 / JCM 14033 / SH-6)\", \"nr_proteins\": 4221, \"release\": \"23-NOV-2011 (Rel. 110, Last updated, Version 2)\", \"source\": \"EBI\", \"taxid\": 797210}, {\"id\": \"HALTV\", \"last_updated\": \"Jun 11, 2010\", \"name\": \"Haloterrigena turkmenica (strain ATCC 51198 / DSM 5511 / NCIMB 13204 / VKM B-1734)\", \"nr_proteins\": 3739, \"release\": \"25-MAY-2010 (Rel. 121, Last updated, Version 2)\", \"source\": \"Genome Reviews\", \"taxid\": 543526}, {\"id\": \"HALRX\", \"last_updated\": \"Dec 18, 2013\", \"name\": \"Halovivax ruber (strain DSM 18193 / JCM 13892 / XH-70)\", \"nr_proteins\": 3099, \"release\": \"18-JUL-2013 (Rel. 117, Last updated, Version 2)\", \"source\": \"EBI\", \"taxid\": 797302}, {\"children\": [{\"id\": \"NATA1\", \"last_updated\": \"Aug 10, 2017\", \"name\": \"Natrialba asiatica (strain ATCC 700177 / DSM 12278 / JCM 9576 / FERM P-10747 / NBRC 102637 / 172P1)\", \"nr_proteins\": 4176, \"release\": \"Ensembl Bacteria 36; ASM33755v1\", \"source\": \"EnsemblGenomes\", \"taxid\": 29540}, {\"id\": \"NATMM\", \"last_updated\": \"Jul 20, 2010\", \"name\": \"Natrialba magadii (strain ATCC 43099 / DSM 3394 / CIP 104546 / JCM 8861/ NBRC 102185 / NCIMB 2190 / MS3)\", \"nr_proteins\": 3558, \"release\": \"13-JUL-2010 (Rel. 123, Last updated, Version 2)\", \"source\": \"Genome Reviews\", \"taxid\": 547559}], \"name\": \"Natrialba\", \"taxid\": 63742, \"nr_hogs\": 4283, \"evolutionaryEvents\": {\"gained\": 51, \"lost\": 2216, \"retained\": 3820, \"duplicated\": 412, \"duplications\": 148}}, {\"children\": [{\"id\": \"NATP1\", \"last_updated\": \"Oct 27, 2014\", \"name\": \"Natrinema pellirubrum (strain DSM 15624 / CIP 106293 / JCM 10476 / NCIMB 786 / 157)\", \"nr_proteins\": 4138, \"release\": \"23-JUL-2013 (Rel. 117, Last updated, Version 2)\", \"source\": \"EBI\", \"taxid\": 797303}, {\"id\": \"NATSJ\", \"last_updated\": \"Oct 27, 2014\", \"name\": \"Natrinema sp. (strain J7-2)\", \"nr_proteins\": 4296, \"release\": \"15-MAY-2014 (Rel. 120, Last updated, Version 6)\", \"source\": \"EBI\", \"taxid\": 406552}], \"name\": \"Natrinema\", \"taxid\": 88723, \"nr_hogs\": 4304, \"evolutionaryEvents\": {\"gained\": 52, \"retained\": 3748, \"lost\": 2241, \"duplicated\": 504, \"duplications\": 195}}, {\"id\": \"NATGS\", \"last_updated\": \"Oct 27, 2014\", \"name\": \"Natronobacterium gregoryi (strain ATCC 43098 / DSM 3393 / CCM 3738 / CIP 104747 / JCM 8860 / NBRC 102187 / NCIMB 2189 / SP2)\", \"nr_proteins\": 3624, \"release\": \"18-JUL-2013 (Rel. 117, Last updated, Version 2)\", \"source\": \"EBI\", \"taxid\": 797304}], \"name\": \"Natrialbaceae\", \"taxid\": 1644061, \"nr_hogs\": 6184, \"evolutionaryEvents\": {\"gained\": 842, \"duplicated\": 729, \"retained\": 4613, \"lost\": 2106, \"duplications\": 306}}], \"name\": \"Halobacteria\", \"taxid\": 183963, \"nr_hogs\": 7025, \"evolutionaryEvents\": {\"gained\": 2357, \"lost\": 6118, \"retained\": 2767, \"duplicated\": 1901, \"duplications\": 605}},\n \"unrooted1\" : \"(((ERPZAN_R00185:0.0,VIRALT_R07861:0.0):0.001945655,(CALWIL_R07193:0.004232679,(((ORISOL_R03544:0.009877258,(((GRAPIC_R12577:0.014982099,(CHAFRE_R02806:0.015160571,PICGYM_R06166:0.005771333)0.924:0.008896484)0.000:0.000000005,((((((PRUFUL_R09054:0.003886375,PRUHIM_R10842:0.001948296)0.982:0.011827022,(((((ERIRUB_R02188:0.007802411,(OENOEN_R08976:0.001941816,(FICALB_R00799:0.001939725,SAXMAU_R01795:0.001939665)0.000:0.000000005)0.892:0.003892813)0.777:0.001950911,CATFUS_R11593:0.009811424)0.763:0.001934869,((LEUROT_R14346:0.004408857,STUVUL_R07134:0.001971242)0.939:0.005906419,(RHAINO_R11059:0.005887267,CINMEX_R12987:0.003886547)0.000:0.000000006)0.865:0.001937309)0.000:0.000000005,CERCOR_R06284:0.001940730)0.000:0.000000005,(COPSEC_R04846:0.004218174,TOXRED_R00790:0.009898142)0.774:0.001943683)0.940:0.003904001)0.756:0.000000005,((LEPASP_R01517:0.003890030,((CHLCYA_R06957:0.001955392,CHLHAR_R11249:0.001953557)0.964:0.008708646,(ELAFOR_R06222:0.067874933,PROCAF_R03956:0.003610596)0.257:0.005031912)0.660:0.001127634)0.767:0.001921350,(BOMGAR_R08262:0.013821927,DICEXI_R09180:0.005866937)0.780:0.001969198)0.201:0.001945712)0.870:0.003873477,((VIDCHA_R00557:0.000000005,VIDMAC_R01666:0.000000005)0.964:0.005889060,(REGSAT_R03545:0.013716864,((CERBRA_R02815:0.001950138,CERFAM_R07219:0.000000005)0.961:0.007862625,(POLCAE_R08689:0.009809226,THRLUD_R00775:0.005859079)0.869:0.003942256)0.709:0.001931719)0.227:0.000000005)0.800:0.001950173)0.000:0.000000005,((UROPYL_R08260:0.001947195,((LONSTR_R08944:0.001958986,TAEGUT_R17040:0.001942470)0.950:0.005924130,(PEUTAE_R12381:0.005854865,(GEOFOR_R09593:0.000000005,SPOHYP_R10874:0.009809954)0.908:0.003914454)0.000:0.000000005)0.000:0.000000005)0.000:0.000000005,(PASAMO_R03813:0.005069014,((((HYPCIN_R05861:0.003896135,(CARCAR_R07597:0.003905784,RHOROS_R03907:0.001943968)0.000:0.000000005)0.842:0.001943562,(AGEPHO_R12112:0.0,QUIMEX_R06835:0.0):0.000000005)0.000:0.000000005,(EMBFUC_R07456:0.001943300,(PASDOM_R01841:0.001943080,((SERCAN_R05569:0.001945109,((LOXCUR_R01247:0.0,LOXLEU_R10869:0.0):0.000000005,(CHLVIR_R02303:0.000000005,HEMWIL_R12881:0.010111980)0.886:0.003957626)0.000:0.000000005)0.970:0.005863006,((MOTALB_R00263:0.000000005,(JUNHYE_R02029:0.000000006,((SPIPAS_R02115:0.006527089,ZONALB_R11673:0.079247082)0.760:0.003205270,MELMEL_R06212:0.001942881)0.000:0.000000005)0.955:0.003895192)0.844:0.001945482,MOLATE_R04767:0.001955739)0.000:0.000000005)0.000:0.000000005)0.000:0.000000005)0.000:0.000000005)0.000:0.000000005,(NESACU_R06611:0.009881748,(SETCOR_R10331:0.003907723,SETKIR_R09068:0.000000005)0.775:0.001967787)0.793:0.001932107)0.018:0.001945014)0.000:0.000000012)0.867:0.001947156)0.759:0.001960110,(((((SYLVIR_R10709:0.008511537,(RHASIB_R03403:0.004219395,(DONATR_R04824:0.002110299,(((SITEUR_R04209:0.002153741,TICMUR_R00244:0.014627474)0.873:0.016577296,(IRECYA_R12278:0.008443130,((CALORN_R07598:0.004102220,PHEMEL_R04365:0.018435972)0.761:0.006405228,PLONIG_R01869:0.002094273)0.769:0.006391425)0.756:0.005458630)0.912:0.044065580,(ACRARU_R14141:0.007219493,HIPICT_R09009:0.006178173)0.856:0.005126254)0.781:0.015838771)0.000:0.000000005)0.000:0.000000005)0.000:0.000000005,PHYTRO_R13017:0.002104908)1.000:0.000000005,(HYLPRA_R13303:0.015927337,NICCHL_R07497:0.003891376)0.000:0.000000005)0.858:0.001940187,((((((AEGCAU_R08906:0.011140782,CETCET_R02558:0.005903608)0.255:0.003415620,HORVUL_R04273:0.009812994)0.626:0.001680505,(ERYMCC_R11442:0.006810883,HIRRUS_R01812:0.006327241)0.735:0.000000006)0.782:0.002116626,(((BRAATR_R01259:0.004742602,PYCJOC_R06715:0.013167726)0.743:0.005550059,((CISJUN_R13494:0.013681315,(STEDEN_R06180:0.002112541,(ZOSHYP_R01814:0.0,ZOSLAT_R06289:0.0):0.004203446)0.754:0.002500532)0.817:0.005615809,((SINWEB_R08836:0.007864975,(SYLATR_R08297:0.006024005,SYLBOR_R04162:0.002682030)0.773:0.001875775)0.978:0.009763809,(PORRUF_R06759:0.006334252,(ILLCLE_R09312:0.004213600,LEILUT_R01534:0.004230040)0.759:0.002109725)0.000:0.000000005)0.274:0.000000005)0.930:0.003882969)0.731:0.000000005,(ANTMIN_R08656:0.005878668,(POEATR_R08762:0.001953933,(PARMAJ_R09814:0.001941467,PSEHUM_R01296:0.000000005)0.779:0.001939953)0.867:0.003890279)0.896:0.003954024)0.802:0.001957509)0.816:0.001941483,PANBIA_R07107:0.011763068)0.000:0.000000005,LOCOCH_R10739:0.009831663)0.749:0.000000005)0.628:0.001953038,((DRYBRU_R10064:0.013876059,MELVER_R13861:0.011929907)0.872:0.005849014,PHANIT_R00172:0.015775111)0.227:0.000000005)0.774:0.001939535)0.886:0.003912118)0.780:0.001969310,((DASBRO_R00594:0.009842139,MALELE_R03053:0.032191473)0.771:0.002069583,ORTSPA_R03385:0.010726540)0.759:0.001967749)0.112:0.001928318)0.754:0.000000005,POSRUF_R10160:0.007851715)0.000:0.000000005,PARPUN_R00466:0.006342347)0.845:0.001945681)0.000:0.000000005)0.473:0.000000005,EDOCOE_R05131:0.020325025,((((((CLIRUF_R03306:0.017236321,PTIVIO_R06384:0.010849082)0.898:0.006313265,(PACPHI_R05793:0.006582303,MYIHEB_R12764:0.015075462)0.736:0.002109579)0.767:0.002175077,((CORCOR_R12340:0.002107315,(APHCOE_R06763:0.001942404,(CORBRA_R01172:0.002099890,CORMON_R14880:0.002098940)0.000:0.000000005)0.771:0.000000006)0.851:0.005928796,(LANLUD_R02205:0.001941207,(STRCIN_R09449:0.004211299,(DICMEG_R07997:0.001948897,((IFRKOW_R03971:0.002424186,PARRAG_R04945:0.010638734)0.841:0.004001123,(CHAPAP_R05228:0.004221857,RHIDAH_R10872:0.001941595)0.770:0.001956199)0.794:0.001941109)0.796:0.001945185)0.000:0.000000005)0.784:0.001886571)0.889:0.003979150)0.841:0.000000005,((ORIORI_R12278:0.000000005,((ALERUF_R04641:0.001959638,OREARF_R11822:0.010656383)0.537:0.003915942,EULNIG_R10110:0.004227146)0.710:0.000000005)0.000:0.000000005,(((((DRYGAM_R05465:0.006536314,MACNIG_R10946:0.006033528)0.776:0.001812789,(GYMTIB_R11425:0.001942894,RHALEU_R08508:0.002105459)0.805:0.001951199)0.000:0.000000005,(PTEMEL_R10767:0.003961168,(FALFRO_R00442:0.004146048,PTILEU_R13363:0.012542161)0.454:0.001966717)0.770:0.002187623)0.000:0.000000005,DYACAS_R00451:0.007833519)0.837:0.001946443,(DAPCHR_R12269:0.011788821,MOHOCH_R00568:0.001957007)0.780:0.001937836)0.000:0.000000005)0.000:0.000000005)0.827:0.001948719,(((ACACHL_R00917:0.024705597,(((((((((BUCCAP_R06050:0.048099589,GALDEA_R14061:0.014658768)0.895:0.009268322,(MERNUB_R06122:0.024383502,((BRALEP_R03310:0.020666256,EURGUL_R08859:0.016515355)0.917:0.008025992,((CHLAEN_R07872:0.016712438,HALSEN_R12568:0.011577606)0.945:0.014651346,(BARMAR_R14004:0.018586348,TODMEX_R01766:0.025072377)0.765:0.003889539)0.764:0.003196345)0.750:0.000000005)0.925:0.006241677)0.887:0.006003563,(((GEOCAL_R04871:0.018333028,((CUCCAN_R12383:0.013003554,(CEUAER_R09623:0.009913529,PIACAY_R02410:0.008057454)0.748:0.001921432)0.961:0.010114104,(CROSUL_R03384:0.015898083,(CENBEN_R01764:0.001965814,CENUNI_R02025:0.000000005)0.996:0.020375886)0.453:0.003834681)0.703:0.000000005)0.981:0.013725180,(APAVIT_R10929:0.017953672,TROMEL_R09632:0.004188259)0.993:0.020110137)0.721:0.002294055,((BUCABY_R08200:0.012691621,BUCRHI_R04945:0.030420444)0.988:0.021974003,(CARCRI_R07732:0.004874465,CHUBUR_R13999:0.005407103)0.991:0.018131937)0.721:0.001947862)0.615:0.001944197)0.856:0.000000005,((MESCAY_R12170:0.014036275,NIPNIP_R07891:0.015312379)0.955:0.009992164,(COCCOC_R01070:0.005985097,EGRGAR_R10096:0.005917623)0.937:0.007802641)0.759:0.002069067)0.000:0.000000005,((((AEGBEN_R04767:0.053844522,(CHAPEL_R10771:0.013274451,HEMCOM_R11712:0.011705892)0.879:0.006682306)0.775:0.003228346,(CALANN_R09088:0.029203089,OREMEL_R09863:0.000000006)1.000:0.046019319)0.946:0.010225750,(NYCBRA_R03609:0.004303275,NYCGRA_R12802:0.015926537)0.994:0.025477451)0.691:0.007556244,(PSOCRE_R10483:0.011830117,(((BURBIS_R07694:0.011963395,((EURHEL_R12117:0.011866340,RHYJUB_R07657:0.011384429)0.790:0.005874564,((OPIHOA_R12042:0.021660699,(ARDKOR_R02007:0.004225482,(CHLMAC_R04828:0.018974440,LOPRUF_R03273:0.002069621)0.691:0.001573230)0.999:0.024492715)0.444:0.002710802,(STECAR_R00653:0.017457247,((EOLROS_R10991:0.007902317,PROATE_R04835:0.000000005)0.772:0.001976536,(AMAGUI_R07007:0.005964334,(AGAROS_R11305:0.008010840,MELUND_R04324:0.003969349)0.749:0.001941969)0.871:0.003980104)0.963:0.010985595)0.670:0.003301845)0.731:0.003470499)0.864:0.005602554)0.838:0.000000005,((PHALEP_R05929:0.023449902,PODSTR_R09766:0.005920522)0.260:0.003886799,(((((((PELURI_R10536:0.007631088,((ATLROG_R04223:0.003629742,ZAPATR_R12447:0.002802803)0.965:0.014223436,HELFUL_R14151:0.014160130)0.733:0.006781844)0.850:0.005259254,(APTFOR_R01110:0.000000005,PYGADE_R06057:0.004255750)0.904:0.004263949)0.773:0.002111086,(HYDTET_R14741:0.005465479,THACHL_R09870:0.006403968)0.848:0.000000005)0.000:0.000000005,((FREGRA_R07112:0.000000006,OCEOCE_R06906:0.001962902)0.964:0.005894749,(((AQUCHR_R00774:0.000000005,SPITYR_R00670:0.008031596)0.855:0.001959914,(CIRPEC_R00403:0.007871094,(HALALB_R01072:0.000000005,HALLEU_R12216:0.000000006)0.845:0.001961457)0.233:0.000000005)0.550:0.005926234,TYTALB_R00623:0.023928630)0.585:0.001945996)0.718:0.000000005)0.000:0.000000005,(((ARAGUA_R06621:0.007873242,(BALREG_R06527:0.008586065,GRUAME_R00169:0.003924619)0.000:0.000000005)0.920:0.003922030,(GAVSTE_R07443:0.006460401,(NESNOT_R10361:0.074557540,PHORUB_R01005:0.012321917)0.734:0.009685667)1.000:0.000000005)0.744:0.000000005,(FULGLA_R09869:0.006405020,CALBOR_R06055:0.003957979)0.850:0.005924294)0.848:0.001955162)0.845:0.001959458,(SCOUMB_R02017:0.018128567,(BALREX_R01585:0.004883042,PELCRI_R05111:0.021816487)0.900:0.007031742)0.853:0.003884320)0.000:0.000000005,(((PANHAL_R04800:0.000000005,(PODCRI_R09770:0.006947596,PODPOD_R03183:0.000000005)1.000:0.018064125)0.844:0.001956037,((CICMAG_R07326:0.003942241,FREMAG_R08115:0.011945731)0.788:0.001955833,SAGSER_R01396:0.008656616)0.770:0.001963524)0.000:0.000000005,(CICNIG_R12996:0.000000005,STROCC_R10326:0.001959681)0.995:0.011888892)0.000:0.000000005)0.830:0.001954508)0.741:0.000000005)0.817:0.001955203,GLABRA_R03687:0.012276589)0.000:0.000000005)0.745:0.000000005)0.831:0.001955222)0.749:0.000000005,(((FALCHE_R13279:0.0,FALPER_R09370:0.0):0.002096194,HERCAC_R07796:0.005940659)0.949:0.007945272,(SULDAC_R00447:0.011544381,((ANHANH_R06269:0.001916157,ANHRUF_R08963:0.002004182)0.949:0.007658136,(NANHAR_R02940:0.001951914,((NANAUR_R02327:0.0,NANBRA_R14303:0.0):0.000000005,(PHACAR_R05990:0.000000005,URIPEL_R08866:0.007345051)0.854:0.002442185)0.000:0.000000005)0.759:0.002238547)0.726:0.001981811)0.948:0.008239236)0.822:0.003895612)0.778:0.001988515,(((CHIMIN_R06220:0.0,PLUSOC_R06636:0.0):0.007867234,((TRILEU_R05014:0.006030801,(PSIHAE_R07704:0.003965813,(EUBBOU_R01201:0.009963312,(RAMSUL_R04838:0.003868894,SEMFRA_R03551:0.007881824)0.760:0.002206950)0.753:0.001983388)0.872:0.003997224)0.848:0.004606937,(INDMAC_R09403:0.034442035,PICPUB_R10180:0.026879379)0.851:0.005751906)0.994:0.024089597)0.834:0.003928465,((CHOACU_R04768:0.010195714,(ANTCAR_R10245:0.003964997,NYCLEU_R08557:0.006396158)0.636:0.000000005)0.978:0.013889478,(((STRCAM_R07813:0.030444894,((RHEAME_R12943:0.001761700,RHEPEN_R09156:0.002282360)0.999:0.031968904,((APTOWE_R09711:0.000000006,((APTAUS_R03341:0.000000005,APTROW_R05016:0.000000005)0.933:0.001954241,APTHAA_R06347:0.000000005)0.736:0.000000005)0.989:0.016047071,((((CRYSOU_R04748:0.004401730,(CRYCIN_R13049:0.002022351,CRYUND_R08482:0.005484799)0.735:0.002009287)0.854:0.006076835,((NOTPEN_R05090:0.000000005,(NOTPER_R02537:0.002017739,NOTORN_R05324:0.005888150)0.000:0.000000005)0.928:0.003958971,EUDELE_R07691:0.004037097)0.128:0.000000006)0.494:0.003918691,((NOTJUL_R01007:0.002185606,NOTNIG_R10629:0.006090779)0.942:0.008150790,TINGUT_R08793:0.006839816)0.670:0.000000006)0.976:0.012653578,(CASCAS_R05625:0.000000005,DRONOV_R04869:0.002271456)0.986:0.016619223)0.658:0.001466720)0.083:0.002536488)0.549:0.009503195)0.991:0.022252835,((CHATOR_R12931:0.012396042,(ANSSEM_R13713:0.012152924,(ANSCYG_R03736:0.006645406,(CAIMOS_R02508:0.000000005,((ANAPLA_R12734:0.0,ANAZON_R00560:0.0):0.001978503,ASASCU_R06730:0.006684948)0.901:0.006641172)0.523:0.000000005)0.948:0.013249707)0.745:0.001969604)0.854:0.003872952,((PENPIL_R11901:0.026110330,((NUMMEL_R03848:0.007820320,(ODOGUJ_R00268:0.000000005,(CALSQU_R12923:0.000000005,COLVIR_R01565:0.002268638)0.948:0.005865147)0.947:0.005870785)0.000:0.000000005,((PHACOL_R03848:0.003920796,(GALGAL_R00386:0.010015603,COTJAP_R09409:0.010011329)0.858:0.003728241)0.768:0.001943935,(MELGAL_R09321:0.001946936,TYMCUP_R02157:0.001949386)0.000:0.000000006)0.988:0.012004391)0.794:0.003175156)0.464:0.002865671,ALELAT_R04518:0.038131137)0.981:0.019648935)0.990:0.016480666)0.958:0.012288887,((PTEGUT_R01267:0.003917595,(PTEBUR_R05087:0.009879723,SYRPAR_R07515:0.007890174)0.770:0.001941318)0.991:0.016988764,(CALNIC_R10107:0.001865900,(ALOBEC_R10806:0.003950232,(COLPIC_R09688:0.005243482,(COLLIV_R04419:0.003499375,PATFAS_R09846:0.004688564)0.901:0.006017680)0.770:0.002666556)0.864:0.004130847)0.999:0.027294977)0.621:0.003661900)0.571:0.003802857)0.732:0.002497778)0.870:0.004231189)0.708:0.001379640,((CHAVOC_R09490:0.004077765,(CHAALE_R15308:0.003984947,(HIMHIM_R01743:0.003951351,IBISTR_R00388:0.001973630)0.776:0.001979280)0.761:0.001856136)0.908:0.005892061,((MESUNI_R06242:0.043175173,TURVEL_R11671:0.048577704)0.468:0.009194422,(((COLSTR_R09987:0.007308627,UROIND_R00112:0.006610823)0.987:0.019623031,(RHICYA_R12088:0.024449587,UPUEPO_R00447:0.018552135)0.940:0.011777256)0.426:0.007108634,((((STEPAR_R11882:0.006115305,(((PHASIM_R07643:0.003954558,(CEPGRY_R10420:0.002586226,(URILOM_R14851:0.001961500,(ALCTOR_R10164:0.000000005,URIAAL_R08244:0.001961208)0.000:0.000000005)0.898:0.005548302)0.849:0.003776601)0.000:0.000000005,(DROARD_R08901:0.005950928,RYNNIG_R04742:0.000000005)0.868:0.001972845)0.000:0.000000005,(CHRMAC_R10297:0.0,LARSMI_R11231:0.0,RISTRI_R04124:0.0):0.000000005)0.853:0.001974154)0.000:0.000000005,GLAPRA_R12578:0.001972885)0.000:0.000000005,RHIAFR_R07918:0.008040462)0.752:0.001899378,((CALPUG_R06327:0.007935790,(AREINT_R13368:0.000000005,LIMLAP_R00949:0.009207055)0.599:0.003914632)0.425:0.001980414,((NYCSEM_R11750:0.001960099,ROSBEN_R13055:0.001968434)0.799:0.001971966,((JACJAC_R12789:0.012072996,THIORB_R09193:0.008787430)0.843:0.003969872,PEDTOR_R12920:0.020301545)0.736:0.001911235)0.705:0.000000005)0.957:0.008005745)0.827:0.004655826)0.680:0.004981755)0.750:0.002524222)0.875:0.004642928)0.897:0.006129668,(CORCON_R08294:0.001880202,CORCRI_R03236:0.004068816)0.987:0.014120918)0.931:0.008750347)0.528:0.006874785,((((((FURFIG_R09482:0.003828829,(CAMPRO_R05359:0.001939106,XIPELE_R10971:0.000000005)0.359:0.003964155)0.874:0.004513791,(SCLMEX_R07822:0.010257712,SCYSUP_R14066:0.007781474)0.534:0.001995529)0.850:0.004792819,((RHEHOF_R06366:0.118165052,SAKLUC_R12331:0.002081497)0.980:0.019415983,GRAVAR_R13536:0.024204750)0.436:0.005015047)0.754:0.002759788,FORRUF_R01984:0.026154635)0.918:0.007587786,(SERLUN_R12374:0.027448888,(SAPAEN_R02087:0.012718993,(PITSOR_R11386:0.028595603,(CALVIR_R12747:0.020072875,SMICAP_R09407:0.018337687)0.857:0.006941496)0.711:0.007413604)0.818:0.004915663)0.926:0.009990057)0.747:0.002743401,((((PIPCHL_R11517:0.003916661,ONYCOR_R09931:0.003918692)0.000:0.000000005,(((TYRSAV_R09019:0.009776634,(NEOCIN_R07762:0.003938880,TACRUB_R02253:0.005842381)0.085:0.003898776)0.863:0.000000005,OXYCRI_R10812:0.000000005)0.000:0.000000006,MIOMAC_R00790:0.001943956)0.845:0.001945435)0.000:0.000000005,(CEPORN_R11899:0.013862951,(LEPCOR_R01168:0.003905301,MANMAN_R08983:0.000000005)0.938:0.005956526)0.778:0.001895519)0.868:0.003824710,PACMIN_R00396:0.005973298)0.903:0.005876812)0.833:0.004438967)0.936:0.011448284,(ATRCLA_R14560:0.007865376,MENNOV_R03873:0.008356460)0.742:0.000000005)0.977:0.009800426)0.000:0.000000005,(NOTCIN_R13885:0.009899398,CNELOR_R10105:0.010186239)0.851:0.003840248)0.856:0.001943330);\",\n \"unrooted2\" : \"((NOTCIN_R13885:0.010187673,CNELOR_R10105:0.010490935)0.825:0.003829957,CALWIL_R07193:0.002172772,(((EDOCOE_R05131:0.018437345,((((((CORCOR_R12340:0.002150513,(CORBRA_R01172:0.002142783,(APHCOE_R06763:0.001980384,CORMON_R14880:0.002141795)0.000:0.000000006)0.736:0.000000006)0.860:0.006046678,(STRCIN_R09449:0.004297327,(LANLUD_R02205:0.001977304,(DICMEG_R07997:0.001987067,((IFRKOW_R03971:0.002479151,PARRAG_R04945:0.010864683)0.844:0.004077025,(CHAPAP_R05228:0.004308558,RHIDAH_R10872:0.001979553)0.762:0.001995638)0.798:0.001980090)0.813:0.001981422)0.000:0.000000006)0.785:0.001922298)0.880:0.004058818,(EULNIG_R10110:0.004314037,(DAPCHR_R12269:0.012017900,MOHOCH_R00568:0.001995882)0.756:0.001975945)0.000:0.000000005)0.000:0.000000005,(ORIORI_R12278:0.000000005,((((DRYGAM_R05465:0.006674807,MACNIG_R10946:0.006155945)0.781:0.001845299,(GYMTIB_R11425:0.001980892,RHALEU_R08508:0.002148580)0.792:0.001989465)0.000:0.000000005,(PTEMEL_R10767:0.004041880,(FALFRO_R00442:0.004227186,PTILEU_R13363:0.012803009)0.400:0.002006650)0.804:0.002231187)0.000:0.000000005,DYACAS_R00451:0.007987995)0.857:0.001982674)0.000:0.000000005)0.728:0.000000005,(ALERUF_R04641:0.001998311,OREARF_R11822:0.010875693)0.755:0.003993123)0.810:0.001979779,((CLIRUF_R03306:0.017616054,PTIVIO_R06384:0.011246237)0.933:0.008375629,(PACPHI_R05793:0.006503186,MYIHEB_R12764:0.015317352)0.000:0.000000005)0.465:0.002157742)0.218:0.000000005)0.830:0.001988561,((((ACACHL_R00917:0.018509584,((((((GLABRA_R03687:0.012519950,(((CICNIG_R12996:0.000000005,STROCC_R10326:0.001996098)0.989:0.010083714,(BALREX_R01585:0.005672171,PELCRI_R05111:0.022062410)0.720:0.008623043)0.244:0.000000005,(((SAGSER_R01396:0.008837603,(CICMAG_R07326:0.004023260,FREMAG_R08115:0.012178796)0.754:0.001989459)0.786:0.002000857,((BURBIS_R07694:0.014250162,(PODSTR_R09766:0.008065108,PHALEP_R05929:0.021501114)0.558:0.003953535)0.804:0.000000005,(((HYDTET_R14741:0.005575582,THACHL_R09870:0.006536105)0.847:0.000000005,(((ATLROG_R04223:0.003503349,ZAPATR_R12447:0.003057157)0.975:0.015667941,HELFUL_R14151:0.015080635)0.929:0.009834040,(PELURI_R10536:0.008719870,(FULGLA_R09869:0.004331155,CALBOR_R06055:0.006012185)0.000:0.000000005)0.205:0.004165973)0.759:0.001842505)0.000:0.000000005,(((FREGRA_R07112:0.000000006,OCEOCE_R06906:0.001999525)0.958:0.006010759,(((NESNOT_R10361:0.075911808,PHORUB_R01005:0.010218983)0.727:0.010242915,GAVSTE_R07443:0.006578816)1.000:0.000000005,(BALREG_R06527:0.008765765,(ARAGUA_R06621:0.008026114,GRUAME_R00169:0.004002936)0.000:0.000000005)0.917:0.003999257)0.832:0.001993320)0.000:0.000000005,(((((TYTALB_R00623:0.026525852,SPITYR_R00670:0.008181286)0.000:0.000000005,AQUCHR_R00774:0.000000005)0.837:0.001996277,(HALALB_R01072:0.000000005,HALLEU_R12216:0.000000005)0.853:0.001996825)0.000:0.000000005,CIRPEC_R00403:0.008020981)0.946:0.006007983,(APTFOR_R01110:0.000000005,PYGADE_R06057:0.004343010)0.969:0.006531397)0.000:0.000000005)0.000:0.000000005)0.915:0.001995948)0.000:0.000000005)0.000:0.000000005,(SCOUMB_R02017:0.020416135,(PANHAL_R04800:0.000000005,(PODCRI_R09770:0.007082498,PODPOD_R03183:0.000000005)1.000:0.018424766)0.725:0.001994383)0.000:0.000000005)0.860:0.001992666)0.470:0.001993944)0.000:0.000000005,((CORCON_R08294:0.001989344,CORCRI_R03236:0.004081501)0.999:0.020881179,PSOCRE_R10483:0.012054824)0.000:0.000000005)0.799:0.000000006,(((AEGBEN_R04767:0.055082077,(CHAPEL_R10771:0.013564311,HEMCOM_R11712:0.011927148)0.871:0.006807602)0.770:0.003280282,(CALANN_R09088:0.029810330,OREMEL_R09863:0.000000005)1.000:0.046990361)0.950:0.010447336,(NYCBRA_R03609:0.004388146,NYCGRA_R12802:0.016244544)0.993:0.025996556)0.531:0.007693278)0.863:0.001993288,(((MESCAY_R12170:0.014767618,NIPNIP_R07891:0.015137138)0.912:0.010217801,(((CHIMIN_R06220:0.0,PLUSOC_R06636:0.0):0.006249464,((TRILEU_R05014:0.006135551,(PSIHAE_R07704:0.004038457,(EUBBOU_R01201:0.010124118,(RAMSUL_R04838:0.004034133,SEMFRA_R03551:0.008129589)0.469:0.000000005)0.778:0.002014038)0.859:0.004063584)0.800:0.004624184,(INDMAC_R09403:0.034956280,PICPUB_R10180:0.027440373)0.862:0.005866117)0.998:0.026347104)0.880:0.004061762,(((PTEGUT_R01267:0.003984815,(PTEBUR_R05087:0.010060270,SYRPAR_R07515:0.008034909)0.738:0.001982083)0.980:0.014864155,(CALNIC_R10107:0.001894525,(ALOBEC_R10806:0.004030050,(COLPIC_R09688:0.005328073,(COLLIV_R04419:0.003568250,PATFAS_R09846:0.004776462)0.822:0.004072246)0.773:0.002730534)0.874:0.004212020)0.998:0.027973676)0.810:0.003897629,(((STRCAM_R07813:0.028627763,((RHEAME_R12943:0.001791362,RHEPEN_R09156:0.002334167)1.000:0.032618768,((APTOWE_R09711:0.000000005,((APTAUS_R03341:0.000000005,APTROW_R05016:0.000000005)0.929:0.001992214,APTHAA_R06347:0.000000005)0.736:0.000000005)0.990:0.016367341,((((CRYSOU_R04748:0.004494095,(CRYCIN_R13049:0.002062606,CRYUND_R08482:0.005595680)0.763:0.002049044)0.873:0.006198459,((NOTPEN_R05090:0.000000005,(NOTPER_R02537:0.002056939,NOTORN_R05324:0.005998319)0.000:0.000000005)0.913:0.004022594,EUDELE_R07691:0.004116187)0.027:0.000000005)0.452:0.003995982,((NOTJUL_R01007:0.002232984,NOTNIG_R10629:0.006216927)0.931:0.008317664,TINGUT_R08793:0.006970222)0.667:0.000000006)0.978:0.012903360,(CASCAS_R05625:0.000000005,DRONOV_R04869:0.002313538)0.988:0.016958367)0.661:0.001476726)0.115:0.002592135)0.550:0.009669946)0.984:0.023238540,((CHATOR_R12931:0.012638931,(ANSSEM_R13713:0.012397313,(ANSCYG_R03736:0.006788341,(CAIMOS_R02508:0.000000005,((ANAPLA_R12734:0.0,ANAZON_R00560:0.0):0.002017872,ASASCU_R06730:0.006821680)0.890:0.006776359)0.498:0.000000005)0.942:0.013525336)0.742:0.002005872)0.857:0.003984425,((PENPIL_R11901:0.026649361,((NUMMEL_R03848:0.007964661,(ODOGUJ_R00268:0.000000005,(CALSQU_R12923:0.000000005,COLVIR_R01565:0.002308952)0.949:0.005979371)0.938:0.005979241)0.000:0.000000005,((PHACOL_R03848:0.003996085,(GALGAL_R00386:0.010209551,COTJAP_R09409:0.010205596)0.875:0.003802413)0.765:0.001980667,(MELGAL_R09321:0.001983344,TYMCUP_R02157:0.001986828)0.000:0.000000006)0.981:0.012228095)0.806:0.003239266)0.705:0.003247262,ALELAT_R04518:0.036290846)0.973:0.017559713)0.979:0.015098668)0.910:0.012360446,(ANTCAR_R10245:0.004047569,(CHOACU_R04768:0.010408223,NYCLEU_R08557:0.006528471)0.000:0.000000005)0.988:0.014522857)0.063:0.001616571)0.876:0.004257166)0.858:0.005510095)0.761:0.002478764,((((FALCHE_R13279:0.0,FALPER_R09370:0.0):0.002137856,HERCAC_R07796:0.006046748)0.950:0.008107933,(SULDAC_R00447:0.011772915,((ANHANH_R06269:0.001952961,ANHRUF_R08963:0.002044577)0.956:0.007810712,(NANHAR_R02940:0.001992131,((NANAUR_R02327:0.0,NANBRA_R14303:0.0):0.000000005,(PHACAR_R05990:0.000000005,URIPEL_R08866:0.007488905)0.853:0.002490073)0.000:0.000000005)0.771:0.002282420)0.737:0.002021252)0.946:0.008398780)0.853:0.003969226,(((APAVIT_R10929:0.018347506,TROMEL_R09632:0.004265692)0.986:0.020695177,(GEOCAL_R04871:0.018687816,((CUCCAN_R12383:0.013236146,(CEUAER_R09623:0.010077489,PIACAY_R02410:0.008187158)0.755:0.001987447)0.975:0.010284164,(CROSUL_R03384:0.016195343,(CENBEN_R01764:0.002002379,CENUNI_R02025:0.000000005)0.998:0.020778908)0.441:0.003903803)0.706:0.000000005)0.972:0.013914251)0.803:0.004473595,((((EURHEL_R12117:0.011827952,RHYJUB_R07657:0.011919472)0.753:0.005876051,((OPIHOA_R12042:0.022126506,(ARDKOR_R02007:0.004249532,(CHLMAC_R04828:0.019344883,LOPRUF_R03273:0.002112717)0.702:0.001660465)0.998:0.024878327)0.510:0.002667056,(STECAR_R00653:0.017697265,((EOLROS_R10991:0.008058735,PROATE_R04835:0.000000006)0.770:0.002015823,(AMAGUI_R07007:0.006092944,(AGAROS_R11305:0.008188291,MELUND_R04324:0.004063995)0.754:0.001955566)0.868:0.004068761)0.954:0.011286353)0.752:0.003239158)0.764:0.004060303)0.802:0.003431182,((CARCRI_R07732:0.004926596,CHUBUR_R13999:0.005565691)0.989:0.019088945,(BUCABY_R08200:0.012922520,BUCRHI_R04945:0.030925860)0.982:0.023053331)0.693:0.001261951)0.798:0.002090455,(COCCOC_R01070:0.006097725,EGRGAR_R10096:0.006031164)0.970:0.010050551)0.240:0.000000005)0.638:0.000000005)0.643:0.000000005)0.000:0.000000005)0.000:0.000000005,((COLSTR_R09987:0.010274933,UROIND_R00112:0.003927263)0.996:0.020105556,(((MESUNI_R06242:0.041334752,TURVEL_R11671:0.050465625)0.881:0.011520693,(((STEPAR_R11882:0.006237959,(((((NYCSEM_R11750:0.001998501,ROSBEN_R13055:0.002005146)0.818:0.002006086,(((JACJAC_R12789:0.012313643,THIORB_R09193:0.008939906)0.842:0.004047610,PEDTOR_R12920:0.020710116)0.763:0.001945396,(CALPUG_R06327:0.008089141,(AREINT_R13368:0.000000005,LIMLAP_R00949:0.009380671)0.613:0.003991462)0.779:0.002022128)0.000:0.000000005)0.988:0.008110302,GLAPRA_R12578:0.000000005)0.878:0.002014220,((DROARD_R08901:0.006068822,RYNNIG_R04742:0.000000005)0.927:0.002011780,((PHASIM_R07643:0.002012306,(CHRMAC_R10297:0.0,LARSMI_R11231:0.0,RISTRI_R04124:0.0):0.000000005)0.000:0.000000005,(CEPGRY_R10420:0.002643322,(ALCTOR_R10164:0.000000005,(URILOM_R14851:0.001997948,URIAAL_R08244:0.001997654)0.000:0.000000005)0.889:0.005651109)0.841:0.003845258)0.000:0.000000005)0.922:0.002014913)0.000:0.000000005,RHIAFR_R07918:0.008202362)0.733:0.000000006)0.897:0.006649422,(RHICYA_R12088:0.027437020,UPUEPO_R00447:0.016656291)0.981:0.017981040)0.601:0.006144029,(CHAVOC_R09490:0.004151844,(CHAALE_R15308:0.004071762,(HIMHIM_R01743:0.004026478,IBISTR_R00388:0.002009799)0.767:0.002013288)0.761:0.001910153)0.866:0.004700446)0.750:0.003193232)0.762:0.003621412,(BUCCAP_R06050:0.050490074,GALDEA_R14061:0.009927491)0.913:0.012765929)0.142:0.001442668)0.727:0.002316086)0.838:0.003888045,(((BRALEP_R03310:0.020926420,EURGUL_R08859:0.014812034)0.922:0.008291825,((CHLAEN_R07872:0.017048275,HALSEN_R12568:0.011760245)0.955:0.014767748,(BARMAR_R14004:0.018846041,TODMEX_R01766:0.025450564)0.774:0.004228639)0.763:0.003187693)0.761:0.000000005,MERNUB_R06122:0.024543538)0.884:0.004167791)0.981:0.014673257)0.940:0.010625720,(FORRUF_R01984:0.028394062,((SERLUN_R12374:0.029067140,(SAPAEN_R02087:0.011611878,(PITSOR_R11386:0.029220318,(CALVIR_R12747:0.020514975,SMICAP_R09407:0.018681747)0.855:0.007030753)0.783:0.008830299)0.814:0.005115354)0.914:0.009593144,(((RHEHOF_R06366:0.119624125,SAKLUC_R12331:0.000000005)0.985:0.021714910,GRAVAR_R13536:0.025023405)0.823:0.006700351,(((FURFIG_R09482:0.003855737,(CAMPRO_R05359:0.001976181,XIPELE_R10971:0.000000005)0.401:0.004085802)0.815:0.004406497,(SCLMEX_R07822:0.009515605,SCYSUP_R14066:0.008755842)0.560:0.002458980)0.696:0.008606532,(TYRSAV_R09019:0.007969348,((((NEOCIN_R07762:0.004014116,TACRUB_R02253:0.005955558)0.890:0.003974262,(MIOMAC_R00790:0.001982210,OXYCRI_R10812:0.000000005)0.000:0.000000005)0.844:0.001981767,((CEPORN_R11899:0.014130612,(LEPCOR_R01168:0.003986434,MANMAN_R08983:0.000000005)0.933:0.006077300)0.752:0.001934480,(ONYCOR_R09931:0.003995015,PIPCHL_R11517:0.003990987)0.000:0.000000006)0.751:0.000000005)0.879:0.003976846,PACMIN_R00396:0.005989343)0.293:0.000000006)0.879:0.006497485)0.155:0.003727304)0.772:0.002871621)0.762:0.002103815)0.881:0.007788756)0.886:0.006396091,(ATRCLA_R14560:0.008240691,MENNOV_R03873:0.008737989)0.724:0.002152865)0.958:0.009658636,(ERPZAN_R00185:0.0,VIRALT_R07861:0.0):0.001982105)0.738:0.000000005)0.000:0.000000005,(((ORISOL_R03544:0.010073721,(((((((PASAMO_R03813:0.005157382,(((LONSTR_R08944:0.001997580,TAEGUT_R17040:0.001978595)0.941:0.006035828,(PEUTAE_R12381:0.005969777,(UROPYL_R08260:0.001985326,(GEOFOR_R09593:0.000000005,SPOHYP_R10874:0.010003757)0.897:0.003991641)0.000:0.000000005)0.000:0.000000005)0.000:0.000000005,(((NESACU_R06611:0.010075839,(SETCOR_R10331:0.003984510,SETKIR_R09068:0.000000005)0.772:0.002006641)0.787:0.001969564,(CARCAR_R07597:0.003978559,(HYPCIN_R05861:0.003976504,RHOROS_R03907:0.001981973)0.000:0.000000005)0.865:0.001981550)0.000:0.000000005,((PASDOM_R01841:0.001981049,(((LOXCUR_R01247:0.0,LOXLEU_R10869:0.0):0.000000005,(SERCAN_R05569:0.001980627,(CHLVIR_R02303:0.000000005,HEMWIL_R12881:0.010303989)0.906:0.004035050)0.000:0.000000005)0.960:0.005972034,((MOTALB_R00263:0.000000005,((SPIPAS_R02115:0.006647930,ZONALB_R11673:0.078050601)0.781:0.003274728,(JUNHYE_R02029:0.000000006,MELMEL_R06212:0.001982826)0.000:0.000000005)0.950:0.003975446)0.836:0.001981658,((AGEPHO_R12112:0.0,QUIMEX_R06835:0.0):0.000000005,MOLATE_R04767:0.001992249)0.000:0.000000005)0.000:0.000000005)0.000:0.000000005)0.000:0.000000005,EMBFUC_R07456:0.001983257)0.000:0.000000005)0.839:0.001984583)0.000:0.000000012)0.117:0.001985853,((VIDCHA_R00557:0.000000005,VIDMAC_R01666:0.000000005)0.968:0.006005349,(REGSAT_R03545:0.013986957,((CERBRA_R02815:0.001988399,CERFAM_R07219:0.000000005)0.964:0.008017940,(POLCAE_R08689:0.010003023,THRLUD_R00775:0.005974106)0.854:0.004020500)0.707:0.001969303)0.173:0.000000005)0.822:0.001988437)0.000:0.000000006,(((PRUFUL_R09054:0.003961340,PRUHIM_R10842:0.001985821)0.985:0.012057570,(((COPSEC_R04846:0.004303382,TOXRED_R00790:0.010092368)0.784:0.001981110,((ERIRUB_R02188:0.007953202,(FICALB_R00799:0.001977029,(OENOEN_R08976:0.001977343,SAXMAU_R01795:0.001976966)0.000:0.000000005)0.883:0.003968839)0.782:0.001988986,CATFUS_R11593:0.010004491)0.768:0.001972341)0.000:0.000000005,(CERCOR_R06284:0.001976201,(RHAINO_R11059:0.006003458,((LEUROT_R14346:0.004501946,STUVUL_R07134:0.002009732)0.940:0.006022253,CINMEX_R12987:0.003961448)0.000:0.000000006)0.862:0.001974750)0.000:0.000000005)0.878:0.003978819)0.740:0.000000005,((LEPASP_R01517:0.003964923,((CHLCYA_R06957:0.001993204,CHLHAR_R11249:0.001991308)0.965:0.008899993,(ELAFOR_R06222:0.069382747,PROCAF_R03956:0.003775292)0.123:0.005054435)0.650:0.001130655)0.762:0.001958075,(BOMGAR_R08262:0.012061374,DICEXI_R09180:0.005980954)0.746:0.002011415)0.193:0.001983239)0.796:0.003949017)0.768:0.001998779,(((HYLPRA_R13303:0.016246184,(((SYLVIR_R10709:0.008687543,(RHASIB_R03403:0.004305963,(DONATR_R04824:0.002153616,(((SITEUR_R04209:0.002197151,TICMUR_R00244:0.014899899)0.862:0.016925528,(IRECYA_R12278:0.008617378,((CALORN_R07598:0.004183775,PHEMEL_R04365:0.018819986)0.766:0.006544313,PLONIG_R01869:0.002136799)0.762:0.006533509)0.767:0.005554313)0.906:0.045026102,(ACRARU_R14141:0.007366927,HIPICT_R09009:0.006307597)0.838:0.005226972)0.777:0.016160176)0.000:0.000000005)0.000:0.000000005)0.000:0.000000005,PHYTRO_R13017:0.002148004)1.000:0.000000006,NICCHL_R07497:0.003963746)0.000:0.000000005)0.864:0.001977934,(LOCOCH_R10739:0.010016213,(((((BRAATR_R01259:0.004836373,PYCJOC_R06715:0.013420910)0.720:0.005653477,((CISJUN_R13494:0.013947538,(STEDEN_R06180:0.002155183,(ZOSHYP_R01814:0.0,ZOSLAT_R06289:0.0):0.004287804)0.764:0.002550873)0.806:0.005724618,((SINWEB_R08836:0.008022415,(SYLATR_R08297:0.006148548,SYLBOR_R04162:0.002737321)0.785:0.001916383)0.967:0.009951187,(PORRUF_R06759:0.006461890,(ILLCLE_R09312:0.004298379,LEILUT_R01534:0.004315475)0.757:0.002152191)0.000:0.000000005)0.269:0.000000005)0.906:0.003960597)0.728:0.000000005,(ANTMIN_R08656:0.005988735,(POEATR_R08762:0.001992461,(PARMAJ_R09814:0.001976891,PSEHUM_R01296:0.000000005)0.791:0.001976320)0.887:0.003965873)0.897:0.004032114)0.804:0.001995577,(((CETCET_R02558:0.006024695,AEGCAU_R08906:0.011372518)0.252:0.003486984,HORVUL_R04273:0.010017086)0.629:0.001712365,(ERYMCC_R11442:0.006941526,HIRRUS_R01812:0.006457026)0.747:0.000000006)0.785:0.002163270)0.805:0.001982585,PANBIA_R07107:0.011988565)0.000:0.000000005)0.752:0.000000005)0.457:0.001991715,((DRYBRU_R10064:0.014158811,MELVER_R13861:0.012160955)0.878:0.005970931,PHANIT_R00172:0.014048097)0.394:0.000000005)0.768:0.001977899)0.383:0.003989321,(CHAFRE_R02806:0.015468322,PICGYM_R06166:0.005886643)0.909:0.009074803)0.000:0.000000005,GRAPIC_R12577:0.015294078)0.808:0.002007802,((DASBRO_R00594:0.010030956,MALELE_R03053:0.032840355)0.761:0.002119060,ORTSPA_R03385:0.010950585)0.752:0.002006856)0.116:0.001965403)0.756:0.000000005,POSRUF_R10160:0.008013965)0.000:0.000000006,PARPUN_R00466:0.006477149)0.839:0.001984635)0.771:0.001976079);\",\n \"nhx\" : \"(((((((((((((((((((((((ENSDLEP00000011728:0.000566[&&NHX:D=N:T=9749],ENSMMNP00015026246:0.001023[&&NHX:D=N:T=40151]):0.002051[&&NHX:D=N:B=100:T=9747],ENSPSNP00000021942:0.00377[&&NHX:D=N:T=42100]):0.001682[&&NHX:D=N:B=97:T=9722],ENSTTRP00000010004:0.004883[&&NHX:D=N:T=9739]):0.004417[&&NHX:D=N:B=97:T=9722],ENSPCTP00005024635:0.007352[&&NHX:D=N:T=9755]):0.001205[&&NHX:D=N:B=99:T=9722],ENSBMSP00010023868:0.006737[&&NHX:D=N:T=9771]):0.015925[&&NHX:D=N:B=99:T=9721],((((((ENSBGRP00000023601:0[&&NHX:D=N:T=30521],ENSBMUP00000018023:0.002196[&&NHX:D=N:T=72004]):0.001033[&&NHX:D=N:B=88:T=9903],ENSBBBP00000019015:0.001697[&&NHX:D=N:T=43346]):0.000565[&&NHX:D=N:B=74:T=27592],(ENSBTAP00000001311:0.000337[&&NHX:D=N:T=9913],ENSBIXP00005031886:0.000914[&&NHX:D=N:T=30522]):0.001146[&&NHX:D=N:B=98:T=9903]):0.008235[&&NHX:DD=Y:B=74:T=27592],ENSCHIP00000024039:0.014386[&&NHX:D=N:T=9925]):0.001511[&&NHX:D=N:B=100:T=9895],ENSMMSP00000000856:0.014163[&&NHX:D=N:T=68415]):0.001839[&&NHX:D=N:B=81:T=35500],ENSCHYP00000039820:0.011355[&&NHX:D=N:T=84702]):0.036645[&&NHX:D=N:B=81:T=35500]):0.005942[&&NHX:D=N:B=27:T=91561],((ENSSSCP00000028073:0.02414[&&NHX:D=N:T=9823],ENSCWAP00000015540:0.025846[&&NHX:D=N:T=51154]):0.001129[&&NHX:D=N:B=90:T=35497],ENSSSCP00000052851:0.064492[&&NHX:D=N:T=9823]):0.021769[&&NHX:D=Y:B=0:T=35497]):0.003699[&&NHX:D=N:B=0:T=91561],(ENSCDRP00005029137:0.009985[&&NHX:D=N:T=9838],ENSVPAP00000000821:0.010494[&&NHX:D=N:T=30538]):0.034855[&&NHX:D=N:B=100:T=9835]):0.01351[&&NHX:D=N:B=0:T=91561],(((((ENSUMAP00000030927:0.000707[&&NHX:D=N:T=29073],ENSUAMP00000017844:0.001135[&&NHX:D=N:T=9643]):0.004718[&&NHX:D=N:B=100:T=9639],ENSAMEP00000009909:0.009591[&&NHX:D=N:T=9646]):0.015488[&&NHX:D=N:B=100:T=9632],(ENSNVIP00000027714:0.003973[&&NHX:D=N:T=452646],ENSMPUP00000001928:0.005437[&&NHX:D=N:T=9669]):0.020722[&&NHX:D=N:B=100:T=169418]):0.00787[&&NHX:D=N:B=100:T=379584],(ENSVVUP00000036965:0.004369[&&NHX:D=N:T=9627],ENSCAFP00020031922:0.0054[&&NHX:D=N:T=286419]):0.032112[&&NHX:D=N:B=100:T=9608]):0.009107[&&NHX:D=N:B=100:T=379584],(((ENSPPRP00000007644:0.000295[&&NHX:D=N:T=9691],ENSPLOP00000021497:0.000735[&&NHX:D=N:T=9689]):0.000985[&&NHX:D=N:B=98:T=9688],ENSPTIP00000023416:0.001804[&&NHX:D=N:T=74533]):0.003065[&&NHX:D=N:B=98:T=9688],ENSFCAP00000019777:0.007049[&&NHX:D=N:T=9685]):0.040525[&&NHX:D=N:B=100:T=9681]):0.023686[&&NHX:D=N:B=100:T=33554]):0.000574[&&NHX:D=N:B=7:T=314145],((ENSRFEP00010002200:0.04543[&&NHX:D=N:T=59479],ENSPVAP00000000225:0.086354[&&NHX:D=N:T=132908]):0.010201[&&NHX:D=N:B=84:T=9397],ENSMLUP00000012516:0.056375[&&NHX:D=N:T=59463]):0.013313[&&NHX:DD=Y:B=78:T=9397]):0.000609[&&NHX:D=N:B=4:T=314145],(ENSECAP00000013360:0.002971[&&NHX:D=N:T=9796],ENSEASP00005031151:0.003002[&&NHX:D=N:T=83772]):0.04043[&&NHX:D=N:B=100:T=9789]):0.003082[&&NHX:D=N:B=15:T=314145],(ENSEEUP00000008968:0.099514[&&NHX:D=N:T=9365],ENSSARP00000002541:0.104111[&&NHX:D=N:T=42254]):0.015519[&&NHX:D=N:B=88:T=9362]):0.007109[&&NHX:D=N:B=36:T=314145],((((((((((ENSMOCP00000000295:0.067555[&&NHX:D=N:T=79684],ENSPEMP00000001193:0.069389[&&NHX:D=N:T=230844]):0.00575[&&NHX:D=N:B=94:T=337677],((ENSMAUP00000022423:0[&&NHX:D=N:T=10036],ENSMAUP00000009408:0[&&NHX:D=N:T=10036]):0[&&NHX:D=Y:T=10036],ENSCGRP00001017976:0.023005[&&NHX:D=N:T=10029]):0.022308[&&NHX:D=N:B=100:T=10026]):0.015842[&&NHX:D=N:B=94:T=337677],(((((MGP_SPRETEiJ_P0075202:0.00265[&&NHX:D=N:T=10096],ENSMUSP00000038576:0.004017[&&NHX:D=N:T=10090]):0.000326[&&NHX:D=N:B=10:T=862507],ENSMSIP00000026406:0.002341[&&NHX:D=N:T=10103]):0.003936[&&NHX:D=N:B=8:T=862507],MGP_CAROLIEiJ_P0072376:0.007484[&&NHX:D=N:T=10089]):0.008466[&&NHX:D=N:B=25:T=862507],MGP_PahariEiJ_P0060583:0.019806[&&NHX:D=N:T=10093]):0.015012[&&NHX:D=N:B=21:T=10088],ENSRNOP00000001475:0.041792[&&NHX:D=N:T=10116]):0.033831[&&NHX:D=N:B=96:T=39107]):0.07317[&&NHX:D=N:B=96:T=337687],ENSNGAP00000024933:0.068058[&&NHX:D=N:T=1026970]):0.01854[&&NHX:D=N:B=56:T=337687],ENSJJAP00000024685:0.114896[&&NHX:D=N:T=51337]):0.024014[&&NHX:D=N:B=16:T=1963758],(((ENSCLAP00000008318:0.033998[&&NHX:D=N:T=34839],ENSODEP00000009470:0.061026[&&NHX:D=N:T=10160]):0.004259[&&NHX:D=N:B=52:T=33550],ENSCPOP00000004635:0.068163[&&NHX:D=N:T=10141]):0.013643[&&NHX:D=N:B=52:T=33550],ENSHGLP00000011991:0.043409[&&NHX:D=N:T=10181]):0.039213[&&NHX:D=N:B=94:T=33550]):0.003549[&&NHX:D=N:B=11:T=9989],(((ENSSTOP00000004979:0.007082[&&NHX:D=N:T=43179],ENSUPAP00010013759:0.008628[&&NHX:D=N:T=9999]):0.0085[&&NHX:D=N:B=96:T=337730],ENSMMMP00000025283:0.00492[&&NHX:D=N:T=9994]):0.027993[&&NHX:D=N:B=96:T=337730],ENSSVLP00005024437:0.029815[&&NHX:D=N:T=55149]):0.034841[&&NHX:D=N:B=92:T=55153]):0.010047[&&NHX:D=N:B=11:T=9989],(ENSOCUP00000014514:0.044118[&&NHX:D=N:T=9986],ENSOPRP00000014082:0.109158[&&NHX:D=N:T=9978]):0.04827[&&NHX:D=N:B=99:T=9975]):0.001917[&&NHX:D=N:B=8:T=314147],ENSTBEP00000013856:0.082615[&&NHX:D=N:T=37347]):0.001123[&&NHX:D=N:B=4:T=314146],(((((((((ENSPTRP00000009812:0.000341[&&NHX:D=N:T=9598],ENSPPAP00000000836:0.001142[&&NHX:D=N:T=9597]):0.002093[&&NHX:D=N:B=100:T=9596],ENSP00000369497:0.001566[&&NHX:D=N:T=9606]):0.000219[&&NHX:D=N:B=17:T=207598],ENSGGOP00000027226:0.002031[&&NHX:D=N:T=9595]):0.004252[&&NHX:D=N:B=17:T=207598],ENSPPYP00000005997:0.007072[&&NHX:D=N:T=9601]):0.002903[&&NHX:D=N:B=99:T=9604],ENSNLEP00000001277:0.009571[&&NHX:D=N:T=61853]):0.002446[&&NHX:D=N:B=98:T=314295],(((((ENSCATP00000015406:0.00209[&&NHX:D=N:T=9531],ENSMLEP00000025266:0.0034[&&NHX:D=N:T=9568]):0.000372[&&NHX:D=N:B=60:T=9528],ENSPANP00000022490:0.001777[&&NHX:D=N:T=9555]):0.000724[&&NHX:D=N:B=54:T=9528],((ENSMFAP00000029418:0.001032[&&NHX:D=N:T=9541],ENSMMUP00000009432:0.005844[&&NHX:D=N:T=9544]):0.000105[&&NHX:D=N:B=40:T=9539],ENSMNEP00000025034:0.002176[&&NHX:D=N:T=9545]):0.001473[&&NHX:D=N:B=34:T=9539]):0.000352[&&NHX:D=N:B=54:T=9528],ENSCSAP00000013938:0.003981[&&NHX:D=N:T=60711]):0.00179[&&NHX:D=N:B=55:T=9528],(ENSRROP00000030947:0[&&NHX:D=N:T=61622],ENSRBIP00000000297:0.022474[&&NHX:D=N:T=61621]):0.008142[&&NHX:D=N:B=92:T=542827]):0.008355[&&NHX:D=N:B=58:T=9527]):0.007639[&&NHX:D=N:B=87:T=9526],((ENSCCAP00000031676:0.011669[&&NHX:D=N:T=2715852],ENSCJAP00000093240:0.015902[&&NHX:D=N:T=9483]):0.000332[&&NHX:D=N:B=23:T=9498],ENSANAP00000015411:0.01113[&&NHX:D=N:T=37293]):0.015231[&&NHX:D=N:B=23:T=9479]):0.029405[&&NHX:D=N:B=92:T=314293],ENSTSYP00000000441:0.060665[&&NHX:D=N:T=1868482]):0.003827[&&NHX:D=N:B=90:T=376913],(((ENSPCOP00000008219:0.014484[&&NHX:D=N:T=379532],ENSMICP00000044704:0.023431[&&NHX:D=N:T=30608]):0.001594[&&NHX:D=N:B=93:T=376915],ENSPSMP00000026900:0.017253[&&NHX:D=N:T=1328070]):0.012285[&&NHX:D=N:B=93:T=376915],ENSOGAP00000009477:0.064918[&&NHX:D=N:T=30611]):0.013645[&&NHX:D=N:B=99:T=376911]):0.005986[&&NHX:D=N:B=89:T=9443]):0.009172[&&NHX:D=N:B=12:T=314146]):0.008774[&&NHX:D=N:B=12:T=1437010],(ENSDNOP00000034947:0.046866[&&NHX:D=N:T=9361],ENSCHOP00000007822:0.050851[&&NHX:D=N:T=9358]):0.025312[&&NHX:D=N:B=100:T=9348]):0.006165[&&NHX:D=N:B=15:T=9347],((ENSETEP00000003277:0.154194[&&NHX:D=N:T=9371],ENSPCAP00000000440:0.17644[&&NHX:D=N:T=9813]):0.023418[&&NHX:D=N:B=93:T=311790],ENSLAFP00000002234:0.069853[&&NHX:D=N:T=9785]):0.048728[&&NHX:D=N:B=91:T=311790]):0.102726[&&NHX:D=N:B=69:T=9347],(((ENSVURP00010026286:0.02893[&&NHX:D=N:T=29139],ENSMEUP00000009812:0.045949[&&NHX:D=N:T=9315]):0.007079[&&NHX:D=N:B=96:T=38609],ENSSHAP00000012162:0.055381[&&NHX:D=N:T=9305]):0.015112[&&NHX:D=N:B=96:T=9263],ENSMODP00000033276:0.071803[&&NHX:D=N:T=13616]):0.123926[&&NHX:D=N:B=96:T=9263]):0.06077[&&NHX:D=N:B=87:T=32525],ENSOANP00000039689:0.264045[&&NHX:D=N:T=9258]):0.091853[&&NHX:D=N:B=90:T=40674],((((ENSPMRP00000005460:0.144183[&&NHX:D=N:T=64176],ENSSMRP00000016793:0.20051[&&NHX:D=N:T=96440]):0.009903[&&NHX:D=N:B=99:T=1329976],((ENSNSUP00000017478:0.005634[&&NHX:D=N:T=8663],ENSLLTP00000016858:0.029105[&&NHX:D=N:T=8630]):0.226094[&&NHX:D=N:B=100:T=8602],ENSACAP00000031108:0.186787[&&NHX:D=N:T=28377]):0.032366[&&NHX:D=N:B=7:T=1329911]):0.135778[&&NHX:D=N:B=3:T=1329912],ENSSPUP00000018703:0.144411[&&NHX:D=N:T=8508]):0.0332[&&NHX:D=N:B=0:T=8504],((((((ENSACCP00020021048:0.030244[&&NHX:D=N:T=223781],ENSSHBP00005016070:0.046241[&&NHX:D=N:T=2489341]):0.000673[&&NHX:D=N:B=100:T=8825],((((ENSGFOP00000022131:0.015965[&&NHX:D=N:T=48883],ENSSCAP00000011543:0.017989[&&NHX:D=N:T=9135]):0.005354[&&NHX:D=N:B=100:T=9126],ENSTGUP00000012130:0.02239[&&NHX:D=N:T=59729]):0.005211[&&NHX:DD=Y:B=100:T=9126],ENSPMJP00000020154:0.031769[&&NHX:D=N:T=9157]):0.0011[&&NHX:D=N:B=13:T=9126],ENSFALP00000008821:0.024057[&&NHX:D=N:T=59894]):0.055526[&&NHX:D=N:B=13:T=9126]):0.017918[&&NHX:D=N:B=100:T=8825],(((ENSGALP00000027524:0.023757[&&NHX:D=N:T=9031],ENSMGAP00000015990:0.025887[&&NHX:D=N:T=9103]):0.000864[&&NHX:D=N:B=94:T=9005],ENSCJPP00005026171:0.031852[&&NHX:D=N:T=93934]):0.055074[&&NHX:D=N:B=94:T=9005],ENSAPLP00000007411:0.069477[&&NHX:D=N:T=8840]):0.021576[&&NHX:D=N:B=100:T=1549675]):0.027956[&&NHX:D=N:B=98:T=8825],ENSSCUP00000019773:0.055174[&&NHX:D=N:T=441894]):0.138375[&&NHX:D=N:B=98:T=8782],ENSCPRP00005008306:0.1287[&&NHX:D=N:T=8502]):0.016113[&&NHX:D=N:B=0:T=8492],((((ENSTMTP00000024650:0.004017[&&NHX:D=N:T=2587831],ENSTMTP00000012675:0.005315[&&NHX:D=N:T=2587831]):0.002859[&&NHX:D=Y:B=100:T=2587831],ENSCPBP00000004776:0.007644[&&NHX:D=N:T=8478]):0.005658[&&NHX:D=N:B=100:T=8476],(ENSGEVP00005002652:0.01601[&&NHX:D=N:T=1825980],ENSCABP00000011062:0.022245[&&NHX:D=N:T=106734]):0.009454[&&NHX:D=N:B=99:T=8487]):0.01978[&&NHX:D=N:B=99:T=8486],ENSPSIP00000012858:0.064659[&&NHX:D=N:T=13735]):0.046163[&&NHX:D=N:B=100:T=8464]):0.04067[&&NHX:D=N:B=0:T=1329799]):0.101687[&&NHX:D=N:B=9:T=32561]):0.107575[&&NHX:D=N:B=89:T=32524],(ENSXETP00000037057:0.302164[&&NHX:D=N:T=8364],ENSLLEP00000043860:0.366066[&&NHX:D=N:T=445787]):0.181688[&&NHX:D=N:B=96:T=8342]):0.09645[&&NHX:D=N:B=49:T=32523],ENSLACP00000008815:0.24746[&&NHX:D=N:T=7897]):0.045271[&&NHX:D=N:B=14:T=8287],((((((((((((((ENSTNIP00000002435:0.089877[&&NHX:D=N:T=99883],ENSTRUP00000015030:0.091412[&&NHX:D=N:T=31033]):0.146182[&&NHX:D=N:B=100:T=31031],ENSGACP00000015199:0.143397[&&NHX:D=N:T=69293]):0.009443[&&NHX:D=N:B=0:T=1489922],ENSSAUP00010031327:0.096966[&&NHX:D=N:T=8175]):0.004928[&&NHX:D=N:B=0:T=1489922],(ENSDLAP00005043188:0.096295[&&NHX:D=N:T=13489],ENSLBEP00000002832:0.154656[&&NHX:D=N:T=56723]):0.015316[&&NHX:D=N:B=15:T=1489922]):0.007374[&&NHX:D=N:B=0:T=1489922],(ENSSLUP00000030625:0.065993[&&NHX:D=N:T=283035],ENSCGOP00000037196:0.066502[&&NHX:D=N:T=56716]):0.014978[&&NHX:D=N:B=91:T=8111]):0.014192[&&NHX:DD=Y:B=0:T=1489922],(((ENSMAMP00000049017:0.112322[&&NHX:D=N:T=205130],ENSBSLP00000034562:0.168852[&&NHX:D=N:T=158456]):0.008315[&&NHX:D=N:B=0:T=1489892],((ENSSDUP00000015520:0.00513[&&NHX:D=N:T=41447],ENSSLDP00000006566:0.007791[&&NHX:D=N:T=1841481]):0.042577[&&NHX:D=N:B=100:T=8160],ENSLCAP00010030231:0.060104[&&NHX:D=N:T=8187]):0.016173[&&NHX:D=N:B=93:T=1489904]):0[&&NHX:D=N:B=0:T=1489872],(ENSSMAP00000010386:0.11135[&&NHX:D=N:T=52904],ENSATEP00000018320:0.126751[&&NHX:D=N:T=64144]):0.003595[&&NHX:D=N:B=14:T=1489872]):0.014963[&&NHX:DD=Y:B=0:T=1489872]):0.008717[&&NHX:D=N:B=0:T=1489872],(((ENSAOCP00000005723:0.022605[&&NHX:D=N:T=80972],ENSAPOP00000003431:0.032376[&&NHX:D=N:T=80966]):0.067976[&&NHX:D=N:B=100:T=30863],(((ENSMZEP00005015140:0.002522[&&NHX:D=N:T=106582],ENSHBUP00000022221:0.00276[&&NHX:D=N:T=8153]):0.005622[&&NHX:D=N:B=100:T=319058],ENSNBRP00000031193:0.014221[&&NHX:D=N:T=32507]):0.055295[&&NHX:D=N:B=100:T=318546],ENSACIP00000005496:0.085203[&&NHX:D=N:T=61819]):0.069808[&&NHX:D=N:B=97:T=8113]):0.006383[&&NHX:D=N:B=72:T=1489908],(((((((ENSPFOP00000001575:0.001877[&&NHX:D=N:T=48698],ENSPLAP00000026811:0.002682[&&NHX:D=N:T=48699]):0.011341[&&NHX:D=N:B=100:T=8080],ENSPREP00000018297:0.014432[&&NHX:D=N:T=8081]):0.009367[&&NHX:D=N:B=100:T=8080],ENSXMAP00000006983:0.020943[&&NHX:D=N:T=8083]):0.07372[&&NHX:D=N:B=100:T=586240],ENSFHEP00000010259:0.090262[&&NHX:D=N:T=8078]):0.010081[&&NHX:D=N:B=100:T=8087],ENSCVAP00000010146:0.166223[&&NHX:D=N:T=28743]):0.099285[&&NHX:D=N:B=100:T=8087],ENSKMAP00000010397:0.154786[&&NHX:D=N:T=37003]):0.018665[&&NHX:D=N:B=11:T=28738],((ENSORLP00000039367:0.012182[&&NHX:D=N:T=8090],ENSOSIP00000028295:0.023719[&&NHX:D=N:T=183150]):0.048352[&&NHX:D=N:B=100:T=8089],ENSOMEP00000001576:0.066811[&&NHX:D=N:T=30732]):0.195635[&&NHX:D=N:B=100:T=8089]):0.03392[&&NHX:D=N:B=9:T=1489913]):0.027302[&&NHX:D=N:B=0:T=1489908]):0.081822[&&NHX:D=N:B=0:T=1489872],ENSMMDP00005016864:0.115686[&&NHX:D=N:T=586833]):0.133158[&&NHX:D=N:B=0:T=123369],ENSGMOP00000010385:0.447969[&&NHX:D=N:T=8049]):0.04027[&&NHX:D=N:B=1:T=123368],(((ENSSSAP00000049301:0.003158[&&NHX:D=N:T=8030],ENSSTUP00000089299:0.005224[&&NHX:D=N:T=8032]):0.007814[&&NHX:D=N:B=100:T=8028],((ENSOTSP00005006826:0.003553[&&NHX:D=N:T=74940],ENSOKIP00005016504:0.004245[&&NHX:D=N:T=8019]):0.001513[&&NHX:D=N:B=95:T=8016],ENSOMYP00000096229:0.004581[&&NHX:D=N:T=8022]):0.012062[&&NHX:D=N:B=95:T=8016]):0.008081[&&NHX:D=N:B=79:T=504568],ENSHHUP00000013710:0.009428[&&NHX:D=N:T=62062]):0.220475[&&NHX:D=N:B=79:T=504568]):0.063675[&&NHX:D=N:B=0:T=1489388],((((ENSPNAP00000002089:0.088107[&&NHX:D=N:T=42514],ENSAMXP00000037719:0.141689[&&NHX:D=N:T=7994]):0.040456[&&NHX:D=N:B=100:T=1489739],ENSEEEP00000018632:0.175328[&&NHX:D=N:T=8005]):0.011488[&&NHX:D=N:B=52:T=186628],ENSIPUP00000019387:0.191507[&&NHX:D=N:T=7998]):0.130849[&&NHX:D=N:B=52:T=186628],((((ENSCCRP00000004504:0.013011[&&NHX:D=N:T=7962],ENSSGRP00000031158:0.015922[&&NHX:D=N:T=75366]):0.000854[&&NHX:D=N:B=100:T=2743694],ENSCARP00000056251:0.028035[&&NHX:D=N:T=7957]):0.0219[&&NHX:D=N:B=100:T=2743694],ENSSGRP00000071274:0.037074[&&NHX:D=N:T=75366]):0.035154[&&NHX:D=Y:B=100:T=2743694],ENSDARP00000099674:0.101043[&&NHX:D=N:T=7955]):0.247776[&&NHX:D=N:B=100:T=30727]):0.127786[&&NHX:D=N:B=98:T=186626]):0.062612[&&NHX:D=N:B=25:T=186625],(ENSPKIP00000013632:0.279788[&&NHX:D=N:T=1676925],ENSSFOP00015002218:0.291858[&&NHX:D=N:T=113540]):0.102594[&&NHX:D=N:B=88:T=41712]):0.110179[&&NHX:D=N:B=0:T=1489341],ENSLOCP00000009962:0.210021[&&NHX:D=N:T=7918]):0.138094[&&NHX:D=N:B=2:T=41665],ENSECRP00000005112:0.560007[&&NHX:D=N:T=27687]):0.12002[&&NHX:D=N:B=55:T=7898]):0.072614[&&NHX:D=N:B=3:T=117571],ENSCMIP00000046776:0.395803[&&NHX:D=N:T=7868]):0.1[&&NHX:D=N:B=4:T=7776],ENSEBUP00000009898:0.958294[&&NHX:D=N:T=7764]):0.1[&&NHX:D=N:B=0:T=7742];\",\n \"nhx2\" : \"((((POP23a_CIOIN_ENSCING00000016202,POP23b_CIOIN_ENSCING00000016169)[&&NHX:Ev=duplication],POP23_CIOSA_ENSCSAVG00000000248),((POP23a_BRAFL_C3ZMF1,POP23b_BRAFL_121417)[&&NHX:Ev=duplication],(((POP3_ORYLA_ENSORLG00000019669,POP3_GASAC_ENSGACG00000014023,POP3_DANRE_Q6JWW1),(POP3_XENTR_B1H1F6,(POP3_CHICK_Q9DG25,(POP3_ORNAN_ENSOANG00000004179,POP3_MONDO_ENSMODG00000018033,((POP3_MOUSE_Q9ES81,POP3_RAT_Q3BCU3),POP3_RABIT_ENSOCUG00000025973,POP3_MACMU_ENSMMUG00000014473,POP3_HUMAN_Q9HBV1))))),(((POP2_GASAC_ENSGACG00000001420,POP2_ORYLA_ENSORLG00000008627,POP2_TAKRU_ENSTRUG00000015933),POP2_DANRE_ENSDARG00000069922),POP2_XENTR_ENSXETG00000018064,(((POP2_TAEGU_ENSTGUG00000013383,POP2_CHICK_Q6T9Z5),POP2_ANOCA_ENSACAG00000003557),((POP2_MACEU_ENSMEUG00000015825,POP2_MONDO_ENSMODG00000018205),((POP2_RABIT_ENSOCUG00000009515,(POP2_RAT_Q6P722,POP2_MOUSE_Q9ES82)),(POP2_MACMU_ENSMMUG00000000905,POP2_HUMAN_Q9HBU9))))))[&&NHX:Ev=duplication])),((POP1_CIOSA_ENSCSAVG00000000247,POP1_CIOIN_ENSCING00000000496),((POP1_DANRE_Q5PQZ7,(POP1_ORYLA_ENSORLG00000019663,POP1_GASAC_ENSGACG00000014015,POP1_TAKRU_ENSORLG00000019663)),(POP1_XENTR_B1H1G2,(POP1_ANOCA_ENSACAG00000003910,(POP1_TAEGU_ENSTGUG00000012218,POP1_CHICK_Q9DG23)),POP1_ORNAN_ENSOANG00000004180,POP1_MONDO_ENSMODG00000018034,(POP1_RABIT_ENSOCUG00000016944,(POP1_RAT_Q3BCU4,POP1_MOUSE_Q9ES83),(POP1_HUMAN_Q8NE79,POP1_MACMU_ENSMMUG00000014471))))))[&&NHX:Ev=duplication];\",\n \"rokas\" : \"(Schizosaccharomyces pombe:0.545914,(Saitoella complicata:0.57412,((Arthrobotrys oligospora:0.539923,((Parastagonospora nodorum:0.465825,(Xylona heveae:0.272728,(Coccidioides immitis:0.254443,Aspergillus nidulans:0.266048)1:0.18207)1:0.041547)1:0.0419986,((Botrytis cinerea:0.0493876,Sclerotinia sclerotiorum:0.0433921)1:0.237364,(Neurospora crassa:0.27673,Fusarium graminearum:0.291175)1:0.153952)1:0.127477)1:0.210957)1:0.198261,(((Lipomyces suomiensis NRRL Y-17356:0.234623,Lipomyces oligophaga NRRL Y-17247:0.370846)1:0.0775974,((Lipomyces japonicus NRRL Y-17848:0.3372,Lipomyces lipofer NRRL Y-11555:0.166258)1:0.0562401,(Lipomyces doorenjongii NRRL Y-27504:0.289327,(Lipomyces kononenkoae NRRL Y-11553:0.0897564,(Lipomyces starkeyi NRRL Y-11557:0.0198789,(Lipomyces mesembrius NRRL Y-27506:0.0193032,Lipomyces arxii NRRL Y-17921:0.0198748)1:0.00839469)1:0.0452686)1:0.113493)1:0.0365204)1:0.0522388)1:0.351588,(((Trigonopsis vinaria NRRL Y-5715:0.32117,Trigonopsis variabilis NRRL Y-1579:0.36434)1:0.434566,(Botryozyma nematodophila NRRL Y-17705:0.702864,(Tortispora starmeri NRRL Y-63665:0.502464,(Tortispora caseinolytica NRRL Y-17796:0.0396928,Tortispora ganteri NRRL Y-17035:0.0458542)1:0.458583)1:0.374135)1:0.158759)1:0.0771598,((((Nadsonia fulvescens var. elongata DSM 6958:0.0202083,Nadsonia fulvescens NRRL Y-12810:0.0176171)1:0.536297,(Candida hispaniensis NRRL Y-5580:0.422522,(Yarrowia bubula NRRL Y-63668:0.0502129,(Yarrowia keelungensis JCM 14894:0.0300806,(Yarrowia lipolytica:0.0264517,(Yarrowia divulgata NRRL Y-63741:0.00987236,Yarrowia deformans JCM 1694:0.0108765)1:0.0239202)1:0.00862142)1:0.0258247)1:0.296485)1:0.408355)1:0.0777756,((Middelhovenomyces tepae NRRL Y-17670:0.443049,((Saprochaete clavata:0.309611,Magnusiomyces tetrasperma NRRL Y-7288:0.34292)1:0.186613,(Galactomyces candidus Phaff 72-186:0.207517,(Dipodascus geniculatus NRRL Y-17628:0.0852517,Dipodascus albidus NRRL Y-12859:0.0862487)1:0.229904)1:0.189193)1:0.149192)1:0.0518788,(((Deakozyma indianensis NRRL YB-1937:0.184702,Candida incommunis NRRL Y-17085:0.20747)1:0.543275,((Wickerhamiella infanticola DS02:0.528425,Wickerhamiella cacticola NRRL Y-27362:0.692381)1:0.075832,(Wickerhamiella versatilis JCM 5958:0.645274,(Wickerhamiella domercqiae:0.626221,(Candida apicola NRRL Y-50540:0.434359,Starmerella bombicola JCM 9596:0.383847)1:0.356841)1:0.0846685)1:0.155283)1:0.413088)1:0.0954418,(((Sugiyamaella lignohabitans CBS 10342:0.411366,(Diddensiella caesifluorescens NRRL Y-48781:0.336519,Spencermartinsiella europaea NRRL Y-48265:0.41893)1:0.0421993)1:0.0384646,(Groenewaldozyma salmanticensis NRRL Y-17090:0.561259,(Zygoascus meyerae NRRL Y-17319:0.366231,Zygoascus ofunaensis NRRL Y-10998:0.397239)1:0.214422)1:0.0535895)1:0.0458319,(Blastobotrys muscicola NRRL Y-7993:0.458918,((Blastobotrys mokoenaii NRRL Y-27120:0.362928,(Blastobotrys proliferans NRRL Y-17577:0.228429,Blastobotrys nivea NRRL Y-17581:0.269851)1:0.158495)1:0.079695,(Blastobotrys serpentis NRRL Y-48249:0.327946,((Blastobotrys raffinosifermentans:0.0217085,Blastobotrys adeninivorans:0.018147)1:0.222596,(Blastobotrys peoriensis NRRL YB-2290:0.169572,Blastobotrys americana NRRL Y-6844:0.161305)1:0.170868)1:0.173794)1:0.0621326)1:0.0484003)1:0.062313)1:0.0537951)1:0.0469088)1:0.0867807)1:0.0634323,((Alloascoidea hylecoeti JCM 7604:0.573891,(Sporopachydermia lactativora NRRL Y-11591:0.293628,Sporopachydermia quercuum JCM 9486:0.229415)1:0.463025)1:0.0601744,((((Ascoidea asiatica JCM 7603:0.367013,Ascoidea rubescens:0.321961)1:0.263464,(Saccharomycopsis capsularis NRRL Y-17639:0.190582,Saccharomycopsis malanga JCM 7620:0.198358)1:0.40498)1:0.163324,((Candida ponderosae NRRL YB-2307:0.38206,((Starmera quercuum NRRL YB-4281:0.250343,(Starmera amethionina NRRL Y-10978:0.208149,Candida stellimalicola NRRL Y-17912:0.200412)1:0.200109)1:0.0953975,((Wickerhamomyces ciferrii NRRL Y-1031:0.190972,Wickerhamomyces anomalus:0.135192)1:0.110022,((Wickerhamomyces hampshirensis NRRL YB-4128:0.251418,(Candida freyschussii:0.200517,((Cyberlindnera xylosilytica NRRL YB-2097:0.171593,(Cyberlindnera fabianii JCM 3601:0.173452,(Cyberlindnera petersonii NRRL YB-3808:0.146495,(Cyberlindnera americana NRRL Y-2156:0.124404,Candida mycetangii NRRL Y-6843:0.138201)1:0.021936)1:0.0555066)1:0.0255677)1:0.104307,((Cyberlindnera mrakii NRRL Y-1364:0.0362246,(Cyberlindnera saturnus NRRL Y-17396:0.0192395,Cyberlindnera suaveolens NRRL Y-17391:0.0161438)1:0.0136523)1:0.121465,((Cyberlindnera jadinii NRRL Y-1542:0.216631,Candida vartiovaarae:0.174307)1:0.0287187,(Cyberlindnera maclurae NRRL Y-5377:0.0723855,Cyberlindnera misumaiensis NRRL Y-17389:0.0590068)1:0.157678)1:0.0254444)1:0.128382)1:0.0244259)1:0.0399877)1:0.0690847,((Wickerhamomyces alni NRRL Y-11625:0.198181,(Wickerhamomyces canadensis NRRL Y-1888:0.0181265,Wickerhamomyces sp.:0.0258553)1:0.152098)1:0.104484,(Wickerhamomyces bovis NRRL YB-4184:0.238507,((Barnettozyma hawaiiensis NRRL Y-27270:0.0769162,(Barnettozyma californica NRRL Y-17395:0.0637227,Barnettozyma populi NRRL Y-12728:0.069715)1:0.012496)1:0.171001,((Barnettozyma pratensis NRRL Y-12696:0.134345,Barnettozyma salicaria NRRL Y-6780:0.201535)1:0.0253729,(Candida montana NRRL Y-17326:0.18273,((Phaffomyces thermotolerans NRRL Y-11709:0.0347558,Candida orba NRRL Y-27336:0.0268361)1:0.0450689,(Phaffomyces opuntiae NRRL Y-11707:0.0227806,Phaffomyces antillensis NRRL Y-12881:0.0381186)1:0.0503677)1:0.136412)1:0.0550969)1:0.0252933)1:0.148508)1:0.0456798)1:0.0515684)1:0.0559147)1:0.0396837)1:0.0394501)1:0.188948,(((Hanseniaspora osmophila NRRL Y-1613:0.0533805,Hanseniaspora vineae:0.0482455)1:0.375889,((Hanseniaspora singularis:0.230831,Hanseniaspora valbyensis NRRL Y-1626:0.170847)1:0.0889552,(Kloeckera hatyaiensis:0.149005,(Hanseniaspora pseudoguilliermondii:0.11701,(Hanseniaspora uvarum:0.0603265,Hanseniaspora clermontiae NRRL Y-27515:0.0811774)1:0.037012)1:0.118708)1:0.169466)1:0.805928)1:0.306057,((((Kluyveromyces aestuarii NRRL YB-4510:0.247878,(Kluyveromyces marxianus CBS6556:0.14186,(Kluyveromyces lactis NRRL Y-1140:0.0794227,Kluyveromyces dobzhanskii NRRL Y-1974:0.107991)1:0.0644926)1:0.119991)1:0.234335,((Eremothecium coryli CBS 5749:0.245286,Eremothecium sinecaudum ATCC 58844:0.262753)1:0.0575176,(Eremothecium cymbalariae DBVPG 7215:0.226178,(Eremothecium gossypii ATCC 10895:0.046311,Ashbya aceri:0.0356574)1:0.257241)1:0.0330026)1:0.17076)1:0.0607471,(Lachancea kluyveri:0.221801,((Lachancea fermentati:0.125926,Lachancea cidri:0.116386)1:0.108281,(Lachancea mirantina:0.360697,((Lachancea waltii:0.155994,(Lachancea quebecensis:0.0412753,Lachancea thermotolerans CBS 6340:0.0381374)1:0.122374)1:0.048069,(Lachancea nothofagi:0.125696,(Lachancea dasiensis:0.187333,(Lachancea meyersii CBS 8951:0.0930237,(Lachancea fantastica:0.0613265,Lachancea lanzarotensis CBS 12615:0.0662562)1:0.080869)1:0.0868343)1:0.0232028)1:0.0796876)1:0.11944)1:0.0368276)1:0.0869217)1:0.0544235)1:0.046723,(((Zygosaccharomyces rouxii CBS 732:0.143413,(Zygosaccharomyces kombuchaensis NRRL YB-4811:0.0926322,(Zygosaccharomyces bisporus NRRL Y-12626:0.083556,Zygosaccharomyces bailii:0.0939337)1:0.0304452)1:0.0574531)1:0.176842,((Zygotorulaspora florentina NRRL Y-1560:0.131232,Zygotorulaspora mrakii NRRL Y-12654:0.168677)1:0.11848,(Torulaspora microellipsoides:0.15825,(Torulaspora maleeae CBS 10694:0.172696,(Torulaspora delbrueckii:0.0799621,(Torulaspora franciscae NRRL Y-17532:0.0354865,Torulaspora pretoriensis NRRL Y-17251:0.0343667)1:0.0834631)1:0.0804511)1:0.0953121)1:0.0235795)1:0.0481102)1:0.0871222,(((Tetrapisispora blattae:0.271746,Yueomyces sinensis NRRL Y-17406:0.347888)1:0.216158,(Vanderwaltozyma polyspora:0.261306,(Tetrapisispora iriomotensis NRRL Y-27309:0.150965,(Tetrapisispora phaffii CBS 4417:0.100885,(Tetrapisispora namnaoensis NRRL Y-27982:0.0531639,Tetrapisispora fleetii NRRL Y-27350:0.0682282)1:0.0667913)1:0.0911273)1:0.204252)1:0.0968006)1:0.049682,((((Nakaseomyces bacillisporus CBS 7720:0.318907,_Candida_ castellii CBS 4332:0.44969)1:0.119593,(_Candida_ glabrata CBS 138:0.19376,(_Candida_ bracarensis CBS 10154:0.0791127,(_Candida_ nivariensis CBS 9983:0.0591139,Nakaseomyces delphensis CBS 2170:0.1071)1:0.0282267)1:0.118561)1:0.24292)1:0.043942,((Saccharomyces uvarum:0.01864,Saccharomyces eubayanus:0.0211527)1:0.0363173,(Saccharomyces arboricola:0.0587131,(Saccharomyces kudriavzevii:0.0570128,(Saccharomyces mikatae IFO 1815:0.0529368,(Saccharomyces paradoxus:0.0250749,Saccharomyces cerevisiae S288C:0.0325262)1:0.0191755)1:0.0192692)1:0.00934172)1:0.0155583)1:0.277733)1:0.0304696,((Naumovozyma dairenensis:0.244773,Naumovozyma castellii:0.223994)1:0.116605,(((Kazachstania africana CBS 2517:0.302329,Kazachstania viticola NRRL Y-27206:0.304357)1:0.0420759,((Kazachstania turicensis NRRL Y-48834:0.232443,Kazachstania kunashirensis NRRL Y-27209:0.160829)1:0.120327,(Kazachstania spencerorum NRRL Y-17920:0.238158,Kazachstania rosinii NRRL Y-17919:0.204563)1:0.0374176)1:0.0694195)1:0.0333483,((Kazachstania intestinalis NRRL Y-48847:0.427517,Kazachstania martiniae NRRL Y-409:0.262551)1:0.0379646,((Kazachstania naganishii CBS 8797:0.335856,Kazachstania bromeliacearum NRRL Y-48836:0.198593)1:0.0338563,(Kazachstania taianensis NRRL Y-48846:0.27887,((Kazachstania transvaalensis NRRL Y-17245:0.111612,Kazachstania yakushimaensis NRRL Y-48837:0.0900106)1:0.290831,(Kazachstania siamensis NRRL Y-48842:0.114965,(Kazachstania unispora NRRL Y-1556:0.0645858,(Kazachstania solicola NRRL Y-27207:0.0241196,Kazachstania aerobia NRRL Y-27976:0.0305719)1:0.0678491)1:0.059458)1:0.1733)1:0.0384928)1:0.0508605)1:0.0761265)1:0.0382292)1:0.0669668)1:0.036691)1:0.0374781)1:0.0230192)1:0.115608)1:0.127779)1:0.342113)1:0.0913588)1:0.0347262,(((Pachysolen tannophilus NRRL Y-2460:0.313751,((Peterozyma xylosa NRRL Y-12939:0.0402272,Peterozyma toletana NRRL YB-4247:0.0398928)1:0.321195,(Nakazawaea peltata JCM 9829:0.323069,Nakazawaea holstii NRRL Y-2155:0.206923)1:0.167264)1:0.0471457)1:0.163091,(((Citeromyces siamensis NRRL Y-27975:0.199314,(Citeromyces hawaiiensis NRRL Y-11581:0.0676646,Citeromyces matritensis NRRL Y-2407:0.0674657)1:0.134721)1:0.41892,(Komagataella pastoris:0.0617151,(Komagataella populi NRRL YB-455:0.0093125,Komagataella pseudopastoris NRRL Y-27603:0.00934262)1:0.0520784)1:0.548169)1:0.0572955,(Kuraishia ogatae NRRL Y-48474:0.423004,((Kuraishia capsulata:0.167402,Kuraishia molischiana NRRL Y-27899:0.174477)1:0.340405,(Candida boidinii JCM 9604:0.409104,((Ogataea methylivora NRRL Y-17250:0.262112,(Ogataea ramenticola NRRL YB-1985:0.331126,(Candida succiphila JCM 9445:0.377882,Ogataea naganishii NRRL Y-7654:0.377342)1:0.0486474)1:0.0581327)1:0.0742491,((((Ogataea nitratoaversa NRRL Y-48449:0.140695,Ogataea pilisensis NRRL Y-27598:0.121524)1:0.101152,(Candida arabinofermentans NRRL YB-2248:0.23367,(Ogataea trehalophila NRRL Y-6781:0.0634693,Ogataea methanolica JCM 10240:0.0635138)1:0.143303)1:0.0364214)1:0.0681563,((Ogataea trehaloabstinens NRRL Y-27595:0.240241,Ogataea populi-albae NRRL Y-48632:0.19583)1:0.109824,((Ogataea zsoltii NRRL Y-27601:0.106801,(Ogataea glucozyma NRRL YB-2185:0.125497,(Ogataea henricii NRRL YB-2194:0.0652918,Ogataea pini NRRL Y-11528:0.0832313)1:0.0564285)1:0.0349258)1:0.117879,((Ogataea minuta NRRL Y-411:0.0815234,Ogataea nonfermentans NRRL YB-2203:0.0649159)1:0.0858242,(Ogataea kodamae NRRL Y-17234:0.276318,(Ogataea philodendri NRRL Y-7210:0.16107,(Ogataea polymorpha NCYC 495 leu1.1:0.0237039,Ogataea parapolymorpha:0.0123489)1:0.137202)1:0.0329933)1:0.0274717)1:0.178127)1:0.0484727)1:0.0552351)1:0.0549412,((Ambrosiozyma maleeae NRRL Y-63635:0.258273,((Ambrosiozyma kashinagacola JCM 15019:0.196206,(Ambrosiozyma pseudovanderkliftii NRRL Y-63632:0.103065,Ambrosiozyma vanderkliftii NRRL Y-63633:0.0839667)1:0.0913495)1:0.0409106,(Ambrosiozyma monospora JCM 7599:0.234639,(Ambrosiozyma oregonensis NRRL Y-6106:0.0826625,(Ambrosiozyma philentoma NRRL Y-7523:0.0357081,Ambrosiozyma ambrosiae NRRL Y-7524:0.0705379)1:0.026201)1:0.130669)1:0.03731)1:0.0668046)1:0.117317,((Brettanomyces custersianus NRRL Y-6653:0.31306,(Brettanomyces anomalus:0.0854333,Brettanomyces bruxellensis CBS 2499:0.0907076)1:0.224162)1:0.282927,((Kregervanrija fluxuum NRRL YB-4273:0.0355143,Kregervanrija delftensis NRRL Y-7119:0.0311594)1:0.225534,((Martiniozyma abiesophila NRRL Y-11514:0.320478,((Saturnispora mendoncae NRRL Y-11515:0.161201,Saturnispora silvae NRRL Y-6725:0.331441)1:0.105865,(Saturnispora saitoi NRRL Y-6671:0.0911533,(Saturnispora zaruensis NRRL Y-7008:0.0580631,(Saturnispora dispora NRRL Y-1447:0.031157,(Saturnispora serradocipensis NRRL Y-48717:0.0165811,Saturnispora hagleri NRRL Y-27828:0.0129394)1:0.0233711)1:0.0308985)1:0.0776961)1:0.125167)1:0.181222)1:0.143022,((Candida sorboxylosa JCM 1536:0.372151,Pichia terricola NRRL YB-4310:0.256406)1:0.0700447,(Pichia membranifaciens KS47-1:0.213499,((Pichia heedii NRRL Y-10967:0.130518,Pichia nakasei NRRL Y-7686:0.123153)1:0.187264,((Pichia norvegensis NRRL Y-7687:0.307748,Pichia kudriavzevii:0.274245)1:0.047663,(Pichia occidentalis NRRL Y-7552:0.190823,Pichia exigua NRRL Y-10920:0.216283)1:0.0273444)1:0.0202107)1:0.0282289)1:0.0444849)1:0.151672)1:0.0978808)1:0.150478)1:0.0843851)1:0.0446598)1:0.111139)1:0.0367086)1:0.137306)1:0.0425494)1:0.0600483)1:0.0499527)1:0.103505,(Babjeviella inositovora NRRL Y-12698:0.594547,((Cephaloascus albidus:0.18956,Cephaloascus fragrans:0.210025)1:0.210658,((Candida schatavii NRRL Y-17078:0.29428,(Candida fragi NRRL Y-17910:0.0714581,Kurtzmaniella cleridarum NRRL Y-48386:0.0735961)1:0.306068)1:0.108229,(((Candida athensensis NRRL Y-27644:0.132895,(Meyerozyma guilliermondii ATCC 6260:0.0289919,(Candida carpophila JCM 9396:0.0151985,Meyerozyma caribbica:0.0185042)1:0.0206601)1:0.0934175)1:0.329014,(Candida ascalaphidarum NRRL Y-27908:0.414658,((Candida gorgasii NRRL Y-27707:0.221357,Candida tammaniensis NRRL Y-8257:0.186332)1:0.101116,(Yamadazyma scolyti NRRL Y-5512:0.270025,(Yamadazyma tenuis:0.191175,(Yamadazyma nakazawae NRRL Y-7903:0.0860963,Yamadazyma philogaea NRRL Y-7813:0.119211)1:0.13583)1:0.0698957)1:0.0621763)1:0.179539)1:0.0478873)1:0.0252656,(((Millerozyma acaciae JCM 10732:0.318905,(Debaryomyces maramus NRRL Y-2171:0.126252,(Debaryomyces nepalensis NRRL Y-7108:0.107212,(Debaryomyces hansenii:0.0420625,(Debaryomyces prosopidis NRRL Y-27369:0.0489959,(Debaryomyces subglobosus NRRL Y-6666:0.0269918,Debaryomyces fabryi NRRL Y-17914:0.0215588)1:0.00458487)1:0.0217112)1:0.0474478)1:0.0562497)1:0.0791464)1:0.0717927,((Priceomyces carsonii NRRL YB-4275:0.202197,(Priceomyces medius NRRL Y-7122:0.126528,(Priceomyces haplophilus JCM 1635:0.134127,Priceomyces castillae NRRL Y-7501:0.0664317)1:0.052666)1:0.106057)1:0.170928,(((Wickerhamia fluorescens JCM 1821:0.309207,(Teunomyces gatunensis NRRL Y-48064:0.139302,(Teunomyces cretensis NRRL Y-27777:0.0373482,Teunomyces kruisii NRRL Y-17087:0.0354532)1:0.0674172)1:0.152253)1:0.0395823,((Suhomyces pyralidae NRRL Y-27085:0.207777,(Suhomyces tanzawaensis NRRL Y-17324:0.114461,(Suhomyces canberraensis NRRL YB-2417:0.126395,Suhomyces emberorum NRRL Y-27606:0.157814)1:0.0330656)1:0.074523)1:0.0880461,(Aciculoconidium aculeatum NRRL YB-4298:0.278681,(Kodamaea laetipori NRRL Y-27713:0.166081,(Kodamaea ohmeri NRRL Y-1932:0.120016,Candida restingae NRRL Y-27358:0.122045)1:0.175941)1:0.0561324)1:0.13211)1:0.0306706)1:0.0320665,((Scheffersomyces stipitis:0.162145,Scheffersomyces lignosus JCM 9837:0.141854)1:0.103183,(((Spathaspora hagerdaliae:0.0274865,Spathaspora gorwiae UFMG-CM-Y312:0.0270552)1:0.185213,(Spathaspora passalidarum NRRL Y-27907:0.0756431,(Spathaspora arborariae:0.0863436,Spathaspora girioi:0.103206)1:0.0276678)1:0.158335)1:0.0543878,((Candida corydali NRRL Y-27910:0.321211,(Lodderomyces elongisporus:0.271322,(Candida parapsilosis:0.0662414,Candida orthopsilosis:0.0591273)1:0.173632)1:0.103296)1:0.0375885,((Candida dubliniensis CD36:0.0370067,Candida albicans WO-1:0.0309348)1:0.126495,(Candida tropicalis ATCC 200956 MY1012:0.0573369,Candida sojae GF41:0.0691758)1:0.118022)1:0.0968903)1:0.0675366)1:0.119154)1:0.0332128)1:0.0611332)1:0.0307845)1:0.0194503,(((Hyphopichia homilentoma JCM 1507:0.231014,Hyphopichia burtonii NRRL Y-1933:0.195628)1:0.0539724,(Danielozyma ontarioensis NRRL YB-1246:0.28361,(Candida gotoi NRRL Y-27225:0.0656244,(Hyphopichia heimii NRRL Y-7502:0.0226493,Candida rhagii NRRL Y-2594:0.0238606)1:0.068766)1:0.157449)1:0.0369338)1:0.0713511,((Candida heveicola NRRL Y-48716:0.134205,_Candida_ auris:0.137532)1:0.207365,(Candida oregonensis NRRL Y-5850:0.222047,(((Candida intermedia JCM 1607:0.130323,Candida blattae NRRL Y-27698:0.127583)1:0.100258,(Clavispora lusitaniae:0.147865,Clavispora fructus NRRL Y-17072:0.15848)1:0.137841)1:0.0302907,((Candida wancherniae NRRL Y-48709:0.246543,(Metschnikowia bicuspidata var. bicuspidata NRRL YB-4993:0.172847,Candida golubevii NRRL Y-48707:0.168165)1:0.0922754)1:0.0530619,(Candida hawaiiana:0.166731,(Metschnikowia kipukae UWOPS 00-669.2:0.116121,((Metschnikowia hibisci UWOPS 95-797.2:0.0472722,(Metschnikowia shivogae UWOPS 04-310.1:0.0168883,Metschnikowia aberdeeniae SUB 05-213.1:0.0146631)1:0.0315668)1:0.0981931,((Metschnikowia proteae:0.00747509,Metschnikowia drakensbergensis:0.00548386)1:0.0718813,((Metschnikowia arizonensis UWOPS 99-103.4:0.0768031,(Metschnikowia similis UWOPS 03-133.4:0.0158634,(Metschnikowia dekortorum:0.00848135,Metschnikowia bowlesiae:0.00946469)1:0.00906119)1:0.100881)1:0.019975,((Metschnikowia kamakouana UWOPS 04-112.5:0.0238126,(Metschnikowia hawaiiensis UWOPS 87-2203.2:0.0113058,(Metschnikowia hamakuensis UWOPS 04-199.1:0.0101785,Metschnikowia mauinuiana UWOPS 04-190.1:0.00865049)1:0.00277958)1:0.0283861)1:0.0126143,((Candida ipomoeae UWOPS 10-104.1:0.0100707,Metschnikowia borealis SUB 99-207.1:0.0167867)1:0.00210267,((Metschnikowia lochheadii UWOPS 99-661.1:0.00996666,(Metschnikowia matae var. matae UFMG-CM-Y391A:0.00424069,Metschnikowia matae var. maris UFMG-CM-Y397T:0.00348643)1:0.00958686)1:0.00918633,(Metschnikowia continentalis UWOPS 95-402.1:0.00666829,(Metschnikowia santaceciliae UWOPS 01-517a1:0.00622675,Metschnikowia cerradonensis:0.00638518)1:0.00224705)1:0.00605543)1:0.00228128)1:0.0140057)1:0.0477555)1:0.0216892)1:0.0216014)1:0.0448311)1:0.0790685)1:0.148907)1:0.104645)1:0.0330591)1:0.0346064)1:0.191308)1:0.0501198)1:0.0235663)1:0.0497414)1:0.249136)1:0.0750128)1:0.0732652)1:0.049717)1:0.219066)1:0.165959)1:0.126267)1:0.0731174)1:0.168976)1:0.15046)1:0.545914);\",\n \"r2t\" : \"(Schizosaccharomyces pombe:0.126204,(Saitoella complicata:0.0885746,((Arthrobotrys oligospora:0.0619566,(((Botrytis cinerea:0.0159599,Sclerotinia sclerotiorum:0.0144928)100:0.0963903,(Fusarium graminearum:0.0510591,(Neurospora crassa:0.0739745,Thermothelomyces heterothallicus:0.0683393)100:0.0362615)100:0.0584987)100:0.0447412,(((Zymoseptoria tritici:0.0711361,Passalora fulva:0.0715012)100:0.0977923,(Curvularia lunata:0.0396482,Parastagonospora nodorum:0.0402995)100:0.0997238)100:0.0445184,(Xylona heveae:0.0827906,(Coccidioides immitis:0.084686,(Aspergillus glaucus:0.0668904,(Aspergillus nidulans:0.0401227,Aspergillus oryzae:0.0447877)100:0.0146822)100:0.0489525)100:0.0540695)100:0.0225032)100:0.0234296)97:0.0417394)100:0.0878736,((Lipomyces japonicus NRRL Y-17848:0.083055,((Lipomyces suomiensis NRRL Y-17356:0.063608,Lipomyces oligophaga NRRL Y-17247:0.0762265)100:0.0217226,(Lipomyces doorenjongii NRRL Y-27504:0.0786482,(Lipomyces lipofer NRRL Y-11555:0.0650201,(Lipomyces kononenkoae NRRL Y-11553:0.0459803,((Lipomyces starkeyi NRRL Y-11557:0.00681505,Lipomyces starkeyi:0.00528117)100:0.0119879,(Lipomyces mesembrius NRRL Y-27506:0.0232923,Lipomyces arxii NRRL Y-17921:0.0349869)100:0.00929258)100:0.0178152)100:0.0224125)100:0.0117255)100:0.0112742)100:0.0161427)100:0.0443967,(((Trigonopsis variabilis NRRL Y-1579:0.0918385,Trigonopsis vinaria NRRL Y-5715:0.0778916)100:0.0634075,(Botryozyma nematodophila NRRL Y-17705:0.126145,(Tortispora starmeri NRRL Y-63665:0.0822969,(Tortispora caseinolytica NRRL Y-17796:0.0293182,Tortispora ganteri NRRL Y-17035:0.0348557)100:0.0511304)100:0.0413347)100:0.0281241)100:0.0197302,(((Middelhovenomyces tepae NRRL Y-17670:0.111319,((Galactomyces candidus Phaff 72-186:0.0669059,(Dipodascus geniculatus NRRL Y-17628:0.0585418,Dipodascus albidus NRRL Y-12859:0.0802071)100:0.032647)100:0.0352005,((Saprochaete clavata:0.0573717,(Magnusiomyces capitatus:0.0225681,Magnusiomyces capitatus:0.00343673)100:0.0266914)100:0.0426538,(Magnusiomyces tetrasperma NRRL Y-7288:0.0909393,(Magnusiomyces ingens:0.00426038,Magnusiomyces ingens:0.00454468)100:0.0594328)100:0.0145665)100:0.037234)100:0.0271195)100:0.0160277,(((Candida incommunis NRRL Y-17085:0.0714356,Deakozyma indianensis NRRL YB-1937:0.0665043)100:0.0862172,((Wickerhamiella infanticola DS02:0.112297,Wickerhamiella cacticola NRRL Y-27362:0.121855)100:0.0593741,(Candida hispaniensis NRRL Y-5580:0.0908408,((Yarrowia sp. JCM 30694:0.00421429,Yarrowia bubula NRRL Y-63668:0.0066085)100:0.0141797,((Yarrowia deformans JCM 1694:0.00474947,Yarrowia divulgata NRRL Y-63741:0.00788674)100:0.00896605,(Yarrowia lipolytica:0.00855678,(Yarrowia sp. JCM 30696:0.00457866,(Yarrowia sp. JCM 30695:0.00109815,Yarrowia keelungensis JCM 14894:0.000746909)100:0.00339822)100:0.00776074)100:0.0030877)100:0.00797457)100:0.0687327)100:0.084079)99:0.0269638)99:0.0226604,(((Groenewaldozyma salmanticensis NRRL Y-17090:0.11507,(Zygoascus ofunaensis NRRL Y-10998:0.0905002,(Zygoascus hellenicus NRRL Y-7136:0.0177705,Zygoascus meyerae NRRL Y-17319:0.033743)100:0.0524429)100:0.0360027)100:0.0174588,((Spencermartinsiella europaea NRRL Y-48265:0.0911582,Diddensiella caesifluorescens NRRL Y-48781:0.0884185)100:0.0161105,(Sugiyamaella valdiviana:0.0815797,(Sugiyamaella americana NRRL YB-2067:0.0856077,Sugiyamaella lignohabitans CBS 10342:0.0351246)100:0.0195916)100:0.0261745)100:0.0136807)100:0.0169933,(Blastobotrys muscicola NRRL Y-7993:0.11487,((Blastobotrys mokoenaii NRRL Y-27120:0.0956722,(Blastobotrys attinorum Y-27639:0.0521706,(Blastobotrys nivea NRRL Y-17581:0.0858854,Blastobotrys proliferans NRRL Y-17577:0.0888617)100:0.0122257)100:0.014012)100:0.0192743,(Blastobotrys serpentis NRRL Y-48249:0.10963,((Blastobotrys americana NRRL Y-6844:0.0632957,Blastobotrys peoriensis NRRL YB-2290:0.056484)100:0.0312416,(Blastobotrys adeninivorans:0.0201089,Blastobotrys raffinosifermentans:0.016445)100:0.0638897)100:0.0369131)100:0.0165191)100:0.0160658)100:0.0187613)100:0.0218206)99:0.0218424)99:0.0323467,((Nadsonia fulvescens NRRL Y-12810:0.0431276,Nadsonia fulvescens var. elongata DSM 6958:0.0290928)100:0.100074,((Alloascoidea hylecoeti JCM 7604:0.142779,(Sporopachydermia lactativora NRRL Y-11591:0.0716173,Sporopachydermia quercuum JCM 9486:0.060207)100:0.0533148)77:0.0184655,(((Ascoidea asiatica JCM 7603:0.0909876,Ascoidea rubescens:0.0923764)100:0.0555868,(Saccharomycopsis fermentans NRRL Y-17710:0.0670507,(Saccharomycopsis malanga JCM 7620:0.0537866,Saccharomycopsis capsularis NRRL Y-17639:0.0726377)100:0.0293327)100:0.0505221)100:0.0351169,((((Candida ponderosae NRRL YB-2307:0.116821,(Starmera quercuum NRRL YB-4281:0.0867524,(Candida stellimalicola NRRL Y-17912:0.0710683,Starmera amethionina NRRL Y-10978:0.0660149)100:0.038032)100:0.024918)91:0.0146313,((Wickerhamomyces anomalus:0.0497049,Wickerhamomyces ciferrii NRRL Y-1031:0.0512548)100:0.0264792,(((Wickerhamomyces alni NRRL Y-11625:0.0754478,(Wickerhamiella azyma NRRL Y-17067:0.0310146,Wickerhamomyces canadensis NRRL Y-1888:0.0326725)100:0.0453877)100:0.0288606,(Wickerhamomyces bovis NRRL YB-4184:0.083978,((Barnettozyma hawaiiensis NRRL Y-27270:0.0506112,(Barnettozyma populi NRRL Y-12728:0.0521714,Barnettozyma californica NRRL Y-17395:0.0407995)100:0.00921085)100:0.0371517,((Barnettozyma pratensis NRRL Y-12696:0.0622423,Barnettozyma salicaria NRRL Y-6780:0.069559)100:0.0123131,(Candida montana NRRL Y-17326:0.0751889,((Candida orba NRRL Y-27336:0.0339559,Phaffomyces thermotolerans NRRL Y-11709:0.0339438)100:0.0210789,(Phaffomyces antillensis NRRL Y-12881:0.0392326,Phaffomyces opuntiae NRRL Y-11707:0.0320823)100:0.0209823)100:0.0419267)100:0.0220956)100:0.0105821)100:0.0313017)100:0.0153705)100:0.0180182,((Wickerhamomyces hampshirensis NRRL YB-4128:0.0842166,Candida freyschussii:0.0702627)100:0.0145882,(((Cyberlindnera xylosilytica NRRL YB-2097:0.0615196,Cyberlindnera fabianii JCM 3601:0.0530417)100:0.011541,(Cyberlindnera petersonii NRRL YB-3808:0.0626946,(Candida mycetangii NRRL Y-6843:0.0582128,Cyberlindnera americana NRRL Y-2156:0.0598929)100:0.0114685)100:0.0159979)100:0.0264469,((Cyberlindnera maclurae NRRL Y-5377:0.0526604,Cyberlindnera misumaiensis NRRL Y-17389:0.0442506)100:0.0440499,(Cyberlindnera jadinii NRRL Y-1542:0.0725383,(Candida vartiovaarae:0.0625927,(Cyberlindnera mrakii NRRL Y-1364:0.0367754,(Cyberlindnera saturnus NRRL Y-17396:0.0287399,Cyberlindnera suaveolens NRRL Y-17391:0.0232996)100:0.0160669)100:0.0292767)100:0.0102841)100:0.0092162)100:0.0263359)100:0.0154825)100:0.0219838)100:0.0164339)95:0.0119649)100:0.0468189,((Saccharomycodes ludwigii UTAD17:0.114355,((Hanseniaspora vineae:0.0341913,Hanseniaspora osmophila NRRL Y-1613:0.0381317)100:0.0685352,((Hanseniaspora singularis:0.0663886,Hanseniaspora valbyensis NRRL Y-1626:0.0517474)100:0.0155812,(Kloeckera hatyaiensis:0.0523116,(Hanseniaspora pseudoguilliermondii:0.0562921,(Hanseniaspora uvarum:0.0346921,Hanseniaspora clermontiae NRRL Y-27515:0.0475276)100:0.0145255)100:0.0211695)100:0.0279143)100:0.114557)100:0.0384264)100:0.0348094,(((((Eremothecium cymbalariae DBVPG 7215:0.0482528,Eremothecium gossypii ATCC 10895:0.0869488)100:0.0173328,(Eremothecium sinecaudum ATCC 58844:0.0547745,Eremothecium coryli CBS 5749:0.0443996)55:0.00927931)100:0.0479904,(Kluyveromyces aestuarii NRRL YB-4510:0.0661155,(Kluyveromyces marxianus CBS6556:0.0381194,(Kluyveromyces dobzhanskii NRRL Y-1974:0.0402393,Kluyveromyces lactis NRRL Y-1140:0.0242856)100:0.0197354)100:0.0335599)100:0.051824)100:0.0229944,(Lachancea kluyveri:0.0625351,((Lachancea cidri:0.185105,Lachancea mirantina:0.119783)99:0.0288772,((Lachancea dasiensis:0.1214,(Lachancea waltii:0.00819208,(Lachancea meyersii CBS 8951:0.183661,Lachancea nothofagi:0.158248)92:0.0175256)35:0.000265047)81:0.0265036,(Lachancea lanzarotensis CBS 12615:0.0483696,(Lachancea quebecensis:0.0129892,(Lachancea thermotolerans CBS 6340:0.00142213,Lachancea thermotolerans:0.00168073)100:0.00945148)100:0.0453357)95:0.0251145)61:0.0240587)100:0.0154712)100:0.0115994)100:0.0190621,((((Zygosaccharomyces kombuchaensis NRRL YB-4811:0.046758,(Zygosaccharomyces bisporus NRRL Y-12626:0.0360355,Zygosaccharomyces bailii:0.0398601)100:0.0121151)100:0.0202831,(Zygosaccharomyces sapae:0.0121896,(Zygosaccharomyces rouxii v1:0.00340107,Zygosaccharomyces rouxii:0.00320738)100:0.00810975)100:0.0509075)100:0.0714314,((Torulaspora microellipsoides:0.0475723,(Zygotorulaspora florentina NRRL Y-1560:0.0483917,Zygotorulaspora mrakii NRRL Y-12654:0.055265)100:0.0283279)99:0.00902968,(Torulaspora maleeae CBS 10694:0.052034,(Torulaspora delbrueckii:0.0233883,(Torulaspora franciscae NRRL Y-17532:0.0262398,Torulaspora pretoriensis NRRL Y-17251:0.0244877)100:0.0186046)100:0.018761)100:0.0240214)100:0.0161415)100:0.0295256,(((Tetrapisispora blattae:0.0525052,Yueomyces sinensis NRRL Y-17406:0.099179)100:0.0421829,(Vanderwaltozyma polyspora:0.0729678,(Tetrapisispora iriomotensis NRRL Y-27309:0.0560405,(Tetrapisispora phaffii CBS 4417:0.0338951,(Tetrapisispora fleetii NRRL Y-27350:0.0348304,Tetrapisispora namnaoensis NRRL Y-27982:0.0327815)100:0.0179)100:0.0198241)100:0.048753)100:0.0314575)100:0.0246669,((Naumovozyma castellii:0.0505552,(((Kazachstania africana CBS 2517:0.0646844,(Kazachstania viticola NRRL Y-27206:0.0759366,Kazachstania martiniae NRRL Y-409:0.0521419)100:0.0130001)97:0.0077118,((Kazachstania rosinii NRRL Y-17919:0.0596281,Kazachstania spencerorum NRRL Y-17920:0.0768462)100:0.0126981,(Kazachstania turicensis NRRL Y-48834:0.0431203,Kazachstania kunashirensis NRRL Y-27209:0.0559373)100:0.0293573)100:0.0207873)97:0.0114597,(Kazachstania intestinalis NRRL Y-48847:0.0833165,(Kazachstania bromeliacearum NRRL Y-48836:0.079683,((Kazachstania taianensis NRRL Y-48846:0.078128,Kazachstania naganishii CBS 8797:0.0939904)100:0.0218932,((Kazachstania yakushimaensis NRRL Y-48837:0.0243461,Kazachstania transvaalensis NRRL Y-17245:0.0430026)100:0.0585229,(Kazachstania siamensis NRRL Y-48842:0.0457349,(Kazachstania unispora NRRL Y-1556:0.0380544,(Kazachstania solicola NRRL Y-27207:0.0275766,Kazachstania aerobia NRRL Y-27976:0.0259698)100:0.024771)100:0.0190303)100:0.0346524)100:0.0155365)100:0.010997)100:0.0149155)97:0.0121949)100:0.0163685)100:0.0115806,(((Nakaseomyces bacillisporus CBS 7720:0.0602697,_Candida_ castellii CBS 4332:0.0552284)100:0.0196278,(_Candida_ glabrata CBS 138:0.0400934,(_Candida_ bracarensis CBS 10154:0.0249734,(_Candida_ nivariensis CBS 9983:0.0220311,Nakaseomyces delphensis CBS 2170:0.029392)100:0.00532474)100:0.016744)100:0.0575278)100:0.0195602,(Lachancea fermentati:0.180518,(((Saccharomyces bayanus NBRC1948:0.00599558,(Saccharomyces eubayanus:0.0311309,(Saccharomyces pastorianus CBS 1503:0.0081642,Saccharomyces pastorianus CBS 1513:0.0041158)100:0.00354016)100:0.00386148)100:0.0060333,(Candida norvegica:0.0339226,(Saccharomyces bayanus CBS 7001:0.0182511,(Saccharomyces bayanus 623-6C CBS 7001:0.00237523,Saccharomyces uvarum:0.00363307)100:0.00208439)100:0.00457913)100:0.00367531)100:0.0171416,(Saccharomyces arboricola:0.0257175,(Saccharomyces kudriavzevii:0.0231824,((Saccharomyces jurei:0.00897546,(Saccharomyces mikatae IFO 1815:0.00132382,Saccharomyces mikatae:0.00400149)100:0.00689138)100:0.0136218,(Saccharomyces cerevisiae x Saccharomyces kudriavzevii x Saccharomyces uvarum CBS 2834:0.00682362,(Saccharomyces cerevisiae x Saccharomyces kudriavzevii:0.00517659,((Saccharomyces cerevisiae x Saccharomyces eubayanus Hybrid H1:0.00776694,(Saccharomyces pastorianus VTT A-63015:0.00325668,Saccharomyces pastorianus Weihenstephan 34/70:0.0116326)100:0.00241464)100:0.0019361,((Saccharomyces cerevisiae Vin13:0.00163674,((Saccharomyces cerevisiae x Saccharomyces mikatae:0.00797371,(Saccharomyces cerevisiae FostersO:0.00307742,(Saccharomyces paradoxus:0.0129436,Saccharomyces cerevisiae x Saccharomyces paradoxus DBVPG1373xZ1:0.00341844)100:0.00492533)99:0.00226386)88:0.000728143,(Ogataea polymorpha RB11:0.000245516,((Candida tropicalis CBS 94:0.000399229,Ogataea polymorpha CBS 4732:0.000452355)100:0.000174036,((Zygosaccharomyces rouxii CBS 732:0.000356679,Lachancea thermotolerans CBS 6340:0.000527001)87:0.000158257,(Millerozyma farinosa CBS 7064:0.000250795,(Kluyveromyces marxianus CBS 712:0.000321026,(Saccharomyces cerevisiae S288C:0.000481844,Saccharomyces cerevisiae AWRI796:0.00294417)100:0.000752871)98:0.000129624)100:0.000812457)79:6.41111e-05)78:0.000115355)100:0.00113339)88:0.000426612)88:0.000745475,(Candida gropengiesseri:0.00398597,(Candida batistae:0.00191938,((Wickerhamiella domercqiae:0.0731683,Wickerhamiella versatilis JCM 5958:0.0917899)100:0.0201985,((Candida stellata:0.0447414,(Candida davenportii:0.0883913,Starmerella bacillaris NP2:0.0706162)100:0.0389893)100:0.0266105,((Starmerella bombicola JCM 9596:0.085771,(Candida bombi:0.0676886,Candida apicola NRRL Y-50540:0.0505998)100:0.0206182)100:0.0320175,(Candida geochares:0.0607001,(Candida sorbosivorans:0.0414339,(Wickerhamiella galacta:0.00713286,Candida magnoliae:0.0215597)100:0.016667)100:0.00941328)100:0.0286677)100:0.0198253)100:0.0223772)100:0.106092)100:0.00330585)100:0.00340044)88:0.000881557)94:0.0026942)94:0.00647231)94:0.00702113)100:0.00371471)100:0.00556456)100:0.00752715)100:0.0530619)100:0.0292997)100:0.015258)100:0.0168147)100:0.0146565)100:0.0355872)100:0.027864)100:0.102054)100:0.0402833,(((Pachysolen tannophilus NRRL Y-2460:0.0808212,((Peterozyma xylosa NRRL Y-12939:0.0413235,Peterozyma toletana NRRL YB-4247:0.0363934)100:0.079557,(Nakazawaea peltata JCM 9829:0.0790579,(Nakazawaea holstii NRRL Y-2155:0.076221,Nakazawaea wickerhamii NRRL Y-2563:0.0830923)100:0.0236035)100:0.0313818)100:0.0167062)100:0.0309597,(((Citeromyces siamensis NRRL Y-27975:0.0596415,(Citeromyces hawaiiensis NRRL Y-11581:0.0404304,Citeromyces matritensis NRRL Y-2407:0.0405154)100:0.0300409)100:0.0722959,((Komagataella populi NRRL YB-455:0.00452192,Komagataella pseudopastoris NRRL Y-27603:0.00450592)100:0.0174026,(Komagataella pastoris:0.00889631,(Komagataella phaffii:0.000148318,(Komagataella phaffii GS115:4.69073e-05,Komagataella phaffii:0.000106001)100:7.7985e-05)100:0.00811704)100:0.0144677)100:0.140854)100:0.0285972,((Kuraishia ogatae NRRL Y-48474:0.0914258,(Kuraishia molischiana NRRL Y-27899:0.0581477,Kuraishia capsulata:0.0467181)100:0.0478643)100:0.0195164,(Candida boidinii JCM 9604:0.110969,(((Candida succiphila JCM 9445:0.0886966,Ogataea naganishii NRRL Y-7654:0.0959386)100:0.0167412,(Ogataea methylivora NRRL Y-17250:0.0855903,Ogataea ramenticola NRRL YB-1985:0.0987928)100:0.0178331)100:0.0227408,((((Ogataea pilisensis NRRL Y-27598:0.066275,Ogataea nitratoaversa NRRL Y-48449:0.0642773)100:0.028961,(Candida arabinofermentans NRRL YB-2248:0.0849656,(Ogataea trehalophila NRRL Y-6781:0.0487782,Ogataea methanolica JCM 10240:0.0493589)100:0.0293327)100:0.0140467)100:0.0279201,(Ogataea trehaloabstinens NRRL Y-27595:0.099808,((Ogataea zsoltii NRRL Y-27601:0.0533496,(Ogataea glucozyma NRRL YB-2185:0.0502725,(Ogataea henricii NRRL YB-2194:0.0474431,(Ogataea pini NRRL Y-11528:0.000173811,Ogataea populi-albae NRRL Y-48632:0.000238677)100:0.0473245)100:0.0117949)100:0.010016)100:0.0313845,((Ogataea nonfermentans NRRL YB-2203:0.0463412,Ogataea minuta NRRL Y-411:0.0528823)100:0.0269107,(Ogataea philodendri NRRL Y-7210:0.0685447,(Ogataea kodamae NRRL Y-17234:0.0684285,(Ogataea parapolymorpha:0.019301,(Ogataea angusta:0.00598477,Ogataea polymorpha NCYC 495 leu1.1:0.000116775)100:0.00806111)100:0.0330794)100:0.0111215)100:0.0117704)100:0.0279163)100:0.0145388)100:0.0167219)100:0.0177219,((Ambrosiozyma maleeae NRRL Y-63635:0.0833518,((Ambrosiozyma kashinagacola JCM 15019:0.0693266,(Ambrosiozyma pseudovanderkliftii NRRL Y-63632:0.0577148,Ambrosiozyma vanderkliftii NRRL Y-63633:0.0566447)100:0.0243184)100:0.0165422,(Ambrosiozyma monospora JCM 7599:0.0768011,(Ambrosiozyma oregonensis NRRL Y-6106:0.0577061,(Ambrosiozyma philentoma NRRL Y-7523:0.0407241,Ambrosiozyma ambrosiae NRRL Y-7524:0.058601)95:0.0150731)100:0.0404117)100:0.0150307)100:0.0199196)100:0.0274069,((Candida sp. JCM 15000:0.0941246,(Brettanomyces custersianus NRRL Y-6653:0.086231,(Brettanomyces anomalus:0.0318015,(Brettanomyces bruxellensis:0.000593528,(Brettanomyces bruxellensis CBS 2499:0.00109505,Brettanomyces bruxellensis:0.00264587)100:0.000384652)100:0.0247517)100:0.0615694)100:0.0521429)100:0.0778521,((Kregervanrija fluxuum NRRL YB-4273:0.0374345,Kregervanrija delftensis NRRL Y-7119:0.0405164)100:0.0638635,((Martiniozyma abiesophila NRRL Y-11514:0.109633,((Saturnispora silvae NRRL Y-6725:0.0831621,Saturnispora mendoncae NRRL Y-11515:0.067902)100:0.0265947,(Saturnispora saitoi NRRL Y-6671:0.0588065,(Saturnispora zaruensis NRRL Y-7008:0.0528894,(Saturnispora dispora NRRL Y-1447:0.0370446,(Saturnispora hagleri NRRL Y-27828:0.0255079,Saturnispora serradocipensis NRRL Y-48717:0.0340521)100:0.0169599)100:0.0125902)100:0.0247621)100:0.0299834)100:0.0367605)100:0.0308369,((Pichia terricola NRRL YB-4310:0.074898,Candida sorboxylosa JCM 1536:0.0758895)100:0.0245451,((Candida californica:0.0648764,(Pichia membranifaciens NRRL Y-2026:0.0243445,Pichia membranifaciens KS47-1:0.0209896)100:0.0311224)59:0.0177483,((Pichia norvegensis NRRL Y-7687:0.0887783,Pichia kudriavzevii:0.082125)100:0.0177134,((Pichia nakasei NRRL Y-7686:0.067107,Pichia heedii NRRL Y-10967:0.0588032)100:0.0369725,(Pichia occidentalis NRRL Y-7552:0.0675481,Pichia exigua NRRL Y-10920:0.0755201)59:0.0151337)59:0.0107938)59:0.0109712)100:0.0124365)100:0.0326334)100:0.0231644)100:0.0331026)100:0.0335554)100:0.0176088)100:0.0289504)99:0.0137276)100:0.034821)100:0.0193198)100:0.0237829)100:0.0278153,(Babjeviella inositovora NRRL Y-12698:0.0830192,((Cephaloascus fragrans:0.0569461,Cephaloascus albidus:0.0718853)100:0.0346833,((Candida schatavii NRRL Y-17078:0.091576,(Candida fragi NRRL Y-17910:0.0453009,Kurtzmaniella cleridarum NRRL Y-48386:0.0568199)100:0.0648921)100:0.0253452,((((Candida ascalaphidarum NRRL Y-27908:0.098612,Diutina catenulata:0.148142)95:0.0200365,(Candida athensensis NRRL Y-27644:0.0392514,((Meyerozyma guilliermondii:0.000908622,Meyerozyma guilliermondii ATCC 6260:0.00309795)100:0.0101255,(Meyerozyma caribbica:0.009389,Candida carpophila JCM 9396:0.00717367)100:0.00816186)100:0.0269725)100:0.0762289)92:0.0167428,((Candida tammaniensis NRRL Y-8257:0.0674796,Candida gorgasii NRRL Y-27707:0.0694565)100:0.0285249,(Yamadazyma scolyti NRRL Y-5512:0.0774375,(Candida aaseri SH-14:0.0654444,((Yamadazyma laniorum yHMH7:0.0417828,Yamadazyma tenuis:0.0402424)100:0.0282539,(Yamadazyma nakazawae NRRL Y-7903:0.0408872,Yamadazyma philogaea NRRL Y-7813:0.0504395)100:0.0356588)100:0.0194215)100:0.0124815)100:0.0205036)100:0.0585866)77:0.0121471,(((Priceomyces carsonii NRRL YB-4275:0.0773801,(Priceomyces medius NRRL Y-7122:0.0599315,(Priceomyces castillae NRRL Y-7501:0.0479101,Priceomyces haplophilus JCM 1635:0.0517119)100:0.0177603)100:0.0293383)100:0.0429337,(Millerozyma acaciae JCM 10732:0.0740945,(Debaryomyces maramus NRRL Y-2171:0.0742901,((Debaryomyces hansenii:0.0094309,Debaryomyces tyrocola:0.00741868)100:0.0123071,(Debaryomyces fabryi NRRL Y-17914:0.0115779,(Debaryomyces hansenii J6:0.00478424,(Debaryomyces subglobosus NRRL Y-6666:0.00307223,(Debaryomyces prosopidis NRRL Y-27369:0.0266364,Debaryomyces nepalensis NRRL Y-7108:0.0590941)100:0.0214071)100:0.0162527)100:0.0127128)100:0.00837282)100:0.0302908)100:0.0281444)100:0.0204554)98:0.014532,((((Wickerhamia fluorescens JCM 1821:0.0804346,(Teunomyces gatunensis NRRL Y-48064:0.0543253,(Teunomyces kruisii NRRL Y-17087:0.0250798,Teunomyces cretensis NRRL Y-27777:0.0295176)100:0.0240266)100:0.0384231)100:0.0131621,((Aciculoconidium aculeatum NRRL YB-4298:0.0837536,(Kodamaea laetipori NRRL Y-27713:0.0636316,(Kodamaea ohmeri NRRL Y-1932:0.0490485,Candida restingae NRRL Y-27358:0.0479262)100:0.0351338)100:0.0169767)100:0.0342227,(Suhomyces pyralidae NRRL Y-27085:0.0720593,((Suhomyces canberraensis NRRL YB-2417:0.0513793,Suhomyces emberorum NRRL Y-27606:0.0573297)100:0.013494,(Suhomyces tanzawaensis:0.000172874,Suhomyces tanzawaensis NRRL Y-17324:0.000124577)100:0.0429432)100:0.0187886)100:0.0236942)100:0.0114544)100:0.012213,(((Scheffersomyces lignosus JCM 9837:0.0282656,Scheffersomyces shehatae ATY839:0.0176242)100:0.034077,(Scheffersomyces stipitis:0.000518897,Scheffersomyces stipitis NRRL Y-7124:0.00119922)100:0.0475992)100:0.0326218,(((Spathaspora gorwiae UFMG-CM-Y312:0.0172059,Spathaspora sp.:0.017776)100:0.0470127,(Spathaspora arborariae:0.0407776,(Spathaspora sp.:0.0365321,(Spathaspora passalidarum NRRL Y-27907:0.000681504,(Spathaspora passalidarum:0.00100702,Spathaspora passalidarum:0.000326132)100:0.00040554)100:0.0255792)100:0.0120683)100:0.040913)100:0.0204885,((Candida corydali NRRL Y-27910:0.0859408,(Lodderomyces elongisporus:0.0706966,(Candida metapsilosis:0.0259618,(Candida orthopsilosis:0.0216995,Candida parapsilosis:0.0233949)100:0.00841778)100:0.0372902)100:0.0291739)100:0.0147675,((Candida sojae GF41:0.0310027,Candida tropicalis ATCC 200956 MY1012:0.0110004)100:0.0223129,(Candida dubliniensis CD36:0.0709642,(Naumovozyma dairenensis:0.00144647,(Candida albicans WO-1:0.00123288,Candida albicans:0.00103971)100:0.000641177)100:0.0102161)100:0.0290815)100:0.0324332)100:0.0267713)100:0.0394725)95:0.0128346)95:0.02227,(((Hyphopichia homilentoma JCM 1507:0.0587536,Hyphopichia burtonii NRRL Y-1933:0.0713047)100:0.016959,(Danielozyma ontarioensis NRRL YB-1246:0.0873366,(Candida gotoi NRRL Y-27225:0.0455032,(Candida rhagii NRRL Y-2594:0.0222124,Hyphopichia heimii NRRL Y-7502:0.0224423)100:0.0230844)100:0.0392466)100:0.0145792)100:0.0209346,((_Candida_ auris:0.0455892,(Candida heveicola NRRL Y-48716:0.0410977,Candida pseudohaemulonis B12108:0.0394728)100:0.0226688)100:0.0469312,((Candida oregonensis NRRL Y-5850:0.0865896,((Candida intermedia JCM 1607:0.042487,Candida blattae NRRL Y-27698:0.0530799)100:0.0238467,(Clavispora fructus NRRL Y-17072:0.0576833,Clavispora lusitaniae:0.0491396)100:0.0272481)100:0.0102521)96:0.0107527,(Metschnikowia bicuspidata:0.104942,((Candida wancherniae NRRL Y-48709:0.0784867,(Candida golubevii NRRL Y-48707:0.0554815,(Metschnikowia bicuspidata var. bicuspidata NRRL YB-4993:0.0413189,(Metschnikowia fructicola:0.0157945,Metschnikowia fructicola:0.0148367)100:0.0299732)100:0.0118293)100:0.0209009)100:0.0131789,((Metschnikowia drosophilae UWOPS83-1135.3:0.021045,Candida torresii CBS 5152:0.0230134)100:0.0543554,((Metschnikowia orientalis UWOPS99-745.6:0.0433538,Candida hawaiiana:0.0375214)100:0.0152737,(Metschnikowia sp. M2Y3 EBD-CdV M2Y3:0.0331658,((Metschnikowia kipukae UWOPS 00-669.2:0.0297972,(Metschnikowia hibisci UWOPS 95-797.2:0.0265758,(Metschnikowia aberdeeniae SUB 05-213.1:0.0117725,Metschnikowia shivogae UWOPS 04-310.1:0.0110661)100:0.0119074)100:0.015541)58:0.00570717,((Metschnikowia proteae:0.0057267,Metschnikowia drakensbergensis:0.0055943)100:0.0241508,(((Metschnikowia arizonensis UWOPS 99-103.4:0.0370555,Metschnikowia colocasiae UWOPS 03-202.1:0.0171738)93:0.00452229,(Metschnikowia sp. 03-147.1 UWOPS 03-147.1:0.0208946,(Metschnikowia similis UWOPS 03-133.4:0.0111303,(Metschnikowia dekortorum:0.00697665,Metschnikowia bowlesiae:0.00921332)100:0.00571605)100:0.023746)93:0.00417948)100:0.00628612,((Metschnikowia hawaiiensis UWOPS 87-2203.2:0.0301812,Metschnikowia sp. 04-218.3 UWOPS 04-218.3:0.0150044)100:0.0108385,((Metschnikowia lochheadii UWOPS 99-661.1:0.00971309,(Metschnikowia matae var. matae UFMG-CM-Y391A:0.00687815,Metschnikowia matae var. maris UFMG-CM-Y397T:0.00685245)100:0.00661365)100:0.00543424,((Metschnikowia sp. 04-226.1 UWOPS 04-226.1:0.00877917,(Metschnikowia continentalis UWOPS 95-402.1:0.00829922,(Metschnikowia santaceciliae UWOPS 01-517a1:0.00694966,Metschnikowia cerradonensis:0.00643801)100:0.0022256)100:0.00393078)100:0.00346672,((Metschnikowia cubensis MUCL 45751:0.0116299,Metschnikowia sp. 01-655c1 UWOPS 01-655c1:0.010726)100:0.00475537,(Candida ipomoeae UWOPS 10-104.1:0.0120555,(Metschnikowia borealis SUB 99-207.1:0.00434673,Metschnikowia sp. 13-106.1 UWOPS 13-106.1:0.0046889)100:0.0079509)100:0.00239546)100:0.00300571)100:0.00344102)100:0.00898957)100:0.0120361)100:0.00782286)100:0.00621084)58:0.0061066)100:0.0152811)100:0.0320067)56:0.00960016)100:0.0151264)100:0.014359)99:0.0138301)100:0.0445971)100:0.014915)94:0.00905625)92:0.0102603)100:0.0178837)100:0.0562855)100:0.0243772)100:0.0198609)100:0.0259199)57:0.0176658)100:0.0501942)100:0.045588)99:0.0241612)100:0.0456527)100:0.0313927)100:0.0580377)100:0.0449143)1:0.126204);\",\n \"LRF1\" : \"((((((((((((((((((TP53_AmelENSAMEP00000017825:0.0263[&&NHX:D=N:T=9646],TP53_MpfuENSMPUP00000008945:0.066538[&&NHX:D=N:T=9669])speciation:0.032561[&&NHX:D=N:B=99:T=379584:DD=],TP53_CfamENSCAFP00000024579:0.086484[&&NHX:D=N:T=9615])speciation:0.034068[&&NHX:D=N:B=81:T=379584:DD=],TP53_FcatENSFCAP00000008925:0.06619[&&NHX:D=N:T=9685])speciation:0.025911[&&NHX:D=N:B=31:T=33554:DD=],TP53_EcabENSECAP00000006210:0.04971[&&NHX:D=N:T=9796])speciation:0.01224[&&NHX:D=N:T=314145:B=17:DD=],(((TP53_BtauENSBTAP00000001420:0.043108[&&NHX:D=N:T=9913],TP53_OariENSOARP00000016707:0.049064[&&NHX:D=N:T=9940])speciation:0.055294[&&NHX:D=N:B=98:T=9895:DD=],TP53_TtruENSTTRP00000009721:0.022529[&&NHX:D=N:T=9739])speciation:0.022515[&&NHX:D=N:T=91561:B=39:DD=],TP53_SscrENSSSCP00000019016:0.065797[&&NHX:D=N:T=9823])speciation:0.020972[&&NHX:D=N:T=91561:B=35:DD=])speciation:0.006996[&&NHX:D=N:B=9:T=314145:DD=],TP53_SaraENSSARP00000005616:0.149927[&&NHX:D=N:T=42254])speciation:0.013221[&&NHX:D=N:T=314145:B=7:DD=],TP53_PvamENSPVAP00000015400:0.117578[&&NHX:D=N:T=132908])speciation:0.0[&&NHX:D=N:B=1:T=314145:DD=],((ENSMLUG00000006411_MlucENSMLUP00000005861:0.003702[&&NHX:D=N:T=59463],ENSMLUG00000025140_MlucENSMLUP00000016733:0.12569[&&NHX:D=N:T=59463])duplication:0.131525[&&NHX:D=Y:T=59463:B=100],TP53_EeurENSEEUP00000013295:0.183463[&&NHX:D=N:T=9365])speciation:0.042602[&&NHX:D=N:T=314145:B=33:DD=])duplication:0.018327[&&NHX:DD=Y:T=314145:B=0:D=],(((((Trp53_MmusENSMUSP00000104298:0.002681[&&NHX:D=N:T=10090],Trp53_MsspMGP_SPRETEiJ_P0028933:0.017851[&&NHX:D=N:T=10096])speciation:0.064969[&&NHX:D=N:B=100:T=862507:DD=],Tp53_RnorENSRNOP00000074031:0.079068[&&NHX:D=N:T=10116])speciation:0.12872[&&NHX:D=N:T=39107:B=100:DD=],LOC100910954_RnorENSRNOP00000064177:0.056502[&&NHX:D=N:T=10116])duplication:0.0[&&NHX:D=Y:B=5:T=39107],TP53_OpriENSOPRP00000005906:0.185911[&&NHX:D=N:T=9978])speciation:0.0[&&NHX:D=N:T=314147:B=0:DD=],((((TP53_MmurENSMICP00000039812:0.054544[&&NHX:D=N:T=30608],TP53_OgarENSOGAP00000015106:0.095719[&&NHX:D=N:T=30611])duplication:0.012762[&&NHX:D=N:B=52:T=376911:DD=],((((((TP53_HsapENSP00000269305:0.0[&&NHX:D=N:T=9606],TP53_GgorENSGGOP00000009561:0.002907[&&NHX:D=N:T=9595])speciation:0.001345[&&NHX:D=N:B=61:T=207598:DD=],TP53_PtroENSPTRP00000014836:0.000592[&&NHX:D=N:T=9598])speciation:0.00877[&&NHX:D=N:B=61:T=207598:DD=],TP53_PabeENSPPYP00000008923:0.009552[&&NHX:D=N:T=9601])speciation:4.8e-05[&&NHX:D=N:T=9604:B=100:DD=],TP53_NleuENSNLEP00000011861:0.032229[&&NHX:D=N:T=61853])speciation:0.004444[&&NHX:D=N:T=314295:B=97:DD=],((TP53_PanuENSPANP00000019643:0.007102[&&NHX:D=N:T=9555],TP53_CsabENSCSAP00000007551:0.010543[&&NHX:D=N:T=60711])speciation:0.000953[&&NHX:D=N:B=100:T=9528:DD=],TP53_MmulENSMMUP00000035274:0.043449[&&NHX:D=N:T=9544])speciation:0.019535[&&NHX:D=N:T=9528:B=55:DD=])speciation:0.013822[&&NHX:D=N:T=9526:B=52:DD=],TP53_CjacENSCJAP00000027663:0.047099[&&NHX:D=N:T=9483])speciation:0.027286[&&NHX:D=N:B=57:T=314293:DD=])speciation:0.013265[&&NHX:D=N:T=9443:B=4:DD=],TP53_TbelENSTBEP00000010189:0.222843[&&NHX:D=N:T=37347])speciation:0.008121[&&NHX:D=N:B=0:T=314146:DD=],((TP53_ItriENSSTOP00000019678:0.08339[&&NHX:D=N:T=43179],Tp53_CporENSCPOP00000012841:0.120892[&&NHX:D=N:T=10141])speciation:0.018406[&&NHX:D=N:T=9989:B=42:DD=],(ENSOCUG00000001138_OcunENSOCUP00000000989:0.013142[&&NHX:D=N:T=9986],ENSOCUG00000022109_OcunENSOCUP00000025959:0.090881[&&NHX:D=N:T=9986])duplication:0.069194[&&NHX:D=Y:T=9986:B=97])speciation:0.015339[&&NHX:D=N:T=314147:B=15:DD=])speciation:0.019539[&&NHX:D=N:B=0:T=314146:DD=])duplication:0.026935[&&NHX:DD=Y:T=314146:B=0:D=])speciation:0.017095[&&NHX:D=N:T=1437010:B=0:DD=],(((((((ENSLAFG00000028692_LafrENSLAFP00000023554:0.00886[&&NHX:D=N:T=9785],ENSLAFG00000030880_LafrENSLAFP00000027441:0.052436[&&NHX:D=N:T=9785])duplication:0.006909[&&NHX:D=Y:B=0:T=9785],ENSLAFG00000030555_LafrENSLAFP00000027808:0.044446[&&NHX:D=N:T=9785])duplication:0.003043[&&NHX:D=Y:T=9785:B=0],(ENSLAFG00000028299_LafrENSLAFP00000024998:0.011792[&&NHX:D=N:T=9785],ENSLAFG00000032042_LafrENSLAFP00000023389:0.017693[&&NHX:D=N:T=9785])duplication:0.015904[&&NHX:D=Y:T=9785:B=74])duplication:0.0[&&NHX:D=Y:B=0:T=9785],(((ENSLAFG00000027365_LafrENSLAFP00000025852:0.011873[&&NHX:D=N:T=9785],ENSLAFG00000026238_LafrENSLAFP00000027253:0.026457[&&NHX:D=N:T=9785])duplication:0.019571[&&NHX:D=Y:T=9785:B=81],ENSLAFG00000027669_LafrENSLAFP00000028793:0.027495[&&NHX:D=N:T=9785])duplication:0.016599[&&NHX:D=Y:T=9785:B=70],ENSLAFG00000027820_LafrENSLAFP00000028173:0.058133[&&NHX:D=N:T=9785])duplication:0.031788[&&NHX:D=Y:T=9785:B=87])duplication:0.038135[&&NHX:D=Y:T=9785:B=10],(ENSLAFG00000027348_LafrENSLAFP00000027515:0.028441[&&NHX:D=N:T=9785],ENSLAFG00000027474_LafrENSLAFP00000018379:0.03464[&&NHX:D=N:T=9785])duplication:0.131904[&&NHX:D=Y:B=100:T=9785],ENSLAFG00000007483_LafrENSLAFP00000006292:0.058399[&&NHX:D=N:T=9785])duplication:0.0075[&&NHX:D=Y:T=9785:B=23],TP53_PcapENSPCAP00000011892:0.114307[&&NHX:D=N:T=9813])speciation:0.010282[&&NHX:D=N:T=311790:B=18:DD=],(ENSETEG00000008987_EtelENSETEP00000007296:0.0[&&NHX:D=N:T=9371],ENSETEG00000009984_EtelENSETEP00000008111:0.105253[&&NHX:D=N:T=9371])duplication:0.154739[&&NHX:D=Y:B=100:T=9371])speciation:0.044399[&&NHX:D=N:T=311790:B=35:DD=])speciation:0.041158[&&NHX:D=N:B=0:T=9347:DD=],TP53_DnovENSDNOP00000004075:0.078395[&&NHX:D=N:T=9361])speciation:0.080059[&&NHX:D=N:B=0:T=9347:DD=],((TP53_SharENSSHAP00000018268:0.0496[&&NHX:D=N:T=9305],ENSMODG00000007271_MdomENSMODP00000009014:0.172546[&&NHX:D=N:T=13616])speciation:0.024952[&&NHX:D=N:T=9263:B=83:DD=],ENSMEUG00000013135_MeugENSMEUP00000011978:0.069167[&&NHX:D=N:T=9315])speciation:0.225429[&&NHX:D=N:B=83:T=9263:DD=])speciation:0.228895[&&NHX:D=N:B=81:T=32525:DD=],tp53_XtroENSXETP00000053759:0.483686[&&NHX:D=N:T=8364])speciation:0.095084[&&NHX:D=N:B=55:T=32523:DD=],(TP53_PsinENSPSIP00000014905:0.228951[&&NHX:D=N:T=13735],ENSOANG00000011981_OanaENSOANP00000018980:0.553865[&&NHX:D=N:T=9258])speciation:0.126185[&&NHX:D=N:B=48:T=32524:DD=])duplication:0.03737[&&NHX:DD=Y:B=17:T=32523:D=],TP53_LchaENSLACP00000015915:0.317935[&&NHX:D=N:T=7897])speciation:0.062274[&&NHX:D=N:B=13:T=8287:DD=],(((tp53_DrerENSDARP00000051548:0.365455[&&NHX:D=N:T=7955],tp53_AmexENSAMXP00000021366:0.579505[&&NHX:D=N:T=7994])speciation:0.105036[&&NHX:D=N:B=46:T=186626:DD=],((((((tp53_TrubENSTRUP00000030645:0.158124[&&NHX:D=N:T=31033],tp53_TnigENSTNIP00000013035:0.25403[&&NHX:D=N:T=99883])speciation:0.1396[&&NHX:D=N:T=31031:B=100:DD=],tp53_OlatENSORLP00000008029:0.359414[&&NHX:D=N:T=8090])speciation:0.040022[&&NHX:D=N:T=1489872:B=1:DD=],(tp53_GacuENSGACP00000025614:0.249641[&&NHX:D=N:T=69293],tp53_OnilENSONIP00000023874:0.251831[&&NHX:D=N:T=8128])speciation:0.085834[&&NHX:D=N:T=1489872:B=100:DD=])duplication:0.070104[&&NHX:DD=Y:T=1489872:B=0:D=],(tp53_PforENSPFOP00000007556:0.070709[&&NHX:D=N:T=48698],tp53_XmacENSXMAP00000015753:0.165631[&&NHX:D=N:T=8083])speciation:0.290725[&&NHX:D=N:B=100:T=586240:DD=])duplication:0.058888[&&NHX:DD=Y:B=2:T=1489872:D=],ENSGMOG00000007755_GmorENSGMOP00000008291:0.272843[&&NHX:D=N:T=8049])speciation:0.143728[&&NHX:D=N:T=123368:B=3:DD=],TP531ofmany_AmexENSAMXP00000007265:0.383807[&&NHX:D=N:T=7994])speciation:0.129809[&&NHX:D=N:T=186625:B=41:DD=])duplication:0.079851[&&NHX:D=Y:B=6:T=186625],tp53_LocuENSLOCP00000017063:0.263043[&&NHX:D=N:T=7918])speciation:0.079504[&&NHX:D=N:T=41665:B=5:DD=])speciation:0.205725[&&NHX:D=N:B=10:T=117571:DD=],ENSPMAG00000009535_PmarENSPMAP00000010479:0.363682[&&NHX:D=N:T=7757])speciation:0.005138[&&NHX:D=N:B=0:T=7742:DD=],((((((((((((TP63_MgalENSMGAP00000001036:0.00675[&&NHX:D=N:T=9103],TP63_GgalENSGALP00000032705:0.02786[&&NHX:D=N:T=9031])speciation:0.018196[&&NHX:D=N:B=100:T=9005:DD=],TP63_AplaENSAPLP00000012746:0.025285[&&NHX:D=N:T=8839])speciation:0.020559[&&NHX:D=N:B=100:T=1549675:DD=],(TP63_TgutENSTGUP00000009686:0.018245[&&NHX:D=N:T=59729],TP63_FalbENSFALP00000007718:0.02902[&&NHX:D=N:T=59894])speciation:0.022707[&&NHX:D=N:B=100:T=9126:DD=])speciation:0.046097[&&NHX:D=N:T=8825:B=100:DD=],TP63_PsinENSPSIP00000018044:0.123057[&&NHX:D=N:T=13735])speciation:0.005555[&&NHX:D=N:T=1329799:B=37:DD=],TP63_AcarENSACAP00000000376:0.736631[&&NHX:D=N:T=28377])speciation:0.010123[&&NHX:D=N:B=0:T=32561:DD=],((((((((((Trp63_MmusENSMUSP00000110965:0.000847[&&NHX:D=N:T=10090],Trp63_MsspMGP_SPRETEiJ_P0042982:0.004734[&&NHX:D=N:T=10096])speciation:0.021561[&&NHX:D=N:B=100:T=862507:DD=],Tp63_RnorENSRNOP00000033463:0.030383[&&NHX:D=N:T=10116])speciation:0.048568[&&NHX:D=N:T=39107:B=100:DD=],Trp63_DordENSDORP00000001930:0.044582[&&NHX:D=N:T=10020],TP63_ItriENSSTOP00000012357:0.057295[&&NHX:D=N:T=43179])speciation:0.000474[&&NHX:D=N:T=33553:B=0:DD=],TP63_CporENSCPOP00000013308:0.058396[&&NHX:D=N:T=10141])speciation:0.003336[&&NHX:D=N:B=0:T=9989:DD=],TP63_OpriENSOPRP00000002632:0.076764[&&NHX:D=N:T=9978])speciation:0.001386[&&NHX:D=N:B=0:T=314147:DD=],(TP63_OcunENSOCUP00000014157:0.04305[&&NHX:D=N:T=9986],TP63_OgarENSOGAP00000003415:0.053686[&&NHX:D=N:T=30611])speciation:0.018263[&&NHX:D=N:B=56:T=314146:DD=])duplication:0.0[&&NHX:DD=Y:T=314146:B=0:D=],TP63_TbelENSTBEP00000003655:0.050557[&&NHX:D=N:T=37347])speciation:0.000127[&&NHX:D=N:B=0:T=314146:DD=],(((((((TP63_PvamENSPVAP00000008543:0.02784[&&NHX:D=N:T=132908],TP63_MlucENSMLUP00000014213:0.029592[&&NHX:D=N:T=59463])speciation:0.007063[&&NHX:D=N:B=37:T=9397:DD=],(((TP63_AmelENSAMEP00000000831:0.015923[&&NHX:D=N:T=9646],TP63_CfamENSCAFP00000020585:0.020935[&&NHX:D=N:T=9615])speciation:0.003042[&&NHX:D=N:T=379584:B=80:DD=],TP63_MpfuENSMPUP00000003407:0.032827[&&NHX:D=N:T=9669])speciation:0.009414[&&NHX:D=N:B=64:T=379584:DD=],TP63_FcatENSFCAP00000000731:0.02322[&&NHX:D=N:T=9685])speciation:0.017067[&&NHX:D=N:T=33554:B=74:DD=])speciation:0.001436[&&NHX:D=N:T=314145:B=0:DD=],((((TP63_BtauENSBTAP00000020544:0.005072[&&NHX:D=N:T=9913],TP63_OariENSOARP00000021997:0.009983[&&NHX:D=N:T=9940])speciation:0.025469[&&NHX:D=N:T=9895:B=100:DD=],TP63_TtruENSTTRP00000011034:0.022489[&&NHX:D=N:T=9739])speciation:0.005877[&&NHX:D=N:B=58:T=91561:DD=],TP63_SscrENSSSCP00000025960:0.02089[&&NHX:D=N:T=9823])speciation:0.005665[&&NHX:D=N:B=29:T=91561:DD=],TP63_VpacENSVPAP00000011479:0.032735[&&NHX:D=N:T=30538])speciation:0.007589[&&NHX:D=N:B=13:T=91561:DD=])speciation:0.001552[&&NHX:D=N:B=0:T=314145:DD=],(TP63_EcabENSECAP00000016315:0.020605[&&NHX:D=N:T=9796],TP63_EeurENSEEUP00000012623:0.068478[&&NHX:D=N:T=9365])speciation:0.015388[&&NHX:D=N:B=15:T=314145:DD=])speciation:0.00388[&&NHX:D=N:T=314145:B=0:DD=],((((((((TP63_HsapENSP00000264731:0.001872[&&NHX:D=N:T=9606],TP63_GgorENSGGOP00000020551:0.002754[&&NHX:D=N:T=9595])speciation:0.000918[&&NHX:D=N:T=207598:B=46:DD=],TP63_PtroENSPTRP00000027067:0.001869[&&NHX:D=N:T=9598])speciation:0.002874[&&NHX:D=N:T=207598:B=46:DD=],TP63_PabeENSPPYP00000016106:0.004542[&&NHX:D=N:T=9601])speciation:0.000913[&&NHX:D=N:T=9604:B=70:DD=],TP63_NleuENSNLEP00000008197:0.004734[&&NHX:D=N:T=61853])speciation:0.000949[&&NHX:D=N:T=314295:B=66:DD=],((TP63_MmulENSMMUP00000038274:0.003714[&&NHX:D=N:T=9544],TP63_CsabENSCSAP00000005295:0.026509[&&NHX:D=N:T=60711])speciation:0.0[&&NHX:D=N:B=31:T=9528:DD=],TP63_PanuENSPANP00000003169:0.001823[&&NHX:D=N:T=9555])speciation:0.010162[&&NHX:D=N:B=31:T=9528:DD=])speciation:0.010185[&&NHX:D=N:T=9526:B=95:DD=],TP63_CjacENSCJAP00000026376:0.015601[&&NHX:D=N:T=9483])speciation:0.013295[&&NHX:D=N:T=314293:B=100:DD=],TP63_MmurENSMICP00000022696:0.021271[&&NHX:D=N:T=30608])speciation:0.0[&&NHX:D=N:B=42:T=9443:DD=],(TP63_TsyrENSTSYP00000003403:0.025783[&&NHX:D=N:T=1868482],TP63_SaraENSSARP00000011553:0.056367[&&NHX:D=N:T=42254])speciation:0.010618[&&NHX:D=N:B=14:T=1437010:DD=])duplication:0.006497[&&NHX:DD=Y:B=1:T=1437010:D=])duplication:0.0[&&NHX:DD=Y:B=0:T=1437010:D=],(TP63_DnovENSDNOP00000012853:0.025753[&&NHX:D=N:T=9361],TP63_ChofENSCHOP00000009300:0.040693[&&NHX:D=N:T=9358])speciation:0.020456[&&NHX:D=N:B=76:T=9348:DD=])speciation:0.001941[&&NHX:D=N:T=9347:B=0:DD=],((TP63_LafrENSLAFP00000020806:0.016207[&&NHX:D=N:T=9785],TP63_PcapENSPCAP00000004708:0.030306[&&NHX:D=N:T=9813])speciation:0.00755[&&NHX:D=N:T=311790:B=91:DD=],TP63_EtelENSETEP00000001864:0.071017[&&NHX:D=N:T=9371])speciation:0.015236[&&NHX:D=N:T=311790:B=8:DD=])speciation:0.007477[&&NHX:D=N:B=0:T=9347:DD=])duplication:0.052158[&&NHX:DD=Y:B=0:T=9347:D=],((TP63_MdomENSMODP00000018831:0.034607[&&NHX:D=N:T=13616],TP63_MeugENSMEUP00000014131:0.045944[&&NHX:D=N:T=9315])speciation:0.011561[&&NHX:D=N:T=9263:B=100:DD=],TP63_SharENSSHAP00000008666:0.303146[&&NHX:D=N:T=9305])speciation:0.054652[&&NHX:D=N:B=12:T=9263:DD=])speciation:0.017647[&&NHX:D=N:B=2:T=32525:DD=],TP63_OanaENSOANP00000021753:0.079276[&&NHX:D=N:T=9258])speciation:0.043447[&&NHX:D=N:T=40674:B=2:DD=])speciation:0.034349[&&NHX:D=N:T=32524:B=0:DD=],tp63_XtroENSXETP00000055541:0.267401[&&NHX:D=N:T=8364])speciation:0.032348[&&NHX:D=N:B=0:T=32523:DD=],(ENSACAG00000002961_AcarENSACAP00000002870:0.0[&&NHX:D=N:T=28377],ENSACAG00000022533_AcarENSACAP00000021196:1.16541[&&NHX:D=N:T=28377])duplication:0.116614[&&NHX:D=Y:T=28377:B=0])duplication:0.005373[&&NHX:D=Y:T=32523:B=0],TP63_LchaENSLACP00000022643:0.17787[&&NHX:D=N:T=7897])speciation:0.031924[&&NHX:D=N:T=8287:B=0:DD=],(((((((tp63_PforENSPFOP00000001124:0.014737[&&NHX:D=N:T=48698],tp63_XmacENSXMAP00000016461:0.044393[&&NHX:D=N:T=8083])speciation:0.052269[&&NHX:D=N:B=99:T=586240:DD=],tp63_OlatENSORLP00000019616:0.105223[&&NHX:D=N:T=8090])speciation:0.020917[&&NHX:D=N:B=24:T=1489913:DD=],tp63_OnilENSONIP00000024326:0.065197[&&NHX:D=N:T=8128])speciation:0.01928[&&NHX:D=N:T=1489908:B=16:DD=],(tp63_TnigENSTNIP00000016776:0.042973[&&NHX:D=N:T=99883],tp63_TrubENSTRUP00000008025:0.048688[&&NHX:D=N:T=31033])speciation:0.043668[&&NHX:D=N:B=100:T=31031:DD=])speciation:0.020832[&&NHX:D=N:B=77:T=1489872:DD=],(ENSGACG00000013629_GacuENSGACP00000018012:0.069577[&&NHX:D=N:T=69293],ENSGMOG00000000413_GmorENSGMOP00000000401:0.110102[&&NHX:D=N:T=8049])speciation:0.067443[&&NHX:D=N:B=97:T=123368:DD=])duplication:0.040724[&&NHX:DD=Y:B=65:T=123368:D=],(tp63_AmexENSAMXP00000004961:0.092792[&&NHX:D=N:T=7994],tp63_DrerENSDARP00000108362:0.121291[&&NHX:D=N:T=7955])speciation:0.046115[&&NHX:D=N:T=186626:B=86:DD=])speciation:0.034365[&&NHX:D=N:T=186625:B=37:DD=],tp63_LocuENSLOCP00000006202:0.102939[&&NHX:D=N:T=7918])speciation:0.049371[&&NHX:D=N:B=52:T=41665:DD=])speciation:0.110844[&&NHX:D=N:B=0:T=117571:DD=],(((((((((((TP73_LafrENSLAFP00000005892:0.029578[&&NHX:D=N:T=9785],TP73_PcapENSPCAP00000000662:0.051492[&&NHX:D=N:T=9813])speciation:0.003183[&&NHX:D=N:T=311790:B=90:DD=],TP73_EtelENSETEP00000007165:0.095673[&&NHX:D=N:T=9371])speciation:0.033805[&&NHX:D=N:T=311790:B=0:DD=],TP73_DnovENSDNOP00000028722:0.457081[&&NHX:D=N:T=9361])speciation:0.006287[&&NHX:D=N:B=0:T=9347:DD=],((((((((TP73_BtauENSBTAP00000007643:0.009498[&&NHX:D=N:T=9913],TP73_OariENSOARP00000017005:0.019572[&&NHX:D=N:T=9940])speciation:0.012531[&&NHX:D=N:T=9895:B=100:DD=],ENSSSCG00000025685_SscrENSSSCP00000022771:0.057187[&&NHX:D=N:T=9823])speciation:0.018712[&&NHX:D=N:T=91561:B=1:DD=],TP73_TtruENSTTRP00000003223:0.039795[&&NHX:D=N:T=9739])speciation:0.015091[&&NHX:D=N:T=91561:B=0:DD=],(((TP73_AmelENSAMEP00000009745:0.040276[&&NHX:D=N:T=9646],TP73_MpfuENSMPUP00000007349:0.069423[&&NHX:D=N:T=9669])speciation:0.011068[&&NHX:D=N:B=5:T=379584:DD=],TP73_CfamENSCAFP00000028819:0.025289[&&NHX:D=N:T=9615])speciation:0.003214[&&NHX:D=N:B=4:T=379584:DD=],TP73_FcatENSFCAP00000010792:0.059719[&&NHX:D=N:T=9685])speciation:0.021832[&&NHX:D=N:B=20:T=33554:DD=])speciation:0.009094[&&NHX:D=N:T=314145:B=0:DD=],TP73_PvamENSPVAP00000008433:0.078992[&&NHX:D=N:T=132908])speciation:0.005352[&&NHX:D=N:T=314145:B=0:DD=],TP73_EeurENSEEUP00000011975:0.098606[&&NHX:D=N:T=9365])speciation:0.0[&&NHX:D=N:B=0:T=314145:DD=],TP73_EcabENSECAP00000001313:0.038035[&&NHX:D=N:T=9796])speciation:0.007356[&&NHX:D=N:T=314145:B=0:DD=],((((((Trp73_MsspMGP_SPRETEiJ_P0068738:0.0082[&&NHX:D=N:T=10096],Trp73_MmusENSMUSP00000101269:0.011834[&&NHX:D=N:T=10090])speciation:0.027464[&&NHX:D=N:B=100:T=862507:DD=],Tp73_RnorENSRNOP00000052265:0.034464[&&NHX:D=N:T=10116])speciation:0.085459[&&NHX:D=N:T=39107:B=100:DD=],TP73_ItriENSSTOP00000022492:0.061184[&&NHX:D=N:T=43179])speciation:0.008334[&&NHX:D=N:B=2:T=33553:DD=],Trp73_DordENSDORP00000013966:0.076743[&&NHX:D=N:T=10020])speciation:0.0[&&NHX:D=N:T=33553:B=0:DD=],TP73_CporENSCPOP00000009800:0.075508[&&NHX:D=N:T=10141])speciation:0.004958[&&NHX:D=N:T=9989:B=0:DD=],((TP73_MmurENSMICP00000031305:0.033995[&&NHX:D=N:T=30608],TP73_OgarENSOGAP00000005402:0.043894[&&NHX:D=N:T=30611])speciation:0.017054[&&NHX:D=N:T=376911:B=93:DD=],((((((TP73_GgorENSGGOP00000015180:0.00182[&&NHX:D=N:T=9595],TP73_HsapENSP00000367545:0.005775[&&NHX:D=N:T=9606])speciation:0.0[&&NHX:D=N:T=207598:B=92:DD=],TP73_PtroENSPTRP00000000118:0.05274[&&NHX:D=N:T=9598])speciation:0.005412[&&NHX:D=N:B=81:T=207598:DD=],TP73_PabeENSPPYP00000002277:0.013149[&&NHX:D=N:T=9601])speciation:0.000495[&&NHX:D=N:B=30:T=9604:DD=],TP73_NleuENSNLEP00000009887:0.326917[&&NHX:D=N:T=61853])speciation:0.010918[&&NHX:D=N:T=314295:B=0:DD=],((TP73_PanuENSPANP00000007545:0.004788[&&NHX:D=N:T=9555],TP73_CsabENSCSAP00000017283:0.012519[&&NHX:D=N:T=60711])speciation:0.000519[&&NHX:D=N:T=9528:B=86:DD=],TP73_MmulENSMMUP00000040655:0.025402[&&NHX:D=N:T=9544])duplication:0.013713[&&NHX:D=N:B=75:T=9528:DD=])speciation:0.010332[&&NHX:D=N:T=9526:B=0:DD=],TP73_CjacENSCJAP00000005070:0.291972[&&NHX:D=N:T=9483])speciation:0.022859[&&NHX:D=N:B=0:T=314293:DD=])speciation:0.014731[&&NHX:D=N:B=0:T=9443:DD=])speciation:0.020217[&&NHX:D=N:T=314146:B=0:DD=])speciation:0.01086[&&NHX:D=N:T=1437010:B=0:DD=])speciation:0.048685[&&NHX:D=N:T=9347:B=0:DD=],ENSSSCG00000003361_SscrENSSSCP00000003644:0.097446[&&NHX:D=N:T=9823])duplication:0.016508[&&NHX:D=Y:T=9347:B=0],((TP73_MeugENSMEUP00000000705:0.023362[&&NHX:D=N:T=9315],TP73_MdomENSMODP00000008216:0.259151[&&NHX:D=N:T=13616])speciation:0.035881[&&NHX:D=N:B=57:T=9263:DD=],TP73_SharENSSHAP00000006513:0.042193[&&NHX:D=N:T=9305])speciation:0.069704[&&NHX:D=N:T=9263:B=36:DD=])speciation:0.023293[&&NHX:D=N:T=32525:B=2:DD=],TP73_OanaENSOANP00000019815:0.30572[&&NHX:D=N:T=9258])speciation:0.017992[&&NHX:D=N:B=0:T=40674:DD=],(((((TP73_GgalENSGALP00000001485:0.002093[&&NHX:D=N:T=9031],TP73_MgalENSMGAP00000001059:0.036491[&&NHX:D=N:T=9103])speciation:0.047733[&&NHX:D=N:T=9005:B=100:DD=],TP73_AplaENSAPLP00000003415:0.02254[&&NHX:D=N:T=8839])speciation:0.021618[&&NHX:D=N:T=1549675:B=97:DD=],(TP73_TgutENSTGUP00000002829:0.010561[&&NHX:D=N:T=59729],TP73_FalbENSFALP00000010031:0.030208[&&NHX:D=N:T=59894])speciation:0.023763[&&NHX:D=N:T=9126:B=100:DD=])speciation:0.016346[&&NHX:D=N:B=97:T=8825:DD=],TP73_PsinENSPSIP00000004448:0.109544[&&NHX:D=N:T=13735])speciation:0.026517[&&NHX:D=N:T=1329799:B=84:DD=],TP73_AcarENSACAP00000001746:0.128451[&&NHX:D=N:T=28377])speciation:0.019965[&&NHX:D=N:B=67:T=32561:DD=])speciation:0.036745[&&NHX:D=N:T=32524:B=15:DD=],tp73_XtroENSXETP00000010981:0.182635[&&NHX:D=N:T=8364])speciation:0.011019[&&NHX:D=N:B=1:T=32523:DD=],TP73_LchaENSLACP00000021702:0.142378[&&NHX:D=N:T=7897])speciation:0.024057[&&NHX:D=N:B=0:T=8287:DD=],((((((tp73_TnigENSTNIP00000014938:0.027328[&&NHX:D=N:T=99883],tp73_TrubENSTRUP00000038165:0.032469[&&NHX:D=N:T=31033])speciation:0.059199[&&NHX:D=N:T=31031:B=100:DD=],tp73_GacuENSGACP00000008676:0.048591[&&NHX:D=N:T=69293])speciation:0.007086[&&NHX:D=N:T=1489922:B=29:DD=],(((tp73_PforENSPFOP00000010896:0.013197[&&NHX:D=N:T=48698],tp73_XmacENSXMAP00000017403:0.030558[&&NHX:D=N:T=8083])speciation:0.063838[&&NHX:D=N:B=100:T=586240:DD=],tp73_OlatENSORLP00000005521:0.062083[&&NHX:D=N:T=8090])speciation:0.017304[&&NHX:D=N:B=58:T=1489913:DD=],tp73_OnilENSONIP00000002627:0.053778[&&NHX:D=N:T=8128])speciation:0.014746[&&NHX:D=N:T=1489908:B=29:DD=])speciation:0.072637[&&NHX:D=N:B=14:T=1489872:DD=],tp73_GmorENSGMOP00000016675:0.181445[&&NHX:D=N:T=8049])speciation:0.038065[&&NHX:D=N:T=123368:B=98:DD=],(tp73_AmexENSAMXP00000014358:0.086906[&&NHX:D=N:T=7994],tp73_DrerENSDARP00000109674:0.134572[&&NHX:D=N:T=7955])speciation:0.064476[&&NHX:D=N:T=186626:B=100:DD=])speciation:0.04364[&&NHX:D=N:T=186625:B=43:DD=],tp73_LocuENSLOCP00000006343:0.115822[&&NHX:D=N:T=7918])speciation:0.046704[&&NHX:D=N:T=41665:B=14:DD=])speciation:0.167736[&&NHX:D=N:T=117571:B=27:DD=])duplication:0.067299[&&NHX:D=Y:B=0:T=117571],tp63_PmarENSPMAP00000007639:0.797694[&&NHX:D=N:T=7757])speciation:0.076045[&&NHX:D=N:T=7742:B=0:DD=],(('p53/p73-b CintENSCINP00000004447':0.450754[&&NHX:D=N:T=7719],ENSCSAVG00000009788_CsavENSCSAVP00000016659:0.47517[&&NHX:D=N:T=51511])speciation:0.378426[&&NHX:D=N:B=100:T=7718:DD=],(ENSCING00000001960_CintENSCINP00000003956:0.141945[&&NHX:D=N:T=7719],ENSCSAVG00000009964_CsavENSCSAVP00000016940:0.26284[&&NHX:D=N:T=51511])speciation:0.525939[&&NHX:D=N:T=7718:B=100:DD=])duplication:0.603292[&&NHX:D=Y:B=100:T=7718])duplication:0.0[&&NHX:D=N:T=7711:B=0:DD=];\",\n \"LRF2\" : \"((((((((((((((((((TP53_AmelENSAMEP00000017825:0.0263[&&NHX:D=N:T=9646],TP53_MpfuENSMPUP00000008945:0.066538[&&NHX:D=N:T=9669])speciation:0.032561[&&NHX:D=N:B=99:T=379584:DD=],TP53_CfamENSCAFP00000024579:0.086484[&&NHX:D=N:T=9615])speciation:0.034068[&&NHX:D=N:B=81:T=379584:DD=],TP53_FcatENSFCAP00000008925:0.06619[&&NHX:D=N:T=9685])speciation:0.025911[&&NHX:D=N:B=31:T=33554:DD=],TP53_EcabENSECAP00000006210:0.04971[&&NHX:D=N:T=9796])speciation:0.01224[&&NHX:D=N:T=314145:B=17:DD=],(((TP53_BtauENSBTAP00000001420:0.043108[&&NHX:D=N:T=9913],TP53_OariENSOARP00000016707:0.049064[&&NHX:D=N:T=9940])speciation:0.055294[&&NHX:D=N:B=98:T=9895:DD=],TP53_TtruENSTTRP00000009721:0.022529[&&NHX:D=N:T=9739])speciation:0.022515[&&NHX:D=N:T=91561:B=39:DD=],TP53_SscrENSSSCP00000019016:0.065797[&&NHX:D=N:T=9823])speciation:0.020972[&&NHX:D=N:T=91561:B=35:DD=])speciation:0.006996[&&NHX:D=N:B=9:T=314145:DD=],TP53_SaraENSSARP00000005616:0.149927[&&NHX:D=N:T=42254])speciation:0.013221[&&NHX:D=N:T=314145:B=7:DD=],TP53_PvamENSPVAP00000015400:0.117578[&&NHX:D=N:T=132908])speciation:0.0[&&NHX:D=N:B=1:T=314145:DD=],((ENSMLUG00000006411_MlucENSMLUP00000005861:0.003702[&&NHX:D=N:T=59463],ENSMLUG00000025140_MlucENSMLUP00000016733:0.12569[&&NHX:D=N:T=59463])duplication:0.131525[&&NHX:D=Y:T=59463:B=100],TP53_EeurENSEEUP00000013295:0.183463[&&NHX:D=N:T=9365])speciation:0.042602[&&NHX:D=N:T=314145:B=33:DD=])duplication:0.018327[&&NHX:DD=Y:T=314145:B=0:D=],(((((Trp53_MmusENSMUSP00000104298:0.002681[&&NHX:D=N:T=10090],Trp53_MsspMGP_SPRETEiJ_P0028933:0.017851[&&NHX:D=N:T=10096])speciation:0.064969[&&NHX:D=N:B=100:T=862507:DD=],Tp53_RnorENSRNOP00000074031:0.079068[&&NHX:D=N:T=10116])speciation:0.12872[&&NHX:D=N:T=39107:B=100:DD=],LOC100910954_RnorENSRNOP00000064177:0.056502[&&NHX:D=N:T=10116])duplication:0.0[&&NHX:D=Y:B=5:T=39107],TP53_OpriENSOPRP00000005906:0.185911[&&NHX:D=N:T=9978])speciation:0.0[&&NHX:D=N:T=314147:B=0:DD=],((((TP53_MmurENSMICP00000039812:0.054544[&&NHX:D=N:T=30608],TP53_OgarENSOGAP00000015106:0.095719[&&NHX:D=N:T=30611])speciation:0.012762[&&NHX:D=N:B=52:T=376911:DD=],((((((TP53_HsapENSP00000269305:0.0[&&NHX:D=N:T=9606],TP53_GgorENSGGOP00000009561:0.002907[&&NHX:D=N:T=9595])speciation:0.001345[&&NHX:D=N:B=61:T=207598:DD=],TP53_PtroENSPTRP00000014836:0.000592[&&NHX:D=N:T=9598])speciation:0.00877[&&NHX:D=N:B=61:T=207598:DD=],TP53_PabeENSPPYP00000008923:0.009552[&&NHX:D=N:T=9601])speciation:4.8e-05[&&NHX:D=N:T=9604:B=100:DD=],TP53_NleuENSNLEP00000011861:0.032229[&&NHX:D=N:T=61853])speciation:0.004444[&&NHX:D=N:T=314295:B=97:DD=],((TP53_PanuENSPANP00000019643:0.007102[&&NHX:D=N:T=9555],TP53_CsabENSCSAP00000007551:0.010543[&&NHX:D=N:T=60711])speciation:0.000953[&&NHX:D=N:B=100:T=9528:DD=],TP53_MmulENSMMUP00000035274:0.043449[&&NHX:D=N:T=9544])speciation:0.019535[&&NHX:D=N:T=9528:B=55:DD=])speciation:0.013822[&&NHX:D=N:T=9526:B=52:DD=],TP53_CjacENSCJAP00000027663:0.047099[&&NHX:D=N:T=9483])speciation:0.027286[&&NHX:D=N:B=57:T=314293:DD=])speciation:0.013265[&&NHX:D=N:T=9443:B=4:DD=],TP53_TbelENSTBEP00000010189:0.222843[&&NHX:D=N:T=37347])speciation:0.008121[&&NHX:D=N:B=0:T=314146:DD=],((TP53_ItriENSSTOP00000019678:0.08339[&&NHX:D=N:T=43179],Tp53_CporENSCPOP00000012841:0.120892[&&NHX:D=N:T=10141])speciation:0.018406[&&NHX:D=N:T=9989:B=42:DD=],(ENSOCUG00000001138_OcunENSOCUP00000000989:0.013142[&&NHX:D=N:T=9986],ENSOCUG00000022109_OcunENSOCUP00000025959:0.090881[&&NHX:D=N:T=9986])duplication:0.069194[&&NHX:D=Y:T=9986:B=97])speciation:0.015339[&&NHX:D=N:T=314147:B=15:DD=])speciation:0.019539[&&NHX:D=N:B=0:T=314146:DD=])duplication:0.026935[&&NHX:DD=Y:T=314146:B=0:D=])speciation:0.017095[&&NHX:D=N:T=1437010:B=0:DD=],((((((((ENSLAFG00000028692_LafrENSLAFP00000023554:0.00886[&&NHX:D=N:T=9785],ENSLAFG00000030880_LafrENSLAFP00000027441:0.052436[&&NHX:D=N:T=9785])duplication:0.006909[&&NHX:D=Y:B=0:T=9785],ENSLAFG00000030555_LafrENSLAFP00000027808:0.044446[&&NHX:D=N:T=9785])duplication:0.003043[&&NHX:D=Y:T=9785:B=0],(ENSLAFG00000028299_LafrENSLAFP00000024998:0.011792[&&NHX:D=N:T=9785],ENSLAFG00000032042_LafrENSLAFP00000023389:0.017693[&&NHX:D=N:T=9785])duplication:0.015904[&&NHX:D=Y:T=9785:B=74])duplication:0.0[&&NHX:D=Y:B=0:T=9785],(((ENSLAFG00000027365_LafrENSLAFP00000025852:0.011873[&&NHX:D=N:T=9785],ENSLAFG00000026238_LafrENSLAFP00000027253:0.026457[&&NHX:D=N:T=9785])duplication:0.019571[&&NHX:D=Y:T=9785:B=81],ENSLAFG00000027669_LafrENSLAFP00000028793:0.027495[&&NHX:D=N:T=9785])duplication:0.016599[&&NHX:D=Y:T=9785:B=70],ENSLAFG00000027820_LafrENSLAFP00000028173:0.058133[&&NHX:D=N:T=9785])duplication:0.031788[&&NHX:D=Y:T=9785:B=87])duplication:0.038135[&&NHX:D=Y:T=9785:B=10],(ENSLAFG00000027348_LafrENSLAFP00000027515:0.028441[&&NHX:D=N:T=9785],ENSLAFG00000027474_LafrENSLAFP00000018379:0.03464[&&NHX:D=N:T=9785])duplication:0.131904[&&NHX:D=Y:B=100:T=9785])duplication:0.082412[&&NHX:D=Y:T=9785:B=96],ENSLAFG00000007483_LafrENSLAFP00000006292:0.058399[&&NHX:D=N:T=9785])duplication:0.0075[&&NHX:D=Y:T=9785:B=23],TP53_PcapENSPCAP00000011892:0.114307[&&NHX:D=N:T=9813])speciation:0.010282[&&NHX:D=N:T=311790:B=18:DD=],(ENSETEG00000008987_EtelENSETEP00000007296:0.0[&&NHX:D=N:T=9371],ENSETEG00000009984_EtelENSETEP00000008111:0.105253[&&NHX:D=N:T=9371])duplication:0.154739[&&NHX:D=Y:B=100:T=9371])speciation:0.044399[&&NHX:D=N:T=311790:B=35:DD=])speciation:0.041158[&&NHX:D=N:B=0:T=9347:DD=],TP53_DnovENSDNOP00000004075:0.078395[&&NHX:D=N:T=9361])speciation:0.080059[&&NHX:D=N:B=0:T=9347:DD=],((TP53_SharENSSHAP00000018268:0.0496[&&NHX:D=N:T=9305],ENSMODG00000007271_MdomENSMODP00000009014:0.172546[&&NHX:D=N:T=13616])speciation:0.024952[&&NHX:D=N:T=9263:B=83:DD=],ENSMEUG00000013135_MeugENSMEUP00000011978:0.069167[&&NHX:D=N:T=9315])speciation:0.225429[&&NHX:D=N:B=83:T=9263:DD=])speciation:0.228895[&&NHX:D=N:B=81:T=32525:DD=],tp53_XtroENSXETP00000053759:0.483686[&&NHX:D=N:T=8364])speciation:0.095084[&&NHX:D=N:B=55:T=32523:DD=],(TP53_PsinENSPSIP00000014905:0.228951[&&NHX:D=N:T=13735],ENSOANG00000011981_OanaENSOANP00000018980:0.553865[&&NHX:D=N:T=9258])speciation:0.126185[&&NHX:D=N:B=48:T=32524:DD=])duplication:0.03737[&&NHX:DD=Y:B=17:T=32523:D=],TP53_LchaENSLACP00000015915:0.317935[&&NHX:D=N:T=7897])speciation:0.062274[&&NHX:D=N:B=13:T=8287:DD=],(((tp53_DrerENSDARP00000051548:0.365455[&&NHX:D=N:T=7955],tp53_AmexENSAMXP00000021366:0.579505[&&NHX:D=N:T=7994])speciation:0.105036[&&NHX:D=N:B=46:T=186626:DD=],((((((tp53_TrubENSTRUP00000030645:0.158124[&&NHX:D=N:T=31033],tp53_TnigENSTNIP00000013035:0.25403[&&NHX:D=N:T=99883])speciation:0.1396[&&NHX:D=N:T=31031:B=100:DD=],tp53_OlatENSORLP00000008029:0.359414[&&NHX:D=N:T=8090])speciation:0.040022[&&NHX:D=N:T=1489872:B=1:DD=],(tp53_GacuENSGACP00000025614:0.249641[&&NHX:D=N:T=69293],tp53_OnilENSONIP00000023874:0.251831[&&NHX:D=N:T=8128])speciation:0.085834[&&NHX:D=N:T=1489872:B=100:DD=])duplication:0.070104[&&NHX:DD=Y:T=1489872:B=0:D=],(tp53_PforENSPFOP00000007556:0.070709[&&NHX:D=N:T=48698],tp53_XmacENSXMAP00000015753:0.165631[&&NHX:D=N:T=8083])speciation:0.290725[&&NHX:D=N:B=100:T=586240:DD=])duplication:0.058888[&&NHX:DD=Y:B=2:T=1489872:D=],ENSGMOG00000007755_GmorENSGMOP00000008291:0.272843[&&NHX:D=N:T=8049])speciation:0.143728[&&NHX:D=N:T=123368:B=3:DD=],TP531ofmany_AmexENSAMXP00000007265:0.383807[&&NHX:D=N:T=7994])speciation:0.129809[&&NHX:D=N:T=186625:B=41:DD=])duplication:0.079851[&&NHX:D=Y:B=6:T=186625],tp53_LocuENSLOCP00000017063:0.263043[&&NHX:D=N:T=7918])speciation:0.079504[&&NHX:D=N:T=41665:B=5:DD=])speciation:0.205725[&&NHX:D=N:B=10:T=117571:DD=],ENSPMAG00000009535_PmarENSPMAP00000010479:0.363682[&&NHX:D=N:T=7757])speciation:0.005138[&&NHX:D=N:B=0:T=7742:DD=],((((((((((((TP63_MgalENSMGAP00000001036:0.00675[&&NHX:D=N:T=9103],TP63_GgalENSGALP00000032705:0.02786[&&NHX:D=N:T=9031])speciation:0.018196[&&NHX:D=N:B=100:T=9005:DD=],TP63_AplaENSAPLP00000012746:0.025285[&&NHX:D=N:T=8839])speciation:0.020559[&&NHX:D=N:B=100:T=1549675:DD=],(TP63_TgutENSTGUP00000009686:0.018245[&&NHX:D=N:T=59729],TP63_FalbENSFALP00000007718:0.02902[&&NHX:D=N:T=59894])speciation:0.022707[&&NHX:D=N:B=100:T=9126:DD=])speciation:0.046097[&&NHX:D=N:T=8825:B=100:DD=],TP63_PsinENSPSIP00000018044:0.123057[&&NHX:D=N:T=13735])speciation:0.005555[&&NHX:D=N:T=1329799:B=37:DD=],TP63_AcarENSACAP00000000376:0.736631[&&NHX:D=N:T=28377])speciation:0.010123[&&NHX:D=N:B=0:T=32561:DD=],(((((((((((Trp63_MmusENSMUSP00000110965:0.000847[&&NHX:D=N:T=10090],Trp63_MsspMGP_SPRETEiJ_P0042982:0.004734[&&NHX:D=N:T=10096])speciation:0.021561[&&NHX:D=N:B=100:T=862507:DD=],Tp63_RnorENSRNOP00000033463:0.030383[&&NHX:D=N:T=10116])speciation:0.048568[&&NHX:D=N:T=39107:B=100:DD=],Trp63_DordENSDORP00000001930:0.044582[&&NHX:D=N:T=10020])speciation:0.014056[&&NHX:D=N:B=17:T=33553:DD=],TP63_ItriENSSTOP00000012357:0.057295[&&NHX:D=N:T=43179])speciation:0.000474[&&NHX:D=N:T=33553:B=0:DD=],TP63_CporENSCPOP00000013308:0.058396[&&NHX:D=N:T=10141])speciation:0.003336[&&NHX:D=N:B=0:T=9989:DD=],TP63_OpriENSOPRP00000002632:0.076764[&&NHX:D=N:T=9978])speciation:0.001386[&&NHX:D=N:B=0:T=314147:DD=],(TP63_OcunENSOCUP00000014157:0.04305[&&NHX:D=N:T=9986],TP63_OgarENSOGAP00000003415:0.053686[&&NHX:D=N:T=30611])speciation:0.018263[&&NHX:D=N:B=56:T=314146:DD=])duplication:0.0[&&NHX:DD=Y:T=314146:B=0:D=],TP63_TbelENSTBEP00000003655:0.050557[&&NHX:D=N:T=37347])speciation:0.000127[&&NHX:D=N:B=0:T=314146:DD=],(((((((TP63_PvamENSPVAP00000008543:0.02784[&&NHX:D=N:T=132908],TP63_MlucENSMLUP00000014213:0.029592[&&NHX:D=N:T=59463])speciation:0.007063[&&NHX:D=N:B=37:T=9397:DD=],(((TP63_AmelENSAMEP00000000831:0.015923[&&NHX:D=N:T=9646],TP63_CfamENSCAFP00000020585:0.020935[&&NHX:D=N:T=9615])speciation:0.003042[&&NHX:D=N:T=379584:B=80:DD=],TP63_MpfuENSMPUP00000003407:0.032827[&&NHX:D=N:T=9669])speciation:0.009414[&&NHX:D=N:B=64:T=379584:DD=],TP63_FcatENSFCAP00000000731:0.02322[&&NHX:D=N:T=9685])speciation:0.017067[&&NHX:D=N:T=33554:B=74:DD=])speciation:0.001436[&&NHX:D=N:T=314145:B=0:DD=],((((TP63_BtauENSBTAP00000020544:0.005072[&&NHX:D=N:T=9913],TP63_OariENSOARP00000021997:0.009983[&&NHX:D=N:T=9940])speciation:0.025469[&&NHX:D=N:T=9895:B=100:DD=],TP63_TtruENSTTRP00000011034:0.022489[&&NHX:D=N:T=9739])speciation:0.005877[&&NHX:D=N:B=58:T=91561:DD=],TP63_SscrENSSSCP00000025960:0.02089[&&NHX:D=N:T=9823])speciation:0.005665[&&NHX:D=N:B=29:T=91561:DD=],TP63_VpacENSVPAP00000011479:0.032735[&&NHX:D=N:T=30538])speciation:0.007589[&&NHX:D=N:B=13:T=91561:DD=])speciation:0.001552[&&NHX:D=N:B=0:T=314145:DD=],(TP63_EcabENSECAP00000016315:0.020605[&&NHX:D=N:T=9796],TP63_EeurENSEEUP00000012623:0.068478[&&NHX:D=N:T=9365])speciation:0.015388[&&NHX:D=N:B=15:T=314145:DD=])speciation:0.00388[&&NHX:D=N:T=314145:B=0:DD=],((((((((TP63_HsapENSP00000264731:0.001872[&&NHX:D=N:T=9606],TP63_GgorENSGGOP00000020551:0.002754[&&NHX:D=N:T=9595])speciation:0.000918[&&NHX:D=N:T=207598:B=46:DD=],TP63_PtroENSPTRP00000027067:0.001869[&&NHX:D=N:T=9598])speciation:0.002874[&&NHX:D=N:T=207598:B=46:DD=],TP63_PabeENSPPYP00000016106:0.004542[&&NHX:D=N:T=9601])speciation:0.000913[&&NHX:D=N:T=9604:B=70:DD=],TP63_NleuENSNLEP00000008197:0.004734[&&NHX:D=N:T=61853])speciation:0.000949[&&NHX:D=N:T=314295:B=66:DD=],((TP63_MmulENSMMUP00000038274:0.003714[&&NHX:D=N:T=9544],TP63_CsabENSCSAP00000005295:0.026509[&&NHX:D=N:T=60711])speciation:0.0[&&NHX:D=N:B=31:T=9528:DD=],TP63_PanuENSPANP00000003169:0.001823[&&NHX:D=N:T=9555])speciation:0.010162[&&NHX:D=N:B=31:T=9528:DD=])speciation:0.010185[&&NHX:D=N:T=9526:B=95:DD=],TP63_CjacENSCJAP00000026376:0.015601[&&NHX:D=N:T=9483])speciation:0.013295[&&NHX:D=N:T=314293:B=100:DD=],TP63_MmurENSMICP00000022696:0.021271[&&NHX:D=N:T=30608])speciation:0.0[&&NHX:D=N:B=42:T=9443:DD=],(TP63_TsyrENSTSYP00000003403:0.025783[&&NHX:D=N:T=1868482],TP63_SaraENSSARP00000011553:0.056367[&&NHX:D=N:T=42254])speciation:0.010618[&&NHX:D=N:B=14:T=1437010:DD=])duplication:0.006497[&&NHX:DD=Y:B=1:T=1437010:D=])duplication:0.0[&&NHX:DD=Y:B=0:T=1437010:D=],(TP63_DnovENSDNOP00000012853:0.025753[&&NHX:D=N:T=9361],TP63_ChofENSCHOP00000009300:0.040693[&&NHX:D=N:T=9358])speciation:0.020456[&&NHX:D=N:B=76:T=9348:DD=])speciation:0.001941[&&NHX:D=N:T=9347:B=0:DD=],((TP63_LafrENSLAFP00000020806:0.016207[&&NHX:D=N:T=9785],TP63_PcapENSPCAP00000004708:0.030306[&&NHX:D=N:T=9813])speciation:0.00755[&&NHX:D=N:T=311790:B=91:DD=],TP63_EtelENSETEP00000001864:0.071017[&&NHX:D=N:T=9371])speciation:0.015236[&&NHX:D=N:T=311790:B=8:DD=])speciation:0.007477[&&NHX:D=N:B=0:T=9347:DD=])duplication:0.052158[&&NHX:DD=Y:B=0:T=9347:D=],((TP63_MdomENSMODP00000018831:0.034607[&&NHX:D=N:T=13616],TP63_MeugENSMEUP00000014131:0.045944[&&NHX:D=N:T=9315])speciation:0.011561[&&NHX:D=N:T=9263:B=100:DD=],TP63_SharENSSHAP00000008666:0.303146[&&NHX:D=N:T=9305])speciation:0.054652[&&NHX:D=N:B=12:T=9263:DD=])speciation:0.017647[&&NHX:D=N:B=2:T=32525:DD=],TP63_OanaENSOANP00000021753:0.079276[&&NHX:D=N:T=9258])speciation:0.043447[&&NHX:D=N:T=40674:B=2:DD=])speciation:0.034349[&&NHX:D=N:T=32524:B=0:DD=],tp63_XtroENSXETP00000055541:0.267401[&&NHX:D=N:T=8364])speciation:0.032348[&&NHX:D=N:B=0:T=32523:DD=],(ENSACAG00000002961_AcarENSACAP00000002870:0.0[&&NHX:D=N:T=28377],ENSACAG00000022533_AcarENSACAP00000021196:1.16541[&&NHX:D=N:T=28377])duplication:0.116614[&&NHX:D=Y:T=28377:B=0])duplication:0.005373[&&NHX:D=Y:T=32523:B=0],TP63_LchaENSLACP00000022643:0.17787[&&NHX:D=N:T=7897])speciation:0.031924[&&NHX:D=N:T=8287:B=0:DD=],(((((((tp63_PforENSPFOP00000001124:0.014737[&&NHX:D=N:T=48698],tp63_XmacENSXMAP00000016461:0.044393[&&NHX:D=N:T=8083])speciation:0.052269[&&NHX:D=N:B=99:T=586240:DD=],tp63_OlatENSORLP00000019616:0.105223[&&NHX:D=N:T=8090])speciation:0.020917[&&NHX:D=N:B=24:T=1489913:DD=],tp63_OnilENSONIP00000024326:0.065197[&&NHX:D=N:T=8128])speciation:0.01928[&&NHX:D=N:T=1489908:B=16:DD=],(tp63_TnigENSTNIP00000016776:0.042973[&&NHX:D=N:T=99883],tp63_TrubENSTRUP00000008025:0.048688[&&NHX:D=N:T=31033])speciation:0.043668[&&NHX:D=N:B=100:T=31031:DD=])speciation:0.020832[&&NHX:D=N:B=77:T=1489872:DD=],(ENSGACG00000013629_GacuENSGACP00000018012:0.069577[&&NHX:D=N:T=69293],ENSGMOG00000000413_GmorENSGMOP00000000401:0.110102[&&NHX:D=N:T=8049])speciation:0.067443[&&NHX:D=N:B=97:T=123368:DD=])duplication:0.040724[&&NHX:DD=Y:B=65:T=123368:D=],(tp63_AmexENSAMXP00000004961:0.092792[&&NHX:D=N:T=7994],tp63_DrerENSDARP00000108362:0.121291[&&NHX:D=N:T=7955])speciation:0.046115[&&NHX:D=N:T=186626:B=86:DD=])speciation:0.034365[&&NHX:D=N:T=186625:B=37:DD=],tp63_LocuENSLOCP00000006202:0.102939[&&NHX:D=N:T=7918])speciation:0.049371[&&NHX:D=N:B=52:T=41665:DD=])speciation:0.110844[&&NHX:D=N:B=0:T=117571:DD=],(((((((((((TP73_LafrENSLAFP00000005892:0.029578[&&NHX:D=N:T=9785],TP73_PcapENSPCAP00000000662:0.051492[&&NHX:D=N:T=9813])speciation:0.003183[&&NHX:D=N:T=311790:B=90:DD=],TP73_EtelENSETEP00000007165:0.095673[&&NHX:D=N:T=9371])speciation:0.033805[&&NHX:D=N:T=311790:B=0:DD=],TP73_DnovENSDNOP00000028722:0.457081[&&NHX:D=N:T=9361])speciation:0.006287[&&NHX:D=N:B=0:T=9347:DD=],((((((((TP73_BtauENSBTAP00000007643:0.009498[&&NHX:D=N:T=9913],TP73_OariENSOARP00000017005:0.019572[&&NHX:D=N:T=9940])speciation:0.012531[&&NHX:D=N:T=9895:B=100:DD=],ENSSSCG00000025685_SscrENSSSCP00000022771:0.057187[&&NHX:D=N:T=9823])speciation:0.018712[&&NHX:D=N:T=91561:B=1:DD=],TP73_TtruENSTTRP00000003223:0.039795[&&NHX:D=N:T=9739])speciation:0.015091[&&NHX:D=N:T=91561:B=0:DD=],(((TP73_AmelENSAMEP00000009745:0.040276[&&NHX:D=N:T=9646],TP73_MpfuENSMPUP00000007349:0.069423[&&NHX:D=N:T=9669])speciation:0.011068[&&NHX:D=N:B=5:T=379584:DD=],TP73_CfamENSCAFP00000028819:0.025289[&&NHX:D=N:T=9615])speciation:0.003214[&&NHX:D=N:B=4:T=379584:DD=],TP73_FcatENSFCAP00000010792:0.059719[&&NHX:D=N:T=9685])speciation:0.021832[&&NHX:D=N:B=20:T=33554:DD=])speciation:0.009094[&&NHX:D=N:T=314145:B=0:DD=],TP73_PvamENSPVAP00000008433:0.078992[&&NHX:D=N:T=132908])speciation:0.005352[&&NHX:D=N:T=314145:B=0:DD=],TP73_EeurENSEEUP00000011975:0.098606[&&NHX:D=N:T=9365])speciation:0.0[&&NHX:D=N:B=0:T=314145:DD=],TP73_EcabENSECAP00000001313:0.038035[&&NHX:D=N:T=9796])speciation:0.007356[&&NHX:D=N:T=314145:B=0:DD=],((((((Trp73_MsspMGP_SPRETEiJ_P0068738:0.0082[&&NHX:D=N:T=10096],Trp73_MmusENSMUSP00000101269:0.011834[&&NHX:D=N:T=10090])speciation:0.027464[&&NHX:D=N:B=100:T=862507:DD=],Tp73_RnorENSRNOP00000052265:0.034464[&&NHX:D=N:T=10116])speciation:0.085459[&&NHX:D=N:T=39107:B=100:DD=],TP73_ItriENSSTOP00000022492:0.061184[&&NHX:D=N:T=43179])speciation:0.008334[&&NHX:D=N:B=2:T=33553:DD=],Trp73_DordENSDORP00000013966:0.076743[&&NHX:D=N:T=10020])speciation:0.0[&&NHX:D=N:T=33553:B=0:DD=],TP73_CporENSCPOP00000009800:0.075508[&&NHX:D=N:T=10141])speciation:0.004958[&&NHX:D=N:T=9989:B=0:DD=],((TP73_MmurENSMICP00000031305:0.033995[&&NHX:D=N:T=30608],TP73_OgarENSOGAP00000005402:0.043894[&&NHX:D=N:T=30611])speciation:0.017054[&&NHX:D=N:T=376911:B=93:DD=],((((((TP73_GgorENSGGOP00000015180:0.00182[&&NHX:D=N:T=9595],TP73_HsapENSP00000367545:0.005775[&&NHX:D=N:T=9606])speciation:0.0[&&NHX:D=N:T=207598:B=92:DD=],TP73_PtroENSPTRP00000000118:0.05274[&&NHX:D=N:T=9598])speciation:0.005412[&&NHX:D=N:B=81:T=207598:DD=],TP73_PabeENSPPYP00000002277:0.013149[&&NHX:D=N:T=9601])speciation:0.000495[&&NHX:D=N:B=30:T=9604:DD=],TP73_NleuENSNLEP00000009887:0.326917[&&NHX:D=N:T=61853])speciation:0.010918[&&NHX:D=N:T=314295:B=0:DD=],((TP73_PanuENSPANP00000007545:0.004788[&&NHX:D=N:T=9555],TP73_CsabENSCSAP00000017283:0.012519[&&NHX:D=N:T=60711])speciation:0.000519[&&NHX:D=N:T=9528:B=86:DD=],TP73_MmulENSMMUP00000040655:0.025402[&&NHX:D=N:T=9544])speciation:0.013713[&&NHX:D=N:B=75:T=9528:DD=])speciation:0.010332[&&NHX:D=N:T=9526:B=0:DD=],TP73_CjacENSCJAP00000005070:0.291972[&&NHX:D=N:T=9483])speciation:0.022859[&&NHX:D=N:B=0:T=314293:DD=])speciation:0.014731[&&NHX:D=N:B=0:T=9443:DD=])speciation:0.020217[&&NHX:D=N:T=314146:B=0:DD=])speciation:0.01086[&&NHX:D=N:T=1437010:B=0:DD=])speciation:0.048685[&&NHX:D=N:T=9347:B=0:DD=],ENSSSCG00000003361_SscrENSSSCP00000003644:0.097446[&&NHX:D=N:T=9823])duplication:0.016508[&&NHX:D=Y:T=9347:B=0],((TP73_MeugENSMEUP00000000705:0.023362[&&NHX:D=N:T=9315],TP73_MdomENSMODP00000008216:0.259151[&&NHX:D=N:T=13616])speciation:0.035881[&&NHX:D=N:B=57:T=9263:DD=],TP73_SharENSSHAP00000006513:0.042193[&&NHX:D=N:T=9305])speciation:0.069704[&&NHX:D=N:T=9263:B=36:DD=])speciation:0.023293[&&NHX:D=N:T=32525:B=2:DD=],TP73_OanaENSOANP00000019815:0.30572[&&NHX:D=N:T=9258])speciation:0.017992[&&NHX:D=N:B=0:T=40674:DD=],(((((TP73_GgalENSGALP00000001485:0.002093[&&NHX:D=N:T=9031],TP73_MgalENSMGAP00000001059:0.036491[&&NHX:D=N:T=9103])speciation:0.047733[&&NHX:D=N:T=9005:B=100:DD=],TP73_AplaENSAPLP00000003415:0.02254[&&NHX:D=N:T=8839])speciation:0.021618[&&NHX:D=N:T=1549675:B=97:DD=],(TP73_TgutENSTGUP00000002829:0.010561[&&NHX:D=N:T=59729],TP73_FalbENSFALP00000010031:0.030208[&&NHX:D=N:T=59894])speciation:0.023763[&&NHX:D=N:T=9126:B=100:DD=])speciation:0.016346[&&NHX:D=N:B=97:T=8825:DD=],TP73_PsinENSPSIP00000004448:0.109544[&&NHX:D=N:T=13735])speciation:0.026517[&&NHX:D=N:T=1329799:B=84:DD=],TP73_AcarENSACAP00000001746:0.128451[&&NHX:D=N:T=28377])speciation:0.019965[&&NHX:D=N:B=67:T=32561:DD=])speciation:0.036745[&&NHX:D=N:T=32524:B=15:DD=],tp73_XtroENSXETP00000010981:0.182635[&&NHX:D=N:T=8364])speciation:0.011019[&&NHX:D=N:B=1:T=32523:DD=],TP73_LchaENSLACP00000021702:0.142378[&&NHX:D=N:T=7897])speciation:0.024057[&&NHX:D=N:B=0:T=8287:DD=],((((((tp73_TnigENSTNIP00000014938:0.027328[&&NHX:D=N:T=99883],tp73_TrubENSTRUP00000038165:0.032469[&&NHX:D=N:T=31033])speciation:0.059199[&&NHX:D=N:T=31031:B=100:DD=],tp73_GacuENSGACP00000008676:0.048591[&&NHX:D=N:T=69293])speciation:0.007086[&&NHX:D=N:T=1489922:B=29:DD=],(((tp73_PforENSPFOP00000010896:0.013197[&&NHX:D=N:T=48698],tp73_XmacENSXMAP00000017403:0.030558[&&NHX:D=N:T=8083])speciation:0.063838[&&NHX:D=N:B=100:T=586240:DD=],tp73_OlatENSORLP00000005521:0.062083[&&NHX:D=N:T=8090])speciation:0.017304[&&NHX:D=N:B=58:T=1489913:DD=],tp73_OnilENSONIP00000002627:0.053778[&&NHX:D=N:T=8128])speciation:0.014746[&&NHX:D=N:T=1489908:B=29:DD=])speciation:0.072637[&&NHX:D=N:B=14:T=1489872:DD=],tp73_GmorENSGMOP00000016675:0.181445[&&NHX:D=N:T=8049])speciation:0.038065[&&NHX:D=N:T=123368:B=98:DD=],(tp73_AmexENSAMXP00000014358:0.086906[&&NHX:D=N:T=7994],tp73_DrerENSDARP00000109674:0.134572[&&NHX:D=N:T=7955])speciation:0.064476[&&NHX:D=N:T=186626:B=100:DD=])speciation:0.04364[&&NHX:D=N:T=186625:B=43:DD=],tp73_LocuENSLOCP00000006343:0.115822[&&NHX:D=N:T=7918])speciation:0.046704[&&NHX:D=N:T=41665:B=14:DD=])speciation:0.167736[&&NHX:D=N:T=117571:B=27:DD=])duplication:0.067299[&&NHX:D=Y:B=0:T=117571],tp63_PmarENSPMAP00000007639:0.797694[&&NHX:D=N:T=7757])speciation:0.076045[&&NHX:D=N:T=7742:B=0:DD=],(('p53/p73-b CintENSCINP00000004447':0.450754[&&NHX:D=N:T=7719],ENSCSAVG00000009788_CsavENSCSAVP00000016659:0.47517[&&NHX:D=N:T=51511])speciation:0.378426[&&NHX:D=N:B=100:T=7718:DD=],(ENSCING00000001960_CintENSCINP00000003956:0.141945[&&NHX:D=N:T=7719],ENSCSAVG00000009964_CsavENSCSAVP00000016940:0.26284[&&NHX:D=N:T=51511])speciation:0.525939[&&NHX:D=N:T=7718:B=100:DD=])duplication:0.603292[&&NHX:D=Y:B=100:T=7718])duplication:0.0[&&NHX:D=N:T=7711:B=0:DD=];\",\n }\n\n // this make able the corner placement for all UI elements inside\n this.container_d3.style('position', 'relative')\n\n // remove previous placeholder & UI\n this.container_d3.selectAll(\".corner_placeholder\").remove()\n this.container_d3.selectAll(\".modal_data\").remove()\n this.remove_scale()\n this.remove_color_legend('node')\n this.remove_color_legend('leaf')\n this.container_d3.selectAll(\".menu_settings\").remove()\n this.container_d3.selectAll(\".empty_message\").remove()\n this.container_d3.select('#histogram-legend').remove();\n\n this.container_d3.select(\"#menu-node\").remove()\n\n/*\n if (phylo.phylo_embedded && !empty_mode){\n\n tooltip_object[0].hide()\n tooltip_object[3].hide()\n\n\n }\n\n\n */\n\n\n if (empty_mode){\n this.top_left = this.add_top_left_container()\n this.add_data_icon()\n this.add_empty_message()\n return\n }\n\n // Create corner placeholder for UI elements\n this.bottom_left = this.add_bottom_left_container()\n this.bottom_right = this.add_bottom_right_container()\n this.top_left = this.add_top_left_container()\n this.top_right = this.add_top_right_container()\n\n // BOTTOM LEFT\n if (this.viewer.model.settings.use_branch_lenght) {\n this.scale_text = this.add_scale()\n }\n this.loader = this.bottom_left.append('text').style('color', 'red').style('font-size', 'small')\n if (this.container_object.message_loader){\n this.update_loader_message()\n }\n //this.add_root_badge()\n\n // BOTTOM RIGHT\n\n if (this.viewer.model.big_tree){\n this.add_rescale_zoom()\n }\n this.add_maximise()\n this.add_fit_height()\n this.add_zoom()\n\n // TOP LEFT\n if (!this.api.settings.phylostratigraphy) {\n if (this.container_object.models.length > 0) {\n this.add_toggle()\n }\n this.add_data_icon()\n }\n\n // TOP RIGHT\n this.add_search()\n this.add_export()\n this.add_meta()\n this.add_settings()\n this.add_undo()\n\n // COLOR LEGEND\n if (this.api.settings.compareMode || (this.viewer.model.settings.style.color_accessor['node'] !== null && this.viewer.model.settings.style.color_accessor['node'] !== 'Topology' )){\n this.add_color_legend('node')\n }\n\n if (this.viewer.model.settings.style.color_accessor['leaf'] !== null){\n this.viewer.set_color_scale('leaf')\n this.add_color_legend('leaf')\n }\n\n // Add Stack\n if (this.viewer.model.settings.has_histogram_data && this.viewer.model.settings.show_histogram){\n\n this.add_histogram_legend();\n\n }\n\n\n\n }\n\n // PLACEHOLDER\n add_bottom_left_container() {\n return this.container_d3.append(\"div\")\n .attr(\"class\",\"corner_placeholder bottom left\")\n .style(\"flex-direction\", \"column\")\n }\n add_bottom_right_container(){\n return this.container_d3.append(\"div\")\n .attr(\"class\",\"corner_placeholder bottom right\")\n .style(\"flex-direction\", \"column\")\n .style( \"align-items\", \"flex-end\")\n }\n add_top_left_container(){\n return this.container_d3.append(\"div\")\n .attr(\"class\",\"corner_placeholder top left\")\n }\n add_top_right_container(){\n var div = this.container_d3.append(\"div\").attr(\"class\",\"corner_placeholder top right\")\n .style(\"flex-direction\",'column')\n .style(\"align-items\",'end')\n\n this.tr_buttons = div.append(\"div\").attr(\"class\",\"tr-button\").style(\"display\",'flex')\n\n this.tr_menus = div.append(\"div\").attr(\"class\",\"tr-menus\")\n\n return div\n }\n\n update_loader_message(){\n this.loader.text(this.container_object.message_loader)\n }\n\n\n add_histogram_legend() {\n\n\n d3__WEBPACK_IMPORTED_MODULE_1__.select('#histogram-legend').remove();\n\n var width = 230;\n var height = 80;\n var svgHeight = height + 25;\n var legendRectSize = 20;\n var left_margin = 25;\n var top_margin = 50;\n\n if (this.api.settings.phylostratigraphy){\n top_margin = 25;\n }\n\n var legendTxtSize = 13;\n // center text in the middle of the legend colored rectangle, rounding it to smaller Y-value\n var legendTxtYPadding = (legendRectSize + legendTxtSize) / 2\n\n if(this.viewer.model.settings.stack.type == \"genes\"){\n var dataLabels = [\"Gained\", \"Duplicated\", \"Retained\", \"Lost\" ]\n } else {\n var dataLabels = [\"Gains\", \"Duplications\", \"Losses\" ]\n }\n\n // to position legends correctly\n var rects = dataLabels.length - 1;\n\n\n var legendSvg = this.viewer.svg.append(\"svg\")\n .attr(\"id\", \"histogram-legend\")\n .attr(\"x\", left_margin)\n .attr(\"y\", top_margin)\n .attr(\"width\", width + \"px\")\n .attr(\"height\", svgHeight + \"px\")\n .append(\"g\")\n\n\n legendSvg.append(\"line\")\n .attr(\"x1\", 0)\n .attr(\"y1\", rects * legendRectSize)\n .attr(\"x2\", 200)\n .attr(\"y2\", rects * legendRectSize)\n .attr(\"class\", \"divline\")\n .attr(\"stroke-width\", 2)\n .attr(\"stroke\", \"black\");\n\n legendSvg.selectAll('rect')\n .data(dataLabels)\n .enter()\n .append('rect')\n .attr('x', 110)\n .attr('y', function(d, i){\n return i * legendRectSize;\n })\n .attr('width', legendRectSize)\n .attr('height', legendRectSize)\n .attr('fill', (d, i, node) => {\n return this.viewer.settings.stack.colorMap[d];\n });\n\n legendSvg.selectAll('text')\n .data(dataLabels)\n .enter()\n .append('text')\n .text(function(d){\n return d;\n })\n .attr('x', 110 + legendRectSize + 5)\n .attr('y', function(d, i){\n return i * legendRectSize + legendTxtYPadding;\n })\n .attr('text-anchor', 'start')\n .attr('alignment-baseline', 'baseline')\n .attr(\"font-size\", legendTxtSize).attr(\"stroke\", \"black\");\n\n\n legendSvg\n .append('text')\n .attr(\"class\", \"legendGeneTotal\")\n .text(\"Total # of \"+this.viewer.model.settings.stack.type)\n .attr('x', 0)\n .attr('y', rects * legendRectSize - 5)\n .attr('text-anchor', 'start')\n .attr(\"font-size\", legendTxtSize).attr(\"stroke\", \"black\");\n\n d3__WEBPACK_IMPORTED_MODULE_1__.selectAll(\".legendGeneTotal\").moveToFront();\n\n }\n\n // DATA ICON\n\n get_modal_adder_corpus(){\n return `\n \n <div class=\"container-fluid\">\n \n <div class=\"card\">\n \n <div class=\"card-body\">\n \n <h5> <b>Step 1: Add data from text or file</b> </h5>\n \n \n <div class=\"row\" style=\" margin-left: 24px\">\n <div class=\"col\" >\n <textarea class=\"form-control\" placeholder=\"Paste or type your tree here\" id=\"exampleFormControlTextarea1s\" rows=\"3\"></textarea>\n\n\n </div>\n <div class=\"col-1 my-auto \"><p class=\"align-middle\" style=\"margin: 0px;\"><b>OR</b></p></div>\n <div class=\"col my-auto\">\n\n <div class=\"input-group mb-3\" style=\"padding-left: 24px;\">\n <input class=\"form-control\" type=\"file\" id=\"add_tree_file_input\"> <div class=\"input-group-append\">\n </div>\n </div>\n\n\n </div>\n </div>\n\n <div class=\"row\" style=\"margin-left: 24px\">\n <div class=\"col\" >\n <h6 class=\"card-subtitle mb-2 text-muted\" style=\"margin-top: 6px\"><small>Example: <a href=\"#\" class=\"t1\">tree #1</a>, <a href=\"#\" class=\"t2\">tree #2</a>, <a href=\"#\" class=\"tbig\">big tree</a>, <a href=\"#\" class=\"nhx_ex\">Extended Newick</a>.</small></h6>\n </div>\n </div>\n \n </div>\n\n \n </div>\n \n <br>\n \n <div class=\"card\">\n \n <div class=\"card-body\">\n \n <h5> <b>Step 2: Choose tree data format </b> </h5>\n \n \n <div class=\"text-center\">\n\n <select class=\"custom-select\" id=\"add_tree_str_select\" style=\"margin-left: 24px;\">\n <option selected value=\"newick\">Newick</option>\n <option value=\"nhx\">Extended Newick</option>\n </select>\n\n\n </div>\n\n\n \n </div>\n\n \n </div>\n \n <br>\n \n <div class=\"card\">\n \n <div class=\"card-body\">\n \n <h5> <b>(Optional) Step 3 : Add a mapping file </b> </h5>\n \n <br>\n \n STEP3__\n \n \n </div>\n\n \n </div>\n \n <br>\n \n <div style=\"margin: auto; width: fit-content;\">\n \n \n <button type=\"button\" class=\"btn btn-danger\" data-bs-dismiss=\"modal\">Cancel</button>\n <button type=\"button\" id=\"modal_add_tree_final_button\" class=\"btn btn-success\" data-bs-dismiss=\"modal\" >Upload tree</button>\n \n </div>\n \n </div>\n \n \n `\n }\n\n\n add_data_icon(){\n\n this.container_d3.select(\"#exampleModal\" + this.container_object.uid).remove()\n\n var b = this.top_left.append('button')\n .attr('class', ' dashed_button')\n .attr('id', 'buttonmodal_' + this.container_object.div_id )\n .attr('data-bs-toggle', 'modal')\n .attr('data-bs-target', '#exampleModal' + this.container_object.uid)\n .attr('data-bs-placement', 'right')\n .attr('title', 'Add a new tree')\n .append(\"div\")\n .attr(\"class\",\"label\")\n\n b.html(\" <i class='fas fa-plus' style='color:#888'></i> Add tree\")\n\n let mod_html = this.get_modal_template()\n\n mod_html = mod_html.replace('TEMPLATE_CORPUS', this.get_modal_adder_corpus())\n mod_html = mod_html.replace('TITLE_', 'Upload your tree')\n mod_html = mod_html.replace('SUB_TITLE_', '')\n mod_html = mod_html.replace('STEP3__', this.get_modal_meta_corpus())\n\n\n\n mod_html = mod_html.replace('exampleFormControlTextarea1s', 'exampleFormControlTextarea1s' + this.container_object.uid)\n mod_html = mod_html.replace('add_tree_file_input', 'add_tree_file_input' + this.container_object.uid)\n mod_html = mod_html.replace('exampleModal', 'exampleModal' + this.container_object.uid)\n mod_html = mod_html.replace('add_tree_str_select', 'add_tree_str_select' + this.container_object.uid)\n mod_html = mod_html.replace('modal_add_tree_final_button', 'modal_add_tree_final_button' + this.container_object.uid)\n mod_html = mod_html.replace('upload_mapping_close', 'upload_mapping_close' + this.container_object.uid)\n mod_html = mod_html.replace('upload_mapping_validation', 'upload_mapping_validation' + this.container_object.uid)\n\n // META CORPUS\n\n mod_html = mod_html.replaceAll('add_meta_file_input', 'tree_adder_modal_add_mapping_file_input' + this.container_object.uid)\n mod_html = mod_html.replace('mod_meta_card2', 'tree_adder_mod_meta_card2_' + this.container_object.uid)\n mod_html = mod_html.replace('mod_meta_card3', 'tree_adder_mod_meta_card3_' + this.container_object.uid)\n mod_html = mod_html.replace('mod_meta_card2_radio', 'tree_adder_mod_meta_card2_radio' + this.container_object.uid)\n\n mod_html = mod_html.replace('flexCheckChecked', 'tree_adder_flexCheckChecked' + this.container_object.uid)\n mod_html = mod_html.replace('flexCheckDefault', 'tree_adder_flexCheckDefault' + this.container_object.uid)\n\n mod_html = mod_html.replace('mapping_check_nodes', 'tree_adder_mapping_check_nodes' + this.container_object.uid)\n mod_html = mod_html.replace('mapping_check_leaf', 'tree_adder_mapping_check_leaf' + this.container_object.uid)\n\n //\n\n\n\n\n document.getElementById(this.container_object.div_id).insertAdjacentHTML('afterend',mod_html)\n\n var modmod = document.getElementById('exampleModal'+ this.container_object.uid);\n\n var thaty = this\n\n const add_tree_helpers = function(container_object, str, format, mapping){\n\n var mapping = (typeof mapping == 'undefined') ? false : mapping;\n\n container_object.add_tree(str, {'data_type':format})\n container_object.current_model = container_object.models.length-1\n\n if (mapping !== false){\n\n let moddy = container_object.models[container_object.current_model]\n\n moddy.settings.use_meta_for_leaf = mapping.parameters.use_meta_for_leaf\n moddy.settings.use_meta_for_node = mapping.parameters.use_meta_for_node\n\n if (moddy.settings.use_meta_for_leaf){\n moddy.add_meta_leaves(mapping.meta, mapping.parameters.headers, container_object.api)\n }\n\n if (moddy.settings.use_meta_for_node){\n moddy.add_meta_nodes(mapping.meta, mapping.parameters.headers, container_object.api)\n }\n\n }\n\n\n document.querySelector('#exampleModal'+ container_object.uid).style.display = 'none'\n document.querySelectorAll('.modal-backdrop').forEach(elem => {\n elem.parentNode.removeChild(elem);\n });\n container_object.viewer.set_data(container_object.models[container_object.current_model]);\n container_object.api.stop_all_workers()\n container_object.compute_topology_and_render_bounded_viewer()\n container_object.viewer.render(container_object.viewer.hierarchy);\n //container_object.viewer.update_collapse_level(container_object.models[container_object.current_model].settings.collapse_level)\n\n\n if (thaty.api.settings.compute_distance && thaty.api.bound_container.includes(thaty)){\n thaty.api.send_worker_distance()\n }\n }\n\n const add_data_from_modal = (format) => {\n\n // mapping information\n var mapping_file = document.getElementById('tree_adder_modal_add_mapping_file_input' + that.container_object.uid).files[0];\n\n\n let s = document.getElementById(\"exampleFormControlTextarea1s\" + this.container_object.uid).value\n\n if (s.length > 0){\n\n if (mapping_file) {\n\n var parameters = that.get_mapping_parameter_from_UI(true)\n\n console.log(parameters)\n const reader = new FileReader();\n\n reader.addEventListener('load', (event) => {\n\n var meta = []\n\n if (mapping_file.name.split('.').pop() == 'tsv'){\n d3__WEBPACK_IMPORTED_MODULE_1__.tsvParse(event.target.result, (d) => {meta[d.id] = d});\n }\n else{\n d3__WEBPACK_IMPORTED_MODULE_1__.csvParse(event.target.result, (d) => {meta[d.id] = d});\n }\n\n\n\n add_tree_helpers(this.container_object, s, format, {'meta': meta, 'parameters': parameters})\n return\n\n\n\n });\n reader.readAsText(mapping_file);\n\n\n }\n else {\n add_tree_helpers(this.container_object, s, format)\n return}\n\n\n\n\n }\n\n var file = document.getElementById('add_tree_file_input' + this.container_object.uid).files[0];\n\n if (file) {\n var reader = new FileReader();\n reader.readAsText(file, \"UTF-8\");\n reader.onload = (evt) => {\n\n if (mapping_file) {\n var parameters = that.get_mapping_parameter_from_UI(true)\n\n const reader = new FileReader();\n\n reader.addEventListener('load', (event) => {\n\n var meta = []\n\n\n if (mapping_file.name.split('.').pop() == 'tsv'){\n d3__WEBPACK_IMPORTED_MODULE_1__.tsvParse(event.target.result, (d) => {meta[d.id] = d});\n }\n else{\n d3__WEBPACK_IMPORTED_MODULE_1__.csvParse(event.target.result, (d) => {meta[d.id] = d});\n }\n\n add_tree_helpers(this.container_object, evt.target.result, format, {'meta': meta, 'parameters': parameters})\n return\n\n\n\n });\n reader.readAsText(mapping_file);\n\n\n }\n else {\n add_tree_helpers(this.container_object, evt.target.result, format)\n return}\n\n\n }\n reader.onerror = function (evt) {\n console.log(\"error reading file\")\n }\n }\n\n\n\n }\n\n document.getElementById('modal_add_tree_final_button' + this.container_object.uid).onclick = () => {\n\n\n var e = document.getElementById('add_tree_str_select' + this.container_object.uid);\n\n add_data_from_modal(e.value)\n }\n\n modmod.getElementsByClassName('t1')[0].onclick = () => {\n document.getElementById(\"exampleFormControlTextarea1s\"+ this.container_object.uid).value = this.examples.small1\n document.getElementById('add_tree_str_select' + this.container_object.uid).value = 'newick'\n };\n\n modmod.getElementsByClassName('t1')[0].onclick = () => {\n document.getElementById(\"exampleFormControlTextarea1s\"+ this.container_object.uid).value = this.examples.small1\n document.getElementById('add_tree_str_select' + this.container_object.uid).value = 'newick'\n };\n\n modmod.getElementsByClassName('t2')[0].onclick = () => {\n document.getElementById(\"exampleFormControlTextarea1s\"+ this.container_object.uid).value = this.examples.small2\n document.getElementById('add_tree_str_select' + this.container_object.uid).value = 'newick'\n };\n\n modmod.getElementsByClassName('tbig')[0].onclick = () => {\n document.getElementById(\"exampleFormControlTextarea1s\"+ this.container_object.uid).value = this.examples.big\n document.getElementById('add_tree_str_select' + this.container_object.uid).value = 'newick'\n };\n\n modmod.getElementsByClassName('nhx_ex')[0].onclick = () => {\n document.getElementById(\"exampleFormControlTextarea1s\"+ this.container_object.uid).value = this.examples.nhx\n document.getElementById('add_tree_str_select' + this.container_object.uid).value = 'nhx'\n };\n\n\n // META DATA UPLOADER\n document.getElementById('upload_mapping_validation'+ this.container_object.uid).style.display = 'none'\n document.getElementById('upload_mapping_close'+ this.container_object.uid).style.display = 'none'\n\n\n\n var x = modmod.getElementsByClassName('card')\n for (var i = 0; i < x.length; i++) {\n x[i].style.border = 'none';\n }\n\n // Add JS for modal corpus\n var that = this\n\n document.getElementById('tree_adder_modal_add_mapping_file_input' + this.container_object.uid).onchange = function() {\n let input = this.files[0];\n\n if (input) {\n\n document.getElementById('tree_adder_mod_meta_card2_' + that.container_object.uid).style.display = 'block'\n document.getElementById('tree_adder_mod_meta_card3_' + that.container_object.uid).style.display = 'block'\n\n var reader = new FileReader();\n var data;\n\n reader.addEventListener(\"load\", parseFile, false);\n reader.readAsText(input);\n function parseFile(){\n\n // load data\n if (input.name.split('.').pop() == 'tsv'){\n data = d3__WEBPACK_IMPORTED_MODULE_1__.tsvParse(reader.result, function(d){\n return d;\n });\n }\n else{\n\n data = d3__WEBPACK_IMPORTED_MODULE_1__.csvParse(reader.result, function(d){\n return d;\n });\n\n }\n\n\n // Get columns + types\n var numerisator = {}\n data['columns'].forEach((currentElement) => { if (currentElement != 'id'){ numerisator[currentElement] = 'num'}})\n data.forEach((currentElement) => {\n for (var key of Object.keys(numerisator)) {\n if (isNaN(currentElement[key])){\n numerisator[key] = 'cat'\n }\n }\n })\n\n // creates radios\n var radio_container = document.getElementById( 'tree_adder_mod_meta_card2_radio' + that.container_object.uid)\n var get_el = function(){return `\n \n <div style = \"padding: 12px 24px 0;\"> <span><b style = \"margin-right: 12px\" > Column: </b> \"NAME_\"</span> <br>\n\n <div class=\"form-check \" style=\"margin-left: 24px\" >\n <input class=\"form-check-input \" name=\"flexRadioDefault\" type=\"radio\" value=\"num\" id=\"RADIO_1\" ATTR_NUM>\n <label class=\"form-check-label\" for=\"RADIO_1\">\n Numerical\n </label>\n </div>\n \n <div class=\"form-check \" style=\"margin-left: 24px\" >\n <input class=\"form-check-input\" name=\"flexRadioDefault\" type=\"radio\" value=\"cat\" id=\"RADIO_2\" ATTR_CAT>\n <label class=\"form-check-label\" for=\"RADIO_2\">\n Categorical\n </label>\n </div>\n \n <div class=\"form-check\" style=\"margin-left: 24px\">\n <input class=\"form-check-input\" name=\"flexRadioDefault\" type=\"radio\" value=\"color\" id=\"RADIO_3\">\n <label class=\"form-check-label\" for=\"RADIO_3\">\n Color\n </label>\n </div>\n \n \n \n \n \n \n \n </div>\n `}\n\n for (var key of Object.keys(numerisator)){\n\n var rad = get_el()\n\n\n rad = rad.replace('NAME_', key)\n rad = rad.replaceAll('flexRadioDefault', 'tree_adder_flexRadioDefault_' + key + that.container_object.uid )\n rad = rad.replace('RADIO_1', that.container_object.uid + 'mapping_header_radiotree_adder_1' + '__' + key )\n rad = rad.replace('RADIO_2', that.container_object.uid + 'mapping_header_radiotree_adder_2' + '__' + key )\n rad = rad.replace('RADIO_3', that.container_object.uid + 'mapping_header_radiotree_adder_3' + '__' + key )\n\n\n\n if (numerisator[key] == 'num'){\n rad = rad.replace('ATTR_NUM', 'checked')\n rad = rad.replace('ATTR_CAT', '')\n }\n else{\n rad = rad.replace('ATTR_NUM', 'disabled')\n rad = rad.replace('ATTR_CAT', 'checked')\n }\n\n\n\n radio_container.insertAdjacentHTML('beforeend',rad)\n\n }\n radio_container.insertAdjacentHTML('beforeend','<br>')\n\n }\n\n }\n\n };\n\n\n\n }\n\n get_modal_template(){\n return `\n <div class=\"modal\" id=\"exampleModal\" tabindex=\"-1\">\n <div class=\"modal-dialog modal-dialog-centered modal-lg\">\n <div class=\"modal-content\">\n \n <div class=\"modal-header\" style=\"height: 128px;border:none !important\">\n <h3 class=\"modal-title\" id=\"exampleModalLabel\" style=\"margin: auto; text-align: center\">\n <b>TITLE_</b> <br>\n \n <small style=\"color:grey\">\n SUB_TITLE_\n </small>\n </h3>\n \n </div>\n \n <div class=\"modal-body\" style=\"background-color: #f8f9fa; padding: 24px 48px;\">\n \n \n TEMPLATE_CORPUS\n \n </div>\n \n \n </div>\n\n </div>\n </div>\n </div>\n`\n }\n\n // TOGGLE\n add_toggle(){\n var sub_div = this.top_left.append(\"div\")\n .style( \"display\", \"flex\")\n .style('margin', '2px')\n\n\n var butty_putty = sub_div.append('button')\n .on('click', d => {return this.container_object.shift_model(-1)})\n .attr('class', ' square_button')\n .attr('id', 'buttontoggleleft_' + this.container_object.div_id )\n .attr('data-bs-placement', 'bottom')\n .attr('title', 'Load previous tree')\n\n\n butty_putty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', ' fas fa-chevron-left ')\n\n butty_putty.append('p')\n .text('Previous')\n .style('font-size', 'xx-small')\n\n this.tooltip_shiftleft = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('buttontoggleleft_' + this.container_object.div_id))\n\n\n\n var stoggle = sub_div.append('div')\n .attr('class', ' square_button screen_toggle')\n .style('min-width', '92px')\n .style('display', 'flex')\n .style('align-items', 'center')\n\n\n var sd = stoggle.append('div')\n\n\n\n\n sd.append(\"div\")\n .style('cursor', 'text')\n .attr('id', 'input_edit_name'+ this.container_object.uid)\n .attr(\"contenteditable\",\"true\")\n .attr(\"class\",\"label\")\n .style('display', 'inline')\n .text(this.viewer.model.settings.name)\n\n\n\n var ol = sd.append(\"ul\").attr('class', \"progress-indicator\" )\n .style('width', 'auto')\n .style('min-width', \"50px\")\n\n for (var i = 0; i < this.container_object.models.length; i++) {\n\n let li = ol.append('li')\n\n if (i == this.container_object.current_model){\n\n li.attr('class','completed' )\n\n }\n\n li.append('span')\n .attr('class','bubble' )\n\n }\n\n\n sub_div.append('button')\n .attr('class', 'square_button')\n .attr('id', 'button_edit_name_check'+ this.container_object.uid)\n .append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#fff')\n .attr('class', ' fas fa-check ')\n\n sub_div.append('button')\n .attr('class', 'square_button button_edit_name')\n .attr('id', 'button_edit_name_trash'+ this.container_object.uid)\n .append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#fff')\n .attr('class', ' fas fa-trash ')\n\n\n var butty_putty = sub_div.append('button')\n .attr('class', ' square_button')\n .on('click', d => { return this.container_object.shift_model(1)})\n .attr('id', 'buttonshiftright_' + this.container_object.div_id )\n .attr('data-bs-placement', 'bottom')\n .attr('title', 'Load next tree')\n\n\n butty_putty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', ' fas fa-chevron-right ')\n\n butty_putty.append('p')\n .text('Next')\n .style('font-size', 'xx-small')\n\n this.tooltip_shiftright = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('buttonshiftright_' + this.container_object.div_id))\n\n\n\n // bind events and action to editable div\n\n var edit_name = document.querySelector('#input_edit_name'+ this.container_object.uid);\n var edit_name_ok = document.querySelector('#button_edit_name_check'+ this.container_object.uid);\n var edit_name_trash = document.querySelector('#button_edit_name_trash'+ this.container_object.uid);\n\n edit_name.addEventListener(\"keypress\", (e) => {\n if (e.which == 13) {\n event.preventDefault();\n edit_name_ok.style.display = 'none';\n edit_name_trash.style.display = 'none';\n var old_name = this.viewer.model.get_name()\n this.container_object.add_action('Rename tree', this.viewer.model, this.viewer.model.set_name, [old_name], true )\n this.viewer.model.set_name(edit_name.textContent)\n return false;\n }\n\n\n //You can add delete key event code as well over here for windows users.\n if(edit_name.textContent.length === 20 && e.keyCode != 8) {\n e.preventDefault();\n }\n });\n\n edit_name.addEventListener('focus', (event) => {\n edit_name_ok.style.display = 'inline';\n edit_name_trash.style.display = 'inline';\n });\n\n edit_name.addEventListener('blur', (event) => {\n setTimeout(() => {\n edit_name_ok.style.display = 'none';\n edit_name_trash.style.display = 'none';\n edit_name.textContent = this.viewer.model.get_name()\n }, 300);\n\n });\n\n\n edit_name_trash.addEventListener('click', (event) => {\n this.container_object.remove_current_tree(true)\n\n });\n\n edit_name_ok.addEventListener('click', (event) => {\n var old_name = this.viewer.model.get_name()\n this.container_object.add_action('Rename tree', this.viewer.model, this.viewer.model.set_name, [old_name], true )\n this.viewer.model.set_name(edit_name.textContent)\n\n });\n\n\n\n\n }\n\n add_rescale_zoom(){\n\n var butty_putty = this.bottom_right.append('button')\n .on('click', d => {\n\n this.viewer.force_zoom_rescaling = true;\n this.viewer.zoomed( {'transform':this.viewer.d3.zoomTransform(this.viewer.svg.node())});\n this.viewer.force_zoom_rescaling = false;\n })\n .attr('class', ' square_button')\n .attr('id', 'buttonscaleviewer_' + this.container_object.div_id )\n .attr('data-bs-placement', 'left')\n .attr('title', 'Optimise text size')\n .style('margin', '2px')\n\n\n butty_putty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', ' fas fa-text-height ')\n\n butty_putty.append('p')\n .text('Optimise text')\n .style('font-size', 'xx-small')\n .style('line-height', 'normal')\n\n\n this.tooltip_fitviewer = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('buttonscaleviewer_' + this.container_object.div_id))\n\n }\n\n add_fit_height() {\n\n var butty_putty = this.bottom_right.append('button')\n .on('click', d => {\n this.viewer.fit_to_viewer_height()\n })\n .attr('class', ' square_button')\n .attr('id', 'buttonfitviewer_' + this.container_object.div_id )\n .attr('data-bs-placement', 'left')\n .attr('title', 'Optimise view (possible collapse/expand)')\n .style('margin', '2px')\n\n\n butty_putty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', ' fas fa-compress ')\n\n butty_putty.append('p')\n .text('Optimise view')\n .style('font-size', 'xx-small')\n .style('line-height', 'normal')\n\n this.tooltip_fitviewer = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('buttonfitviewer_' + this.container_object.div_id))\n\n }\n\n add_maximise() {\n\n var butty_putty= this.bottom_right.append('button')\n .on('click', d => {\n this.viewer.maximise_zoom()\n })\n .attr('class', ' square_button')\n .attr('id', 'button_maximise_zoom_' + this.container_object.div_id )\n .attr('data-bs-placement', 'left')\n .attr('title', 'Fit tree into viewer (no collapse/expand)')\n .style('margin', '2px')\n\n\n butty_putty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', ' fas fa-expand ')\n\n butty_putty.append('p')\n .text('Fit screen')\n .style('font-size', 'xx-small')\n\n this.tooltip_fitviewer = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('button_maximise_zoom_' + this.container_object.div_id))\n\n }\n\n // BADGE ROOTING\n add_root_badge() {\n\n\n\n this.bottom_left.append('button')\n .attr('class', ' square_button')\n .style('padding', '4px')\n .style('margin', '2px')\n .style('cursor', 'default')\n .style('color', 'white')\n .style('background', 'rgb(136, 136, 136)')\n .append(\"div\")\n .on('click', d => { return this.container_object.toggle_rooting()})\n .attr(\"class\", \"label\")\n .append('small')\n .html(this.viewer.model.rooted ? 'Rooted Tree <i class=\\\"fas fa-sync-alt\\\"></i>' : 'Unrooted Tree <i class=\\\"fas fa-sync-alt\\\"></i> ')\n }\n\n // ZOOM\n add_zoom(){\n\n var butty_putty =this.bottom_right.append('button')\n .on('click', d => {return this.viewer.zoom_in()})\n .attr('class', ' square_button')\n .attr('id', 'buttonzoomplus_' + this.container_object.div_id )\n .attr('data-bs-placement', 'left')\n .attr('title', 'Zoom in')\n .style('margin', '2px')\n\n\n\n\n butty_putty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', ' fas fa-search-plus ')\n\n butty_putty.append('p')\n .text('Zoom in')\n .style('font-size', 'xx-small')\n\n this.tooltip_zoomplus = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('buttonzoomplus_' + this.container_object.div_id))\n\n\n var butty_putty = this.bottom_right.append('button')\n .on('click', d => {return this.viewer.zoom_out()})\n .attr('class', ' square_button')\n .style('margin', '2px')\n .attr('id', 'buttonzoomminus_' + this.container_object.div_id )\n .attr('data-bs-placement', 'left')\n .attr('title', 'Zoom out')\n\n\n\n butty_putty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', ' fas fa-search-minus ')\n\n butty_putty.append('p')\n .text('Zoom out')\n .style('font-size', 'xx-small')\n\n this.tooltip_zoomminus = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('buttonzoomminus_' + this.container_object.div_id))\n\n }\n\n // SCALE\n add_scale(){\n\n var scaleLineLateralPadding = 10\n var scaleLineBottomPadding = 10\n\n\n var gg = this.viewer.svg_d3.node().append('g')\n .attr(\"class\", 'scale')\n .attr(\"transform\", \"translate(0,\" + (this.viewer.height - scaleLineBottomPadding) + \")\")\n\n gg.append(\"path\")\n .attr(\"d\", (d) => {return \"M\" + scaleLineLateralPadding + \",20L\" + (this.scale_pixel_length) + \",20\"})\n .attr(\"class\", 'scale_line')\n\n\n var scale_text = gg.append(\"text\")\n .attr(\"class\", 'scale_text')\n .attr(\"x\", this.scale_pixel_length/2)\n .attr(\"y\", 10)\n .attr(\"fill\", \"#555\")\n .attr('text-anchor', 'middle')\n .attr(\"dy\", \".2em\")\n .text(d => {return this.compute_scale()})\n\n\n return scale_text\n\n\n\n }\n remove_scale(){this.container_d3.select(\".scale\").remove()}\n\n update_scale_value(zoom_scale){\n this.scale_text.text(this.compute_scale(zoom_scale))\n\n }\n\n compute_scale(zoom_scale){\n var zoom_scale = zoom_scale || 1;\n return (this.viewer.scale_branch_length.invert(this.scale_pixel_length)/zoom_scale).toFixed(4);\n }\n\n //COLORING\n add_color_legend(type){\n\n this.container_d3.select(\".colorlegend_\" + type).remove()\n\n var tt =this.viewer.model.settings.extended_data_type[this.viewer.model.settings.style.color_accessor[type]]\n\n if ( tt === 'cat' || tt === 'color'){return}\n\n\n var type = (typeof type !== 'undefined') ? type : 'node';\n\n let top_padding = 16;\n let left_padding = 16;\n let width = 16;\n let height = 100;\n let gutter = 8;\n let rect_height = height/100;\n\n var offset = type == 'node' ? (this.viewer.height/2) + 30 : this.viewer.height/2-height - 10\n\n let gg = this.viewer.svg_d3.node().append('g')\n .attr(\"class\", 'colorlegend_' + type)\n\n\n var values = []\n\n for (let i = 0; i < 100; i++) {\n let n = this.viewer.intercolor[type]((i/100).toFixed(2));\n values.push(this.viewer.colorScale[type](n));\n }\n\n gg.selectAll(\"rect\")\n .data(values)\n .join(\"rect\")\n .attr(\"x\", left_padding)\n .attr(\"y\", (d, i) => offset + i)\n .attr(\"width\", width)\n .attr(\"height\", rect_height)\n .attr(\"fill\", d => d);\n\n gg.append(\"text\")\n .attr(\"x\", left_padding + width + gutter )\n .attr(\"y\", offset - 6 )\n .attr(\"fill\", \"#555\")\n .attr('text-anchor', 'start')\n .attr(\"dy\", \".2em\")\n .text(() => {\n var ms = this.viewer.model.settings.style;\n\n if (ms.color_accessor[type]){\n var n = ms.color_extent_max[type][ms.color_accessor[type]];\n return Number.isInteger(n) ? n : parseFloat(n).toFixed(3);\n\n }\n return 1\n })\n\n gg.append(\"text\")\n .attr(\"x\", left_padding + width + gutter )\n .attr(\"y\", offset + height + 10 )\n .attr(\"fill\", \"#555\")\n .attr('text-anchor', 'start')\n .attr(\"dy\", \".2em\")\n .text(() => {\n var ms = this.viewer.model.settings.style;\n\n if (ms.color_accessor[type]){\n\n var n;\n\n if (ms.color_extent_max[type][ms.color_accessor[type]] == ms.color_extent_min[type][ms.color_accessor[type]]){\n n = ms.color_extent_min[type][ms.color_accessor[type]]-1;\n }else{\n n = ms.color_extent_min[type][ms.color_accessor[type]];\n }\n\n\n return Number.isInteger(n) ? n : parseFloat(n).toFixed(3);\n\n }\n return 0\n })\n\n\n var xx = gutter\n var yy = offset + height/2\n\n gg.append(\"text\")\n .attr(\"fill\", \"#555\")\n .attr('transform', \"translate(\"+xx+\", \" +yy+ \")rotate(-90)\")\n .attr('text-anchor', 'middle')\n .attr(\"dy\", \".2em\")\n .text(() => {\n var ms = this.viewer.model.settings.style;\n return ms.color_accessor[type] ? ms.color_accessor[type] : \"Topology\"\n\n\n })\n\n }\n remove_color_legend(type){this.container_d3.select(\".colorlegend_\" + type).remove()}\n\n // SEARCH\n\n autocomplete(inp, arr) {\n\n var that = this\n\n\n /*the autocomplete function takes two arguments,\n the text field element and an array of possible autocompleted values:*/\n var currentFocus;\n /*execute a function when someone writes in the text field:*/\n\n inp.addEventListener(\"input\", function(e) {\n\n\n\n var a, b, i, val = this.value;\n /*close any already open lists of autocompleted values*/\n closeAllLists();\n if (!val) { return false;}\n currentFocus = -1;\n /*create a DIV element that will contain the items (values):*/\n a = document.createElement(\"DIV\");\n a.setAttribute(\"id\", this.id + \"autocomplete-list\");\n a.setAttribute(\"class\", \"autocomplete-items\");\n /*append the DIV element as a child of the autocomplete container:*/\n this.parentNode.appendChild(a);\n /*for each item in the array...*/\n for (i = 0; i < arr.length; i++) {\n /*check if the item starts with the same letters as the text field value:*/\n if (arr[i].toUpperCase().includes(val.toUpperCase()) ){\n //if (arr[i].substr(0, val.length).toUpperCase() === val.toUpperCase()) {\n /*create a DIV element for each matching element:*/\n b = document.createElement(\"DIV\");\n /*make the matching letters bold:*/\n var start_index = arr[i].toUpperCase().indexOf(val.toUpperCase())\n b.innerHTML += arr[i].substr(0, start_index);\n b.innerHTML += \"<strong>\" + arr[i].substr(start_index, val.length) + \"</strong>\";\n b.innerHTML += arr[i].substr(start_index + val.length);\n /*insert a input field that will hold the current array item's value:*/\n b.innerHTML += \"<input type='hidden' value='\" + arr[i] + \"'>\";\n /*execute a function when someone clicks on the item value (DIV element):*/\n b.addEventListener(\"click\", function(e) {\n /*insert the value for the autocomplete text field:*/\n that.dismiss_blur = true\n inp.value = this.getElementsByTagName(\"input\")[0].value;\n document.getElementById('buttonsearch_' + this.container_object.div_id ).focus();\n\n that.container_object.zoom_to_node(inp.value)\n that.viewer.maximise_zoom()\n\n /*close the list of autocompleted values,\n (or any other open lists of autocompleted values:*/\n closeAllLists();\n });\n a.appendChild(b);\n }\n }\n });\n /*execute a function presses a key on the keyboard:*/\n inp.addEventListener(\"keydown\", function(e) {\n var x = document.getElementById(this.id + \"autocomplete-list\");\n if (x) x = x.getElementsByTagName(\"div\");\n if (e.keyCode == 40) {\n /*If the arrow DOWN key is pressed,\n increase the currentFocus variable:*/\n currentFocus++;\n /*and and make the current item more visible:*/\n addActive(x);\n } else if (e.keyCode == 38) { //up\n /*If the arrow UP key is pressed,\n decrease the currentFocus variable:*/\n currentFocus--;\n /*and and make the current item more visible:*/\n addActive(x);\n } else if (e.keyCode == 13) {\n /*If the ENTER key is pressed, prevent the form from being submitted,*/\n e.preventDefault();\n if (currentFocus > -1) {\n /*and simulate a click on the \"active\" item:*/\n if (x) x[currentFocus].click();\n }\n }\n });\n function addActive(x) {\n /*a function to classify an item as \"active\":*/\n if (!x) return false;\n /*start by removing the \"active\" class on all items:*/\n removeActive(x);\n if (currentFocus >= x.length) currentFocus = 0;\n if (currentFocus < 0) currentFocus = (x.length - 1);\n /*add class \"autocomplete-active\":*/\n x[currentFocus].classList.add(\"autocomplete-active\");\n }\n function removeActive(x) {\n /*a function to remove the \"active\" class from all autocomplete items:*/\n for (var i = 0; i < x.length; i++) {\n x[i].classList.remove(\"autocomplete-active\");\n }\n }\n function closeAllLists(elmnt) {\n /*close all autocomplete lists in the document,\n except the one passed as an argument:*/\n var x = document.getElementsByClassName(\"autocomplete-items\");\n for (var i = 0; i < x.length; i++) {\n if (elmnt != x[i] && elmnt != inp) {\n x[i].parentNode.removeChild(x[i]);\n }\n }\n }\n /*execute a function when someone clicks in the document:*/\n document.addEventListener(\"click\", function (e) {\n closeAllLists(e.target);\n });\n\n\n }\n\n add_search(){\n\n\n this.container_d3.selectAll(\"#searchinp\" + this.viewer.uid).remove()\n\n // add input\n this.search_input = this.tr_buttons.append('input')\n .attr('class', ' search_input')\n .style('display', 'none')\n .style('height', '56px')\n .attr('id', \"searchinp\" + this.viewer.uid )\n\n var input_el = document.getElementById(\"searchinp\" + this.viewer.uid );\n\n // add search button\n var search_but = this.tr_buttons.append('button')\n .attr('class', ' square_button search_button')\n .attr('id', 'buttonsearch_' + this.container_object.div_id )\n .attr('data-bs-placement', 'bottom')\n .attr('title', 'search for label')\n .style('border-top-left-radius', '8px')\n .style('border-bottom-left-radius', '8px')\n .style('margin', '2px')\n .on(\"click\", d => {\n var display = input_el.style.display;\n\n if (display == 'none'){\n let search_el = document.getElementById('buttonsearch_' + this.container_object.div_id );\n\n input_el.style.display = 'inline-block';\n search_el.style.borderTopLeftRadius = '0px';\n search_el.style.borderBottomLeftRadius = '0px';\n }\n else{\n this.container_object.zoom_to_node(document.getElementById(\"searchinp\" + this.viewer.uid).value)\n this.viewer.maximise_zoom()\n\n input_el.style.display = 'none';\n search_el.style.borderTopLeftRadius = '8px';\n search_el.style.borderBottomLeftRadius = '8px';\n document.getElementById('searchinp' + this.viewer.uid + 'autocomplete-list').remove();\n }\n })\n\n\n search_but.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', ' fas fa-search ')\n\n search_but.append('p')\n .text('Search')\n .style('font-size', 'xx-small')\n\n this.tooltip_search = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('buttonsearch_' + this.container_object.div_id))\n\n\n\n let search_el = document.getElementById('buttonsearch_' + this.container_object.div_id );\n\n this.autocomplete(document.getElementById(\"searchinp\" + this.viewer.uid ), this.viewer.model.settings.suggestions)\n\n input_el.addEventListener(\"keyup\", ({key}) => {\n if (key === \"Enter\") {\n this.container_object.zoom_to_node(document.getElementById(\"searchinp\" + this.viewer.uid).value)\n this.viewer.maximise_zoom()\n }\n })\n\n input_el.addEventListener(\"blur\", (e) => {\n\n setTimeout(() => {\n\n if (this.dismiss_blur){\n this.dismiss_blur = false\n\n }\n else{\n input_el.style.display = 'none';\n search_el.style.borderTopLeftRadius = '8px';\n search_el.style.borderBottomLeftRadius = '8px';\n document.getElementById('searchinp' + this.viewer.uid + 'autocomplete-list').remove();\n\n }\n }, 200);\n\n })\n\n\n }\n\n // META\n get_modal_meta_corpus(){\n return `\n\n <div class=\"container-fluid\">\n \n <div class=\"card\">\n \n <div class=\"card-body\">\n \n <h5> <b>Step 1: Select your mapping file</b> </h5>\n \n\n <div class=\"input-group mb-3\" style=\"padding: 24px 24px 0;\">\n <input class=\"form-control\" type=\"file\" id=\"add_meta_file_input\" > \n </div>\n \n <p style=\"padding: 0 24px;\"><small>\n <b>Accepted format:</b> '.csv' or '.tsv' and must contain column names at first row. \n The mapping is done using the column named 'id' to identify leaves and nodes.\n</small></p>\n\n </div>\n \n </div>\n\n <br>\n \n <div class=\"card\" id=\"mod_meta_card2\" style=\"display: none\">\n \n <div class=\"card-body\" id=\"mod_meta_card2_radio\" >\n \n <h5> <b>Step 2: Configure data mapping types</b> </h5>\n \n \n \n </div>\n \n </div>\n \n <br>\n \n <div class=\"card\" id=\"mod_meta_card3\" style=\"display: none\">\n \n <div class=\"card-body\">\n \n <h5> <b>Step 3: Choose a target for additional data</b> </h5>\n \n <div class=\"form-check\" style=\"padding: 12px 48px 0;\">\n <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"mapping_check_leaf\" checked>\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\n Apply to leaves\n </label>\n </div>\n <div class=\"form-check\" style=\"padding: 12px 48px 0;\">\n <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"mapping_check_nodes\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n Apply to Nodes\n </label>\n </div>\n \n\n </div>\n \n </div>\n \n <br>\n \n <div style=\"margin: auto; width: fit-content;\">\n \n <button type=\"button\" id=\"upload_mapping_close\" class=\"btn btn-danger\" data-bs-dismiss=\"modal\">Cancel</button>\n <button type=\"button\" id=\"upload_mapping_validation\" class=\"btn btn-success\" data-bs-dismiss=\"modal\" disabled >Upload mapping file</button>\n</div>\n \n \n \n </div>\n \n `\n }\n\n add_meta(){\n\n let mod_html = this.get_modal_template()\n\n\n mod_html = mod_html.replace('TEMPLATE_CORPUS', this.get_modal_meta_corpus())\n mod_html = mod_html.replace('TITLE_', 'Upload your own mapping file')\n mod_html = mod_html.replace('SUB_TITLE_', 'to add additional information to leaves and nodes')\n\n mod_html = mod_html.replace('exampleModal', 'modal_meta_' + this.container_object.uid)\n mod_html = mod_html.replaceAll('add_meta_file_input', 'modal_add_mapping_file_input' + this.container_object.uid)\n\n mod_html = mod_html.replace('mod_meta_card2', 'mod_meta_card2_' + this.container_object.uid)\n mod_html = mod_html.replace('mod_meta_card3', 'mod_meta_card3_' + this.container_object.uid)\n mod_html = mod_html.replace('mod_meta_card2_radio', 'mod_meta_card2_radio' + this.container_object.uid)\n\n mod_html = mod_html.replace('flexCheckChecked', 'flexCheckChecked' + this.container_object.uid)\n mod_html = mod_html.replace('flexCheckDefault', 'flexCheckDefault' + this.container_object.uid)\n\n mod_html = mod_html.replace('upload_mapping_validation', 'upload_mapping_validation' + this.container_object.uid)\n mod_html = mod_html.replace('mapping_check_nodes', 'mapping_check_nodes' + this.container_object.uid)\n mod_html = mod_html.replace('mapping_check_leaf', 'mapping_check_leaf' + this.container_object.uid)\n\n document.getElementById(this.container_object.div_id).insertAdjacentHTML('afterend',mod_html)\n\n // Add JS for modal corpus\n var that = this\n\n document.getElementById('modal_add_mapping_file_input' + this.container_object.uid).onchange = function() {\n let input = this.files[0];\n\n if (input) {\n\n document.getElementById('mod_meta_card2_' + that.container_object.uid).style.display = 'block'\n document.getElementById('mod_meta_card3_' + that.container_object.uid).style.display = 'block'\n document.getElementById('upload_mapping_validation' + that.container_object.uid).disabled = false;\n\n\n var reader = new FileReader();\n var data;\n\n reader.addEventListener(\"load\", parseFile, false);\n reader.readAsText(input);\n function parseFile(){\n\n // load data\n if (input.name.split('.').pop() == 'tsv'){\n data = d3__WEBPACK_IMPORTED_MODULE_1__.tsvParse(reader.result, function(d){\n return d;\n });\n }\n else{\n\n data = d3__WEBPACK_IMPORTED_MODULE_1__.csvParse(reader.result, function(d){\n return d;\n });\n\n }\n\n\n // Get columns + types\n var numerisator = {}\n data['columns'].forEach((currentElement) => { if (currentElement != 'id'){ numerisator[currentElement] = 'num'}})\n data.forEach((currentElement) => {\n for (var key of Object.keys(numerisator)) {\n if (isNaN(currentElement[key])){\n numerisator[key] = 'cat'\n }\n }\n })\n\n // creates radios\n var radio_container = document.getElementById( 'mod_meta_card2_radio' + that.container_object.uid)\n var get_el = function(){return `\n \n <div style = \"padding: 12px 24px 0;\"> <span><b style = \"margin-right: 12px\" > Column: </b> \"NAME_\"</span> <br>\n\n <div class=\"form-check \" style=\"margin-left: 24px\" >\n <input class=\"form-check-input \" name=\"flexRadioDefault\" type=\"radio\" value=\"num\" id=\"RADIO_1\" ATTR_NUM>\n <label class=\"form-check-label\" for=\"RADIO_1\">\n Numerical\n </label>\n </div>\n \n <div class=\"form-check \" style=\"margin-left: 24px\" >\n <input class=\"form-check-input\" name=\"flexRadioDefault\" type=\"radio\" value=\"cat\" id=\"RADIO_2\" ATTR_CAT>\n <label class=\"form-check-label\" for=\"RADIO_2\">\n Categorical\n </label>\n </div>\n \n <div class=\"form-check\" style=\"margin-left: 24px\">\n <input class=\"form-check-input\" name=\"flexRadioDefault\" type=\"radio\" value=\"color\" id=\"RADIO_3\">\n <label class=\"form-check-label\" for=\"RADIO_3\">\n Color\n </label>\n </div>\n \n \n \n \n \n \n \n </div>\n `}\n\n for (var key of Object.keys(numerisator)){\n\n var rad = get_el()\n\n\n rad = rad.replace('NAME_', key)\n rad = rad.replaceAll('flexRadioDefault', 'flexRadioDefault_' + key + that.container_object.uid )\n rad = rad.replace('RADIO_1', that.container_object.uid + 'mapping_header_radio1' + '__' + key )\n rad = rad.replace('RADIO_2', that.container_object.uid + 'mapping_header_radio2' + '__' + key )\n rad = rad.replace('RADIO_3', that.container_object.uid + 'mapping_header_radio3' + '__' + key )\n\n\n\n if (numerisator[key] == 'num'){\n rad = rad.replace('ATTR_NUM', 'checked')\n rad = rad.replace('ATTR_CAT', '')\n }\n else{\n rad = rad.replace('ATTR_NUM', 'disabled')\n rad = rad.replace('ATTR_CAT', 'checked')\n }\n\n\n\n radio_container.insertAdjacentHTML('beforeend',rad)\n\n }\n radio_container.insertAdjacentHTML('beforeend','<br>')\n\n }\n\n }\n\n else {\n document.getElementById('upload_mapping_validation' + that.container_object.uid).disabled = true;\n }\n };\n\n document.getElementById('upload_mapping_validation' + this.container_object.uid).onclick = function(){\n\n\n var file = document.getElementById('modal_add_mapping_file_input' + that.container_object.uid).files[0];\n\n if (file) {\n\n var parameters = that.get_mapping_parameter_from_UI()\n\n console.log(parameters)\n const reader = new FileReader();\n\n reader.addEventListener('load', (event) => {\n\n var meta = []\n\n if (file.name.split('.').pop() == 'tsv'){\n d3__WEBPACK_IMPORTED_MODULE_1__.tsvParse(event.target.result, (d) => {meta[d.id] = d});\n }\n else{\n d3__WEBPACK_IMPORTED_MODULE_1__.csvParse(event.target.result, (d) => {meta[d.id] = d});\n }\n\n that.viewer.model.settings.use_meta_for_leaf = parameters.use_meta_for_leaf\n that.viewer.model.settings.use_meta_for_node = parameters.use_meta_for_node\n\n\n\n if (that.viewer.model.settings.use_meta_for_leaf){\n that.viewer.model.add_meta_leaves(meta, parameters.headers, that.container_object.api)\n }\n\n if (that.viewer.model.settings.use_meta_for_node){\n that.viewer.model.add_meta_nodes(meta, parameters.headers, that.container_object.api)\n }\n\n\n\n that.viewer.interface = new Interface(that.viewer, that.viewer.container_object)\n\n });\n reader.readAsText(file);\n\n }\n\n\n\n\n }\n\n\n // add the button\n var ex_b = this.tr_buttons.append('button')\n .attr('id', 'button_meta' + this.container_object.uid)\n .attr('data-bs-placement', 'bottom')\n .attr('title', 'Add additional informations to the tree')\n .attr('data-bs-toggle', 'modal')\n .attr('data-bs-target', '#modal_meta_' + this.container_object.uid )\n\n var divybuty = ex_b.attr('class', ' square_button')\n .style('margin', '2px')\n\n divybuty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', 'fas fa-file-lines')\n\n divybuty.append('p')\n .text('Mapping')\n .style('font-size', 'xx-small')\n\n\n }\n\n get_mapping_parameter_from_UI(modal){\n\n var modal = (typeof modal == 'undefined') ? false : modal;\n\n var p = {'headers': {}}\n\n if (modal){\n var prefix = this.container_object.uid + 'mapping_header_radiotree_adder_'\n }\n else{\n var prefix = this.container_object.uid + 'mapping_header_radio'\n }\n\n\n var checkies = document.querySelectorAll(`[id^=\"${prefix}\"]`);\n\n\n checkies.forEach(element => {\n\n if (element.checked) {\n var column_type = element.value\n var column_name = element.id.split('__').pop()\n\n\n p['headers'][column_name] = column_type\n }\n\n\n });\n\n if (modal){\n p['use_meta_for_node'] = document.getElementById( 'tree_adder_mapping_check_nodes' + this.container_object.uid).checked\n p['use_meta_for_leaf'] = document.getElementById( 'tree_adder_mapping_check_leaf' + this.container_object.uid).checked\n }\n else{\n p['use_meta_for_node'] = document.getElementById( 'mapping_check_nodes' + this.container_object.uid).checked\n p['use_meta_for_leaf'] = document.getElementById( 'mapping_check_leaf' + this.container_object.uid).checked\n }\n\n\n\n\n\n return p\n }\n\n // EXPORT\n add_export() {\n\n // add the button\n var ex_b = this.tr_buttons.append('button')\n .attr('id', 'button_export' + this.container_object.uid)\n .attr('data-bs-placement', 'bottom')\n .attr('title', 'Export this tree as graphic or text file')\n\n var divybuty = ex_b.attr('class', ' square_button')\n .style('margin', '2px')\n .on(\"click\", d => {\n if (this.menu_export.style('display') === 'none'){\n this.menu_settings.style(\"display\", 'none') // make it more general to all menu/button\n ex_b.style('background-color', '#CCC');\n document.getElementById(\"button_settings\" + this.container_object.uid).style.backgroundColor = 'rgba(239, 239, 239, 0.95)';\n return this.menu_export.style(\"display\", 'block')\n }\n ex_b.style('background-color', 'rgba(239, 239, 239, 0.95)');\n return this.menu_export.style(\"display\", 'none')\n })\n\n\n\n\n divybuty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', ' fas fa-download ')\n\n divybuty.append('p')\n .text('Download')\n .style('font-size', 'xx-small')\n\n\n this.tooltip_export = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('button_export' + this.container_object.uid))\n\n\n\n // add the sub menu container\n this.menu_export = this.tr_menus.append('div')\n .style(\"background-color\", '#aaa')\n .attr('class', 'menu_export')\n\n\n // ADD THE ACCORDION SYSTEM\n\n this.menu_exportimage_b = this.menu_export.append('button').attr('class', 'accordion').text(\"Export as Graphic\")\n this.menu_exportimage_p = this.menu_export.append('div').attr('class', 'panel').append(\"div\").style(\"padding\", \"14px\")\n\n this.export_as = this.menu_exportimage_p.append('div')\n .style('display', 'flex')\n\n this.export_as.append('button') // todo clean click\n .attr('class', ' square_button')\n .on(\"click\", d => {\n this.screen_shot('png')\n })\n .style('margin', '2px')\n .style('flex-grow', '1')\n .append(\"text\")\n .text(\"PNG\")\n\n\n this.export_as.append('button')\n .attr('class', ' square_button')\n .on(\"click\", d => { // todo clean\n this.screen_shot('svg')\n })\n .style('margin', '2px')\n .style('flex-grow', '1')\n .append(\"text\")\n .text(\"SVG\")\n\n\n\n this.menu_exportfile_b = this.menu_export.append('button').attr('class', 'accordion').text(\"Export as Text\")\n this.menu_exportfile_p = this.menu_export.append('div').attr('class', 'panel').append(\"div\").style(\"padding\", \"14px\")\n\n this.export_as = this.menu_exportfile_p.append('div')\n .style('display', 'flex')\n\n this.export_as.append('button') // todo clean click\n .attr('class', ' square_button')\n .on(\"click\", d => {\n this.container_object.export_as_newick()\n })\n .style('margin', '2px')\n .style('flex-grow', '1')\n .append(\"text\")\n .text(\"Newick\")\n\n }\n\n screen_shot(format){\n\n var svg = this.viewer.d3.select(\"#svg\" + this.viewer.uid)\n this.addLogo(svg);\n var name = svg.attr(\"id\");\n var svgString = this.getSVGString(svg.node());\n\n if(format === 'svg') {\n\n var blob = new Blob([svgString], {\"type\": \"image/svg+xml;base64,\"+ btoa(svgString)});\n file_saver__WEBPACK_IMPORTED_MODULE_0__.saveAs(blob, name+\".svg\");\n svg.select(\"#exportLogo\").remove();\n\n }\n else if (format === 'png'){\n var exportElement = svg.node();\n var width = exportElement.getBoundingClientRect().width;\n var height = exportElement.getBoundingClientRect().height;\n this.svgString2Image(svgString, 2 * width, 2 * height, 'png', save);\n svg.select(\"#exportLogo\").remove();\n\n function save(dataBlob, filesize) {\n var filename = (name) ? name+\".\" : \"\";\n file_saver__WEBPACK_IMPORTED_MODULE_0__.saveAs(dataBlob, filename+'phylo.io.png'); // FileSaver.js function\n }\n\n }\n\n }\n\n // UNDO\n add_undo(){\n var divybuty = this.tr_buttons.append('button')\n .attr('class', ' square_button')\n .attr('id', 'buttonundo_' + this.container_object.div_id )\n .attr('data-bs-placement', 'bottom')\n .attr('title', d=> { return this.container_object.history_actions.length > 0 ? 'Undo ' + this.container_object.get_last_action().name : 'Nothing to undo' })\n .style('margin', '2px')\n .on(\"click\", d => {\n this.api.undoing = true\n var cta = this.container_object.pop_last_action();\n if (cta) {\n cta.fonct.apply(cta.fonction_obj, cta.argu);\n\n if (cta.refresh_interface){\n let empty = this.container_object.models.length <= 0\n this.container_object.interface = new Interface(this.viewer, this.container_object, empty )\n }\n\n }\n this.api.undoing = false\n })\n\n\n\n\n\n divybuty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', ' fas fa-undo ')\n\n divybuty.append('p')\n .text('Undo')\n .style('font-size', 'xx-small')\n\n this.tooltip_undo = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('buttonundo_' + this.container_object.div_id))\n\n }\n\n toggle_select_node_face(cid){\n\n var acc = document.getElementById(\"accordion_branch\"+cid)\n\n\n if (acc.classList.contains('active')) {\n\n document.getElementById('selectlt' + cid).style.display = 'block';\n document.getElementById('selectlb' + cid).style.display = 'block';\n document.getElementById('selectr' + cid).style.display = 'block';\n\n document.getElementById('selectlt' + cid).style.top = -90 + 'px';\n document.getElementById('selectlb' + cid).style.top = -40 + 'px';\n document.getElementById('selectr' + cid).style.top = -60 + 'px';\n\n document.getElementById('selectlt' + cid).style.left = '30px';\n document.getElementById('selectlb' + cid).style.left = '30px';\n document.getElementById('selectr' + cid).style.left = '130px';\n\n }\n else{\n document.getElementById('selectlt' + cid).style.display = 'none';\n document.getElementById('selectlb' + cid).style.display = 'none';\n document.getElementById('selectr' + cid).style.display = 'none';\n }\n }\n\n // SETTINGS\n add_settings() {\n\n // add the buttons\n var set_b = this.tr_buttons.append('button')\n .attr('data-bs-placement', 'bottom')\n .attr('title', 'Viewer settings')\n\n set_b.attr('class', ' square_button')\n set_b.attr('id', 'button_settings' + this.container_object.uid)\n .style('margin', '2px')\n .on(\"click\", d => {\n if (this.menu_settings.style('display') === 'none') { //make it as funtion\n this.menu_export.style(\"display\", 'none')\n set_b.style('background-color', '#CCC');\n document.getElementById(\"button_export\" + this.container_object.uid).style.backgroundColor = 'rgba(239, 239, 239, 0.95)';\n return this.menu_settings.style(\"display\", 'block')\n }\n set_b.style('background-color', 'rgba(239, 239, 239, 0.95)');\n return this.menu_settings.style(\"display\", 'none')\n })\n\n set_b.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', ' fas fa-sliders-h ')\n\n set_b.append('p')\n .text('Settings')\n .style('font-size', 'xx-small')\n\n\n\n this.tooltip_settings = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('button_settings' + this.container_object.uid))\n\n\n // add the menu\n this.menu_settings = this.tr_menus.append('div')\n .attr('class', 'menu_settings')\n\n\n // ADD THE ACCORDION SYSTEM todo close other when open one\n\n this.menu_general_b = this.menu_settings.append('button').attr('id', 'accordion_tree'+this.container_object.uid).attr('class', 'accordion').text(\"Tree\")\n this.menu_general_p = this.menu_settings.append('div').attr('class', 'panel').append(\"div\").style(\"padding\", \"14px\")\n this.menu_tree_b = this.menu_settings.append('button').attr('id', 'accordion_branch'+this.container_object.uid).attr('class', 'accordion').text(\"Branch & Labels\")\n this.menu_tree_p = this.menu_settings.append('div').attr('class', 'panel').append(\"div\").style(\"padding\", \"14px\")\n\n this.menu_search_b = this.menu_settings.append('button').attr('id', 'accordion_branch'+this.container_object.uid).attr('class', 'accordion').text(\"Search\")\n this.menu_search_p = this.menu_settings.append('div').attr('class', 'panel').append(\"div\").style(\"padding\", \"14px\")\n\n //this.menu_metadata_b = this.menu_settings.append('button').attr('id', 'accordion_color'+this.container_object.uid).attr('class', 'accordion').text(\"Additional Information\")\n //this.menu_metadata_p = this.menu_settings.append('div').attr('class', 'panel').append(\"div\").style(\"padding\", \"14px\")\n\n this.menu_coloring_b = this.menu_settings.append('button').attr('id', 'accordion_color'+this.container_object.uid).attr('class', 'accordion').text(\"Coloring\")\n this.menu_coloring_panel = this.menu_settings.append('div').attr('class', 'panel')\n\n this.menu_coloring_p = this.menu_coloring_panel.append(\"div\").style(\"padding\", \"14px\")\n\n if (this.viewer.model.settings.has_histogram_data && this.viewer.model.settings.show_histogram ) {\n this.menu_stack_b = this.menu_settings.append('button').attr('class', 'accordion').text(\"Bar Graph\")\n this.menu_stack_p = this.menu_settings.append('div').attr('class', 'panel').append(\"div\").style(\"padding\", \"14px\")\n\n\n\n this.slider_sts = this.add_slider_UI(this.menu_stack_p, \"Bar height\", 40, 300, this.viewer.model.settings.stack.stackHeight, 5, \"slider_stack_height_\",\n (e ) =>{this.viewer.update_stack_height(e.target.value)})\n\n this.slider_sts = this.add_slider_UI(this.menu_stack_p, \"Bar width\", 10, 150, this.viewer.model.settings.stack.stackWidth, 5, \"slider_stack_width_\",\n (e ) =>{this.viewer.update_stack_width(e.target.value)})\n\n this.slider_sts = this.add_slider_UI(this.menu_stack_p, \"Label size\", 6, 40, this.viewer.model.settings.stack.legendTxtSize, 1, \"slider_stack_text_size_\",\n (e ) =>{this.viewer.update_stack_font(e.target.value)})\n\n this.menu_stack_p.append(\"p\").text('Labels').style('margin-bottom', \"0px\")\n\n\n this.stack_type = this.menu_stack_p.append('div')\n .style('display', 'flex')\n .style('margin-bottom', \"14px\")\n\n\n\n this.stack_type.append('button') // todo clean click\n .attr('class', ' square_button')\n .attr('id', 'stack_type_events')\n .style('background-color', d => {return this.viewer.model.settings.stack.type === 'events' ? 'rgb(204, 204, 204)': null })\n .on(\"click\", d => {\n this.viewer.update_stack_type('events')\n this.viewer. d3.select(\"#stack_type_events\").style('background-color','rgb(204, 204, 204)')\n this.viewer.d3.select(\"#stack_type_genes\").style('background-color', null)\n })\n .style('margin', '2px')\n .style('flex-grow', '1')\n .append(\"text\")\n .text(\"Events\")\n\n\n this.stack_type.append('button')\n .attr('class', ' square_button')\n .attr('id', 'stack_type_genes')\n .style('background-color', d => {return this.viewer.model.settings.stack.type === 'genes' ? 'rgb(204, 204, 204)': null })\n .on(\"click\", d => {\n this.viewer.update_stack_type('genes')\n this.viewer.d3.select(\"#stack_type_genes\").style('background-color','rgb(204, 204, 204)')\n this.viewer.d3.select(\"#stack_type_events\").style('background-color', null)\n })\n .style('margin', '2px')\n .style('flex-grow', '1')\n .append(\"text\")\n .text(\"Genes\")\n\n this.add_swicth_UI(this.menu_stack_p, (this.viewer.model.settings.stack.maxStackHeight === 'ratio'),\"Fix stack height\", this.viewer.toggle_height_max_ratio.bind(this.viewer))\n\n this.add_swicth_UI(this.menu_stack_p, this.viewer.model.settings.stack.showHistogramValues,\"Show numbers\", this.viewer.toggle_show_stack_number.bind(this.viewer))\n\n if (this.viewer.model.settings.stack.has_support){\n this.add_swicth_UI(this.menu_stack_p, this.viewer.model.settings.stack.only_support,\"remove low coverage hogs\", this.viewer.toggle_only_support.bind(this.viewer))\n\n }\n\n\n\n\n }\n\n // ADD LOGIC TO ACCORDION todo add it general or to this div only\n var acc = document.getElementById(this.container_object.div_id).getElementsByClassName(\"accordion\");\n var that = this;\n var i;\n\n for (i = 0; i < acc.length; i++) {\n acc[i].addEventListener(\"click\", function(e) {\n\n this.classList.toggle(\"active\");\n\n var panel = this.nextElementSibling;\n if (panel.style.maxHeight) {\n panel.style.maxHeight = null;\n } else {\n panel.style.maxHeight = panel.scrollHeight + \"px\";\n }\n\n that.toggle_select_node_face(that.container_object.uid)\n\n /*\n\n var checkExist = setInterval(function() {\n\n var obs_h = panel.style.maxHeight ? panel.getBoundingClientRect().height : 0\n var exp_h = panel.style.maxHeight ? panel.scrollHeight : 0\n\n if (obs_h == exp_h ) {\n that.toggle_select_node_face(that.container_object.uid)\n clearInterval(checkExist);\n }\n\n else {\n console.log(obs_h, exp_h )\n }\n }, 200);\n\n */\n\n });\n\n\n }\n\n // ADD TOGGLE BRANCH LENGTH\n if(this.viewer.model.settings.has_branch_lenght){\n this.add_swicth_UI(this.menu_general_p, this.viewer.model.settings.use_branch_lenght,\"Use branch length\", this.viewer.toggle_use_length.bind(this.viewer))\n }\n\n this.add_swicth_UI(this.menu_general_p, this.viewer.model.settings.align_tip,\"Align leaves\", this.viewer.toggle_align_tip.bind(this.viewer))\n\n this.add_swicth_UI(this.menu_general_p, this.viewer.model.settings.mirror,\"Mirror tree\", this.viewer.toggle_mirror.bind(this.viewer))\n\n // ADD SLIDER RESIZE X/Y\n /*\n this.slider_v = this.add_slider_UI(this.menu_general_p, \"Tree height\", 2, 1000, this.viewer.model.settings.tree.node_vertical_size, 1, \"slider_node_vertical_size_\",\n (e ) =>{this.viewer.modify_node_size('vertical', e.target.value - this.viewer.model.settings.tree.node_vertical_size)})\n\n this.slider_h = this.add_slider_UI(this.menu_general_p, \"Tree width\", 2, 1000, this.viewer.model.settings.tree.node_horizontal_size, 1, \"slider_node_horyzontal_size_\",\n (e ) =>{this.viewer.modify_node_size('horizontal', e.target.value - this.viewer.model.settings.tree.node_horizontal_size)})\n */\n\n\n this.buttons_height = this.add_quartet_buttons(this.menu_general_p, \"Tree height\", \"buton_vertical_size_\", this.container_object.modify_node_size_percent, 'vertical')\n this.buttons_width = this.add_quartet_buttons(this.menu_general_p, \"Tree width\", \"buton_horyzontal_size_\", this.container_object.modify_node_size_percent, 'horizontal')\n\n\n // ADD SELECT LEFT NODE LABEL\n this.add_node_face_UI(this.menu_tree_p, this.container_object.uid)\n\n // ADD TOGGLE INTERNAL LABEL\n //this.add_swicth_UI(this.menu_tree_p, this.viewer.model.settings.display_internal_label,\"Show internal label\", this.viewer.toggle_internal_label.bind(this.viewer))\n\n\n // ADD TOGGLE tooltips\n this.add_swicth_UI(this.menu_tree_p, this.viewer.model.settings.subsample_label,\"Subsample Labels\", this.viewer.toggle_subsample.bind(this.viewer))\n\n // ADD TOGGLE LEAF LABEL\n this.add_swicth_UI(this.menu_tree_p, this.viewer.model.settings.display_leaves,\"Show Leaves Labels\", this.viewer.toggle_leaves.bind(this.viewer))\n\n // ADD TOGGLE tooltips\n this.add_swicth_UI(this.menu_tree_p, this.viewer.model.settings.show_tooltips,\"Show tooltips\", this.viewer.toggle_tooltips.bind(this.viewer))\n\n if (this.viewer.model.settings.has_duplications){\n // ADD TOGGLE DUPLICATION\n this.add_swicth_UI(this.menu_tree_p, this.viewer.model.settings.display_duplication,\"Show duplications\", this.viewer.toggle_duplication.bind(this.viewer))\n\n }\n\n // ADD SLIDER NODE/LINE/TEXT\n /*\n this.slider_n = this.add_slider_UI(this.menu_tree_p, \"Node Radius\", 1, this.viewer.model.settings.tree.node_vertical_size/2, this.viewer.model.settings.tree.node_radius, 1, \"slider_node_radius_\",\n (e ) =>{this.viewer.update_node_radius(e.target.value)})\n\n this.slider_l = this.add_slider_UI(this.menu_tree_p, \"Line width\", 1, this.viewer.model.settings.tree.node_vertical_size/2, this.viewer.model.settings.tree.line_width, 1, \"slider_line_width_\",\n (e ) =>{this.viewer.update_line_width(e.target.value)})\n\n this.slider_t = this.add_slider_UI(this.menu_tree_p, \"Leaf label size\", 4, 50, this.viewer.model.settings.tree.font_size, 1, \"slider_text_size_\",\n (e ) =>{this.viewer.update_font_size(e.target.value)})\n\n this.slider_i = this.add_slider_UI(this.menu_tree_p, \"Node label size\", 1, this.viewer.model.settings.tree.node_vertical_size*2, this.viewer.model.settings.style.font_size_internal, 1, \"slider_text_node_size_\",\n (e ) =>{this.viewer.update_font_size_node(e.target.value)})\n\n */\n\n this.add_quartet_buttons(this.menu_tree_p, \"Node Radius\", \"buton_node_radius_\", this.container_object.update_node_radius_percent )\n this.add_quartet_buttons(this.menu_tree_p, \"Line width\", \"buton_line_width_\", this.container_object.update_line_width_percent)\n this.add_quartet_buttons(this.menu_tree_p, \"Leaf label size\", \"buton_leaf_label_size_\", this.container_object.update_font_size_leaf_percent)\n this.add_quartet_buttons(this.menu_tree_p, \"Node label size\", \"buton_node_label_\", this.container_object.update_font_size_node_percent)\n\n\n\n\n\n // COLLAPSE\n\n this.slider_c = this.add_slider_UI(this.menu_general_p,\n this.viewer.model.settings.collapse_level == 0 ? \"Autocollapse: Off\" : \"Autocollapse: \" + this.viewer.model.settings.collapse_level,\n 0, this.viewer.model.settings.tree.max_depth , this.viewer.model.settings.collapse_level, 0,\"slider_collapse_level_\",)\n document.getElementById(\"slider_collapse_level_\" + this.container_object.uid).onchange = (e) => {\n\n\n this.viewer.update_collapse_level(e.target.value, false)\n var lab = e.target.value == 0 ? \"Autocollapse: Off\" : \"Autocollapse: \" + this.viewer.model.settings.collapse_level;\n\n document.getElementById(\"slider_collapse_level_\" + this.container_object.uid)\n .parentElement.previousSibling.innerHTML = lab;\n\n }\n\n\n if (this.api.settings.compareMode) {\n // equalize tree\n this.menu_general_p.append(\"p\").text('Equalize trees')\n .style('margin-bottom', '0px')\n\n\n this.equalize_div = this.menu_general_p.append('div')\n .style('display', 'flex')\n .style('margin-top', '0px')\n\n\n this.equalize_div.append('button')\n .attr('class', ' square_button')\n .attr('id', 'equ_reroot' + this.viewer.uid)\n .on(\"click\", d => {\n this.container_object.reroot_to_compared_tree()\n })\n .style('margin', '2px')\n .style('flex-grow', '1')\n .append(\"text\")\n .text(\"Reroot\")\n\n\n this.equalize_div.append('button')\n .attr('class', ' square_button')\n .attr('id', 'equ_reorder' + this.viewer.uid)\n .on(\"click\", d => {\n this.container_object.reorder_to_compared_tree()\n })\n .style('margin', '2px')\n .style('flex-grow', '1')\n .append(\"text\")\n .text(\"Reorder\")\n }\n\n\n // ADD TOGGLE MULTIPLE SEARCH\n this.add_swicth_UI(this.menu_search_p, this.viewer.model.settings.multiple_search,\"Multiple search\", this.viewer.toggle_multiple_search.bind(this.viewer))\n\n\n /*\n // ADDITIONAL DATA\n var meta_div = this.menu_metadata_p.append('div')\n .style('display','block')\n //.style('margin','8px')\n\n\n meta_div.append('p').text(\"Mapping file\").style('font-weight','bold')\n\n\n meta_div.append('input')\n .attr('id','filemeta' + this.container_object.uid )\n .attr('type','file')\n .style('margin-bottom','16px')\n\n\n this.add_swicth_UI(this.menu_metadata_p, this.viewer.model.settings.use_meta_for_leaf,\"Apply to leaves\", this.viewer.toggle_use_meta_for_leaf.bind(this.viewer) )\n this.add_swicth_UI(this.menu_metadata_p, this.viewer.model.settings.use_meta_for_node,\"Apply to nodes\", this.viewer.toggle_use_meta_for_node.bind(this.viewer))\n\n\n this.meta_div = this.menu_metadata_p.append('div')\n .style('display', 'flex')\n .style('margin-top', '0px')\n\n\n this.button_meta = this.meta_div.append('button')\n .attr('id','button_add_meta' + this.container_object.uid )\n .on(\"click\", (e) => {\n\n var file = document.getElementById('filemeta' + this.container_object.uid).files[0];\n\n if (file) {\n const reader = new FileReader();\n reader.addEventListener('load', (event) => {\n\n var meta = []\n\n d3.csvParse(event.target.result, (d) => {meta[d.id] = d});\n\n if (this.viewer.model.settings.use_meta_for_leaf){\n this.viewer.model.add_meta_leaves(meta)\n }\n\n if (this.viewer.model.settings.use_meta_for_node){\n this.viewer.model.add_meta_nodes(meta)\n }\n\n this.viewer.interface = new Interface(this.viewer, this.viewer.container_object)\n\n });\n reader.readAsText(file);\n\n }\n\n\n\n })\n .attr('class', ' square_button')\n .style('border-radius', '2px')\n .style('flex-grow', '1')\n .style('background-color', '#CCC')\n .text('Use this file')\n\n\n */\n\n\n // COLORING\n var that = this;\n\n\n this.menu_coloring_p.append('p').text(\"Leaves\").style('font-weight','bold')\n\n var color_leaves_div = this.menu_coloring_p.append('div')\n .style('display','block')\n .style('margin-left','8px')\n\n var options = Array.from(this.viewer.model.settings.colorlabels['leaf'])\n\n if (options.length > 0){\n\n options.unshift('None')\n\n color_leaves_div.append('label').text(\"Data\")\n\n var selectcoloring_leaf = color_leaves_div.append('select')\n .attr('id','selectcoloring_leaf' + this.container_object.uid )\n .attr('class','select')\n .style('float','right')\n .on('change', function(){\n\n that.on_change_coloring_scheme('leaf', this.value)\n\n })\n\n\n\n selectcoloring_leaf.selectAll('option').data(options).enter()\n .append('option')\n .attr('value', function (d) {\n return d; })\n .property(\"selected\", (d) => { return d == this.viewer.model.settings.style.color_accessor['leaf'] })\n .text(function (d) { return d; });\n\n\n\n\n this.color_leaf_div = this.menu_coloring_p.append('div')\n\n }\n else {\n color_leaves_div.style('float','right').append('label').text(\"No Data available\");\n this.menu_coloring_p.append('br')\n\n }\n\n\n this.menu_coloring_p.append('p').text(\"Nodes\").style('font-weight','bold').style('margin-top','8px')\n\n var drop = this.menu_coloring_p.append('div')\n .style('display','block')\n .style('margin-left','8px')\n\n\n drop.append('label').text(\"Data\");\n\n var selectcoloring = drop.append('select')\n .attr('id','selectcoloring' + this.container_object.uid )\n .attr('class','select')\n .style('float','right')\n .on('change', function(){\n\n that.on_change_coloring_scheme('node', this.value)\n\n })\n\n var options = Array.from(this.viewer.model.settings.colorlabels['node'])\n options.push(\"None\")\n\n selectcoloring.selectAll('option').data(options).enter().append('option').attr('value', function (d) { return d; })\n .property(\"selected\", (d) => { return d == this.viewer.model.settings.style.color_accessor['node'] })\n .text(function (d) { return d; });\n\n\n this.color_node_div = this.menu_coloring_p.append('div')\n\n this.create_color_scheme_picker('node')\n\n\n }\n\n on_change_coloring_scheme(type, val){\n\n this.viewer.model.settings.style.color_accessor[type] = val === 'None' ? null : val;\n\n console.log()\n\n this.create_color_scheme_picker(type)\n\n this.viewer.set_color_scale(type);\n this.viewer.render(this.viewer.hierarchy)\n\n this.remove_color_legend(type)\n if(this.viewer.model.settings.style.color_accessor[type]) {\n this.add_color_legend(type)\n }\n\n this.menu_coloring_panel.style(\"max-height\", this.menu_coloring_p.style(\"height\"))\n\n }\n\n create_color_scheme_picker(type){\n\n var acc = this.viewer.model.settings.style.color_accessor[type]\n var type_acc = this.viewer.model.settings.extended_data_type[acc]\n\n\n if (type == 'leaf'){\n var container_ = this.color_leaf_div\n container_.html('')\n }\n\n else if (type == 'node'){\n var container_ = this.color_node_div\n container_.html('')\n }\n\n if (type_acc == 'num'){\n\n var domain_leaf = container_.append('div')\n .style('display','block')\n .style('margin','12px')\n\n domain_leaf.append('label').text(\"# domain\");\n\n domain_leaf.append('input')\n .attr('id','inputcoloring_' + type + this.container_object.uid )\n .attr('type','number')\n .attr('name','quantity')\n .attr('min','2')\n .attr('value', this.viewer.model.settings.style.number_domain[type])\n .attr('max','5')\n .style('float','right')\n .on('change', (d) => {\n this.viewer.model.settings.style.number_domain[type] = document.getElementById('inputcoloring_' + type + this.container_object.uid ).value;\n this.create_color_picker(type)\n this.viewer.set_color_scale(type);\n this.viewer.render(this.viewer.hierarchy)\n\n\n })\n\n\n var colcol = container_.append('div')\n .style('display','block')\n .style('margin','8px')\n\n colcol.append('label').text(\"Color\");\n\n colcol.append(\"span\").attr('id',type + '_colorspan_' + this.container_object.uid );\n\n this.create_color_picker(type)\n\n }\n\n\n else if (type_acc == 'color' ){\n container_.append('label').text(\"Use color loaded\").style('float', 'right');\n container_.append('br')\n this.viewer.set_color_scale(type);\n this.viewer.render(this.viewer.hierarchy)\n }\n\n else if (type_acc == 'cat' || typeof type_acc == 'undefined'){\n container_.append('label').text(\"Default color scheme\").style('float', 'right');\n container_.append('br')\n this.viewer.set_color_scale(type);\n this.viewer.render(this.viewer.hierarchy)\n }\n\n else{\n container_.append('label').text(\"\");\n }\n\n\n\n\n}\n\n create_color_picker(type){\n\n var colspan = d3__WEBPACK_IMPORTED_MODULE_1__.select(\"#\" + type + '_colorspan_' + this.container_object.uid)\n\n colspan.html(\"\")\n\n\n var number = this.viewer.model.settings.style.number_domain[type];\n var default_color = this.viewer.model.settings.style.color_domain_default[type];\n var w = Math.round(135/number);\n var color = []\n\n switch (number) {\n case '2':\n color = [default_color[0], default_color[4]]\n break;\n case '3':\n color = [default_color[0],default_color[2], default_color[4]]\n break;\n case '4':\n color = [default_color[0],default_color[1],default_color[2], default_color[4]]\n break;\n case '5':\n color = default_color\n\n }\n\n\n\n for (let i = 0; i < number; i++) {\n var idd = type + '_color_picker_' + this.viewer.container_object.uid + '_' + i;\n colspan.append(\"span\").style('display',' inline-block').style('float','right')\n .html(\"<input class='colpicker_\" + type + \"' type=\\\"color\\\" id=\\\"\"+idd+\"\\\" style='width:\" + w +\"px;'name=\\\"favcolor\\\" value=\\\"\" + color[i] + \"\\\">\")\n\n d3__WEBPACK_IMPORTED_MODULE_1__.select(\"#\" + idd).on('change', () => {\n\n\n this.update_color_pickers(type)\n\n this.viewer.set_color_scale(type);\n this.viewer.render(this.viewer.hierarchy)\n this.remove_color_legend(type)\n this.add_color_legend(type)\n })\n\n }\n\n\n\n\n this.viewer.model.settings.style.color_domain[type] = color;\n\n }\n\n update_color_pickers(type){\n\n var colspan = d3__WEBPACK_IMPORTED_MODULE_1__.select(\"#\" + type + '_colorspan_' + this.container_object.uid)\n\n\n var new_col = []\n colspan.selectAll(\".colpicker_\" + type).each(function(d){\n new_col.push(this.value)\n })\n\n this.viewer.model.settings.style.color_domain[type] = new_col\n\n\n\n }\n\n add_swicth_UI(parent, checked, label, f){\n\n var lab = parent.append('label').style(\"display\", 'inline-block')\n .attr(\"class\",\"switch\")\n\n lab.append('input').attr('type', 'checkbox' ).property('checked', checked);\n lab.append('span').attr(\"class\",\"slider_t round\")\n .on('click', (d) => { f()} )\n\n parent.append('p').text(label).style(\"display\", 'inline-block').style(\"margin-left\", '12px')\n parent.append('br')\n\n }\n\n add_node_face_UI(parent,container_id){\n\n var w = 220;\n var h = 160;\n var gutter = 20\n\n var s = parent.append(\"svg\")\n .attr('display', 'block')\n .attr(\"width\", w )\n .attr(\"height\", h)\n\n s.append('line')\n .style(\"stroke\", \"black\")\n .style(\"stroke-width\", 2)\n .attr(\"x1\", gutter/2)\n .attr(\"y1\", h/2)\n .attr(\"x2\", w/2)\n .attr(\"y2\", h/2);\n\n s.append('line')\n .style(\"stroke\", \"black\")\n .style(\"stroke-width\", 2)\n .attr(\"x1\", w/2)\n .attr(\"y1\", gutter)\n .attr(\"x2\", w/2)\n .attr(\"y2\", h-gutter);\n\n s.append('line')\n .style(\"stroke\", \"black\")\n .style(\"stroke-width\", 2)\n .attr(\"x1\", w/2)\n .attr(\"y1\", gutter)\n .attr(\"x2\", w-gutter)\n .attr(\"y2\", gutter);\n\n s.append('line')\n .style(\"stroke\", \"black\")\n .style(\"stroke-width\", 2)\n .attr(\"x1\", w/2)\n .attr(\"y1\", h-gutter)\n .attr(\"x2\", w-gutter)\n .attr(\"y2\", h-gutter);\n\n s.append('circle')\n .attr('cx', w/2)\n .attr('cy', h/2)\n .attr('r', 5)\n .attr('stroke', 'black')\n .attr('fill', '#69a3b2');\n\n\n var l = Array.from(this.viewer.model.settings.labels['node'])\n\n var options = [\"None\"]\n options = options.concat(l)\n\n var that = this\n\n var selectlt = parent.append('select').attr('id','selectlt' + container_id ).attr('class','select dropdrop ').on('change', function(){\n\n var value = this.value === 'None' ? false : this.value\n\n that.viewer.model.settings.display_internal_label_left_top = value\n\n that.viewer.render(that.viewer.hierarchy)\n\n })\n\n var selectlb = parent.append('select').attr('id','selectlb' + container_id ).attr('class','select dropdrop ').on('change', function(){\n\n var value = this.value === 'None' ? false : this.value\n\n that.viewer.model.settings.display_internal_label_left_bottom = value\n\n that.viewer.render(that.viewer.hierarchy)\n\n })\n\n var selectr = parent.append('select').attr('id','selectr' + container_id ).attr('class','select dropdrop').on('change', function(){\n\n var value = this.value === 'None' ? false : this.value\n\n that.viewer.model.settings.display_internal_label = value\n\n that.viewer.render(that.viewer.hierarchy)\n\n })\n\n selectlt.selectAll('option').data(options).enter().append('option').attr('value', function (d) { return d; }).text(function (d) { return d; });\n selectlb.selectAll('option').data(options).enter().append('option').attr('value', function (d) { return d; }).text(function (d) { return d; });\n selectr.selectAll('option').data(options).enter().append('option').attr('value', function (d) { return d; }).text(function (d) { return d; });\n\n\n\n function selectElement(id, valueToSelect) {\n let element = document.getElementById(id);\n element.value = valueToSelect;\n }\n\n selectElement('selectr' + container_id, this.viewer.model.settings.display_internal_label == false ? \"None\" : this.viewer.model.settings.display_internal_label )\n selectElement('selectlb' + container_id, this.viewer.model.settings.display_internal_label_left_bottom == false ? \"None\" : this.viewer.model.settings.display_internal_label_left_bottom )\n selectElement('selectlt' + container_id, this.viewer.model.settings.display_internal_label_left_top == false ? \"None\" : this.viewer.model.settings.display_internal_label_left_top )\n\n\n }\n\n\n add_quartet_buttons(parent, label, id, f, aux){\n\n var f = f || function(){};\n var aux = aux || null;\n\n parent.append(\"p\").text(label)\n .style('margin-bottom','0px')\n .style('font-weight','bold')\n\n var buttons = parent.append('div')\n .style('display', 'flex')\n .style('margin-top', '0px')\n .style('margin-bottom', '4px')\n\n\n var butty_putty1 = buttons.append('button')\n .attr('class', ' square_button')\n .style('border-radius', '0px')\n .style('padding', '2px')\n .attr('id', id + 'first' + this.container_object.uid )\n .on(\"click\", (e) => f.call(this.container_object,-0.50, aux ) )\n .style('margin', '2px')\n .style('flex-grow', '1')\n\n\n butty_putty1.append(\"div\").append('i')\n .style('color', '#888')\n .style('font-size', '12px')\n .attr('class', ' fas fa-minus ')\n\n butty_putty1.append('p')\n .text('-50%')\n .style('font-size', 'xx-small')\n .style('line-height', 'normal')\n .style('margin-bottom', '4px')\n\n var butty_putty2 = buttons.append('button')\n .attr('class', ' square_button')\n .style('border-radius', '0px')\n .style('padding', '2px')\n .attr('id', id + 'second' + this.container_object.uid )\n .on(\"click\", (e) => f.call(this.container_object,-0.20, aux ) )\n .style('margin', '2px')\n .style('flex-grow', '1')\n\n\n butty_putty2.append(\"div\").append('i')\n .style('color', '#888')\n .style('font-size', '8px')\n .attr('class', ' fas fa-minus ')\n\n butty_putty2.append('p')\n .text('-20%')\n .style('font-size', 'xx-small')\n .style('line-height', 'normal')\n .style('margin-bottom', '4px')\n\n\n var butty_putty3 = buttons.append('button')\n .attr('class', ' square_button')\n .style('border-radius', '0px')\n .style('padding', '2px')\n .attr('id', id + 'third' + this.container_object.uid )\n .on(\"click\", (e) => f.call(this.container_object,0.20, aux ) )\n .style('margin', '2px')\n .style('flex-grow', '1')\n\n\n\n butty_putty3.append(\"div\").append('i')\n .style('color', '#888')\n .style('font-size', '8px')\n .attr('class', ' fas fa-plus ')\n\n butty_putty3.append('p')\n .text('+20%')\n .style('font-size', 'xx-small')\n .style('line-height', 'normal')\n .style('margin-bottom', '4px')\n\n\n\n var butty_putty4 = buttons.append('button')\n .attr('class', ' square_button')\n .style('border-radius', '0px')\n .style('padding', '2px')\n .attr('id', id + 'fourth' + this.container_object.uid )\n .on(\"click\", (e) => f.call(this.container_object,0.50, aux ) )\n .style('margin', '2px')\n .style('flex-grow', '1')\n\n\n\n butty_putty4.append(\"div\").append('i')\n .style('color', '#888')\n .style('font-size', '12px')\n .attr('class', ' fas fa-plus ')\n\n butty_putty4.append('p')\n .text('+50%')\n .style('font-size', 'xx-small')\n .style('line-height', 'normal')\n .style('margin-bottom', '4px')\n\n return buttons\n\n\n\n }\n\n add_slider_UI(parent, label, min, max, current, step, id, f){\n\n var f = f || function(){};\n\n parent.append(\"p\").text(label).style('margin-bottom','0px').style('font-weight','bold')\n\n var d = parent.append('div')\n .attr(\"class\",\"slidecontainer\")\n\n var input = d.append('input').attr(\"class\",\"slider\")\n .attr('type', 'range' )\n .attr('min', min )\n .attr('max', max )\n .attr('value', current )\n //.attr('step', step )\n .attr('id', id + this.container_object.uid )\n .on('click', (e) => { f(e)} )\n .style('margin-bottom','12px')\n\n return input\n\n\n\n }\n\n update_slider(slide ,value){\n slide.attr('value', value);\n }\n\n //OLD PHYLO COPY PASTE todo clean\n // Below are the functions that handle actual exporting:\n // getSVGString ( svgNode ) and svgString2Image( svgString, width, height, format, callback )\n getSVGString( svgNode ) {\n svgNode.setAttribute('xlink', 'http://www.w3.org/1999/xlink');\n var cssStyleText = getCSSStyles( svgNode );\n appendCSS( cssStyleText, svgNode );\n\n var serializer = new XMLSerializer();\n var svgString = serializer.serializeToString(svgNode);\n svgString = svgString.replace(/(\\w+)?:?xlink=/g, 'xmlns:xlink='); // Fix root xlink without namespace\n svgString = svgString.replace(/NS\\d+:href/g, 'xlink:href'); // Safari NS namespace fix\n\n return svgString;\n\n function getCSSStyles( parentElement ) {\n var selectorTextArr = [];\n\n // Add Parent element Id and Classes to the list\n selectorTextArr.push( '#'+parentElement.id );\n for (var c = 0; c < parentElement.classList.length; c++)\n if ( !contains('.'+parentElement.classList[c], selectorTextArr) )\n selectorTextArr.push( '.'+parentElement.classList[c] );\n\n // Add Children element Ids and Classes to the list\n var nodes = parentElement.getElementsByTagName(\"*\");\n for (var i = 0; i < nodes.length; i++) {\n var id = nodes[i].id;\n if ( !contains('#'+id, selectorTextArr) )\n selectorTextArr.push( '#'+id );\n\n var classes = nodes[i].classList;\n for (var c = 0; c < classes.length; c++)\n if ( !contains('.'+classes[c], selectorTextArr) )\n selectorTextArr.push( '.'+classes[c] );\n }\n\n // Extract CSS Rules\n var extractedCSSText = \"\";\n for (var i = 0; i < document.styleSheets.length; i++) {\n var s = document.styleSheets[i];\n\n try {\n if(!s.cssRules) continue;\n } catch( e ) {\n if(e.name !== 'SecurityError') throw e; // for Firefox\n continue;\n }\n\n var cssRules = s.cssRules;\n for (var r = 0; r < cssRules.length; r++) {\n if ( contains( cssRules[r].selectorText, selectorTextArr ) )\n extractedCSSText += cssRules[r].cssText;\n }\n }\n\n\n return extractedCSSText;\n\n function contains(str,arr) {\n return arr.indexOf( str ) === -1 ? false : true;\n }\n\n }\n\n function appendCSS( cssText, element ) {\n var styleElement = document.createElement(\"style\");\n styleElement.setAttribute(\"type\",\"text/css\");\n styleElement.innerHTML = cssText;\n var refNode = element.hasChildNodes() ? element.children[0] : null;\n element.insertBefore( styleElement, refNode );\n }\n }\n\n svgString2Image( svgString, width, height, format, callback ) {\n var format = format ? format : 'png';\n\n var imgsrc = 'data:image/svg+xml;base64,'+ btoa( unescape( encodeURIComponent( svgString ) ) ); // Convert SVG string to dataurl\n\n var canvas = document.createElement(\"canvas\");\n var context = canvas.getContext(\"2d\");\n\n canvas.width = width;\n canvas.height = height;\n\n var image = new Image;\n image.onload = function() {\n\n context.clearRect ( 0, 0, width, height );\n context.fillStyle = \"#ffffff\";\n context.fillRect(0, 0, width, height);\n context.drawImage(image, 0, 0, width, height);\n\n canvas.toBlob( function(blob) {\n var filesize = Math.round( blob.length/1024 ) + ' KB';\n if ( callback ) callback( blob, filesize );\n });\n };\n image.src = imgsrc;\n }\n\n addLogo(svg) {\n // TODO load with ajax\n var logo_xml = '<svg id=\"exportLogo\" x=\"0\" y=\"0\"><g id=\"g4169\"> <path d=\"m 29.606259,23.679171 1.905511,0 c 0.193778,0.617882 0.290669,1.188505 0.290672,1.711869 0.466506,-0.545171 1.022728,-0.99222 1.668668,-1.341146 0.653108,-0.348904 1.295455,-0.523362 1.927043,-0.523373 0.976073,1.1e-5 1.86603,0.261698 2.669869,0.78506 0.810999,0.523383 1.442581,1.221215 1.894747,2.093495 0.459321,0.865028 0.688986,1.802739 0.688998,2.813134 -1.2e-5,1.010407 -0.229677,1.951752 -0.688998,2.824038 -0.452166,0.865023 -1.083748,1.559219 -1.894747,2.082592 -0.803839,0.516105 -1.693796,0.774156 -2.669869,0.774157 -0.638765,-1e-6 -1.284701,-0.163554 -1.937809,-0.490663 -0.653117,-0.334377 -1.20575,-0.770521 -1.657902,-1.308434 l 0,6.542172 -1.711731,0 0,-12.713622 c -2e-6,-0.552441 -0.04665,-1.170313 -0.139953,-1.853616 -0.08613,-0.683283 -0.20096,-1.148504 -0.344499,-1.395663 m 2.196183,5.539039 c -3e-6,1.133981 0.355261,2.093499 1.065795,2.878557 0.717702,0.777793 1.561006,1.166688 2.529916,1.166687 0.954543,10e-7 1.79067,-0.392528 2.508385,-1.177592 0.717697,-0.785056 1.07655,-1.740939 1.076561,-2.867652 -1.1e-5,-1.1267 -0.358864,-2.082583 -1.076561,-2.867652 -0.717715,-0.79232 -1.553842,-1.188485 -2.508385,-1.188495 -0.96891,10e-6 -1.812214,0.396175 -2.529916,1.188495 -0.710534,0.785069 -1.065798,1.740952 -1.065795,2.867652\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4145\" /> <path d=\"m 43.224746,34.75725 0,-16.279106 1.711731,0 0,7.152775 c 0.437798,-0.610593 0.94378,-1.112159 1.517951,-1.504699 0.581337,-0.399789 1.151913,-0.599688 1.71173,-0.599699 0.602867,1.1e-5 1.141147,0.123585 1.614841,0.370723 0.473678,0.23989 0.854062,0.570633 1.141153,0.99223 0.287074,0.421615 0.502386,0.897739 0.645937,1.428373 0.143531,0.523382 0.215302,1.083101 0.215312,1.679158 l 0,6.760245 -1.6902,0 0,-6.760245 c -8e-6,-0.33437 -0.0323,-0.65421 -0.09689,-0.959518 -0.05742,-0.305294 -0.154315,-0.603326 -0.290672,-0.894097 -0.136371,-0.298024 -0.337329,-0.534268 -0.602873,-0.708736 -0.265559,-0.181718 -0.584938,-0.272581 -0.958139,-0.272591 -0.473692,10e-6 -0.96891,0.243524 -1.485653,0.730544 -0.509576,0.487036 -0.925846,1.05039 -1.24881,1.69006 -0.315795,0.632417 -0.47369,1.177598 -0.473687,1.635543 l 0,5.53904 -1.711731,0\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4147\" /> <path d=\"m 53.581256,23.679171 1.776325,0 3.423461,8.472114 3.337338,-8.472114 1.797856,0 -6.4163,16.388142 -1.819387,0 2.22848,-5.658979 -4.327773,-10.729163\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4149\" /> <path d=\"m 67.415055,34.75725 -1.71173,0 0,-16.279106 1.71173,0 0,16.279106\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4151\" /> <path d=\"m 80.882824,26.361462 c 0.523914,0.872297 0.785877,1.824546 0.785889,2.856748 -1.2e-5,1.032215 -0.261975,1.984463 -0.785889,2.856749 -0.523937,0.872291 -1.234467,1.562854 -2.131589,2.071689 -0.897143,0.501566 -1.873223,0.752348 -2.928244,0.752349 -1.062213,-1e-6 -2.04547,-0.250783 -2.949776,-0.752349 -0.897136,-0.508835 -1.607665,-1.199398 -2.131589,-2.071689 -0.523928,-0.872286 -0.78589,-1.824534 -0.785889,-2.856749 -10e-7,-1.032202 0.261961,-1.984451 0.785889,-2.856748 0.523924,-0.87955 1.234453,-1.570111 2.131589,-2.071688 0.904306,-0.508825 1.887563,-0.763242 2.949776,-0.763253 1.055021,1.1e-5 2.031101,0.254428 2.928244,0.763253 0.897122,0.501577 1.607652,1.192138 2.131589,2.071688 m -9.20459,2.856748 c -3e-6,1.126713 0.405501,2.082596 1.216513,2.867652 0.811004,0.785064 1.794261,1.177593 2.949775,1.177592 1.1555,10e-7 2.142346,-0.392528 2.960541,-1.177592 0.818175,-0.792325 1.227268,-1.748208 1.227279,-2.867652 -1.1e-5,-1.112162 -0.409104,-2.060776 -1.227279,-2.845844 -0.818195,-0.792321 -1.805041,-1.188485 -2.960541,-1.188495 -1.155514,10e-6 -2.138771,0.396174 -2.949775,1.188495 -0.811012,0.785068 -1.216516,1.733682 -1.216513,2.845844\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4153\" /> <path d=\"m 84.532366,34.0049 c -2e-6,-0.247148 0.08612,-0.457951 0.258374,-0.63241 0.172247,-0.181725 0.380382,-0.272588 0.624405,-0.27259 0.244018,2e-6 0.452152,0.09087 0.624405,0.27259 0.179424,0.174459 0.269137,0.385262 0.269141,0.63241 -4e-6,0.239881 -0.08972,0.454318 -0.269141,0.643314 -0.17943,0.181727 -0.387564,0.27259 -0.624405,0.27259 -0.236846,0 -0.444981,-0.09087 -0.624405,-0.27259 -0.172252,-0.188996 -0.258376,-0.403433 -0.258374,-0.643314\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee\" id=\"path4155\" /> <path d=\"m 89.527608,21.08411 c -10e-7,-0.239866 0.08253,-0.447035 0.247608,-0.621507 0.172248,-0.174444 0.380383,-0.261673 0.624406,-0.261687 0.23684,1.4e-5 0.437798,0.08724 0.602874,0.261687 0.172246,0.174472 0.258371,0.381641 0.258374,0.621507 -3e-6,0.247162 -0.08254,0.457964 -0.247609,0.632409 -0.165075,0.167203 -0.369621,0.250796 -0.613639,0.250783 -0.244023,1.3e-5 -0.452158,-0.08358 -0.624406,-0.250783 -0.165074,-0.174445 -0.247609,-0.385247 -0.247608,-0.632409 m 1.356465,13.67314 -0.968904,0 0,-11.056271 0.968904,0 0,11.056271\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee\" id=\"path4157\" /> <path d=\"m 99.593447,23.526521 c 0.753583,1.1e-5 1.474873,0.149027 2.163883,0.447048 0.68899,0.298043 1.28468,0.701476 1.78709,1.210302 0.50238,0.508844 0.90072,1.115812 1.19499,1.820905 0.29424,0.705108 0.44137,1.442918 0.44139,2.213434 -2e-5,0.777797 -0.14715,1.519242 -0.44139,2.224339 -0.29427,0.705104 -0.69261,1.312071 -1.19499,1.820905 -0.50241,0.501568 -1.0981,0.905001 -1.78709,1.210301 -0.68901,0.298033 -1.4103,0.447049 -2.163883,0.447049 -1.543077,0 -2.860068,-0.556084 -3.950979,-1.668254 -1.090916,-1.112166 -1.636373,-2.456945 -1.636372,-4.03434 -10e-7,-1.032202 0.247608,-1.984451 0.742827,-2.856748 0.502393,-0.87955 1.180625,-1.570111 2.0347,-2.071688 0.861243,-0.508825 1.797849,-0.763242 2.809824,-0.763253 m -4.629212,5.691689 c -2e-6,1.301171 0.452153,2.416973 1.356467,3.347412 0.911483,0.923175 2.009573,1.38476 3.294277,1.384759 1.284681,10e-7 2.379191,-0.461584 3.283511,-1.384759 0.91147,-0.930439 1.36721,-2.046241 1.36722,-3.347412 -1e-5,-1.293889 -0.45575,-2.402423 -1.36722,-3.325603 -0.90432,-0.923164 -1.99883,-1.38475 -3.283511,-1.38476 -1.284704,10e-6 -2.382794,0.461596 -3.294277,1.38476 -0.904314,0.92318 -1.356469,2.031714 -1.356467,3.325603\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee\" id=\"path4159\" /> </g> <g id=\"g4014\" transform=\"translate(12.84,20.592727)\"> <g transform=\"translate(0,-0.065)\" id=\"g3992\"> <polygon style=\"fill:#939598\" id=\"polygon461\" points=\"5.7,0.23 11.86,0.23 11.86,1.65 7.12,1.65 7.12,6.04 11.86,6.04 11.86,7.46 11.86,7.46 5.7,7.46 \" class=\"cls-2\" /> <polygon style=\"fill:#939598\" id=\"polygon463\" points=\"0,7.08 3.51,7.08 3.51,8.49 1.43,8.49 1.45,15.84 12.68,15.84 12.68,17.26 12.68,17.26 0.04,17.26 \" class=\"cls-2\" /> <polygon style=\"fill:#939598\" id=\"polygon465\" points=\"10.49,11.02 10.49,12.44 10.49,12.44 2.84,12.44 2.84,7.79 4.26,7.79 4.26,11.02 \" class=\"cls-2\" transform=\"translate(0,-0.15225398)\" /> <polygon style=\"fill:#bcbec0\" id=\"polygon467\" points=\"4.26,4.55 4.26,7.79 4.26,7.79 2.84,7.79 2.84,3.13 6.41,3.13 6.41,4.55 \" class=\"cls-3\" transform=\"matrix(1,0,0,0.85463687,0,0.4549866)\" /> <rect style=\"fill:#939598;fill-opacity:1\" id=\"rect3926-3\" width=\"1.4240631\" height=\"1.7319686\" x=\"2.8396611\" y=\"7.0799503\" /> <rect style=\"fill:#939598;fill-opacity:1\" id=\"rect3926-6\" width=\"1.3864813\" height=\"1.6934805\" x=\"5.7012329\" y=\"2.9206221\" /> </g> <g id=\"g4005\"> <g id=\"g3984\"> <polygon class=\"cls-2\" points=\"94.93,12.33 94.93,10.91 99.87,10.91 99.87,6.46 94.93,6.46 94.93,5.04 101.29,5.04 101.29,12.33 101.29,12.33 \" id=\"polygon453\" style=\"fill:#939598\" /> <polygon class=\"cls-2\" points=\"94.72,17.36 94.72,15.94 104.87,15.94 104.9,5.41 102.74,5.41 102.74,3.99 106.32,3.99 106.29,17.36 106.29,17.36 \" id=\"polygon455\" style=\"fill:#939598\" /> <polygon class=\"cls-2\" points=\"95.51,1.42 95.51,0 103.45,0 103.45,4.7 103.45,4.7 102.03,4.7 102.03,1.42 \" id=\"polygon457\" style=\"fill:#939598\" /> <polygon class=\"cls-3\" points=\"102.03,7.97 102.03,4.7 103.45,4.7 103.45,9.39 103.45,9.39 100.65,9.39 100.65,7.97 \" id=\"polygon459\" style=\"fill:#bcbec0\" /> <rect y=\"3.9876499\" x=\"102.02941\" height=\"1.4238259\" width=\"1.4579451\" id=\"rect3926\" style=\"fill:#939598;fill-opacity:1\" /> <rect y=\"7.884686\" x=\"99.887817\" height=\"1.6934805\" width=\"1.397205\" id=\"rect3926-7\" style=\"fill:#939598;fill-opacity:1\" /> </g> </g> </g> </g> </svg>';\n\n\n svg.append(\"g\").html(logo_xml);\n\n }\n\n add_empty_message(){\n\n\n this.container_d3.selectAll(\".empty_message\").remove()\n\n\n /*if (phylo.phylo_embedded){\n\n if (phylo.bound_container[0]==this.container_object){\n tooltip_object[0].show()\n tooltip_object[3].show()\n }\n\n }\n\n */\n\n\n\n this.viewer.svg_d3.node().append('g')\n .attr(\"class\", 'empty_message')\n .attr('width',this.viewer.width )\n .attr(\"transform\", \"translate(\"+ (this.viewer.width/2)+\",\" + (this.viewer.height/2) + \")\")\n .append(\"text\")\n .attr(\"fill\", \"#333\")\n .attr('text-anchor', 'middle')\n .style('font-size', '1.2em')\n .html('No tree here ! You can <a href=\"#\" id=\"add_tree_link' + this.container_object.uid +'\">add a tree</a> or use examples below.')\n\n document.querySelector('#add_tree_link'+ this.container_object.uid).addEventListener('click', event => {\n $('#exampleModal' + this.container_object.uid).modal('show')\n });\n\n\n\n this.viewer.svg_d3.node().append('text')\n .attr(\"class\", 'empty_message')\n .attr(\"transform\", \"translate(\"+ (this.viewer.width/2)+\",\" + (this.viewer.height/2 + 24) + \")\")\n .attr('text-anchor', 'middle')\n .attr(\"fill\", \"#bbb\")\n .html(\"Ready to use examples: <a id='ex1\"+ this.container_object.uid +\"' style='cursor:pointer;text-decoration: underline'>Tree bundle #1</a> - <a style='cursor:pointer;text-decoration: underline' id='ex2\"+ this.container_object.uid +\"'>Tree bundle #2</a> \")\n\n\n\n document.querySelector('#ex1'+ this.container_object.uid).addEventListener('click', event => {\n this.container_object.add_tree(this.examples[\"LRF1\"],{'data_type': 'nhx'})\n this.container_object.add_tree(this.examples[\"r2t\"])\n this.container_object.add_tree(this.examples[\"unrooted1\"])\n this.container_object.add_tree(this.examples[\"small1\"])\n\n\n this.api.start()\n });\n\n document.querySelector('#ex2'+ this.container_object.uid).addEventListener('click', event => {\n\n this.container_object.add_tree(this.examples[\"LRF2\"],{'data_type': 'nhx'})\n this.container_object.add_tree(this.examples[\"rokas\"])\n this.container_object.add_tree(this.examples[\"nhx\"],{'data_type': 'nhx'})\n this.container_object.add_tree(this.examples[\"unrooted2\"])\n this.container_object.add_tree(this.examples[\"small2\"])\n this.container_object.add_tree(this.examples[\"stack\"],{'data_type': 'json', 'use_branch_lenght': false, 'show_histogram':true, 'collapse_level': 2})\n this.api.start()\n });\n\n }\n\n\n}\n\n//# sourceURL=webpack://PhyloIO/./src/interface.js?");
8605
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Interface)\n/* harmony export */ });\n/* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! file-saver */ \"./node_modules/file-saver/dist/FileSaver.min.js\");\n/* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(file_saver__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3 */ \"./node_modules/d3/index.js\");\n/* harmony import */ var bootstrap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! bootstrap */ \"./node_modules/bootstrap/dist/js/bootstrap.esm.js\");\n/* harmony import */ var d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! d3-scale-chromatic */ \"./node_modules/d3-scale-chromatic/src/index.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ \"./src/utils.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_utils__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\n\n\n// D3 viewer Interface that render UI elements(buttons, slider, menu)\nclass Interface {\n\n constructor(v,c, empty_mode){\n\n var empty_mode = (typeof empty_mode !== 'undefined') ? empty_mode : false;\n\n this.scale_pixel_length = 120;\n\n this.container_object = c\n this.viewer = v\n this.container_d3 = v.container_d3\n this.api = this.container_object.api\n\n //MISC\n this.dismiss_blur = false\n\n this.examples={\n \"small1\": \"((yli:1.0085614391793067,(((lel:0.2880678599618948,(cal:0.11643570498932501,ctr:0.12746420698315983):0.0877413194006926):0.12449843844102518,pst:0.20187483296288805):0.04951181210826987,(pgu:0.3208350693977453,dha:0.19121342958249643):0.0444880656387921):0.3761988962574594):0.22545281705785974,(((kla:0.32829009627835226,ago:0.35217085340006204):0.057415467336693615,(skl:0.15813405639248146,kwa:0.25658337062111586):0.04348414441988464):0.036897766465122404,(cgl:0.29957965624763355,(sca:0.24212307199678842,(sba:0.03984952076326609,(((sce:0.022286259220280224,spa:0.016875934069075366):0.01282179619059339,smi:0.03661027033511007):0.013312280806766753,sku:0.042685124078088485):0.014142671709463695):0.17548658899657893):0.03625000527459598):0.08921537612721808):0.22545281705785974):0;\",\n \"small2\": \"((sba:0.04645932805874481569,(smi:0.03315550229946162553,(spa:0.01466907419174275952,sce:0.02383733069302066895):0.01620853054082276729):0.01834962617511207497):0.06496501071301066799,(sca:0.21928497146352055047,((((ago:0.34529718349701971070,kla:0.26611733077459831520):0.04460721000595434249,(kwa:0.23458417353426505580,skl:0.38245746198409408256):0.02217438839159899949):0.02847427462232336726,(((pst:0.21220493191897629726,((cal:0.09792303271040220247,ctr:0.11778282966461572911):0.07993742108354510989,lel:0.23757786374413303321):0.09896075353236584438):0.04667831716440219020,(pgu:0.28475663985974825065,dha:0.17797706546403241346):0.04249479494672471491):0.29326816910580705278,yli:0.72911704942210797675):0.31199925135971823265):0.06946141605430436461,cgl:0.27125751484306920291):0.03678319509837457008):0.09011350505801994648,sku:3.28511106679567399524):0.0;\",\n \"big\": \"(((SOLTU34696:0.02229166687593289037,SOLLC24463:0.00709709081903918577):0.18421898265728259281,((((MEDTR17610:0.15714167879247994963,(SOYBN06937:0.02529940651188004874,SOYBN15364:0.00931421471673856902):0.03339587536636171722):0.04648572868545788189,(SOYBN40305:0.05161993270599975203,SOYBN06011:0.01868797976671805749):0.13262390593762377056):0.09574925506273131159,((POPTR14057:0.08501820169894380719,POPTR15493:0.03388172716526779982):0.04903132056086856316,(VITVI16878:0.15032892038600365048,(MANES09114:0.00455508973340297985,MANES09113:0.00000100000050002909):0.10960937493738516502):0.06005265654177237983):0.03327927635394690997):0.04169405035061653220,((((SELML14800:0.01085671843303792107,SELML05537:0.02039560840819776635):0.73478761253095836725,(((((((MUSAM01035:0.00000100000050002909,MUSAC06029:0.00000100000050002909):0.30554247145426172150,((((ARALY04176:0.03071803778508035501,ARATH04062:0.02390145058045729451):0.26881464177877639754,(ARATH20168:0.04620983006923840702,ARALY11148:0.00932022073022199457):0.20782072992434411085):0.09488068423975774823,(((SOYBN02845:0.00976170253766352886,SOYBN51173:0.02918590246006154409):0.08540209758062287937,((MEDTR41063:0.00000100000050002909,MEDTR41066:0.02017257537407208742):0.16176325397181906540,(SOYBN11067:0.03963088470198131846,SOYBN08966:0.01232745661039070031):0.08548569071631144378):0.04853822353702215431):0.14497593655405260904,(MANES12931:0.07738860904262530316,(MANES07497:0.09434645317867160208,POPTR11029:0.12695444105377301502):0.02979790056758981412):0.05775061588261572176):0.01638682789008762478):0.05403462689546538467,(((MUSAM29615:0.00000100000050002909,MUSAC32718:0.00000100000050002909):0.08299761701045121898,((MUSAM27485:0.00000100000050002909,MUSAC30588:0.00000100000050002909):0.06661990811446089067,(MUSAC19509:0.00000100000050002909,MUSAM13578:0.00000100000050002909):0.06965462171572417427):0.02546304953829388665):0.19603767643398820053,(SOLLC06707:0.01792241662639993890,SOLTU18103:0.01706502381760034368):0.18420517353108956105):0.02629729192908691893):0.18414179845688000148):0.53817024374636479589,((SELML06655:0.00000100000050002909,SELML08476:0.03320959111509765721):0.85020985387688086110,(SELML03696:0.00000100000050002909,SELML10004:0.00646896469865896381):0.70379805522375493698):0.08752580347866126265):0.06518214565099944569,(((SELML10585:0.09739496921243473437,((SELML09645:0.01874532851656703428,SELML09389:0.00461002747936521164):0.00923396102862936510,(((SELML20828:0.00466275631610225862,(((SELML20789:0.01052082189588285019,SELML01265:0.01037032025689046087):0.12574093071149400336,SELML20813:0.00000100000050002909):0.00927460510378439601,SELML09379:0.00932813396907514365):0.01397774234266347532):0.01871018274364625450,SELML09395:0.00000100000050002909):0.00000100000050002909,SELML20823:0.00463913170794102298):0.00475219553005659830):0.03038880589415450875):0.25057129550716489286,(SELML06902:0.00000100000050002909,SELML13410:0.01944383189133876144):0.69918435501807829624):0.21184059841609043096,(((SOLTU11560:0.00866375047195633470,SOLLC08801:0.03929176849985123454):0.10262341703543685634,(SOLTU05304:0.01187114169278406621,SOLLC33391:0.01633284173625539071):0.15173972504306554310):0.21239804572202647392,(((SOLLC08269:0.02116737660229363674,SOLTU10962:0.01372146392435308164):0.25856914038108191889,((((MEDTR21917:0.01799185381782565998,MEDTR21918:0.00922025508246283182):0.05573688941724050383,((SOYBN35782:0.03087107867875190509,SOYBN00680:0.01163081217349988539):0.08312081118311021033,MEDTR21916:0.15768887143629881087):0.03305450703309942284):0.01735157638851950873,((SOYBN01697:0.01802156549906810262,SOYBN46853:0.01038317775355940449):0.09530254205432765746,(SOYBN00679:0.02003726912435226451,SOYBN35783:0.03023646561760832269):0.03688686876344755838):0.02302672045433903220):0.08493744642431001746,((VITVI19452:0.12740781730937075777,((POPTR37828:0.04689316251484140774,POPTR22952:0.05970448316470000627):0.04193762972183705945,MANES11398:0.08400005523386327999):0.02628003046485331493):0.03551912761098192928,((((ARATH04782:0.00000100000050002909,ARALY08526:0.01228654282875111386):0.29212655156837918913,(ARATH15344:0.00223041658309429966,ARALY09276:0.01996073486554238163):0.13397468053224975693):0.07185417278801679852,POPTR16926:0.13312849254037534275):0.01098363254080201613,(MANES03104:0.09480815288204409719,MANES16408:0.02654262709927663472):0.03040210277567834823):0.03004035743504208933):0.01404570578236909867):0.03121249594034346958):0.05887160826170913935,(((SORBI10122:0.03323503849451007325,(MAIZE08377:0.02021590177517258030,SETIT28177:0.08805632675554768418):0.02504709626837576045):0.07287654177256396026,((BRADI21338:0.02686457952333810503,(WHEAT87462:0.01035700555682448655,(AEGTA26567:0.02910656260243310589,WHEAT48582:0.00000100000050002909):0.00625588989844735790):0.02544515824802914133):0.05168964740217039944,(ORYBR07284:0.04813817240195044506,(ORYSJ56422:0.00433527809312172531,(ORYGL06636:0.00000100000050002909,ORYSI08916:0.00431204407639125802):0.00000100000050002909):0.02653829363724803658):0.07984049213339161621):0.04976898423119274079):0.18678884266555975668,(MUSAC33499:0.00000100000050002909,MUSAM30396:0.00000100000050002909):0.08842248045116975208):0.04165816956540665389):0.09570036071387207077):0.60260647226597463533):0.10300128639879745085):0.05333874304685561757,((SELML13018:0.00000100000050002909,SELML30466:0.00477137258052293296):0.56143589685507788722,(((((PHYPA18023:1.45983872422859706219,((PHYPA12217:0.72758536297043008290,(PHYPA14615:0.22317040222409229022,PHYPA01897:0.18214443240871036611):0.11097031107740006062):0.14961122338629148643,(PHYPA08531:0.29900979623764539772,(PHYPA04376:0.25454022577299584285,(PHYPA18912:0.62398743983641291599,(PHYPA13415:0.71529981912002149613,PHYPA01014:0.26003643742515786252):0.07742794881965327225):0.38565491945027224885):0.05957449835352644774):0.09269847683225705681):0.75858844054616292318):0.07539002105126456355,((PHYPA04370:0.31660275332914461499,PHYPA05793:0.28028601507271555526):0.27571769085407782374,PHYPA28145:1.21917586572920066956):0.14066981600410852216):0.11608964301527176233,(PHYPA27115:0.42531933835658036758,(PHYPA31589:0.11675081532900566383,PHYPA04378:0.17222158017426700272):0.22477213002122817254):0.32580096131428765149):0.08974406589734822137,(((PHYPA11652:0.08450753494102389296,PHYPA31587:0.15429860569540626569):0.08729389620246855164,PHYPA04379:0.14759110818710738378):0.49200936134970701952,PHYPA11641:0.66796896516575210434):0.18230799226098934329):0.07538150349550752638,(PHYPA05231:0.11882948010610601408,PHYPA09854:0.13832190416771542041):1.05007915890183545216):0.04891086498022992335):0.04436693750603239172):0.09999942466169695066,(((MANES21353:0.07843656258111202095,POPTR03078:0.09140350201084442017):0.03941132856151274150,(((ARATH05045:0.05812548265815464105,ARALY28862:0.04021698999013888220):0.25858803601578123077,(SOLLC33983:0.41111237385610865935,(MUSAC06420:0.00000100000050002909,MUSAM01426:0.00000100000050002909):0.30877713598507794401):0.04059574780523743376):0.08460593221894585625,((SOYBN45734:0.02007143564929426971,SOYBN20022:0.02561133933208175478):0.12665765536264397828,VITVI20760:0.14512568901466627036):0.04894509511205995256):0.01780901105694476100):0.79989526243629693880,(((((((MUSAM28527:0.00000100000050002909,MUSAC31630:0.00000100000050002909):0.11781514143582931531,(MUSAC24401:0.00000100000050002909,MUSAM31539:0.00000100000050002909):0.22759820284884196839):0.25781360213390636105,(((SORBI02725:0.11543585860026051026,SETIT15331:0.15169645446581081494):0.13454550939445297786,((ORYBR24386:0.10628364006661440710,((ORYSI29698:0.00000100000050002909,ORYGL22907:0.00000100000050002909):0.00000100000050002909,ORYSJ27622:0.00438633581703788689):0.08878200480216735802):0.08345810431159335352,(BRADI03434:0.13799244964271445424,(HORVD25504:0.02166620886455744924,((TRIUA06372:0.12959511089449690657,(WHEAT32698:0.03864763690807082597,TRIUA00769:0.00135317713596018983):0.00332330737539259652):0.00464075870143152661,(WHEAT28360:0.00922554755876476597,AEGTA22609:0.00000100000050002909):0.01862772431606431189):0.02827628220152079985):0.14784094324758120798):0.07657774840354276968):0.05040432524277733278):0.23807470404558811472,((((MUSAC22475:0.00000100000050002909,MUSAM05163:0.00000100000050002909):0.25879616543111028104,(MUSAC29462:0.00000100000050002909,MUSAM23604:0.00000100000050002909):0.08534457241850162967):0.08980587516420318606,(MUSAC23213:0.00000100000050002909,MUSAM05901:0.00000100000050002909):0.20220365953842298068):0.06421223425467911805,(((SOLLC23016:0.03638597281328402600,SOLTU33038:0.03710672999887828366):0.29159362129737559366,((((((((ARALY10000:0.01016220106392523755,ARATH03249:0.02976834372087038688):0.05490653820923878381,((ARALY10002:0.01549038619041884918,ARATH03248:0.03122391175138889211):0.01458789518267716509,((ARALY16713:0.17918780086834498744,ARALY19559:0.00438957615145475245):0.02873653665739813248,ARATH25850:0.00908135915132069274):0.03407168058096569224):0.02455523248667762851):0.11014162658842005516,(ARALY12955:0.02429673062665791208,ARATH18258:0.00967455909419093554):0.10410863334016712267):0.40633050951692445407,((ARALY10003:0.01890634137244458224,ARATH03247:0.01697584690425940276):0.23155955806054623336,((ARALY29288:0.00042458426852172735,ARATH19292:0.03247589055765442295):0.08250360960924246756,(ARATH02753:0.00865066469549579699,ARALY03291:0.01449081555443989568):0.16209839577201246019):0.15608768708840575767):0.04420186725022508950):0.08484641382635919882,(POPTR09167:0.28267859137257533853,(MANES21800:0.27864093159963454482,(ARATH19291:0.00000100000050002909,ARALY29287:0.02848852333773088663):0.43319629460236386276):0.03894089730857926146):0.00000100000050002909):0.03186457471675530062,VITVI24172:0.31426671234562669754):0.00905854647086176169,(SOLTU33039:0.05816087707296611897,SOLLC23017:0.02228257830393525277):0.46113355005377754114):0.03843900357137167156,(((((MANES16527:0.20707799493124401380,(SOLLC23268:0.38025304824661310121,(SOLTU28412:0.00535624135194013185,SOLLC22105:0.05613627561101311447):0.09524303674191680891):0.12887928131447612401):0.01260972240155851243,(MANES09941:0.15645263168174200485,POPTR34479:0.12389048001495335527):0.04342295486236855823):0.07276609054885742334,(((SOYBN42202:0.02118227836288713931,SOYBN21748:0.01644615953338779066):0.24692740479443978097,MEDTR15771:0.31577361363375822112):0.02131661459480957074,(MEDTR42390:0.18078632029169158790,(SOYBN07961:0.37594291031565674199,SOYBN12455:0.03193064477323372813):0.02501370661023886305):0.02702136410198599167):0.06155412104215795405):0.09626978611305717082,(((((((((ARATH01434:0.03326402804023043808,ARALY00064:0.02999459562184841194):0.09421924133575029781,(ARALY29644:0.00203379637304447252,ARATH11101:0.01593368143997206388):0.10660883901796770756):0.22164631262628492481,((SOLTU15123:0.02410755361753252543,SOLLC27615:0.01286137629737767185):0.18825616043936321820,(SOLTU41630:0.00000100000050002909,SOLLC30182:0.01473818587608549668):0.09500375584676275242):0.17962816527417160839):0.08482781103288279667,(MANES07144:0.16203913770382263881,((SOYBN11469:0.01589453517297529858,SOYBN24966:0.02339464808929192854):0.10356474599509736534,((MEDTR08954:0.05864939370753735615,(MEDTR34621:0.00829907080829405015,MEDTR34620:0.00499994643452340067):0.05668403220200715631):0.05273462105741605344,(SOYBN51684:0.17642901646205200183,SOYBN04901:0.04125914054456694680):0.02380766330124998303):0.03158760632170121152):0.03851851133473387090):0.02315930849886935899):0.02718091095752991210,(POPTR16993:0.04940577660331951781,POPTR30799:0.05457640310787268551):0.08863894760701460096):0.02762469745444158173,(VITVI24450:0.12181582135342103324,(VITVI24449:0.06220884938171312994,(VITVI24464:0.00000100000050002909,VITVI24468:0.00712346844720962869):0.03603185331464960756):0.03975815408878824453):0.04329459094678926590):0.09176438539436139463,(((POPTR29056:0.13077457669048556110,POPTR29057:0.05267175297008459822):0.03075236009326701853,(POPTR00348:0.01655953669099122921,(POPTR00349:0.02697645280289770117,(POPTR33189:0.00000100000050002909,POPTR00144:0.00000100000050002909):0.00000100000050002909):0.00832072236514292893):0.07838168083037699851):0.23788536085482214766,((MEDTR30438:0.42136317822004920597,((MEDTR34998:0.24452848238158930716,SOYBN52677:0.18766209293093907839):0.25855905575446785916,(SOYBN49014:0.05867839907026141388,SOYBN32844:0.03581342653317994701):0.21655431189076917997):0.08773815390042381812):0.58465212659114340621,(((MANES04116:0.19401691338063234427,POPTR20093:0.18508769771064598197):0.09736567009284757823,(SOYBN11603:0.03048877614613966849,SOYBN25107:0.04153919669446339002):0.38440991156696335818):0.05515883257564905412,(POPTR20092:0.39016581191482535562,(((SOLTU13165:0.04159132887095513820,SOLLC26035:0.01757476771752396541):0.00180276329067892709,(SOLTU35076:0.00000100000050002909,(SOLLC24749:0.03395202277028106647,SOLTU35031:0.01558226242757700629):0.00804631861762039081):0.04136147442165903632):0.21271461606494213026,((SOLTU12410:0.00000100000050002909,(SOLLC25814:0.13820828413746039098,SOLTU12411:0.01799620292402752050):0.00969324716455009783):0.07820328705153896387,(SOLLC24748:0.02869551553635420194,SOLTU35030:0.04501180869005286245):0.20948390734446886707):0.20270577077823093148):0.11657674465039977174):0.13317593844878172771):0.03831849101601358248):0.03027129903572875480):0.03922875979866165264):0.01684645710782435579,(VITVI05921:0.12563325049328344374,VITVI05917:0.12520596478204715218):0.09462124288777128134):0.12775367251944327873,((MUSAM14430:0.00000100000050002909,MUSAC13763:0.00000100000050002909):0.12771273976123795335,(((ORYBR24388:0.50337366142262240931,((((ORYSI29699:0.00000100000050002909,ORYSJ27625:0.00000100000050002909):0.00000100000050002909,ORYGL22909:0.00000100000050002909):0.05549083806812468017,(BRADI03435:0.04879077134835191343,(((TRIUA08215:0.00000100000050002909,TRIUA21996:0.26295948200265867323):0.00817389315608522439,(AEGTA13309:0.06562444529583479069,WHEAT45064:0.00774167688334377515):0.00000100000050002909):0.01380935257089896222,(((WHEAT35766:0.00000100000050002909,AEGTA04524:0.00000100000050002909):0.04170615254011814793,(AEGTA33213:0.49888754849868760521,((((WHEAT22160:0.00000100000050002909,AEGTA33214:0.00906687784214987337):0.03675660265279418609,((WHEAT12004:0.02468264540695007739,TRIUA20762:0.00000100000050002909):0.01414429238908978051,WHEAT32782:0.02388174542004466855):0.00435236434194583716):0.00442687273163500095,HORVD08982:0.01562263189613093996):0.00000100000050002909,(TRIUA20761:0.01797442353088164399,AEGTA13308:0.21717138522337739448):0.00000100000050002909):0.01682333246933797460):0.00000100000050002909):0.01065485246687873644,WHEAT85085:0.04145107218113282949):0.00620667325593616225):0.09132283132833111938):0.08791813509551500705):0.03195489850186534336,(SETIT15329:0.07047114177174997052,(SORBI35374:0.03755068835215968903,MAIZE72512:0.15141617114170607961):0.02064961395275088582):0.11605603169074922565):0.09827247229610616697):0.13439659878358387046,((ORYBR24384:0.03666623653652124198,(ORYSJ27620:0.00000100000050002909,ORYGL22905:0.00434516659941436463):0.03537232336334167337):0.02291511989991039736,((MAIZE64782:0.12255768679116242625,(SORBI02724:0.09075153353677181678,SETIT15333:0.07560264449419117072):0.02320087886123306173):0.06356620741069120284,(BRADI03432:0.06195219615737228291,(HORVD25508:0.01427375674581105383,((WHEAT60407:0.00000100000050002909,AEGTA11226:0.00000100000050002909):0.02692964354303263586,TRIUA05358:0.00719803332716940653):0.00000100000050002909):0.07319329388444215101):0.02694480428233698988):0.02241696300054943011):0.36519870575419122183):0.14644337324362149966,((((MUSAC12755:0.00000100000050002909,MUSAM19743:0.00000100000050002909):0.07371963208175744131,(MUSAM05165:0.00000100000050002909,MUSAC22477:0.00000100000050002909):0.16545618048524771138):0.02447116931618892322,(MUSAC09456:0.00000100000050002909,MUSAM25853:0.00000100000050002909):0.05457371980977839682):0.04635251160636844753,((MUSAM11486:0.00000100000050002909,MUSAC17417:0.00000100000050002909):0.08485970297192710343,((MUSAC17415:0.00000100000050002909,MUSAM11484:0.00000100000050002909):0.33334399991305391220,(MUSAM31803:0.00000100000050002909,MUSAC24665:0.00000100000050002909):0.07566046214822304272):0.04431691006149920259):0.05194682509849380542):0.03666911559745159033):0.01456961455004371006):0.14985506206622983827):0.03340758602615528233):0.01255933172298845032,(VITVI24175:0.26754754006319836357,(((MEDTR42526:0.16032652036014988228,(SOYBN12535:0.03027105407316259961,SOYBN08048:0.04459494280090759571):0.07879501743940507674):0.07505689396764725352,((((MANES17118:0.57346662585280039348,(MANES12544:0.19676794187305621242,(MEDTR42524:0.15007457841664581522,SOYBN08047:0.03605790941550521961):0.09402460020059832946):0.03140011839487689971):0.01962392224388840103,(((MEDTR42514:0.09247918994835495343,MEDTR22615:0.01366432305670875307):0.09928330387283584857,(SOYBN12532:0.01036494078386980197,SOYBN08046:0.02196716485467621605):0.08169955796560558758):0.07198943302804891586,((VITVI24171:0.08664819722726199713,(((POPTR35499:0.40525100571876260247,((ARATH02754:0.09320590455013072484,ARALY03289:0.06086088394003414531):0.07885615652586927538,(ARATH19290:0.02337986454851012641,(ARALY29286:0.04717209494117403229,ARATH19288:0.03814580558053030923):0.03846693729312187365):0.10192877215205804753):0.41417766472732803207):0.16073676182087695552,((SOLLC23015:0.02694372101697084868,SOLTU33037:0.02653802323606794730):0.62199957187418364324,((SOLTU20512:0.00972271123875176162,(SOLTU20511:0.01147018644784781119,(SOLTU20513:0.02643882042012478742,SOLTU20515:0.00847805955390828168):0.03193416255995014386):0.00393787153698065429):0.03967830724138914078,((((SOLTU20514:0.16945049892412741843,SOLLC18753:0.00537086722032452044):0.00000100000050002909,SOLLC18751:0.01120267337000929557):0.00828665510820371549,SOLLC18752:0.00716802422552568694):0.00971966198421999293,SOLLC18748:0.00418184823767660859):0.00822225218720306142):0.11665217368444748269):0.07816312271988211380):0.02148922590693498266,(VITVI24169:0.02546827158878254074,(VITVI24167:0.04990519451560231079,(VITVI24184:0.03312198278353388481,(VITVI24181:0.30224729240440550981,(VITVI24177:0.01929054557240287085,((VITVI24182:0.00000100000050002909,VITVI24179:0.02106867567382362735):0.03167180870398408898,(VITVI24176:0.01969267275057362890,VITVI24180:0.02633637180363321284):0.02597636696155432995):0.00000100000050002909):0.02677990712203075913):0.02558610491879504886):0.01286942444778651704):0.03459532071023858901):0.05761190653651706434):0.03828416322048041470):0.02247322089413233276,VITVI24170:0.37661850836053661906):0.02859208169062607205):0.01287130689201141688):0.05928063733794242118,(((POPTR09170:0.00928249566138726612,POPTR09171:0.01362830117483226737):0.11097795401069124321,(MANES11727:0.01231132068132651143,MANES11726:0.02535966891397891179):0.11754186504289823589):0.04771316751350534319,(POPTR12670:0.12474531585938525291,POPTR31146:0.25446595055379106487):0.01103215326216829342):0.03032714223225285721):0.01533143610219641836,(MANES23986:0.05998852601446329202,MANES23987:0.09367903400324815999):0.06602906363494510933):0.01836632947338360036):0.02448133477151803392,(MEDTR42525:0.13691511460265232136,(SOYBN08045:0.06479718425348945932,SOYBN12534:0.04696694479745631978):0.02945549968934863330):0.11225969672461046100):0.03403827949339053444):0.01233721383218942119):0.01532854881626578673):0.04320162729338317825):0.05558940326725511638,((MANES31736:0.09777810604085424018,POPTR09168:0.18283577282268856368):0.11236611418309042087,((ARALY11467:0.03888936752086643439,ARATH05433:0.02972788478467355833):0.41420996743610127844,((SOYBN08043:0.05247574434689786932,SOYBN12531:0.05270147179584935837):0.09631960271930162243,MEDTR42513:0.14993674747835861183):0.13917114534057511976):0.01712154485486190592):0.09614297396977788956):0.06092720203940441698):0.06456712224928252974):0.11705550806939674091):0.08311322551438103667,((((SETIT15332:0.10628368765867061974,SORBI07769:0.17746843073221649223):0.13238212253032827226,((BRADI03433:0.11328188015797371890,HORVD25505:0.10975535063066788055):0.16776288152872084747,(ORYBR24385:0.11210383409748714278,((ORYSI29697:0.00000100000050002909,ORYSJ27621:0.00000100000050002909):0.00000100000050002909,ORYGL22906:0.00863506858097733837):0.05243481921101125764):0.03958836043479305872):0.06380505947748491002):0.73392444568281156592,(((BRADI25911:0.22376624706888575966,((HORVD28420:0.04133972816789235893,(WHEAT70817:0.01108882466288622914,WHEAT69921:0.04801524586326613719):0.04057905017628739980):0.21283851374492795960,BRADI25910:0.18298421028386721576):0.09725606334819790477):0.28333157001538916697,((ORYBR18897:0.11449855306039051495,((ORYSJ08762:0.00000100000050002909,ORYSI23023:0.00000100000050002909):0.01068998266261429742,ORYGL17951:0.02629761802361783168):0.04752807889957954418):0.20366728263354880180,SETIT25618:0.15219643970655943876):0.08943886650101305624):0.18916259784654348985,(((SORBI34307:0.19854749956115821941,SETIT21651:0.15111504480999468636):0.15925433731526916770,(((AEGTA26651:0.02903255429824982276,WHEAT83808:0.00000100000050002909):0.17503197160876571292,((MAIZE96631:0.09611910691411411356,(SORBI22834:0.06072956019428756708,SETIT20833:0.09321874300456664542):0.03442156993612226906):0.01669260821340538478,((TRIUA13662:0.03946045674247487811,(WHEAT52330:0.05776660877334939548,(WHEAT86773:0.00532743048250389466,AEGTA07045:0.01706992676679780149):0.00000100000050002909):0.05607798516832061819):0.02665893917150888998,HORVD23663:0.05284167798097322288):0.10922772489145500530):0.04191254724687159400):0.16454957110542003940,((SORBI02257:0.06147049404514631776,(MAIZE96650:0.11638670537737398625,SETIT20829:0.09826335381078528386):0.03068151872990982493):0.08611535254662248950,(((SETIT20832:0.07938310066649272023,SETIT20831:0.08489703161439335344):0.11500264078366927156,(MAIZE96644:0.09403094034705827831,SORBI02258:0.08634180949574422892):0.02753513034845714302):0.04039718929754703564,((WHEAT25045:0.03964513054506172557,AEGTA29018:0.28747232515061138525):0.10074830354835012658,(((((WHEAT08852:0.00000100000050002909,AEGTA29019:0.00000100000050002909):0.03722325902676116433,AEGTA29020:0.01976556200521976253):0.00603347134718825503,((TRIUA15959:0.09466630863943445440,WHEAT20495:0.14768597603717259492):0.00467495466410714454,((WHEAT65446:0.02594364243649492988,WHEAT38110:0.02098146513182690825):0.00659101893750014059,(TRIUA01828:0.14559717274205583037,TRIUA15958:0.04075243626788545293):0.00599465909884547114):0.00559920822398990350):0.00517256328758699049):0.01262375076365237873,TRIUA01286:0.02408004711105568574):0.01395035019780327054,(HORVD20872:0.01098578451738006431,HORVD05302:0.02063874355727766952):0.01863102271750660330):0.06009445017908530279):0.07507266639965004540):0.09634548124187623797):0.18733450981839830374):0.12464078965327556048):0.17929409366442500273,(((ORYBR27565:0.04310309170319372163,(ORYSJ16804:0.00464142537892024785,(ORYSI33560:0.00000100000050002909,ORYGL25925:0.00000100000050002909):0.00000100000050002909):0.03961188448467305862):0.15656295455261637350,(((BRADI00988:0.00476391111437001521,BRADI00989:0.00000100000050002909):0.20467187354703644808,BRADI15630:0.07167181318010748536):0.07709451096557318195,(WHEAT57120:0.02880284780026281730,(AEGTA19608:0.00000100000050002909,(HORVD12912:0.03808128361930788325,TRIUA04806:0.00650706260684350089):0.01248932730957088774):0.00000100000050002909):0.11439129903184673542):0.04934059931720293640):0.03754646250901938487,(BRADI15631:0.13872232419541341564,(HORVD07278:0.07725049260346161795,(TRIUA09787:0.03715911881960721336,(AEGTA10083:0.32811103361633536801,WHEAT80354:0.00089786239555732748):0.00938949191268437407):0.01976863625399532740):0.19670631464817542322):0.29458213491685558694):0.10093247659056210630):0.54345118316186735719):0.18977601405509095245):0.05157025295330795039,(((SETIT25616:0.07852315106039221837,(MAIZE06173:0.06733444043491103315,(SORBI18564:0.06516675669532950854,MAIZE66584:0.09815205600982566947):0.01488314414710101632):0.06917477120401739621):0.06047679945543893432,((ORYBR18895:0.09356013673021203181,(ORYSI23019:0.01995226433074431122,(ORYSJ08756:0.00000100000050002909,ORYGL17947:0.00000100000050002909):0.00000100000050002909):0.03687445132702502765):0.11333698691822792493,(BRADI25914:0.24966037553655898162,(WHEAT65410:0.01346895926767484493,((TRIUA05751:0.00958342138837884987,WHEAT70813:0.00000100000050002909):0.03311185057557836792,AEGTA16932:0.00967767982351243686):0.01558616683975027999):0.21100450855734623201):0.16071927687677828311):0.05689779434687595311):0.26359514352027774153,((((((ORYBR27580:0.05145045231195581603,(ORYSI33573:0.00872787187461502960,(ORYSJ16829:0.00290821604630775313,ORYGL25941:0.00289957823451919994):0.00000100000050002909):0.04185497770274457935):0.08669634333957521033,(SETIT20817:0.09654332316673008840,(SORBI10904:0.07537288338661414511,MAIZE96657:0.10383560034707478570):0.07765613274820971912):0.14373989258596550633):0.04331225638908815789,(AEGTA14407:0.21396357640882618378,(WHEAT49075:0.03742635225901538853,TRIUA17073:0.22481355191992527520):0.00000100000050002909):0.21191601840842899662):0.17902285996310970950,((ORYBR27579:0.06945899715509075423,((ORYGL25940:0.00000100000050002909,ORYSJ16828:0.00000100000050002909):0.00000100000050002909,ORYSI33572:0.00000100000050002909):0.04585702763633902473):0.13572794106610852616,((BRADI15643:0.11353281774113219149,(HORVD25688:0.09536913642604670505,((WHEAT71963:0.00000100000050002909,AEGTA06757:0.00898509776603926072):0.00442891723575507702,(WHEAT55769:0.00000100000050002909,TRIUA30371:0.01424187857255200876):0.02808541866378306065):0.08820649727989528233):0.25080997272986199631):0.10015461496007804776,((MAIZE68589:0.06784969608152634224,SORBI23124:0.06689421831480514558):0.06072688689452997168,SETIT20818:0.08250223655998115135):0.28081662195421031036):0.03415190331329334694):0.18099515830813858730):0.23828339406633486375,(((((TRIUA28261:0.00000100000050002909,WHEAT77614:0.00522012460352415733):0.01052026755137579032,WHEAT14212:0.01900931337671126625):0.00537892467272544673,WHEAT53726:0.03427952163898331794):0.01082305341106296580,(AEGTA15427:0.04656158751954651148,HORVD28399:0.05149089461177087240):0.00569082262386825383):0.16990790881276357505,((SETIT25615:0.12311182883990935688,(SORBI29267:0.02895599022920697027,MAIZE06178:0.06139925813407767080):0.08104739507434938206):0.18396741248761069865,((ORYSJ08754:0.00537134026524889712,(ORYSI23018:0.00000100000050002909,ORYGL17946:0.00000100000050002909):0.00406329179906062595):0.05999854286502422085,ORYBR18893:0.06397293409596348235):0.10346668422380561614):0.03797983181460620750):0.24990133958587135155):0.23925253305203117438,((((SORBI29268:0.05227356919765768078,(MAIZE66585:0.07675489623044472187,MAIZE06172:0.04528658852080717778):0.04941640495042282782):0.12382799873015735981,SETIT25617:0.14818171317810244214):0.27929943165305376462,((ORYBR18896:0.07419590753389222748,(ORYSI23022:0.00379711849766854910,(ORYSJ08761:0.10978693143125221876,ORYGL17950:0.01344563814004453781):0.00597586960473746407):0.07325585159068384589):0.19276665548532748162,(((HORVD28419:0.04596984122855517219,((AEGTA22182:0.00000100000050002909,WHEAT70818:0.02185908074112965019):0.02081808898138607158,(WHEAT69922:0.00000100000050002909,TRIUA14442:0.00913756995703720459):0.03482865824733673982):0.02434412174635048817):0.06443026333473295120,(HORVD28384:0.05759773530055015828,(AEGTA13517:0.00803920841303648777,(TRIUA05752:0.00000100000050002909,WHEAT39273:0.00521712108856406138):0.02662966533034783270):0.03119273092612735027):0.06885337214824652219):0.21194169365585280307,BRADI25913:0.19919830833343557530):0.10088797326520221320):0.04768688711835541300):0.22477349059093132411,((BRADI15632:0.22523659181088406811,(HORVD14906:0.05450683071876778057,(AEGTA12904:0.00000100000050002909,WHEAT14274:0.00000100000050002909):0.03721889908342769504):0.14284606075147304738):0.18649531433975805039,((((MAIZE96629:0.12229417865612347838,SORBI07264:0.06804146904928368156):0.15660089871520962990,SETIT20845:0.20059836865508490211):0.20541359029522737734,(SETIT20843:0.27853855718646863826,(SETIT20846:0.19630229880655805652,SORBI29609:0.14153813858141500726):0.14100051772267477301):0.10308325201364867962):0.09889564227595368240,(ORYBR27566:0.14928134818711108478,(ORYGL25930:0.00000100000050002909,(ORYSJ16810:0.00000100000050002909,(ORYSI33563:0.00000100000050002909,ORYSI33564:0.00000100000050002909):0.00836936205081428679):0.00829818569265527821):0.09616705606222861191):0.10112884277092673568):0.08676621583995366982):0.28813117070194893543):0.27210265692022123085):0.19598207908246487174):0.31295195999555491806):0.06897982798816415517):0.18705402992952535612,((((MANES04285:0.12809102396342048058,(POPTR35398:0.06397137367521385509,POPTR09053:0.09971463383116427326):0.06707996716399333703):0.06835412311457757240,(((ARALY24866:0.07611219986911359203,ARALY15026:0.02951860233566997935):0.02063033503687307021,ARATH03093:0.08666218447788577584):0.63638075247570258242,((MEDTR09013:0.18352185936553044865,(SOYBN12169:0.06494325341357314041,SOYBN24259:0.02854138856056501888):0.09714032590245939847):0.07812792911076180125,(MEDTR04903:0.11409216700434123004,(SOYBN22997:0.01478501927712241523,SOYBN50659:0.01775462673194045868):0.07115741312144341357):0.07794777989400249185):0.11908487576965891275):0.04740388078412241524):0.09194528558281013508,(SOLLC25539:0.24250141908759470510,(SOLLC25538:0.04050633972016133566,SOLLC25537:0.09295939090930299686):0.34009277540434990073):0.12937517660271360964):0.16950878800358334941,(((((((HORVD25108:0.00652390781678803631,(WHEAT76911:0.00000100000050002909,AEGTA04386:0.00000100000050002909):0.10477360487069939388):0.25393731138557690263,BRADI16645:0.17915000039128264886):0.06859033134266104281,(((ORYSJ06431:0.01388706125222685314,ORYSI28312:0.00977859196568739084):0.08335865941777977073,ORYBR23218:0.09547226708483877444):0.11486798143665095939,(SETIT14402:0.06305449355691006286,(MAIZE36432:0.07234254082785142315,SORBI11618:0.06568491744010958311):0.06013131251270829869):0.12189287365735004820):0.02240333271100423962):0.19929879531099886636,((((ORYGL09971:0.00438988821365675092,(ORYSI12988:0.00431545886734002217,ORYSJ30798:0.00432538371525326062):0.01311685936201942120):0.07922776893689105482,ORYBR10598:0.09040656229199227345):0.17168839822092302194,((SETIT01298:0.08266867070424761821,(MAIZE102130:0.08227597029840134912,SORBI13361:0.04506175022050269013):0.08586011082166068731):0.13460033789939085391,((ORYBR10597:0.07760596236226748046,((ORYSJ30796:0.00436490517936372925,ORYSI12987:0.00476068264444901110):0.01185171851093684905,ORYGL09970:0.00577594490990200344):0.08205012303557990272):0.17608303601621336232,(BRADI14833:0.11270235572949421909,(AEGTA10569:0.04789626742153037936,((TRIUA24825:0.00487943287423979032,WHEAT51707:0.00000100000050002909):0.05749501657107006919,(HORVD26507:0.06549282606881859370,WHEAT57481:0.01525853310575596249):0.02151149485069921499):0.01015745618935793605):0.13886462886579525877):0.07200691689499534587):0.05700688907148198509):0.20893791248844395536):0.04062771579734936883,((BRADI14835:0.44955348766375019531,(((AEGTA29856:0.00469479107038425682,WHEAT79399:0.03830812668319911324):0.01765932240119157809,TRIUA22875:0.01373661399126350872):0.07619097858445392224,(AEGTA19497:0.01701177093089568590,(WHEAT78466:0.01269519732717229281,(TRIUA22876:0.00448992266538095468,WHEAT43851:0.00000100000050002909):0.01022824027457463168):0.00805587906133016854):0.01751328239966683242):0.25361120816617449547):0.20112712000601240536,(SETIT01299:0.08374250964003029929,(MAIZE57163:0.05579303092246609003,SORBI00293:0.06982219139494250104):0.12294729382070185286):0.14774140597567320121):0.05550965349764053203):0.16501391345501570385):0.59156027821168211123,(MUSAM25306:0.00000100000050002909,MUSAC08909:0.00000100000050002909):0.56425331043823023780):0.06935179398753481272,(MUSAC17235:0.00000100000050002909,MUSAM11304:0.00000100000050002909):0.33074656626257226133):0.04113446107292954845,(MUSAC32048:0.00000100000050002909,MUSAM28945:0.00000100000050002909):0.40395029835227724835):0.11116519932884783017):0.36383795737023516548):0.15513855160898498697,(((SELML04036:0.00000100000050002909,SELML30593:0.02253800581798172387):0.73343806290509760970,((SELML32009:0.01185944579387473129,SELML25830:0.01564284217923260847):0.62496234353243873549,(((MUSAM00846:0.00000100000050002909,MUSAC05840:0.00000100000050002909):0.27767379729728347559,((((MANES31537:0.10373728244440343083,(POPTR26312:0.04902524609267987221,(POPTR17073:0.02424460350045745324,POPTR19841:0.03067210702970476002):0.05725919276272732616):0.05217826816232578463):0.01773646899821938738,((SOYBN45709:0.01976467850871522700,SOYBN20068:0.00931593700793753761):0.08882356558152308679,((SOLTU19135:0.02308697979826383404,SOLLC17663:0.01527362106607774161):0.07746500380067365688,(SOLLC14588:0.10705113654201102447,(SOLLC05546:0.02544882799719032015,SOLTU17369:0.01633887941936840171):0.35601242514875991452):0.02408651051819441294):0.19862420489319848604):0.05000377207553802911):0.01929113506021261706,VITVI05611:0.13589966418294793793):0.04057999491301594874,(ARATH21508:0.01314216671002194949,ARALY07020:0.01471697015965536294):0.24430137817921074306):0.17530343814579910089):0.12758705747720480717,((SETIT07458:0.08223267413614934740,SORBI05578:0.04285640908248434383):0.09886489818727521584,((BRADI02621:0.04319706558677083308,(HORVD26946:0.03123079674234424327,(WHEAT30637:0.00000100000050002909,AEGTA27617:0.02543652954470833685):0.03906645080991166807):0.03767712306148063989):0.07591027655908981486,(ORYBR25880:0.35980546318773182213,(ORYGL31036:0.38561322162703270955,(ORYSJ17704:0.00000100000050002909,ORYSI31590:0.00000100000050002909):0.04221454678817607165):0.03733326424170398811):0.04923224252110530025):0.04482387213923874625):0.30330798639493300461):0.42391238293699867734):0.12900733688252491449):0.25672951179217162743,(((ARATH12088:0.04345612947334916848,ARALY15180:0.01278238004773055332):0.28225191641228014605,(((SOLLC08866:0.03116105286661456295,SOLTU11652:0.03595173601233894733):0.27779696276678966793,(((MANES08542:0.06187204056805281627,MANES04002:0.06468024974113477377):0.02999104263142534851,POPTR02330:0.15197978163985234601):0.05110266224294635756,(VITVI10320:0.21088861138339548562,(((SOYBN04100:0.01701653951175300522,SOYBN05818:0.02033318006357448526):0.09272937116350643549,(SOYBN15520:0.04250480034728820744,SOYBN06739:0.02912054771531125130):0.13799826100591089384):0.05268169938475606578,MEDTR17803:0.22034338595431993135):0.10199510913397043244):0.04902372571343893010):0.06609838470913978470):0.04655835393607146017,((((((MUSAM15403:0.00000100000050002909,MUSAC14736:0.00000100000050002909):0.20600028692733854396,(MUSAM32781:0.00000100000050002909,MUSAC25643:0.00000100000050002909):0.14115274237014310832):0.08651793145117307737,((MUSAM00673:0.00000100000050002909,MUSAC05667:0.00000100000050002909):0.11158952141205510933,(MUSAC25329:0.00000100000050002909,MUSAM32467:0.00000100000050002909):0.09387903218927463878):0.10995434277929043432):0.06052700194057819560,(((MUSAM00310:0.00000100000050002909,MUSAC05304:0.00000100000050002909):0.13617504367452637482,(((MUSAC16058:0.00000100000050002909,MUSAM16725:0.00000100000050002909):0.10486022114717413745,(MUSAC34135:0.00000100000050002909,MUSAM34135:0.00000100000050002909):0.16409156328852872453):0.03858655198261457669,(MUSAC25174:0.00000100000050002909,MUSAM32312:0.00000100000050002909):0.10788142495815214450):0.00752993573947097292):0.01084418378141180188,(((((BRADI07661:0.26881884453128335188,(WHEAT50034:0.03271148716698367431,(AEGTA06624:0.24424696696338152324,HORVD17390:0.02177411956805997209):0.03785406196553546543):0.18638030109999692563):0.10981446169140147984,(((ORYSI15840:0.00000100000050002909,ORYGL12258:0.00000100000050002909):0.00000100000050002909,ORYSJ36105:0.00000100000050002909):0.27537284175231424577,((MAIZE09078:0.05434356009372160595,SORBI15382:0.10237753003433391896):0.08944045921903263918,SETIT35250:0.12215170581009912598):0.11826045417292589679):0.06548353249881462557):0.08146513048135459178,((ORYBR05841:0.10404597279528658704,(ORYSI07141:0.00410773159144801024,(ORYSJ35711:0.00000100000050002909,ORYGL05048:0.00000100000050002909):0.00000100000050002909):0.04551987923090337895):0.10576161218838060762,(SETIT32776:0.03943648086112061524,(SORBI31574:0.04111134894492661507,MAIZE23151:0.03520893854577578780):0.09070106443727682377):0.16283646104099522289):0.07836123413467779852):0.17511975411130692448,((ORYBR25645:0.04931355332983965167,(ORYSI31315:0.00835369478738797432,ORYSJ41794:0.00397326718722296364):0.04418686662609763033):0.08009020363744218107,((BRADI02810:0.05979159213351873531,(TRIUA27388:0.13259298260816299031,(HORVD25257:0.01307217327549589983,AEGTA11651:0.05044489330556417572):0.01995233262441147709):0.03516129744274204549):0.05459216916254347463,(SETIT07215:0.04708381360637253765,SORBI16057:0.03780571253328020992):0.09250629558585042600):0.04857731608863719713):0.18601242575533336043):0.13081987323926835831,((MUSAM28387:0.00000100000050002909,MUSAC31490:0.00000100000050002909):0.13809275391935840749,(MUSAM06163:0.00000100000050002909,MUSAC02514:0.00000100000050002909):0.13443733978458655143):0.11240886943371462825):0.05296458176641562210):0.11191148042352855319):0.07792882604348769227,(MAIZE50869:0.20161901399966816739,(ORYSJ13792:0.00344556629476266627,ORYGL12141:0.00000100000050002909):0.40526528156755575738):0.34137254689259671769):0.06006403217219220131,((((POPTR35027:0.05393182831209996503,POPTR04952:0.05521659134831382459):0.02201585503116876286,(MANES19609:0.02596841235999546374,MANES10538:0.09181495744289040750):0.04296697850138769814):0.02764613685628336884,((MEDTR23007:0.14861117512699956178,(SOYBN29338:0.02458418719769522864,((SOYBN13736:0.01509013228527967231,SOYBN43775:0.02145355348494341549):0.16640095219656991787,SOYBN36549:0.01028863285353836740):0.01839206753814766684):0.01622596695858928920):0.03660556882643294790,((SOLTU39089:0.00117096551526091417,SOLLC28021:0.01187029290712567423):0.22287372997554585896,(ARATH07366:0.00875683690028302222,ARALY00833:0.00000100000050002909):0.16827048768696287184):0.07244843191799404947):0.03534464371453985287):0.02000463252403119480,VITVI17808:0.08998241193148946715):0.10986619059172396395):0.13405078768268269274):0.12311481700378895665):0.98882183914734911312,(((((((WHEAT60967:0.00000100000050002909,AEGTA03722:0.03332352249727857374):0.08507743088329765280,(AEGTA03721:0.03120567159614403077,(WHEAT14055:0.00632227175877901008,TRIUA29195:0.00000100000050002909):0.04673495602798510146):0.16329576388942035337):0.15531729757554188498,(BRADI07070:0.37026291951256035118,((HORVD20994:0.12811193893398598043,(WHEAT12350:0.01969559231421251846,(WHEAT77085:0.01470223385584298013,AEGTA19716:0.06316851070386607370):0.00968132322715203539):0.05119939814746100881):0.04084095514757011408,(WHEAT24898:0.05016574049112149103,AEGTA12347:0.01995581980971198113):0.02081975473411607977):0.16869837479957952575):0.05619664667980716483):0.24831642305719148212,((SETIT14425:0.47764687327215699097,((MAIZE18162:0.09553598393514040055,SORBI25193:0.11352614105783159770):0.21191848898802437273,((SORBI35181:0.05292730142081283201,MAIZE18161:0.17432028069242672119):0.06032098126313615444,SETIT13838:0.11164201632808351539):0.11456166237898118831):0.07622478167291260598):0.14940224679826055731,((BRADI04294:0.32595916819305448264,((AEGTA18745:0.10634535983946430404,(AEGTA31075:0.04459594651531112453,(WHEAT11096:0.00000100000050002909,(WHEAT08529:0.00635692172798464974,AEGTA31072:0.04144121980447820069):0.04159188193122757837):0.04412101762037935054):0.02698704179012119744):0.16284134573657008116,(AEGTA18744:0.01195316090528342548,(TRIUA11031:0.00925297322801557805,WHEAT15146:0.01060034719047915977):0.01727983893001515739):0.13273228717604926286):0.12103778798370855296):0.09464116324714079431,(ORYBR22877:0.13523352767443408418,(ORYGL21734:0.00000100000050002909,ORYSJ43339:0.01255436389797181564):0.13884677756965096984):0.29626227185512138407):0.06436276448759868651):0.02413499568510924648):0.60968947337191503610,(((ARALY23414:0.02066749278201470558,ARATH11243:0.01399957689288938364):0.09425546221828634552,ARALY00651:0.10735033664226613370):0.40388505237973570949,((ARALY03956:0.24012169013550627161,ARALY21124:0.19633072357738970415):0.06427522303025316741,((ARATH01314:0.06647529874620333734,(ARALY03958:0.06595260696372405584,ARALY03957:0.00000100000050002909):0.06649198091038591163):0.21274165779273099264,(ARATH01313:0.06513841882889097323,ARALY03960:0.05578436753233904921):0.22023463130689255318):0.03504678664890692463):0.17391961257736873736):0.24505110983118211232):0.09555851836326578752,((MANES21561:0.67512690969040023425,((POPTR30883:0.26030484457406699583,MANES22834:0.29598774812820566327):0.07412064484319866309,(SOYBN27365:0.48410414600105500238,(VITVI08941:0.26078928529473799358,(SOLTU29411:0.51721146347862034798,SOLLC22543:0.68707100045555735690):0.06957081549371632589):0.03225955561093173107):0.07734559707383820149):0.05534749079235385533):0.08271228282775787422,(SOYBN53276:0.69961742713612240507,((MEDTR16163:0.30630307718879640211,MEDTR16156:0.31924879265458311339):0.66390538027899415052,(VITVI18229:0.54639937413730021998,SOLLC07830:0.94719796632216579635):0.16723691155378409001):0.10848114991407539764):0.14393105388568841474):0.08673670159109429789):0.18155032659242803517,(SOLTU32649:0.24228719342220669808,SOLLC03543:0.12833616651811430298):0.93228257253300017560):0.24359505812097589916):0.12373506733650779799):0.11058357764889827080):0.07068998206559712338,(PHYPA30212:0.81857794292793251145,PHYPA09708:0.39080088203220170184):0.52297803939947840046):0.03632494674845065247):0.09068896307712170923):0.07263521594265974490,(SELML17821:0.01973385479375744031,SELML01125:0.00874005985571055244):0.53914442669752848936):0.08591529231707925596):0.41641658843242934651,((MUSAM19491:0.00000100000050002909,MUSAC12503:0.00000100000050002909):0.32605151158697270874,(VITVI01671:0.23325592850007700885,(SOLLC19172:0.03908680398679684892,SOLTU20866:0.02667117357700208441):0.50668488201429251472):0.10899142519943895435):0.33614237059822776876):0.17589028901001635408,(((MUSAM33416:0.00000100000050002909,MUSAC26277:0.00000100000050002909):0.05308649677679021933,(MUSAM22433:0.00000100000050002909,MUSAC28290:0.00000100000050002909):0.10865916116839537120):0.11562652940171699867,(((ORYSI23756:0.01256242933992473415,ORYSI23267:0.00560850022995434787):0.07517652287960574498,(BRADI26138:0.18376865474644263343,((TRIUA31870:0.12653508889230044576,WHEAT63736:0.00000100000050002909):0.00345742178483259173,((HORVD28654:0.05426658531501288296,(WHEAT11407:0.00000100000050002909,AEGTA04531:0.05734732027821431988):0.00000100000050002909):0.01474230293715694806,WHEAT86670:0.01156767049293624082):0.00343543531358274801):0.02583949515618799361):0.04852184646475490165):0.03136079249069338715,(SETIT25858:0.07987162960856626637,(MAIZE47396:0.28369596669371405229,(SORBI01504:0.00000100000050002909,SORBI01242:0.00000100000050002909):0.05827541633595767490):0.02898787783404207022):0.08067073843757789631):0.36136655251411919920):0.23107011329715593240):0.19459168503719689869):0.04647901588325549505):0.33295044965727599307,ARALY22584:0.01839604238464330119,ARATH00549:0.01550155215353314284):0.0;\",\n \"stack\" : {\"children\": [{\"children\": [{\"children\": [{\"children\": [{\"id\": \"HALHT\", \"last_updated\": \"Aug 20, 2012\", \"name\": \"Haloarcula hispanica (strain ATCC 33960 / DSM 4426 / JCM 8911 / NBRC 102182 / NCIMB 2187 / VKM B-1755)\", \"nr_proteins\": 3855, \"release\": \"18-OCT-2011 (Rel. 110, Last updated, Version 2)\", \"source\": \"EBI\", \"taxid\": 634497}, {\"id\": \"HALMA\", \"last_updated\": \"Mar 25, 2014\", \"name\": \"Haloarcula marismortui (strain ATCC 43049 / DSM 3752 / JCM 8966 / VKM B-1809)\", \"nr_proteins\": 4231, \"release\": \"02-FEB-2014 (Rel. 119, Last updated, Version 9)\", \"source\": \"EBI\", \"taxid\": 272569}], \"name\": \"Haloarcula\", \"taxid\": 2237, \"nr_hogs\": 4107, \"evolutionaryEvents\": {\"gained\": 178, \"retained\": 3532, \"duplicated\": 397, \"lost\": 1508, \"duplications\": 166}}, {\"id\": \"HALMD\", \"last_updated\": \"Nov 23, 2009\", \"name\": \"Halomicrobium mukohataei (strain ATCC 700874 / DSM 12286 / JCM 9738 / NCIMB 13541)\", \"nr_proteins\": 3168, \"release\": \"03-NOV-2009 (Rel. 113, Last updated, Version 1)\", \"source\": \"Genome Reviews\", \"taxid\": 485914}, {\"id\": \"HALUD\", \"last_updated\": \"Nov 23, 2009\", \"name\": \"Halorhabdus utahensis (strain DSM 12940 / JCM 11049 / AX-2)\", \"nr_proteins\": 2998, \"release\": \"03-NOV-2009 (Rel. 113, Last updated, Version 1)\", \"source\": \"Genome Reviews\", \"taxid\": 519442}, {\"children\": [{\"id\": \"NATM8\", \"last_updated\": \"Oct 27, 2014\", \"name\": \"Natronomonas moolapensis (strain DSM 18674 / JCM 14361 / 8.8.11)\", \"nr_proteins\": 2852, \"release\": \"27-FEB-2014 (Rel. 119, Last updated, Version 4)\", \"source\": \"EBI\", \"taxid\": 268739}, {\"id\": \"NATPD\", \"last_updated\": \"Mar 25, 2014\", \"name\": \"Natronomonas pharaonis (strain ATCC 35678 / DSM 2160 / CIP 103997 / NBRC 14720 / NCIMB 2260 / Gabara)\", \"nr_proteins\": 2824, \"release\": \"07-MAR-2014 (Rel. 120, Last updated, Version 14)\", \"source\": \"EBI\", \"taxid\": 348780}], \"name\": \"Natronomonas\", \"taxid\": 63743, \"nr_hogs\": 3156, \"evolutionaryEvents\": {\"gained\": 93, \"lost\": 2294, \"duplicated\": 254, \"retained\": 2809, \"duplications\": 103}}], \"name\": \"Haloarculaceae\", \"taxid\": 1963268, \"nr_hogs\": 5206, \"evolutionaryEvents\": {\"gained\": 273, \"retained\": 4584, \"duplicated\": 349, \"lost\": 1040, \"duplications\": 163}}, {\"children\": [{\"id\": \"HALJB\", \"last_updated\": \"Dec 23, 2010\", \"name\": \"Halalkalicoccus jeotgali (strain DSM 18796 / CECT 7217 / JCM 14584 / KCTC 4019 / B3)\", \"nr_proteins\": 3779, \"release\": \"30-NOV-2010 (Rel. 127, Last updated, Version 2)\", \"source\": \"Genome Reviews\", \"taxid\": 795797}, {\"children\": [{\"id\": \"HALS3\", \"last_updated\": \"May 8, 2008\", \"name\": \"Halobacterium salinarum (strain ATCC 29341 / DSM 671 / R1)\", \"nr_proteins\": 2742, \"release\": \"29-APR-2008 (Rel. 90, Last updated, Version 1)\", \"source\": \"Genome Reviews\", \"taxid\": 478009}, {\"id\": \"HALSA\", \"last_updated\": \"Mar 25, 2014\", \"name\": \"Halobacterium salinarum (strain ATCC 700922 / JCM 11081 / NRC-1)\", \"nr_proteins\": 2418, \"release\": \"03-FEB-2014 (Rel. 119, Last updated, Version 7)\", \"source\": \"EBI\", \"taxid\": 64091}], \"name\": \"Halobacterium salinarum\", \"taxid\": 2242, \"nr_hogs\": 2540, \"evolutionaryEvents\": {\"gained\": 201, \"retained\": 2202, \"duplicated\": 137, \"lost\": 1437, \"duplications\": 62}}], \"name\": \"Halobacteriaceae\", \"taxid\": 2236, \"nr_hogs\": 3701, \"evolutionaryEvents\": {\"gained\": 13, \"retained\": 3605, \"duplicated\": 83, \"lost\": 2142, \"duplications\": 40}}], \"name\": \"Halobacteriales\", \"taxid\": 2235, \"nr_hogs\": 5787, \"evolutionaryEvents\": {\"gained\": 118, \"retained\": 5120, \"lost\": 1677, \"duplicated\": 549, \"duplications\": 228}}, {\"children\": [{\"children\": [{\"children\": [{\"id\": \"HALMT\", \"last_updated\": \"Nov 30, 2012\", \"name\": \"Haloferax mediterranei (strain ATCC 33500 / DSM 1411 / JCM 8866 / NBRC 14739 / NCIMB 2177 / R-4)\", \"nr_proteins\": 3861, \"release\": \"02-AUG-2012 (Rel. 113, Last updated, Version 3)\", \"source\": \"EBI\", \"taxid\": 523841}, {\"id\": \"HALVD\", \"last_updated\": \"Jul 20, 2010\", \"name\": \"Haloferax volcanii (strain ATCC 29605 / DSM 3757 / JCM 8879 / NBRC 14742 / NCIMB 2012 / VKM B-1768 / DS2)\", \"nr_proteins\": 3986, \"release\": \"13-JUL-2010 (Rel. 123, Last updated, Version 2)\", \"source\": \"Genome Reviews\", \"taxid\": 309800}], \"name\": \"Haloferax\", \"taxid\": 2251, \"nr_hogs\": 4166, \"evolutionaryEvents\": {\"gained\": 107, \"retained\": 3786, \"lost\": 1192, \"duplicated\": 273, \"duplications\": 108}}, {\"id\": \"HALBP\", \"last_updated\": \"Aug 20, 2012\", \"name\": \"Halogeometricum borinquense (strain ATCC 700274 / DSM 11551 / JCM 10706 / PR3)\", \"nr_proteins\": 3894, \"release\": \"24-NOV-2010 (Rel. 106, Last updated, Version 1)\", \"source\": \"EBI\", \"taxid\": 469382}, {\"children\": [{\"id\": \"HALWD\", \"last_updated\": \"Sep 26, 2006\", \"name\": \"Haloquadratum walsbyi (strain DSM 16790 / HBSQ001)\", \"nr_proteins\": 2819, \"release\": \"24-JUL-2006 (Rel. 88, Last updated, Version 2)\", \"source\": \"EBI\", \"taxid\": 362976}, {\"id\": \"HALWC\", \"last_updated\": \"Apr 2, 2012\", \"name\": \"Haloquadratum walsbyi (strain DSM 16854 / JCM 12705 / C23)\", \"nr_proteins\": 2974, \"release\": \"15-MAR-2012 (Rel. 112, Last updated, Version 4)\", \"source\": \"EBI\", \"taxid\": 768065}], \"name\": \"Haloquadratum walsbyi\", \"taxid\": 293091, \"nr_hogs\": 2819, \"evolutionaryEvents\": {\"gained\": 209, \"retained\": 2443, \"lost\": 2564, \"duplicated\": 167, \"duplications\": 79}}], \"name\": \"Haloferacaceae\", \"taxid\": 1644056, \"nr_hogs\": 5086, \"evolutionaryEvents\": {\"gained\": 222, \"duplicated\": 385, \"retained\": 4479, \"lost\": 571, \"duplications\": 174}}, {\"id\": \"HALLT\", \"last_updated\": \"Jun 22, 2009\", \"name\": \"Halorubrum lacusprofundi (strain ATCC 49239 / DSM 5036 / JCM 8891 / ACAM 34)\", \"nr_proteins\": 3493, \"release\": \"16-JUN-2009 (Rel. 107, Last updated, Version 3)\", \"source\": \"Genome Reviews\", \"taxid\": 416348}], \"name\": \"Haloferacales\", \"taxid\": 1644055, \"nr_hogs\": 5224, \"evolutionaryEvents\": {\"gained\": 94, \"retained\": 4671, \"lost\": 2155, \"duplicated\": 459, \"duplications\": 199}}, {\"children\": [{\"id\": \"HALXS\", \"last_updated\": \"Aug 20, 2012\", \"name\": \"Halopiger xanaduensis (strain DSM 18323 / JCM 14033 / SH-6)\", \"nr_proteins\": 4221, \"release\": \"23-NOV-2011 (Rel. 110, Last updated, Version 2)\", \"source\": \"EBI\", \"taxid\": 797210}, {\"id\": \"HALTV\", \"last_updated\": \"Jun 11, 2010\", \"name\": \"Haloterrigena turkmenica (strain ATCC 51198 / DSM 5511 / NCIMB 13204 / VKM B-1734)\", \"nr_proteins\": 3739, \"release\": \"25-MAY-2010 (Rel. 121, Last updated, Version 2)\", \"source\": \"Genome Reviews\", \"taxid\": 543526}, {\"id\": \"HALRX\", \"last_updated\": \"Dec 18, 2013\", \"name\": \"Halovivax ruber (strain DSM 18193 / JCM 13892 / XH-70)\", \"nr_proteins\": 3099, \"release\": \"18-JUL-2013 (Rel. 117, Last updated, Version 2)\", \"source\": \"EBI\", \"taxid\": 797302}, {\"children\": [{\"id\": \"NATA1\", \"last_updated\": \"Aug 10, 2017\", \"name\": \"Natrialba asiatica (strain ATCC 700177 / DSM 12278 / JCM 9576 / FERM P-10747 / NBRC 102637 / 172P1)\", \"nr_proteins\": 4176, \"release\": \"Ensembl Bacteria 36; ASM33755v1\", \"source\": \"EnsemblGenomes\", \"taxid\": 29540}, {\"id\": \"NATMM\", \"last_updated\": \"Jul 20, 2010\", \"name\": \"Natrialba magadii (strain ATCC 43099 / DSM 3394 / CIP 104546 / JCM 8861/ NBRC 102185 / NCIMB 2190 / MS3)\", \"nr_proteins\": 3558, \"release\": \"13-JUL-2010 (Rel. 123, Last updated, Version 2)\", \"source\": \"Genome Reviews\", \"taxid\": 547559}], \"name\": \"Natrialba\", \"taxid\": 63742, \"nr_hogs\": 4283, \"evolutionaryEvents\": {\"gained\": 51, \"lost\": 2216, \"retained\": 3820, \"duplicated\": 412, \"duplications\": 148}}, {\"children\": [{\"id\": \"NATP1\", \"last_updated\": \"Oct 27, 2014\", \"name\": \"Natrinema pellirubrum (strain DSM 15624 / CIP 106293 / JCM 10476 / NCIMB 786 / 157)\", \"nr_proteins\": 4138, \"release\": \"23-JUL-2013 (Rel. 117, Last updated, Version 2)\", \"source\": \"EBI\", \"taxid\": 797303}, {\"id\": \"NATSJ\", \"last_updated\": \"Oct 27, 2014\", \"name\": \"Natrinema sp. (strain J7-2)\", \"nr_proteins\": 4296, \"release\": \"15-MAY-2014 (Rel. 120, Last updated, Version 6)\", \"source\": \"EBI\", \"taxid\": 406552}], \"name\": \"Natrinema\", \"taxid\": 88723, \"nr_hogs\": 4304, \"evolutionaryEvents\": {\"gained\": 52, \"retained\": 3748, \"lost\": 2241, \"duplicated\": 504, \"duplications\": 195}}, {\"id\": \"NATGS\", \"last_updated\": \"Oct 27, 2014\", \"name\": \"Natronobacterium gregoryi (strain ATCC 43098 / DSM 3393 / CCM 3738 / CIP 104747 / JCM 8860 / NBRC 102187 / NCIMB 2189 / SP2)\", \"nr_proteins\": 3624, \"release\": \"18-JUL-2013 (Rel. 117, Last updated, Version 2)\", \"source\": \"EBI\", \"taxid\": 797304}], \"name\": \"Natrialbaceae\", \"taxid\": 1644061, \"nr_hogs\": 6184, \"evolutionaryEvents\": {\"gained\": 842, \"duplicated\": 729, \"retained\": 4613, \"lost\": 2106, \"duplications\": 306}}], \"name\": \"Halobacteria\", \"taxid\": 183963, \"nr_hogs\": 7025, \"evolutionaryEvents\": {\"gained\": 2357, \"lost\": 6118, \"retained\": 2767, \"duplicated\": 1901, \"duplications\": 605}},\n \"unrooted1\" : \"(((ERPZAN_R00185:0.0,VIRALT_R07861:0.0):0.001945655,(CALWIL_R07193:0.004232679,(((ORISOL_R03544:0.009877258,(((GRAPIC_R12577:0.014982099,(CHAFRE_R02806:0.015160571,PICGYM_R06166:0.005771333)0.924:0.008896484)0.000:0.000000005,((((((PRUFUL_R09054:0.003886375,PRUHIM_R10842:0.001948296)0.982:0.011827022,(((((ERIRUB_R02188:0.007802411,(OENOEN_R08976:0.001941816,(FICALB_R00799:0.001939725,SAXMAU_R01795:0.001939665)0.000:0.000000005)0.892:0.003892813)0.777:0.001950911,CATFUS_R11593:0.009811424)0.763:0.001934869,((LEUROT_R14346:0.004408857,STUVUL_R07134:0.001971242)0.939:0.005906419,(RHAINO_R11059:0.005887267,CINMEX_R12987:0.003886547)0.000:0.000000006)0.865:0.001937309)0.000:0.000000005,CERCOR_R06284:0.001940730)0.000:0.000000005,(COPSEC_R04846:0.004218174,TOXRED_R00790:0.009898142)0.774:0.001943683)0.940:0.003904001)0.756:0.000000005,((LEPASP_R01517:0.003890030,((CHLCYA_R06957:0.001955392,CHLHAR_R11249:0.001953557)0.964:0.008708646,(ELAFOR_R06222:0.067874933,PROCAF_R03956:0.003610596)0.257:0.005031912)0.660:0.001127634)0.767:0.001921350,(BOMGAR_R08262:0.013821927,DICEXI_R09180:0.005866937)0.780:0.001969198)0.201:0.001945712)0.870:0.003873477,((VIDCHA_R00557:0.000000005,VIDMAC_R01666:0.000000005)0.964:0.005889060,(REGSAT_R03545:0.013716864,((CERBRA_R02815:0.001950138,CERFAM_R07219:0.000000005)0.961:0.007862625,(POLCAE_R08689:0.009809226,THRLUD_R00775:0.005859079)0.869:0.003942256)0.709:0.001931719)0.227:0.000000005)0.800:0.001950173)0.000:0.000000005,((UROPYL_R08260:0.001947195,((LONSTR_R08944:0.001958986,TAEGUT_R17040:0.001942470)0.950:0.005924130,(PEUTAE_R12381:0.005854865,(GEOFOR_R09593:0.000000005,SPOHYP_R10874:0.009809954)0.908:0.003914454)0.000:0.000000005)0.000:0.000000005)0.000:0.000000005,(PASAMO_R03813:0.005069014,((((HYPCIN_R05861:0.003896135,(CARCAR_R07597:0.003905784,RHOROS_R03907:0.001943968)0.000:0.000000005)0.842:0.001943562,(AGEPHO_R12112:0.0,QUIMEX_R06835:0.0):0.000000005)0.000:0.000000005,(EMBFUC_R07456:0.001943300,(PASDOM_R01841:0.001943080,((SERCAN_R05569:0.001945109,((LOXCUR_R01247:0.0,LOXLEU_R10869:0.0):0.000000005,(CHLVIR_R02303:0.000000005,HEMWIL_R12881:0.010111980)0.886:0.003957626)0.000:0.000000005)0.970:0.005863006,((MOTALB_R00263:0.000000005,(JUNHYE_R02029:0.000000006,((SPIPAS_R02115:0.006527089,ZONALB_R11673:0.079247082)0.760:0.003205270,MELMEL_R06212:0.001942881)0.000:0.000000005)0.955:0.003895192)0.844:0.001945482,MOLATE_R04767:0.001955739)0.000:0.000000005)0.000:0.000000005)0.000:0.000000005)0.000:0.000000005)0.000:0.000000005,(NESACU_R06611:0.009881748,(SETCOR_R10331:0.003907723,SETKIR_R09068:0.000000005)0.775:0.001967787)0.793:0.001932107)0.018:0.001945014)0.000:0.000000012)0.867:0.001947156)0.759:0.001960110,(((((SYLVIR_R10709:0.008511537,(RHASIB_R03403:0.004219395,(DONATR_R04824:0.002110299,(((SITEUR_R04209:0.002153741,TICMUR_R00244:0.014627474)0.873:0.016577296,(IRECYA_R12278:0.008443130,((CALORN_R07598:0.004102220,PHEMEL_R04365:0.018435972)0.761:0.006405228,PLONIG_R01869:0.002094273)0.769:0.006391425)0.756:0.005458630)0.912:0.044065580,(ACRARU_R14141:0.007219493,HIPICT_R09009:0.006178173)0.856:0.005126254)0.781:0.015838771)0.000:0.000000005)0.000:0.000000005)0.000:0.000000005,PHYTRO_R13017:0.002104908)1.000:0.000000005,(HYLPRA_R13303:0.015927337,NICCHL_R07497:0.003891376)0.000:0.000000005)0.858:0.001940187,((((((AEGCAU_R08906:0.011140782,CETCET_R02558:0.005903608)0.255:0.003415620,HORVUL_R04273:0.009812994)0.626:0.001680505,(ERYMCC_R11442:0.006810883,HIRRUS_R01812:0.006327241)0.735:0.000000006)0.782:0.002116626,(((BRAATR_R01259:0.004742602,PYCJOC_R06715:0.013167726)0.743:0.005550059,((CISJUN_R13494:0.013681315,(STEDEN_R06180:0.002112541,(ZOSHYP_R01814:0.0,ZOSLAT_R06289:0.0):0.004203446)0.754:0.002500532)0.817:0.005615809,((SINWEB_R08836:0.007864975,(SYLATR_R08297:0.006024005,SYLBOR_R04162:0.002682030)0.773:0.001875775)0.978:0.009763809,(PORRUF_R06759:0.006334252,(ILLCLE_R09312:0.004213600,LEILUT_R01534:0.004230040)0.759:0.002109725)0.000:0.000000005)0.274:0.000000005)0.930:0.003882969)0.731:0.000000005,(ANTMIN_R08656:0.005878668,(POEATR_R08762:0.001953933,(PARMAJ_R09814:0.001941467,PSEHUM_R01296:0.000000005)0.779:0.001939953)0.867:0.003890279)0.896:0.003954024)0.802:0.001957509)0.816:0.001941483,PANBIA_R07107:0.011763068)0.000:0.000000005,LOCOCH_R10739:0.009831663)0.749:0.000000005)0.628:0.001953038,((DRYBRU_R10064:0.013876059,MELVER_R13861:0.011929907)0.872:0.005849014,PHANIT_R00172:0.015775111)0.227:0.000000005)0.774:0.001939535)0.886:0.003912118)0.780:0.001969310,((DASBRO_R00594:0.009842139,MALELE_R03053:0.032191473)0.771:0.002069583,ORTSPA_R03385:0.010726540)0.759:0.001967749)0.112:0.001928318)0.754:0.000000005,POSRUF_R10160:0.007851715)0.000:0.000000005,PARPUN_R00466:0.006342347)0.845:0.001945681)0.000:0.000000005)0.473:0.000000005,EDOCOE_R05131:0.020325025,((((((CLIRUF_R03306:0.017236321,PTIVIO_R06384:0.010849082)0.898:0.006313265,(PACPHI_R05793:0.006582303,MYIHEB_R12764:0.015075462)0.736:0.002109579)0.767:0.002175077,((CORCOR_R12340:0.002107315,(APHCOE_R06763:0.001942404,(CORBRA_R01172:0.002099890,CORMON_R14880:0.002098940)0.000:0.000000005)0.771:0.000000006)0.851:0.005928796,(LANLUD_R02205:0.001941207,(STRCIN_R09449:0.004211299,(DICMEG_R07997:0.001948897,((IFRKOW_R03971:0.002424186,PARRAG_R04945:0.010638734)0.841:0.004001123,(CHAPAP_R05228:0.004221857,RHIDAH_R10872:0.001941595)0.770:0.001956199)0.794:0.001941109)0.796:0.001945185)0.000:0.000000005)0.784:0.001886571)0.889:0.003979150)0.841:0.000000005,((ORIORI_R12278:0.000000005,((ALERUF_R04641:0.001959638,OREARF_R11822:0.010656383)0.537:0.003915942,EULNIG_R10110:0.004227146)0.710:0.000000005)0.000:0.000000005,(((((DRYGAM_R05465:0.006536314,MACNIG_R10946:0.006033528)0.776:0.001812789,(GYMTIB_R11425:0.001942894,RHALEU_R08508:0.002105459)0.805:0.001951199)0.000:0.000000005,(PTEMEL_R10767:0.003961168,(FALFRO_R00442:0.004146048,PTILEU_R13363:0.012542161)0.454:0.001966717)0.770:0.002187623)0.000:0.000000005,DYACAS_R00451:0.007833519)0.837:0.001946443,(DAPCHR_R12269:0.011788821,MOHOCH_R00568:0.001957007)0.780:0.001937836)0.000:0.000000005)0.000:0.000000005)0.827:0.001948719,(((ACACHL_R00917:0.024705597,(((((((((BUCCAP_R06050:0.048099589,GALDEA_R14061:0.014658768)0.895:0.009268322,(MERNUB_R06122:0.024383502,((BRALEP_R03310:0.020666256,EURGUL_R08859:0.016515355)0.917:0.008025992,((CHLAEN_R07872:0.016712438,HALSEN_R12568:0.011577606)0.945:0.014651346,(BARMAR_R14004:0.018586348,TODMEX_R01766:0.025072377)0.765:0.003889539)0.764:0.003196345)0.750:0.000000005)0.925:0.006241677)0.887:0.006003563,(((GEOCAL_R04871:0.018333028,((CUCCAN_R12383:0.013003554,(CEUAER_R09623:0.009913529,PIACAY_R02410:0.008057454)0.748:0.001921432)0.961:0.010114104,(CROSUL_R03384:0.015898083,(CENBEN_R01764:0.001965814,CENUNI_R02025:0.000000005)0.996:0.020375886)0.453:0.003834681)0.703:0.000000005)0.981:0.013725180,(APAVIT_R10929:0.017953672,TROMEL_R09632:0.004188259)0.993:0.020110137)0.721:0.002294055,((BUCABY_R08200:0.012691621,BUCRHI_R04945:0.030420444)0.988:0.021974003,(CARCRI_R07732:0.004874465,CHUBUR_R13999:0.005407103)0.991:0.018131937)0.721:0.001947862)0.615:0.001944197)0.856:0.000000005,((MESCAY_R12170:0.014036275,NIPNIP_R07891:0.015312379)0.955:0.009992164,(COCCOC_R01070:0.005985097,EGRGAR_R10096:0.005917623)0.937:0.007802641)0.759:0.002069067)0.000:0.000000005,((((AEGBEN_R04767:0.053844522,(CHAPEL_R10771:0.013274451,HEMCOM_R11712:0.011705892)0.879:0.006682306)0.775:0.003228346,(CALANN_R09088:0.029203089,OREMEL_R09863:0.000000006)1.000:0.046019319)0.946:0.010225750,(NYCBRA_R03609:0.004303275,NYCGRA_R12802:0.015926537)0.994:0.025477451)0.691:0.007556244,(PSOCRE_R10483:0.011830117,(((BURBIS_R07694:0.011963395,((EURHEL_R12117:0.011866340,RHYJUB_R07657:0.011384429)0.790:0.005874564,((OPIHOA_R12042:0.021660699,(ARDKOR_R02007:0.004225482,(CHLMAC_R04828:0.018974440,LOPRUF_R03273:0.002069621)0.691:0.001573230)0.999:0.024492715)0.444:0.002710802,(STECAR_R00653:0.017457247,((EOLROS_R10991:0.007902317,PROATE_R04835:0.000000005)0.772:0.001976536,(AMAGUI_R07007:0.005964334,(AGAROS_R11305:0.008010840,MELUND_R04324:0.003969349)0.749:0.001941969)0.871:0.003980104)0.963:0.010985595)0.670:0.003301845)0.731:0.003470499)0.864:0.005602554)0.838:0.000000005,((PHALEP_R05929:0.023449902,PODSTR_R09766:0.005920522)0.260:0.003886799,(((((((PELURI_R10536:0.007631088,((ATLROG_R04223:0.003629742,ZAPATR_R12447:0.002802803)0.965:0.014223436,HELFUL_R14151:0.014160130)0.733:0.006781844)0.850:0.005259254,(APTFOR_R01110:0.000000005,PYGADE_R06057:0.004255750)0.904:0.004263949)0.773:0.002111086,(HYDTET_R14741:0.005465479,THACHL_R09870:0.006403968)0.848:0.000000005)0.000:0.000000005,((FREGRA_R07112:0.000000006,OCEOCE_R06906:0.001962902)0.964:0.005894749,(((AQUCHR_R00774:0.000000005,SPITYR_R00670:0.008031596)0.855:0.001959914,(CIRPEC_R00403:0.007871094,(HALALB_R01072:0.000000005,HALLEU_R12216:0.000000006)0.845:0.001961457)0.233:0.000000005)0.550:0.005926234,TYTALB_R00623:0.023928630)0.585:0.001945996)0.718:0.000000005)0.000:0.000000005,(((ARAGUA_R06621:0.007873242,(BALREG_R06527:0.008586065,GRUAME_R00169:0.003924619)0.000:0.000000005)0.920:0.003922030,(GAVSTE_R07443:0.006460401,(NESNOT_R10361:0.074557540,PHORUB_R01005:0.012321917)0.734:0.009685667)1.000:0.000000005)0.744:0.000000005,(FULGLA_R09869:0.006405020,CALBOR_R06055:0.003957979)0.850:0.005924294)0.848:0.001955162)0.845:0.001959458,(SCOUMB_R02017:0.018128567,(BALREX_R01585:0.004883042,PELCRI_R05111:0.021816487)0.900:0.007031742)0.853:0.003884320)0.000:0.000000005,(((PANHAL_R04800:0.000000005,(PODCRI_R09770:0.006947596,PODPOD_R03183:0.000000005)1.000:0.018064125)0.844:0.001956037,((CICMAG_R07326:0.003942241,FREMAG_R08115:0.011945731)0.788:0.001955833,SAGSER_R01396:0.008656616)0.770:0.001963524)0.000:0.000000005,(CICNIG_R12996:0.000000005,STROCC_R10326:0.001959681)0.995:0.011888892)0.000:0.000000005)0.830:0.001954508)0.741:0.000000005)0.817:0.001955203,GLABRA_R03687:0.012276589)0.000:0.000000005)0.745:0.000000005)0.831:0.001955222)0.749:0.000000005,(((FALCHE_R13279:0.0,FALPER_R09370:0.0):0.002096194,HERCAC_R07796:0.005940659)0.949:0.007945272,(SULDAC_R00447:0.011544381,((ANHANH_R06269:0.001916157,ANHRUF_R08963:0.002004182)0.949:0.007658136,(NANHAR_R02940:0.001951914,((NANAUR_R02327:0.0,NANBRA_R14303:0.0):0.000000005,(PHACAR_R05990:0.000000005,URIPEL_R08866:0.007345051)0.854:0.002442185)0.000:0.000000005)0.759:0.002238547)0.726:0.001981811)0.948:0.008239236)0.822:0.003895612)0.778:0.001988515,(((CHIMIN_R06220:0.0,PLUSOC_R06636:0.0):0.007867234,((TRILEU_R05014:0.006030801,(PSIHAE_R07704:0.003965813,(EUBBOU_R01201:0.009963312,(RAMSUL_R04838:0.003868894,SEMFRA_R03551:0.007881824)0.760:0.002206950)0.753:0.001983388)0.872:0.003997224)0.848:0.004606937,(INDMAC_R09403:0.034442035,PICPUB_R10180:0.026879379)0.851:0.005751906)0.994:0.024089597)0.834:0.003928465,((CHOACU_R04768:0.010195714,(ANTCAR_R10245:0.003964997,NYCLEU_R08557:0.006396158)0.636:0.000000005)0.978:0.013889478,(((STRCAM_R07813:0.030444894,((RHEAME_R12943:0.001761700,RHEPEN_R09156:0.002282360)0.999:0.031968904,((APTOWE_R09711:0.000000006,((APTAUS_R03341:0.000000005,APTROW_R05016:0.000000005)0.933:0.001954241,APTHAA_R06347:0.000000005)0.736:0.000000005)0.989:0.016047071,((((CRYSOU_R04748:0.004401730,(CRYCIN_R13049:0.002022351,CRYUND_R08482:0.005484799)0.735:0.002009287)0.854:0.006076835,((NOTPEN_R05090:0.000000005,(NOTPER_R02537:0.002017739,NOTORN_R05324:0.005888150)0.000:0.000000005)0.928:0.003958971,EUDELE_R07691:0.004037097)0.128:0.000000006)0.494:0.003918691,((NOTJUL_R01007:0.002185606,NOTNIG_R10629:0.006090779)0.942:0.008150790,TINGUT_R08793:0.006839816)0.670:0.000000006)0.976:0.012653578,(CASCAS_R05625:0.000000005,DRONOV_R04869:0.002271456)0.986:0.016619223)0.658:0.001466720)0.083:0.002536488)0.549:0.009503195)0.991:0.022252835,((CHATOR_R12931:0.012396042,(ANSSEM_R13713:0.012152924,(ANSCYG_R03736:0.006645406,(CAIMOS_R02508:0.000000005,((ANAPLA_R12734:0.0,ANAZON_R00560:0.0):0.001978503,ASASCU_R06730:0.006684948)0.901:0.006641172)0.523:0.000000005)0.948:0.013249707)0.745:0.001969604)0.854:0.003872952,((PENPIL_R11901:0.026110330,((NUMMEL_R03848:0.007820320,(ODOGUJ_R00268:0.000000005,(CALSQU_R12923:0.000000005,COLVIR_R01565:0.002268638)0.948:0.005865147)0.947:0.005870785)0.000:0.000000005,((PHACOL_R03848:0.003920796,(GALGAL_R00386:0.010015603,COTJAP_R09409:0.010011329)0.858:0.003728241)0.768:0.001943935,(MELGAL_R09321:0.001946936,TYMCUP_R02157:0.001949386)0.000:0.000000006)0.988:0.012004391)0.794:0.003175156)0.464:0.002865671,ALELAT_R04518:0.038131137)0.981:0.019648935)0.990:0.016480666)0.958:0.012288887,((PTEGUT_R01267:0.003917595,(PTEBUR_R05087:0.009879723,SYRPAR_R07515:0.007890174)0.770:0.001941318)0.991:0.016988764,(CALNIC_R10107:0.001865900,(ALOBEC_R10806:0.003950232,(COLPIC_R09688:0.005243482,(COLLIV_R04419:0.003499375,PATFAS_R09846:0.004688564)0.901:0.006017680)0.770:0.002666556)0.864:0.004130847)0.999:0.027294977)0.621:0.003661900)0.571:0.003802857)0.732:0.002497778)0.870:0.004231189)0.708:0.001379640,((CHAVOC_R09490:0.004077765,(CHAALE_R15308:0.003984947,(HIMHIM_R01743:0.003951351,IBISTR_R00388:0.001973630)0.776:0.001979280)0.761:0.001856136)0.908:0.005892061,((MESUNI_R06242:0.043175173,TURVEL_R11671:0.048577704)0.468:0.009194422,(((COLSTR_R09987:0.007308627,UROIND_R00112:0.006610823)0.987:0.019623031,(RHICYA_R12088:0.024449587,UPUEPO_R00447:0.018552135)0.940:0.011777256)0.426:0.007108634,((((STEPAR_R11882:0.006115305,(((PHASIM_R07643:0.003954558,(CEPGRY_R10420:0.002586226,(URILOM_R14851:0.001961500,(ALCTOR_R10164:0.000000005,URIAAL_R08244:0.001961208)0.000:0.000000005)0.898:0.005548302)0.849:0.003776601)0.000:0.000000005,(DROARD_R08901:0.005950928,RYNNIG_R04742:0.000000005)0.868:0.001972845)0.000:0.000000005,(CHRMAC_R10297:0.0,LARSMI_R11231:0.0,RISTRI_R04124:0.0):0.000000005)0.853:0.001974154)0.000:0.000000005,GLAPRA_R12578:0.001972885)0.000:0.000000005,RHIAFR_R07918:0.008040462)0.752:0.001899378,((CALPUG_R06327:0.007935790,(AREINT_R13368:0.000000005,LIMLAP_R00949:0.009207055)0.599:0.003914632)0.425:0.001980414,((NYCSEM_R11750:0.001960099,ROSBEN_R13055:0.001968434)0.799:0.001971966,((JACJAC_R12789:0.012072996,THIORB_R09193:0.008787430)0.843:0.003969872,PEDTOR_R12920:0.020301545)0.736:0.001911235)0.705:0.000000005)0.957:0.008005745)0.827:0.004655826)0.680:0.004981755)0.750:0.002524222)0.875:0.004642928)0.897:0.006129668,(CORCON_R08294:0.001880202,CORCRI_R03236:0.004068816)0.987:0.014120918)0.931:0.008750347)0.528:0.006874785,((((((FURFIG_R09482:0.003828829,(CAMPRO_R05359:0.001939106,XIPELE_R10971:0.000000005)0.359:0.003964155)0.874:0.004513791,(SCLMEX_R07822:0.010257712,SCYSUP_R14066:0.007781474)0.534:0.001995529)0.850:0.004792819,((RHEHOF_R06366:0.118165052,SAKLUC_R12331:0.002081497)0.980:0.019415983,GRAVAR_R13536:0.024204750)0.436:0.005015047)0.754:0.002759788,FORRUF_R01984:0.026154635)0.918:0.007587786,(SERLUN_R12374:0.027448888,(SAPAEN_R02087:0.012718993,(PITSOR_R11386:0.028595603,(CALVIR_R12747:0.020072875,SMICAP_R09407:0.018337687)0.857:0.006941496)0.711:0.007413604)0.818:0.004915663)0.926:0.009990057)0.747:0.002743401,((((PIPCHL_R11517:0.003916661,ONYCOR_R09931:0.003918692)0.000:0.000000005,(((TYRSAV_R09019:0.009776634,(NEOCIN_R07762:0.003938880,TACRUB_R02253:0.005842381)0.085:0.003898776)0.863:0.000000005,OXYCRI_R10812:0.000000005)0.000:0.000000006,MIOMAC_R00790:0.001943956)0.845:0.001945435)0.000:0.000000005,(CEPORN_R11899:0.013862951,(LEPCOR_R01168:0.003905301,MANMAN_R08983:0.000000005)0.938:0.005956526)0.778:0.001895519)0.868:0.003824710,PACMIN_R00396:0.005973298)0.903:0.005876812)0.833:0.004438967)0.936:0.011448284,(ATRCLA_R14560:0.007865376,MENNOV_R03873:0.008356460)0.742:0.000000005)0.977:0.009800426)0.000:0.000000005,(NOTCIN_R13885:0.009899398,CNELOR_R10105:0.010186239)0.851:0.003840248)0.856:0.001943330);\",\n \"unrooted2\" : \"((NOTCIN_R13885:0.010187673,CNELOR_R10105:0.010490935)0.825:0.003829957,CALWIL_R07193:0.002172772,(((EDOCOE_R05131:0.018437345,((((((CORCOR_R12340:0.002150513,(CORBRA_R01172:0.002142783,(APHCOE_R06763:0.001980384,CORMON_R14880:0.002141795)0.000:0.000000006)0.736:0.000000006)0.860:0.006046678,(STRCIN_R09449:0.004297327,(LANLUD_R02205:0.001977304,(DICMEG_R07997:0.001987067,((IFRKOW_R03971:0.002479151,PARRAG_R04945:0.010864683)0.844:0.004077025,(CHAPAP_R05228:0.004308558,RHIDAH_R10872:0.001979553)0.762:0.001995638)0.798:0.001980090)0.813:0.001981422)0.000:0.000000006)0.785:0.001922298)0.880:0.004058818,(EULNIG_R10110:0.004314037,(DAPCHR_R12269:0.012017900,MOHOCH_R00568:0.001995882)0.756:0.001975945)0.000:0.000000005)0.000:0.000000005,(ORIORI_R12278:0.000000005,((((DRYGAM_R05465:0.006674807,MACNIG_R10946:0.006155945)0.781:0.001845299,(GYMTIB_R11425:0.001980892,RHALEU_R08508:0.002148580)0.792:0.001989465)0.000:0.000000005,(PTEMEL_R10767:0.004041880,(FALFRO_R00442:0.004227186,PTILEU_R13363:0.012803009)0.400:0.002006650)0.804:0.002231187)0.000:0.000000005,DYACAS_R00451:0.007987995)0.857:0.001982674)0.000:0.000000005)0.728:0.000000005,(ALERUF_R04641:0.001998311,OREARF_R11822:0.010875693)0.755:0.003993123)0.810:0.001979779,((CLIRUF_R03306:0.017616054,PTIVIO_R06384:0.011246237)0.933:0.008375629,(PACPHI_R05793:0.006503186,MYIHEB_R12764:0.015317352)0.000:0.000000005)0.465:0.002157742)0.218:0.000000005)0.830:0.001988561,((((ACACHL_R00917:0.018509584,((((((GLABRA_R03687:0.012519950,(((CICNIG_R12996:0.000000005,STROCC_R10326:0.001996098)0.989:0.010083714,(BALREX_R01585:0.005672171,PELCRI_R05111:0.022062410)0.720:0.008623043)0.244:0.000000005,(((SAGSER_R01396:0.008837603,(CICMAG_R07326:0.004023260,FREMAG_R08115:0.012178796)0.754:0.001989459)0.786:0.002000857,((BURBIS_R07694:0.014250162,(PODSTR_R09766:0.008065108,PHALEP_R05929:0.021501114)0.558:0.003953535)0.804:0.000000005,(((HYDTET_R14741:0.005575582,THACHL_R09870:0.006536105)0.847:0.000000005,(((ATLROG_R04223:0.003503349,ZAPATR_R12447:0.003057157)0.975:0.015667941,HELFUL_R14151:0.015080635)0.929:0.009834040,(PELURI_R10536:0.008719870,(FULGLA_R09869:0.004331155,CALBOR_R06055:0.006012185)0.000:0.000000005)0.205:0.004165973)0.759:0.001842505)0.000:0.000000005,(((FREGRA_R07112:0.000000006,OCEOCE_R06906:0.001999525)0.958:0.006010759,(((NESNOT_R10361:0.075911808,PHORUB_R01005:0.010218983)0.727:0.010242915,GAVSTE_R07443:0.006578816)1.000:0.000000005,(BALREG_R06527:0.008765765,(ARAGUA_R06621:0.008026114,GRUAME_R00169:0.004002936)0.000:0.000000005)0.917:0.003999257)0.832:0.001993320)0.000:0.000000005,(((((TYTALB_R00623:0.026525852,SPITYR_R00670:0.008181286)0.000:0.000000005,AQUCHR_R00774:0.000000005)0.837:0.001996277,(HALALB_R01072:0.000000005,HALLEU_R12216:0.000000005)0.853:0.001996825)0.000:0.000000005,CIRPEC_R00403:0.008020981)0.946:0.006007983,(APTFOR_R01110:0.000000005,PYGADE_R06057:0.004343010)0.969:0.006531397)0.000:0.000000005)0.000:0.000000005)0.915:0.001995948)0.000:0.000000005)0.000:0.000000005,(SCOUMB_R02017:0.020416135,(PANHAL_R04800:0.000000005,(PODCRI_R09770:0.007082498,PODPOD_R03183:0.000000005)1.000:0.018424766)0.725:0.001994383)0.000:0.000000005)0.860:0.001992666)0.470:0.001993944)0.000:0.000000005,((CORCON_R08294:0.001989344,CORCRI_R03236:0.004081501)0.999:0.020881179,PSOCRE_R10483:0.012054824)0.000:0.000000005)0.799:0.000000006,(((AEGBEN_R04767:0.055082077,(CHAPEL_R10771:0.013564311,HEMCOM_R11712:0.011927148)0.871:0.006807602)0.770:0.003280282,(CALANN_R09088:0.029810330,OREMEL_R09863:0.000000005)1.000:0.046990361)0.950:0.010447336,(NYCBRA_R03609:0.004388146,NYCGRA_R12802:0.016244544)0.993:0.025996556)0.531:0.007693278)0.863:0.001993288,(((MESCAY_R12170:0.014767618,NIPNIP_R07891:0.015137138)0.912:0.010217801,(((CHIMIN_R06220:0.0,PLUSOC_R06636:0.0):0.006249464,((TRILEU_R05014:0.006135551,(PSIHAE_R07704:0.004038457,(EUBBOU_R01201:0.010124118,(RAMSUL_R04838:0.004034133,SEMFRA_R03551:0.008129589)0.469:0.000000005)0.778:0.002014038)0.859:0.004063584)0.800:0.004624184,(INDMAC_R09403:0.034956280,PICPUB_R10180:0.027440373)0.862:0.005866117)0.998:0.026347104)0.880:0.004061762,(((PTEGUT_R01267:0.003984815,(PTEBUR_R05087:0.010060270,SYRPAR_R07515:0.008034909)0.738:0.001982083)0.980:0.014864155,(CALNIC_R10107:0.001894525,(ALOBEC_R10806:0.004030050,(COLPIC_R09688:0.005328073,(COLLIV_R04419:0.003568250,PATFAS_R09846:0.004776462)0.822:0.004072246)0.773:0.002730534)0.874:0.004212020)0.998:0.027973676)0.810:0.003897629,(((STRCAM_R07813:0.028627763,((RHEAME_R12943:0.001791362,RHEPEN_R09156:0.002334167)1.000:0.032618768,((APTOWE_R09711:0.000000005,((APTAUS_R03341:0.000000005,APTROW_R05016:0.000000005)0.929:0.001992214,APTHAA_R06347:0.000000005)0.736:0.000000005)0.990:0.016367341,((((CRYSOU_R04748:0.004494095,(CRYCIN_R13049:0.002062606,CRYUND_R08482:0.005595680)0.763:0.002049044)0.873:0.006198459,((NOTPEN_R05090:0.000000005,(NOTPER_R02537:0.002056939,NOTORN_R05324:0.005998319)0.000:0.000000005)0.913:0.004022594,EUDELE_R07691:0.004116187)0.027:0.000000005)0.452:0.003995982,((NOTJUL_R01007:0.002232984,NOTNIG_R10629:0.006216927)0.931:0.008317664,TINGUT_R08793:0.006970222)0.667:0.000000006)0.978:0.012903360,(CASCAS_R05625:0.000000005,DRONOV_R04869:0.002313538)0.988:0.016958367)0.661:0.001476726)0.115:0.002592135)0.550:0.009669946)0.984:0.023238540,((CHATOR_R12931:0.012638931,(ANSSEM_R13713:0.012397313,(ANSCYG_R03736:0.006788341,(CAIMOS_R02508:0.000000005,((ANAPLA_R12734:0.0,ANAZON_R00560:0.0):0.002017872,ASASCU_R06730:0.006821680)0.890:0.006776359)0.498:0.000000005)0.942:0.013525336)0.742:0.002005872)0.857:0.003984425,((PENPIL_R11901:0.026649361,((NUMMEL_R03848:0.007964661,(ODOGUJ_R00268:0.000000005,(CALSQU_R12923:0.000000005,COLVIR_R01565:0.002308952)0.949:0.005979371)0.938:0.005979241)0.000:0.000000005,((PHACOL_R03848:0.003996085,(GALGAL_R00386:0.010209551,COTJAP_R09409:0.010205596)0.875:0.003802413)0.765:0.001980667,(MELGAL_R09321:0.001983344,TYMCUP_R02157:0.001986828)0.000:0.000000006)0.981:0.012228095)0.806:0.003239266)0.705:0.003247262,ALELAT_R04518:0.036290846)0.973:0.017559713)0.979:0.015098668)0.910:0.012360446,(ANTCAR_R10245:0.004047569,(CHOACU_R04768:0.010408223,NYCLEU_R08557:0.006528471)0.000:0.000000005)0.988:0.014522857)0.063:0.001616571)0.876:0.004257166)0.858:0.005510095)0.761:0.002478764,((((FALCHE_R13279:0.0,FALPER_R09370:0.0):0.002137856,HERCAC_R07796:0.006046748)0.950:0.008107933,(SULDAC_R00447:0.011772915,((ANHANH_R06269:0.001952961,ANHRUF_R08963:0.002044577)0.956:0.007810712,(NANHAR_R02940:0.001992131,((NANAUR_R02327:0.0,NANBRA_R14303:0.0):0.000000005,(PHACAR_R05990:0.000000005,URIPEL_R08866:0.007488905)0.853:0.002490073)0.000:0.000000005)0.771:0.002282420)0.737:0.002021252)0.946:0.008398780)0.853:0.003969226,(((APAVIT_R10929:0.018347506,TROMEL_R09632:0.004265692)0.986:0.020695177,(GEOCAL_R04871:0.018687816,((CUCCAN_R12383:0.013236146,(CEUAER_R09623:0.010077489,PIACAY_R02410:0.008187158)0.755:0.001987447)0.975:0.010284164,(CROSUL_R03384:0.016195343,(CENBEN_R01764:0.002002379,CENUNI_R02025:0.000000005)0.998:0.020778908)0.441:0.003903803)0.706:0.000000005)0.972:0.013914251)0.803:0.004473595,((((EURHEL_R12117:0.011827952,RHYJUB_R07657:0.011919472)0.753:0.005876051,((OPIHOA_R12042:0.022126506,(ARDKOR_R02007:0.004249532,(CHLMAC_R04828:0.019344883,LOPRUF_R03273:0.002112717)0.702:0.001660465)0.998:0.024878327)0.510:0.002667056,(STECAR_R00653:0.017697265,((EOLROS_R10991:0.008058735,PROATE_R04835:0.000000006)0.770:0.002015823,(AMAGUI_R07007:0.006092944,(AGAROS_R11305:0.008188291,MELUND_R04324:0.004063995)0.754:0.001955566)0.868:0.004068761)0.954:0.011286353)0.752:0.003239158)0.764:0.004060303)0.802:0.003431182,((CARCRI_R07732:0.004926596,CHUBUR_R13999:0.005565691)0.989:0.019088945,(BUCABY_R08200:0.012922520,BUCRHI_R04945:0.030925860)0.982:0.023053331)0.693:0.001261951)0.798:0.002090455,(COCCOC_R01070:0.006097725,EGRGAR_R10096:0.006031164)0.970:0.010050551)0.240:0.000000005)0.638:0.000000005)0.643:0.000000005)0.000:0.000000005)0.000:0.000000005,((COLSTR_R09987:0.010274933,UROIND_R00112:0.003927263)0.996:0.020105556,(((MESUNI_R06242:0.041334752,TURVEL_R11671:0.050465625)0.881:0.011520693,(((STEPAR_R11882:0.006237959,(((((NYCSEM_R11750:0.001998501,ROSBEN_R13055:0.002005146)0.818:0.002006086,(((JACJAC_R12789:0.012313643,THIORB_R09193:0.008939906)0.842:0.004047610,PEDTOR_R12920:0.020710116)0.763:0.001945396,(CALPUG_R06327:0.008089141,(AREINT_R13368:0.000000005,LIMLAP_R00949:0.009380671)0.613:0.003991462)0.779:0.002022128)0.000:0.000000005)0.988:0.008110302,GLAPRA_R12578:0.000000005)0.878:0.002014220,((DROARD_R08901:0.006068822,RYNNIG_R04742:0.000000005)0.927:0.002011780,((PHASIM_R07643:0.002012306,(CHRMAC_R10297:0.0,LARSMI_R11231:0.0,RISTRI_R04124:0.0):0.000000005)0.000:0.000000005,(CEPGRY_R10420:0.002643322,(ALCTOR_R10164:0.000000005,(URILOM_R14851:0.001997948,URIAAL_R08244:0.001997654)0.000:0.000000005)0.889:0.005651109)0.841:0.003845258)0.000:0.000000005)0.922:0.002014913)0.000:0.000000005,RHIAFR_R07918:0.008202362)0.733:0.000000006)0.897:0.006649422,(RHICYA_R12088:0.027437020,UPUEPO_R00447:0.016656291)0.981:0.017981040)0.601:0.006144029,(CHAVOC_R09490:0.004151844,(CHAALE_R15308:0.004071762,(HIMHIM_R01743:0.004026478,IBISTR_R00388:0.002009799)0.767:0.002013288)0.761:0.001910153)0.866:0.004700446)0.750:0.003193232)0.762:0.003621412,(BUCCAP_R06050:0.050490074,GALDEA_R14061:0.009927491)0.913:0.012765929)0.142:0.001442668)0.727:0.002316086)0.838:0.003888045,(((BRALEP_R03310:0.020926420,EURGUL_R08859:0.014812034)0.922:0.008291825,((CHLAEN_R07872:0.017048275,HALSEN_R12568:0.011760245)0.955:0.014767748,(BARMAR_R14004:0.018846041,TODMEX_R01766:0.025450564)0.774:0.004228639)0.763:0.003187693)0.761:0.000000005,MERNUB_R06122:0.024543538)0.884:0.004167791)0.981:0.014673257)0.940:0.010625720,(FORRUF_R01984:0.028394062,((SERLUN_R12374:0.029067140,(SAPAEN_R02087:0.011611878,(PITSOR_R11386:0.029220318,(CALVIR_R12747:0.020514975,SMICAP_R09407:0.018681747)0.855:0.007030753)0.783:0.008830299)0.814:0.005115354)0.914:0.009593144,(((RHEHOF_R06366:0.119624125,SAKLUC_R12331:0.000000005)0.985:0.021714910,GRAVAR_R13536:0.025023405)0.823:0.006700351,(((FURFIG_R09482:0.003855737,(CAMPRO_R05359:0.001976181,XIPELE_R10971:0.000000005)0.401:0.004085802)0.815:0.004406497,(SCLMEX_R07822:0.009515605,SCYSUP_R14066:0.008755842)0.560:0.002458980)0.696:0.008606532,(TYRSAV_R09019:0.007969348,((((NEOCIN_R07762:0.004014116,TACRUB_R02253:0.005955558)0.890:0.003974262,(MIOMAC_R00790:0.001982210,OXYCRI_R10812:0.000000005)0.000:0.000000005)0.844:0.001981767,((CEPORN_R11899:0.014130612,(LEPCOR_R01168:0.003986434,MANMAN_R08983:0.000000005)0.933:0.006077300)0.752:0.001934480,(ONYCOR_R09931:0.003995015,PIPCHL_R11517:0.003990987)0.000:0.000000006)0.751:0.000000005)0.879:0.003976846,PACMIN_R00396:0.005989343)0.293:0.000000006)0.879:0.006497485)0.155:0.003727304)0.772:0.002871621)0.762:0.002103815)0.881:0.007788756)0.886:0.006396091,(ATRCLA_R14560:0.008240691,MENNOV_R03873:0.008737989)0.724:0.002152865)0.958:0.009658636,(ERPZAN_R00185:0.0,VIRALT_R07861:0.0):0.001982105)0.738:0.000000005)0.000:0.000000005,(((ORISOL_R03544:0.010073721,(((((((PASAMO_R03813:0.005157382,(((LONSTR_R08944:0.001997580,TAEGUT_R17040:0.001978595)0.941:0.006035828,(PEUTAE_R12381:0.005969777,(UROPYL_R08260:0.001985326,(GEOFOR_R09593:0.000000005,SPOHYP_R10874:0.010003757)0.897:0.003991641)0.000:0.000000005)0.000:0.000000005)0.000:0.000000005,(((NESACU_R06611:0.010075839,(SETCOR_R10331:0.003984510,SETKIR_R09068:0.000000005)0.772:0.002006641)0.787:0.001969564,(CARCAR_R07597:0.003978559,(HYPCIN_R05861:0.003976504,RHOROS_R03907:0.001981973)0.000:0.000000005)0.865:0.001981550)0.000:0.000000005,((PASDOM_R01841:0.001981049,(((LOXCUR_R01247:0.0,LOXLEU_R10869:0.0):0.000000005,(SERCAN_R05569:0.001980627,(CHLVIR_R02303:0.000000005,HEMWIL_R12881:0.010303989)0.906:0.004035050)0.000:0.000000005)0.960:0.005972034,((MOTALB_R00263:0.000000005,((SPIPAS_R02115:0.006647930,ZONALB_R11673:0.078050601)0.781:0.003274728,(JUNHYE_R02029:0.000000006,MELMEL_R06212:0.001982826)0.000:0.000000005)0.950:0.003975446)0.836:0.001981658,((AGEPHO_R12112:0.0,QUIMEX_R06835:0.0):0.000000005,MOLATE_R04767:0.001992249)0.000:0.000000005)0.000:0.000000005)0.000:0.000000005)0.000:0.000000005,EMBFUC_R07456:0.001983257)0.000:0.000000005)0.839:0.001984583)0.000:0.000000012)0.117:0.001985853,((VIDCHA_R00557:0.000000005,VIDMAC_R01666:0.000000005)0.968:0.006005349,(REGSAT_R03545:0.013986957,((CERBRA_R02815:0.001988399,CERFAM_R07219:0.000000005)0.964:0.008017940,(POLCAE_R08689:0.010003023,THRLUD_R00775:0.005974106)0.854:0.004020500)0.707:0.001969303)0.173:0.000000005)0.822:0.001988437)0.000:0.000000006,(((PRUFUL_R09054:0.003961340,PRUHIM_R10842:0.001985821)0.985:0.012057570,(((COPSEC_R04846:0.004303382,TOXRED_R00790:0.010092368)0.784:0.001981110,((ERIRUB_R02188:0.007953202,(FICALB_R00799:0.001977029,(OENOEN_R08976:0.001977343,SAXMAU_R01795:0.001976966)0.000:0.000000005)0.883:0.003968839)0.782:0.001988986,CATFUS_R11593:0.010004491)0.768:0.001972341)0.000:0.000000005,(CERCOR_R06284:0.001976201,(RHAINO_R11059:0.006003458,((LEUROT_R14346:0.004501946,STUVUL_R07134:0.002009732)0.940:0.006022253,CINMEX_R12987:0.003961448)0.000:0.000000006)0.862:0.001974750)0.000:0.000000005)0.878:0.003978819)0.740:0.000000005,((LEPASP_R01517:0.003964923,((CHLCYA_R06957:0.001993204,CHLHAR_R11249:0.001991308)0.965:0.008899993,(ELAFOR_R06222:0.069382747,PROCAF_R03956:0.003775292)0.123:0.005054435)0.650:0.001130655)0.762:0.001958075,(BOMGAR_R08262:0.012061374,DICEXI_R09180:0.005980954)0.746:0.002011415)0.193:0.001983239)0.796:0.003949017)0.768:0.001998779,(((HYLPRA_R13303:0.016246184,(((SYLVIR_R10709:0.008687543,(RHASIB_R03403:0.004305963,(DONATR_R04824:0.002153616,(((SITEUR_R04209:0.002197151,TICMUR_R00244:0.014899899)0.862:0.016925528,(IRECYA_R12278:0.008617378,((CALORN_R07598:0.004183775,PHEMEL_R04365:0.018819986)0.766:0.006544313,PLONIG_R01869:0.002136799)0.762:0.006533509)0.767:0.005554313)0.906:0.045026102,(ACRARU_R14141:0.007366927,HIPICT_R09009:0.006307597)0.838:0.005226972)0.777:0.016160176)0.000:0.000000005)0.000:0.000000005)0.000:0.000000005,PHYTRO_R13017:0.002148004)1.000:0.000000006,NICCHL_R07497:0.003963746)0.000:0.000000005)0.864:0.001977934,(LOCOCH_R10739:0.010016213,(((((BRAATR_R01259:0.004836373,PYCJOC_R06715:0.013420910)0.720:0.005653477,((CISJUN_R13494:0.013947538,(STEDEN_R06180:0.002155183,(ZOSHYP_R01814:0.0,ZOSLAT_R06289:0.0):0.004287804)0.764:0.002550873)0.806:0.005724618,((SINWEB_R08836:0.008022415,(SYLATR_R08297:0.006148548,SYLBOR_R04162:0.002737321)0.785:0.001916383)0.967:0.009951187,(PORRUF_R06759:0.006461890,(ILLCLE_R09312:0.004298379,LEILUT_R01534:0.004315475)0.757:0.002152191)0.000:0.000000005)0.269:0.000000005)0.906:0.003960597)0.728:0.000000005,(ANTMIN_R08656:0.005988735,(POEATR_R08762:0.001992461,(PARMAJ_R09814:0.001976891,PSEHUM_R01296:0.000000005)0.791:0.001976320)0.887:0.003965873)0.897:0.004032114)0.804:0.001995577,(((CETCET_R02558:0.006024695,AEGCAU_R08906:0.011372518)0.252:0.003486984,HORVUL_R04273:0.010017086)0.629:0.001712365,(ERYMCC_R11442:0.006941526,HIRRUS_R01812:0.006457026)0.747:0.000000006)0.785:0.002163270)0.805:0.001982585,PANBIA_R07107:0.011988565)0.000:0.000000005)0.752:0.000000005)0.457:0.001991715,((DRYBRU_R10064:0.014158811,MELVER_R13861:0.012160955)0.878:0.005970931,PHANIT_R00172:0.014048097)0.394:0.000000005)0.768:0.001977899)0.383:0.003989321,(CHAFRE_R02806:0.015468322,PICGYM_R06166:0.005886643)0.909:0.009074803)0.000:0.000000005,GRAPIC_R12577:0.015294078)0.808:0.002007802,((DASBRO_R00594:0.010030956,MALELE_R03053:0.032840355)0.761:0.002119060,ORTSPA_R03385:0.010950585)0.752:0.002006856)0.116:0.001965403)0.756:0.000000005,POSRUF_R10160:0.008013965)0.000:0.000000006,PARPUN_R00466:0.006477149)0.839:0.001984635)0.771:0.001976079);\",\n \"nhx\" : \"(((((((((((((((((((((((ENSDLEP00000011728:0.000566[&&NHX:D=N:T=9749],ENSMMNP00015026246:0.001023[&&NHX:D=N:T=40151]):0.002051[&&NHX:D=N:B=100:T=9747],ENSPSNP00000021942:0.00377[&&NHX:D=N:T=42100]):0.001682[&&NHX:D=N:B=97:T=9722],ENSTTRP00000010004:0.004883[&&NHX:D=N:T=9739]):0.004417[&&NHX:D=N:B=97:T=9722],ENSPCTP00005024635:0.007352[&&NHX:D=N:T=9755]):0.001205[&&NHX:D=N:B=99:T=9722],ENSBMSP00010023868:0.006737[&&NHX:D=N:T=9771]):0.015925[&&NHX:D=N:B=99:T=9721],((((((ENSBGRP00000023601:0[&&NHX:D=N:T=30521],ENSBMUP00000018023:0.002196[&&NHX:D=N:T=72004]):0.001033[&&NHX:D=N:B=88:T=9903],ENSBBBP00000019015:0.001697[&&NHX:D=N:T=43346]):0.000565[&&NHX:D=N:B=74:T=27592],(ENSBTAP00000001311:0.000337[&&NHX:D=N:T=9913],ENSBIXP00005031886:0.000914[&&NHX:D=N:T=30522]):0.001146[&&NHX:D=N:B=98:T=9903]):0.008235[&&NHX:DD=Y:B=74:T=27592],ENSCHIP00000024039:0.014386[&&NHX:D=N:T=9925]):0.001511[&&NHX:D=N:B=100:T=9895],ENSMMSP00000000856:0.014163[&&NHX:D=N:T=68415]):0.001839[&&NHX:D=N:B=81:T=35500],ENSCHYP00000039820:0.011355[&&NHX:D=N:T=84702]):0.036645[&&NHX:D=N:B=81:T=35500]):0.005942[&&NHX:D=N:B=27:T=91561],((ENSSSCP00000028073:0.02414[&&NHX:D=N:T=9823],ENSCWAP00000015540:0.025846[&&NHX:D=N:T=51154]):0.001129[&&NHX:D=N:B=90:T=35497],ENSSSCP00000052851:0.064492[&&NHX:D=N:T=9823]):0.021769[&&NHX:D=Y:B=0:T=35497]):0.003699[&&NHX:D=N:B=0:T=91561],(ENSCDRP00005029137:0.009985[&&NHX:D=N:T=9838],ENSVPAP00000000821:0.010494[&&NHX:D=N:T=30538]):0.034855[&&NHX:D=N:B=100:T=9835]):0.01351[&&NHX:D=N:B=0:T=91561],(((((ENSUMAP00000030927:0.000707[&&NHX:D=N:T=29073],ENSUAMP00000017844:0.001135[&&NHX:D=N:T=9643]):0.004718[&&NHX:D=N:B=100:T=9639],ENSAMEP00000009909:0.009591[&&NHX:D=N:T=9646]):0.015488[&&NHX:D=N:B=100:T=9632],(ENSNVIP00000027714:0.003973[&&NHX:D=N:T=452646],ENSMPUP00000001928:0.005437[&&NHX:D=N:T=9669]):0.020722[&&NHX:D=N:B=100:T=169418]):0.00787[&&NHX:D=N:B=100:T=379584],(ENSVVUP00000036965:0.004369[&&NHX:D=N:T=9627],ENSCAFP00020031922:0.0054[&&NHX:D=N:T=286419]):0.032112[&&NHX:D=N:B=100:T=9608]):0.009107[&&NHX:D=N:B=100:T=379584],(((ENSPPRP00000007644:0.000295[&&NHX:D=N:T=9691],ENSPLOP00000021497:0.000735[&&NHX:D=N:T=9689]):0.000985[&&NHX:D=N:B=98:T=9688],ENSPTIP00000023416:0.001804[&&NHX:D=N:T=74533]):0.003065[&&NHX:D=N:B=98:T=9688],ENSFCAP00000019777:0.007049[&&NHX:D=N:T=9685]):0.040525[&&NHX:D=N:B=100:T=9681]):0.023686[&&NHX:D=N:B=100:T=33554]):0.000574[&&NHX:D=N:B=7:T=314145],((ENSRFEP00010002200:0.04543[&&NHX:D=N:T=59479],ENSPVAP00000000225:0.086354[&&NHX:D=N:T=132908]):0.010201[&&NHX:D=N:B=84:T=9397],ENSMLUP00000012516:0.056375[&&NHX:D=N:T=59463]):0.013313[&&NHX:DD=Y:B=78:T=9397]):0.000609[&&NHX:D=N:B=4:T=314145],(ENSECAP00000013360:0.002971[&&NHX:D=N:T=9796],ENSEASP00005031151:0.003002[&&NHX:D=N:T=83772]):0.04043[&&NHX:D=N:B=100:T=9789]):0.003082[&&NHX:D=N:B=15:T=314145],(ENSEEUP00000008968:0.099514[&&NHX:D=N:T=9365],ENSSARP00000002541:0.104111[&&NHX:D=N:T=42254]):0.015519[&&NHX:D=N:B=88:T=9362]):0.007109[&&NHX:D=N:B=36:T=314145],((((((((((ENSMOCP00000000295:0.067555[&&NHX:D=N:T=79684],ENSPEMP00000001193:0.069389[&&NHX:D=N:T=230844]):0.00575[&&NHX:D=N:B=94:T=337677],((ENSMAUP00000022423:0[&&NHX:D=N:T=10036],ENSMAUP00000009408:0[&&NHX:D=N:T=10036]):0[&&NHX:D=Y:T=10036],ENSCGRP00001017976:0.023005[&&NHX:D=N:T=10029]):0.022308[&&NHX:D=N:B=100:T=10026]):0.015842[&&NHX:D=N:B=94:T=337677],(((((MGP_SPRETEiJ_P0075202:0.00265[&&NHX:D=N:T=10096],ENSMUSP00000038576:0.004017[&&NHX:D=N:T=10090]):0.000326[&&NHX:D=N:B=10:T=862507],ENSMSIP00000026406:0.002341[&&NHX:D=N:T=10103]):0.003936[&&NHX:D=N:B=8:T=862507],MGP_CAROLIEiJ_P0072376:0.007484[&&NHX:D=N:T=10089]):0.008466[&&NHX:D=N:B=25:T=862507],MGP_PahariEiJ_P0060583:0.019806[&&NHX:D=N:T=10093]):0.015012[&&NHX:D=N:B=21:T=10088],ENSRNOP00000001475:0.041792[&&NHX:D=N:T=10116]):0.033831[&&NHX:D=N:B=96:T=39107]):0.07317[&&NHX:D=N:B=96:T=337687],ENSNGAP00000024933:0.068058[&&NHX:D=N:T=1026970]):0.01854[&&NHX:D=N:B=56:T=337687],ENSJJAP00000024685:0.114896[&&NHX:D=N:T=51337]):0.024014[&&NHX:D=N:B=16:T=1963758],(((ENSCLAP00000008318:0.033998[&&NHX:D=N:T=34839],ENSODEP00000009470:0.061026[&&NHX:D=N:T=10160]):0.004259[&&NHX:D=N:B=52:T=33550],ENSCPOP00000004635:0.068163[&&NHX:D=N:T=10141]):0.013643[&&NHX:D=N:B=52:T=33550],ENSHGLP00000011991:0.043409[&&NHX:D=N:T=10181]):0.039213[&&NHX:D=N:B=94:T=33550]):0.003549[&&NHX:D=N:B=11:T=9989],(((ENSSTOP00000004979:0.007082[&&NHX:D=N:T=43179],ENSUPAP00010013759:0.008628[&&NHX:D=N:T=9999]):0.0085[&&NHX:D=N:B=96:T=337730],ENSMMMP00000025283:0.00492[&&NHX:D=N:T=9994]):0.027993[&&NHX:D=N:B=96:T=337730],ENSSVLP00005024437:0.029815[&&NHX:D=N:T=55149]):0.034841[&&NHX:D=N:B=92:T=55153]):0.010047[&&NHX:D=N:B=11:T=9989],(ENSOCUP00000014514:0.044118[&&NHX:D=N:T=9986],ENSOPRP00000014082:0.109158[&&NHX:D=N:T=9978]):0.04827[&&NHX:D=N:B=99:T=9975]):0.001917[&&NHX:D=N:B=8:T=314147],ENSTBEP00000013856:0.082615[&&NHX:D=N:T=37347]):0.001123[&&NHX:D=N:B=4:T=314146],(((((((((ENSPTRP00000009812:0.000341[&&NHX:D=N:T=9598],ENSPPAP00000000836:0.001142[&&NHX:D=N:T=9597]):0.002093[&&NHX:D=N:B=100:T=9596],ENSP00000369497:0.001566[&&NHX:D=N:T=9606]):0.000219[&&NHX:D=N:B=17:T=207598],ENSGGOP00000027226:0.002031[&&NHX:D=N:T=9595]):0.004252[&&NHX:D=N:B=17:T=207598],ENSPPYP00000005997:0.007072[&&NHX:D=N:T=9601]):0.002903[&&NHX:D=N:B=99:T=9604],ENSNLEP00000001277:0.009571[&&NHX:D=N:T=61853]):0.002446[&&NHX:D=N:B=98:T=314295],(((((ENSCATP00000015406:0.00209[&&NHX:D=N:T=9531],ENSMLEP00000025266:0.0034[&&NHX:D=N:T=9568]):0.000372[&&NHX:D=N:B=60:T=9528],ENSPANP00000022490:0.001777[&&NHX:D=N:T=9555]):0.000724[&&NHX:D=N:B=54:T=9528],((ENSMFAP00000029418:0.001032[&&NHX:D=N:T=9541],ENSMMUP00000009432:0.005844[&&NHX:D=N:T=9544]):0.000105[&&NHX:D=N:B=40:T=9539],ENSMNEP00000025034:0.002176[&&NHX:D=N:T=9545]):0.001473[&&NHX:D=N:B=34:T=9539]):0.000352[&&NHX:D=N:B=54:T=9528],ENSCSAP00000013938:0.003981[&&NHX:D=N:T=60711]):0.00179[&&NHX:D=N:B=55:T=9528],(ENSRROP00000030947:0[&&NHX:D=N:T=61622],ENSRBIP00000000297:0.022474[&&NHX:D=N:T=61621]):0.008142[&&NHX:D=N:B=92:T=542827]):0.008355[&&NHX:D=N:B=58:T=9527]):0.007639[&&NHX:D=N:B=87:T=9526],((ENSCCAP00000031676:0.011669[&&NHX:D=N:T=2715852],ENSCJAP00000093240:0.015902[&&NHX:D=N:T=9483]):0.000332[&&NHX:D=N:B=23:T=9498],ENSANAP00000015411:0.01113[&&NHX:D=N:T=37293]):0.015231[&&NHX:D=N:B=23:T=9479]):0.029405[&&NHX:D=N:B=92:T=314293],ENSTSYP00000000441:0.060665[&&NHX:D=N:T=1868482]):0.003827[&&NHX:D=N:B=90:T=376913],(((ENSPCOP00000008219:0.014484[&&NHX:D=N:T=379532],ENSMICP00000044704:0.023431[&&NHX:D=N:T=30608]):0.001594[&&NHX:D=N:B=93:T=376915],ENSPSMP00000026900:0.017253[&&NHX:D=N:T=1328070]):0.012285[&&NHX:D=N:B=93:T=376915],ENSOGAP00000009477:0.064918[&&NHX:D=N:T=30611]):0.013645[&&NHX:D=N:B=99:T=376911]):0.005986[&&NHX:D=N:B=89:T=9443]):0.009172[&&NHX:D=N:B=12:T=314146]):0.008774[&&NHX:D=N:B=12:T=1437010],(ENSDNOP00000034947:0.046866[&&NHX:D=N:T=9361],ENSCHOP00000007822:0.050851[&&NHX:D=N:T=9358]):0.025312[&&NHX:D=N:B=100:T=9348]):0.006165[&&NHX:D=N:B=15:T=9347],((ENSETEP00000003277:0.154194[&&NHX:D=N:T=9371],ENSPCAP00000000440:0.17644[&&NHX:D=N:T=9813]):0.023418[&&NHX:D=N:B=93:T=311790],ENSLAFP00000002234:0.069853[&&NHX:D=N:T=9785]):0.048728[&&NHX:D=N:B=91:T=311790]):0.102726[&&NHX:D=N:B=69:T=9347],(((ENSVURP00010026286:0.02893[&&NHX:D=N:T=29139],ENSMEUP00000009812:0.045949[&&NHX:D=N:T=9315]):0.007079[&&NHX:D=N:B=96:T=38609],ENSSHAP00000012162:0.055381[&&NHX:D=N:T=9305]):0.015112[&&NHX:D=N:B=96:T=9263],ENSMODP00000033276:0.071803[&&NHX:D=N:T=13616]):0.123926[&&NHX:D=N:B=96:T=9263]):0.06077[&&NHX:D=N:B=87:T=32525],ENSOANP00000039689:0.264045[&&NHX:D=N:T=9258]):0.091853[&&NHX:D=N:B=90:T=40674],((((ENSPMRP00000005460:0.144183[&&NHX:D=N:T=64176],ENSSMRP00000016793:0.20051[&&NHX:D=N:T=96440]):0.009903[&&NHX:D=N:B=99:T=1329976],((ENSNSUP00000017478:0.005634[&&NHX:D=N:T=8663],ENSLLTP00000016858:0.029105[&&NHX:D=N:T=8630]):0.226094[&&NHX:D=N:B=100:T=8602],ENSACAP00000031108:0.186787[&&NHX:D=N:T=28377]):0.032366[&&NHX:D=N:B=7:T=1329911]):0.135778[&&NHX:D=N:B=3:T=1329912],ENSSPUP00000018703:0.144411[&&NHX:D=N:T=8508]):0.0332[&&NHX:D=N:B=0:T=8504],((((((ENSACCP00020021048:0.030244[&&NHX:D=N:T=223781],ENSSHBP00005016070:0.046241[&&NHX:D=N:T=2489341]):0.000673[&&NHX:D=N:B=100:T=8825],((((ENSGFOP00000022131:0.015965[&&NHX:D=N:T=48883],ENSSCAP00000011543:0.017989[&&NHX:D=N:T=9135]):0.005354[&&NHX:D=N:B=100:T=9126],ENSTGUP00000012130:0.02239[&&NHX:D=N:T=59729]):0.005211[&&NHX:DD=Y:B=100:T=9126],ENSPMJP00000020154:0.031769[&&NHX:D=N:T=9157]):0.0011[&&NHX:D=N:B=13:T=9126],ENSFALP00000008821:0.024057[&&NHX:D=N:T=59894]):0.055526[&&NHX:D=N:B=13:T=9126]):0.017918[&&NHX:D=N:B=100:T=8825],(((ENSGALP00000027524:0.023757[&&NHX:D=N:T=9031],ENSMGAP00000015990:0.025887[&&NHX:D=N:T=9103]):0.000864[&&NHX:D=N:B=94:T=9005],ENSCJPP00005026171:0.031852[&&NHX:D=N:T=93934]):0.055074[&&NHX:D=N:B=94:T=9005],ENSAPLP00000007411:0.069477[&&NHX:D=N:T=8840]):0.021576[&&NHX:D=N:B=100:T=1549675]):0.027956[&&NHX:D=N:B=98:T=8825],ENSSCUP00000019773:0.055174[&&NHX:D=N:T=441894]):0.138375[&&NHX:D=N:B=98:T=8782],ENSCPRP00005008306:0.1287[&&NHX:D=N:T=8502]):0.016113[&&NHX:D=N:B=0:T=8492],((((ENSTMTP00000024650:0.004017[&&NHX:D=N:T=2587831],ENSTMTP00000012675:0.005315[&&NHX:D=N:T=2587831]):0.002859[&&NHX:D=Y:B=100:T=2587831],ENSCPBP00000004776:0.007644[&&NHX:D=N:T=8478]):0.005658[&&NHX:D=N:B=100:T=8476],(ENSGEVP00005002652:0.01601[&&NHX:D=N:T=1825980],ENSCABP00000011062:0.022245[&&NHX:D=N:T=106734]):0.009454[&&NHX:D=N:B=99:T=8487]):0.01978[&&NHX:D=N:B=99:T=8486],ENSPSIP00000012858:0.064659[&&NHX:D=N:T=13735]):0.046163[&&NHX:D=N:B=100:T=8464]):0.04067[&&NHX:D=N:B=0:T=1329799]):0.101687[&&NHX:D=N:B=9:T=32561]):0.107575[&&NHX:D=N:B=89:T=32524],(ENSXETP00000037057:0.302164[&&NHX:D=N:T=8364],ENSLLEP00000043860:0.366066[&&NHX:D=N:T=445787]):0.181688[&&NHX:D=N:B=96:T=8342]):0.09645[&&NHX:D=N:B=49:T=32523],ENSLACP00000008815:0.24746[&&NHX:D=N:T=7897]):0.045271[&&NHX:D=N:B=14:T=8287],((((((((((((((ENSTNIP00000002435:0.089877[&&NHX:D=N:T=99883],ENSTRUP00000015030:0.091412[&&NHX:D=N:T=31033]):0.146182[&&NHX:D=N:B=100:T=31031],ENSGACP00000015199:0.143397[&&NHX:D=N:T=69293]):0.009443[&&NHX:D=N:B=0:T=1489922],ENSSAUP00010031327:0.096966[&&NHX:D=N:T=8175]):0.004928[&&NHX:D=N:B=0:T=1489922],(ENSDLAP00005043188:0.096295[&&NHX:D=N:T=13489],ENSLBEP00000002832:0.154656[&&NHX:D=N:T=56723]):0.015316[&&NHX:D=N:B=15:T=1489922]):0.007374[&&NHX:D=N:B=0:T=1489922],(ENSSLUP00000030625:0.065993[&&NHX:D=N:T=283035],ENSCGOP00000037196:0.066502[&&NHX:D=N:T=56716]):0.014978[&&NHX:D=N:B=91:T=8111]):0.014192[&&NHX:DD=Y:B=0:T=1489922],(((ENSMAMP00000049017:0.112322[&&NHX:D=N:T=205130],ENSBSLP00000034562:0.168852[&&NHX:D=N:T=158456]):0.008315[&&NHX:D=N:B=0:T=1489892],((ENSSDUP00000015520:0.00513[&&NHX:D=N:T=41447],ENSSLDP00000006566:0.007791[&&NHX:D=N:T=1841481]):0.042577[&&NHX:D=N:B=100:T=8160],ENSLCAP00010030231:0.060104[&&NHX:D=N:T=8187]):0.016173[&&NHX:D=N:B=93:T=1489904]):0[&&NHX:D=N:B=0:T=1489872],(ENSSMAP00000010386:0.11135[&&NHX:D=N:T=52904],ENSATEP00000018320:0.126751[&&NHX:D=N:T=64144]):0.003595[&&NHX:D=N:B=14:T=1489872]):0.014963[&&NHX:DD=Y:B=0:T=1489872]):0.008717[&&NHX:D=N:B=0:T=1489872],(((ENSAOCP00000005723:0.022605[&&NHX:D=N:T=80972],ENSAPOP00000003431:0.032376[&&NHX:D=N:T=80966]):0.067976[&&NHX:D=N:B=100:T=30863],(((ENSMZEP00005015140:0.002522[&&NHX:D=N:T=106582],ENSHBUP00000022221:0.00276[&&NHX:D=N:T=8153]):0.005622[&&NHX:D=N:B=100:T=319058],ENSNBRP00000031193:0.014221[&&NHX:D=N:T=32507]):0.055295[&&NHX:D=N:B=100:T=318546],ENSACIP00000005496:0.085203[&&NHX:D=N:T=61819]):0.069808[&&NHX:D=N:B=97:T=8113]):0.006383[&&NHX:D=N:B=72:T=1489908],(((((((ENSPFOP00000001575:0.001877[&&NHX:D=N:T=48698],ENSPLAP00000026811:0.002682[&&NHX:D=N:T=48699]):0.011341[&&NHX:D=N:B=100:T=8080],ENSPREP00000018297:0.014432[&&NHX:D=N:T=8081]):0.009367[&&NHX:D=N:B=100:T=8080],ENSXMAP00000006983:0.020943[&&NHX:D=N:T=8083]):0.07372[&&NHX:D=N:B=100:T=586240],ENSFHEP00000010259:0.090262[&&NHX:D=N:T=8078]):0.010081[&&NHX:D=N:B=100:T=8087],ENSCVAP00000010146:0.166223[&&NHX:D=N:T=28743]):0.099285[&&NHX:D=N:B=100:T=8087],ENSKMAP00000010397:0.154786[&&NHX:D=N:T=37003]):0.018665[&&NHX:D=N:B=11:T=28738],((ENSORLP00000039367:0.012182[&&NHX:D=N:T=8090],ENSOSIP00000028295:0.023719[&&NHX:D=N:T=183150]):0.048352[&&NHX:D=N:B=100:T=8089],ENSOMEP00000001576:0.066811[&&NHX:D=N:T=30732]):0.195635[&&NHX:D=N:B=100:T=8089]):0.03392[&&NHX:D=N:B=9:T=1489913]):0.027302[&&NHX:D=N:B=0:T=1489908]):0.081822[&&NHX:D=N:B=0:T=1489872],ENSMMDP00005016864:0.115686[&&NHX:D=N:T=586833]):0.133158[&&NHX:D=N:B=0:T=123369],ENSGMOP00000010385:0.447969[&&NHX:D=N:T=8049]):0.04027[&&NHX:D=N:B=1:T=123368],(((ENSSSAP00000049301:0.003158[&&NHX:D=N:T=8030],ENSSTUP00000089299:0.005224[&&NHX:D=N:T=8032]):0.007814[&&NHX:D=N:B=100:T=8028],((ENSOTSP00005006826:0.003553[&&NHX:D=N:T=74940],ENSOKIP00005016504:0.004245[&&NHX:D=N:T=8019]):0.001513[&&NHX:D=N:B=95:T=8016],ENSOMYP00000096229:0.004581[&&NHX:D=N:T=8022]):0.012062[&&NHX:D=N:B=95:T=8016]):0.008081[&&NHX:D=N:B=79:T=504568],ENSHHUP00000013710:0.009428[&&NHX:D=N:T=62062]):0.220475[&&NHX:D=N:B=79:T=504568]):0.063675[&&NHX:D=N:B=0:T=1489388],((((ENSPNAP00000002089:0.088107[&&NHX:D=N:T=42514],ENSAMXP00000037719:0.141689[&&NHX:D=N:T=7994]):0.040456[&&NHX:D=N:B=100:T=1489739],ENSEEEP00000018632:0.175328[&&NHX:D=N:T=8005]):0.011488[&&NHX:D=N:B=52:T=186628],ENSIPUP00000019387:0.191507[&&NHX:D=N:T=7998]):0.130849[&&NHX:D=N:B=52:T=186628],((((ENSCCRP00000004504:0.013011[&&NHX:D=N:T=7962],ENSSGRP00000031158:0.015922[&&NHX:D=N:T=75366]):0.000854[&&NHX:D=N:B=100:T=2743694],ENSCARP00000056251:0.028035[&&NHX:D=N:T=7957]):0.0219[&&NHX:D=N:B=100:T=2743694],ENSSGRP00000071274:0.037074[&&NHX:D=N:T=75366]):0.035154[&&NHX:D=Y:B=100:T=2743694],ENSDARP00000099674:0.101043[&&NHX:D=N:T=7955]):0.247776[&&NHX:D=N:B=100:T=30727]):0.127786[&&NHX:D=N:B=98:T=186626]):0.062612[&&NHX:D=N:B=25:T=186625],(ENSPKIP00000013632:0.279788[&&NHX:D=N:T=1676925],ENSSFOP00015002218:0.291858[&&NHX:D=N:T=113540]):0.102594[&&NHX:D=N:B=88:T=41712]):0.110179[&&NHX:D=N:B=0:T=1489341],ENSLOCP00000009962:0.210021[&&NHX:D=N:T=7918]):0.138094[&&NHX:D=N:B=2:T=41665],ENSECRP00000005112:0.560007[&&NHX:D=N:T=27687]):0.12002[&&NHX:D=N:B=55:T=7898]):0.072614[&&NHX:D=N:B=3:T=117571],ENSCMIP00000046776:0.395803[&&NHX:D=N:T=7868]):0.1[&&NHX:D=N:B=4:T=7776],ENSEBUP00000009898:0.958294[&&NHX:D=N:T=7764]):0.1[&&NHX:D=N:B=0:T=7742];\",\n \"nhx2\" : \"((((POP23a_CIOIN_ENSCING00000016202,POP23b_CIOIN_ENSCING00000016169)[&&NHX:Ev=duplication],POP23_CIOSA_ENSCSAVG00000000248),((POP23a_BRAFL_C3ZMF1,POP23b_BRAFL_121417)[&&NHX:Ev=duplication],(((POP3_ORYLA_ENSORLG00000019669,POP3_GASAC_ENSGACG00000014023,POP3_DANRE_Q6JWW1),(POP3_XENTR_B1H1F6,(POP3_CHICK_Q9DG25,(POP3_ORNAN_ENSOANG00000004179,POP3_MONDO_ENSMODG00000018033,((POP3_MOUSE_Q9ES81,POP3_RAT_Q3BCU3),POP3_RABIT_ENSOCUG00000025973,POP3_MACMU_ENSMMUG00000014473,POP3_HUMAN_Q9HBV1))))),(((POP2_GASAC_ENSGACG00000001420,POP2_ORYLA_ENSORLG00000008627,POP2_TAKRU_ENSTRUG00000015933),POP2_DANRE_ENSDARG00000069922),POP2_XENTR_ENSXETG00000018064,(((POP2_TAEGU_ENSTGUG00000013383,POP2_CHICK_Q6T9Z5),POP2_ANOCA_ENSACAG00000003557),((POP2_MACEU_ENSMEUG00000015825,POP2_MONDO_ENSMODG00000018205),((POP2_RABIT_ENSOCUG00000009515,(POP2_RAT_Q6P722,POP2_MOUSE_Q9ES82)),(POP2_MACMU_ENSMMUG00000000905,POP2_HUMAN_Q9HBU9))))))[&&NHX:Ev=duplication])),((POP1_CIOSA_ENSCSAVG00000000247,POP1_CIOIN_ENSCING00000000496),((POP1_DANRE_Q5PQZ7,(POP1_ORYLA_ENSORLG00000019663,POP1_GASAC_ENSGACG00000014015,POP1_TAKRU_ENSORLG00000019663)),(POP1_XENTR_B1H1G2,(POP1_ANOCA_ENSACAG00000003910,(POP1_TAEGU_ENSTGUG00000012218,POP1_CHICK_Q9DG23)),POP1_ORNAN_ENSOANG00000004180,POP1_MONDO_ENSMODG00000018034,(POP1_RABIT_ENSOCUG00000016944,(POP1_RAT_Q3BCU4,POP1_MOUSE_Q9ES83),(POP1_HUMAN_Q8NE79,POP1_MACMU_ENSMMUG00000014471))))))[&&NHX:Ev=duplication];\",\n \"rokas\" : \"(Schizosaccharomyces pombe:0.545914,(Saitoella complicata:0.57412,((Arthrobotrys oligospora:0.539923,((Parastagonospora nodorum:0.465825,(Xylona heveae:0.272728,(Coccidioides immitis:0.254443,Aspergillus nidulans:0.266048)1:0.18207)1:0.041547)1:0.0419986,((Botrytis cinerea:0.0493876,Sclerotinia sclerotiorum:0.0433921)1:0.237364,(Neurospora crassa:0.27673,Fusarium graminearum:0.291175)1:0.153952)1:0.127477)1:0.210957)1:0.198261,(((Lipomyces suomiensis NRRL Y-17356:0.234623,Lipomyces oligophaga NRRL Y-17247:0.370846)1:0.0775974,((Lipomyces japonicus NRRL Y-17848:0.3372,Lipomyces lipofer NRRL Y-11555:0.166258)1:0.0562401,(Lipomyces doorenjongii NRRL Y-27504:0.289327,(Lipomyces kononenkoae NRRL Y-11553:0.0897564,(Lipomyces starkeyi NRRL Y-11557:0.0198789,(Lipomyces mesembrius NRRL Y-27506:0.0193032,Lipomyces arxii NRRL Y-17921:0.0198748)1:0.00839469)1:0.0452686)1:0.113493)1:0.0365204)1:0.0522388)1:0.351588,(((Trigonopsis vinaria NRRL Y-5715:0.32117,Trigonopsis variabilis NRRL Y-1579:0.36434)1:0.434566,(Botryozyma nematodophila NRRL Y-17705:0.702864,(Tortispora starmeri NRRL Y-63665:0.502464,(Tortispora caseinolytica NRRL Y-17796:0.0396928,Tortispora ganteri NRRL Y-17035:0.0458542)1:0.458583)1:0.374135)1:0.158759)1:0.0771598,((((Nadsonia fulvescens var. elongata DSM 6958:0.0202083,Nadsonia fulvescens NRRL Y-12810:0.0176171)1:0.536297,(Candida hispaniensis NRRL Y-5580:0.422522,(Yarrowia bubula NRRL Y-63668:0.0502129,(Yarrowia keelungensis JCM 14894:0.0300806,(Yarrowia lipolytica:0.0264517,(Yarrowia divulgata NRRL Y-63741:0.00987236,Yarrowia deformans JCM 1694:0.0108765)1:0.0239202)1:0.00862142)1:0.0258247)1:0.296485)1:0.408355)1:0.0777756,((Middelhovenomyces tepae NRRL Y-17670:0.443049,((Saprochaete clavata:0.309611,Magnusiomyces tetrasperma NRRL Y-7288:0.34292)1:0.186613,(Galactomyces candidus Phaff 72-186:0.207517,(Dipodascus geniculatus NRRL Y-17628:0.0852517,Dipodascus albidus NRRL Y-12859:0.0862487)1:0.229904)1:0.189193)1:0.149192)1:0.0518788,(((Deakozyma indianensis NRRL YB-1937:0.184702,Candida incommunis NRRL Y-17085:0.20747)1:0.543275,((Wickerhamiella infanticola DS02:0.528425,Wickerhamiella cacticola NRRL Y-27362:0.692381)1:0.075832,(Wickerhamiella versatilis JCM 5958:0.645274,(Wickerhamiella domercqiae:0.626221,(Candida apicola NRRL Y-50540:0.434359,Starmerella bombicola JCM 9596:0.383847)1:0.356841)1:0.0846685)1:0.155283)1:0.413088)1:0.0954418,(((Sugiyamaella lignohabitans CBS 10342:0.411366,(Diddensiella caesifluorescens NRRL Y-48781:0.336519,Spencermartinsiella europaea NRRL Y-48265:0.41893)1:0.0421993)1:0.0384646,(Groenewaldozyma salmanticensis NRRL Y-17090:0.561259,(Zygoascus meyerae NRRL Y-17319:0.366231,Zygoascus ofunaensis NRRL Y-10998:0.397239)1:0.214422)1:0.0535895)1:0.0458319,(Blastobotrys muscicola NRRL Y-7993:0.458918,((Blastobotrys mokoenaii NRRL Y-27120:0.362928,(Blastobotrys proliferans NRRL Y-17577:0.228429,Blastobotrys nivea NRRL Y-17581:0.269851)1:0.158495)1:0.079695,(Blastobotrys serpentis NRRL Y-48249:0.327946,((Blastobotrys raffinosifermentans:0.0217085,Blastobotrys adeninivorans:0.018147)1:0.222596,(Blastobotrys peoriensis NRRL YB-2290:0.169572,Blastobotrys americana NRRL Y-6844:0.161305)1:0.170868)1:0.173794)1:0.0621326)1:0.0484003)1:0.062313)1:0.0537951)1:0.0469088)1:0.0867807)1:0.0634323,((Alloascoidea hylecoeti JCM 7604:0.573891,(Sporopachydermia lactativora NRRL Y-11591:0.293628,Sporopachydermia quercuum JCM 9486:0.229415)1:0.463025)1:0.0601744,((((Ascoidea asiatica JCM 7603:0.367013,Ascoidea rubescens:0.321961)1:0.263464,(Saccharomycopsis capsularis NRRL Y-17639:0.190582,Saccharomycopsis malanga JCM 7620:0.198358)1:0.40498)1:0.163324,((Candida ponderosae NRRL YB-2307:0.38206,((Starmera quercuum NRRL YB-4281:0.250343,(Starmera amethionina NRRL Y-10978:0.208149,Candida stellimalicola NRRL Y-17912:0.200412)1:0.200109)1:0.0953975,((Wickerhamomyces ciferrii NRRL Y-1031:0.190972,Wickerhamomyces anomalus:0.135192)1:0.110022,((Wickerhamomyces hampshirensis NRRL YB-4128:0.251418,(Candida freyschussii:0.200517,((Cyberlindnera xylosilytica NRRL YB-2097:0.171593,(Cyberlindnera fabianii JCM 3601:0.173452,(Cyberlindnera petersonii NRRL YB-3808:0.146495,(Cyberlindnera americana NRRL Y-2156:0.124404,Candida mycetangii NRRL Y-6843:0.138201)1:0.021936)1:0.0555066)1:0.0255677)1:0.104307,((Cyberlindnera mrakii NRRL Y-1364:0.0362246,(Cyberlindnera saturnus NRRL Y-17396:0.0192395,Cyberlindnera suaveolens NRRL Y-17391:0.0161438)1:0.0136523)1:0.121465,((Cyberlindnera jadinii NRRL Y-1542:0.216631,Candida vartiovaarae:0.174307)1:0.0287187,(Cyberlindnera maclurae NRRL Y-5377:0.0723855,Cyberlindnera misumaiensis NRRL Y-17389:0.0590068)1:0.157678)1:0.0254444)1:0.128382)1:0.0244259)1:0.0399877)1:0.0690847,((Wickerhamomyces alni NRRL Y-11625:0.198181,(Wickerhamomyces canadensis NRRL Y-1888:0.0181265,Wickerhamomyces sp.:0.0258553)1:0.152098)1:0.104484,(Wickerhamomyces bovis NRRL YB-4184:0.238507,((Barnettozyma hawaiiensis NRRL Y-27270:0.0769162,(Barnettozyma californica NRRL Y-17395:0.0637227,Barnettozyma populi NRRL Y-12728:0.069715)1:0.012496)1:0.171001,((Barnettozyma pratensis NRRL Y-12696:0.134345,Barnettozyma salicaria NRRL Y-6780:0.201535)1:0.0253729,(Candida montana NRRL Y-17326:0.18273,((Phaffomyces thermotolerans NRRL Y-11709:0.0347558,Candida orba NRRL Y-27336:0.0268361)1:0.0450689,(Phaffomyces opuntiae NRRL Y-11707:0.0227806,Phaffomyces antillensis NRRL Y-12881:0.0381186)1:0.0503677)1:0.136412)1:0.0550969)1:0.0252933)1:0.148508)1:0.0456798)1:0.0515684)1:0.0559147)1:0.0396837)1:0.0394501)1:0.188948,(((Hanseniaspora osmophila NRRL Y-1613:0.0533805,Hanseniaspora vineae:0.0482455)1:0.375889,((Hanseniaspora singularis:0.230831,Hanseniaspora valbyensis NRRL Y-1626:0.170847)1:0.0889552,(Kloeckera hatyaiensis:0.149005,(Hanseniaspora pseudoguilliermondii:0.11701,(Hanseniaspora uvarum:0.0603265,Hanseniaspora clermontiae NRRL Y-27515:0.0811774)1:0.037012)1:0.118708)1:0.169466)1:0.805928)1:0.306057,((((Kluyveromyces aestuarii NRRL YB-4510:0.247878,(Kluyveromyces marxianus CBS6556:0.14186,(Kluyveromyces lactis NRRL Y-1140:0.0794227,Kluyveromyces dobzhanskii NRRL Y-1974:0.107991)1:0.0644926)1:0.119991)1:0.234335,((Eremothecium coryli CBS 5749:0.245286,Eremothecium sinecaudum ATCC 58844:0.262753)1:0.0575176,(Eremothecium cymbalariae DBVPG 7215:0.226178,(Eremothecium gossypii ATCC 10895:0.046311,Ashbya aceri:0.0356574)1:0.257241)1:0.0330026)1:0.17076)1:0.0607471,(Lachancea kluyveri:0.221801,((Lachancea fermentati:0.125926,Lachancea cidri:0.116386)1:0.108281,(Lachancea mirantina:0.360697,((Lachancea waltii:0.155994,(Lachancea quebecensis:0.0412753,Lachancea thermotolerans CBS 6340:0.0381374)1:0.122374)1:0.048069,(Lachancea nothofagi:0.125696,(Lachancea dasiensis:0.187333,(Lachancea meyersii CBS 8951:0.0930237,(Lachancea fantastica:0.0613265,Lachancea lanzarotensis CBS 12615:0.0662562)1:0.080869)1:0.0868343)1:0.0232028)1:0.0796876)1:0.11944)1:0.0368276)1:0.0869217)1:0.0544235)1:0.046723,(((Zygosaccharomyces rouxii CBS 732:0.143413,(Zygosaccharomyces kombuchaensis NRRL YB-4811:0.0926322,(Zygosaccharomyces bisporus NRRL Y-12626:0.083556,Zygosaccharomyces bailii:0.0939337)1:0.0304452)1:0.0574531)1:0.176842,((Zygotorulaspora florentina NRRL Y-1560:0.131232,Zygotorulaspora mrakii NRRL Y-12654:0.168677)1:0.11848,(Torulaspora microellipsoides:0.15825,(Torulaspora maleeae CBS 10694:0.172696,(Torulaspora delbrueckii:0.0799621,(Torulaspora franciscae NRRL Y-17532:0.0354865,Torulaspora pretoriensis NRRL Y-17251:0.0343667)1:0.0834631)1:0.0804511)1:0.0953121)1:0.0235795)1:0.0481102)1:0.0871222,(((Tetrapisispora blattae:0.271746,Yueomyces sinensis NRRL Y-17406:0.347888)1:0.216158,(Vanderwaltozyma polyspora:0.261306,(Tetrapisispora iriomotensis NRRL Y-27309:0.150965,(Tetrapisispora phaffii CBS 4417:0.100885,(Tetrapisispora namnaoensis NRRL Y-27982:0.0531639,Tetrapisispora fleetii NRRL Y-27350:0.0682282)1:0.0667913)1:0.0911273)1:0.204252)1:0.0968006)1:0.049682,((((Nakaseomyces bacillisporus CBS 7720:0.318907,_Candida_ castellii CBS 4332:0.44969)1:0.119593,(_Candida_ glabrata CBS 138:0.19376,(_Candida_ bracarensis CBS 10154:0.0791127,(_Candida_ nivariensis CBS 9983:0.0591139,Nakaseomyces delphensis CBS 2170:0.1071)1:0.0282267)1:0.118561)1:0.24292)1:0.043942,((Saccharomyces uvarum:0.01864,Saccharomyces eubayanus:0.0211527)1:0.0363173,(Saccharomyces arboricola:0.0587131,(Saccharomyces kudriavzevii:0.0570128,(Saccharomyces mikatae IFO 1815:0.0529368,(Saccharomyces paradoxus:0.0250749,Saccharomyces cerevisiae S288C:0.0325262)1:0.0191755)1:0.0192692)1:0.00934172)1:0.0155583)1:0.277733)1:0.0304696,((Naumovozyma dairenensis:0.244773,Naumovozyma castellii:0.223994)1:0.116605,(((Kazachstania africana CBS 2517:0.302329,Kazachstania viticola NRRL Y-27206:0.304357)1:0.0420759,((Kazachstania turicensis NRRL Y-48834:0.232443,Kazachstania kunashirensis NRRL Y-27209:0.160829)1:0.120327,(Kazachstania spencerorum NRRL Y-17920:0.238158,Kazachstania rosinii NRRL Y-17919:0.204563)1:0.0374176)1:0.0694195)1:0.0333483,((Kazachstania intestinalis NRRL Y-48847:0.427517,Kazachstania martiniae NRRL Y-409:0.262551)1:0.0379646,((Kazachstania naganishii CBS 8797:0.335856,Kazachstania bromeliacearum NRRL Y-48836:0.198593)1:0.0338563,(Kazachstania taianensis NRRL Y-48846:0.27887,((Kazachstania transvaalensis NRRL Y-17245:0.111612,Kazachstania yakushimaensis NRRL Y-48837:0.0900106)1:0.290831,(Kazachstania siamensis NRRL Y-48842:0.114965,(Kazachstania unispora NRRL Y-1556:0.0645858,(Kazachstania solicola NRRL Y-27207:0.0241196,Kazachstania aerobia NRRL Y-27976:0.0305719)1:0.0678491)1:0.059458)1:0.1733)1:0.0384928)1:0.0508605)1:0.0761265)1:0.0382292)1:0.0669668)1:0.036691)1:0.0374781)1:0.0230192)1:0.115608)1:0.127779)1:0.342113)1:0.0913588)1:0.0347262,(((Pachysolen tannophilus NRRL Y-2460:0.313751,((Peterozyma xylosa NRRL Y-12939:0.0402272,Peterozyma toletana NRRL YB-4247:0.0398928)1:0.321195,(Nakazawaea peltata JCM 9829:0.323069,Nakazawaea holstii NRRL Y-2155:0.206923)1:0.167264)1:0.0471457)1:0.163091,(((Citeromyces siamensis NRRL Y-27975:0.199314,(Citeromyces hawaiiensis NRRL Y-11581:0.0676646,Citeromyces matritensis NRRL Y-2407:0.0674657)1:0.134721)1:0.41892,(Komagataella pastoris:0.0617151,(Komagataella populi NRRL YB-455:0.0093125,Komagataella pseudopastoris NRRL Y-27603:0.00934262)1:0.0520784)1:0.548169)1:0.0572955,(Kuraishia ogatae NRRL Y-48474:0.423004,((Kuraishia capsulata:0.167402,Kuraishia molischiana NRRL Y-27899:0.174477)1:0.340405,(Candida boidinii JCM 9604:0.409104,((Ogataea methylivora NRRL Y-17250:0.262112,(Ogataea ramenticola NRRL YB-1985:0.331126,(Candida succiphila JCM 9445:0.377882,Ogataea naganishii NRRL Y-7654:0.377342)1:0.0486474)1:0.0581327)1:0.0742491,((((Ogataea nitratoaversa NRRL Y-48449:0.140695,Ogataea pilisensis NRRL Y-27598:0.121524)1:0.101152,(Candida arabinofermentans NRRL YB-2248:0.23367,(Ogataea trehalophila NRRL Y-6781:0.0634693,Ogataea methanolica JCM 10240:0.0635138)1:0.143303)1:0.0364214)1:0.0681563,((Ogataea trehaloabstinens NRRL Y-27595:0.240241,Ogataea populi-albae NRRL Y-48632:0.19583)1:0.109824,((Ogataea zsoltii NRRL Y-27601:0.106801,(Ogataea glucozyma NRRL YB-2185:0.125497,(Ogataea henricii NRRL YB-2194:0.0652918,Ogataea pini NRRL Y-11528:0.0832313)1:0.0564285)1:0.0349258)1:0.117879,((Ogataea minuta NRRL Y-411:0.0815234,Ogataea nonfermentans NRRL YB-2203:0.0649159)1:0.0858242,(Ogataea kodamae NRRL Y-17234:0.276318,(Ogataea philodendri NRRL Y-7210:0.16107,(Ogataea polymorpha NCYC 495 leu1.1:0.0237039,Ogataea parapolymorpha:0.0123489)1:0.137202)1:0.0329933)1:0.0274717)1:0.178127)1:0.0484727)1:0.0552351)1:0.0549412,((Ambrosiozyma maleeae NRRL Y-63635:0.258273,((Ambrosiozyma kashinagacola JCM 15019:0.196206,(Ambrosiozyma pseudovanderkliftii NRRL Y-63632:0.103065,Ambrosiozyma vanderkliftii NRRL Y-63633:0.0839667)1:0.0913495)1:0.0409106,(Ambrosiozyma monospora JCM 7599:0.234639,(Ambrosiozyma oregonensis NRRL Y-6106:0.0826625,(Ambrosiozyma philentoma NRRL Y-7523:0.0357081,Ambrosiozyma ambrosiae NRRL Y-7524:0.0705379)1:0.026201)1:0.130669)1:0.03731)1:0.0668046)1:0.117317,((Brettanomyces custersianus NRRL Y-6653:0.31306,(Brettanomyces anomalus:0.0854333,Brettanomyces bruxellensis CBS 2499:0.0907076)1:0.224162)1:0.282927,((Kregervanrija fluxuum NRRL YB-4273:0.0355143,Kregervanrija delftensis NRRL Y-7119:0.0311594)1:0.225534,((Martiniozyma abiesophila NRRL Y-11514:0.320478,((Saturnispora mendoncae NRRL Y-11515:0.161201,Saturnispora silvae NRRL Y-6725:0.331441)1:0.105865,(Saturnispora saitoi NRRL Y-6671:0.0911533,(Saturnispora zaruensis NRRL Y-7008:0.0580631,(Saturnispora dispora NRRL Y-1447:0.031157,(Saturnispora serradocipensis NRRL Y-48717:0.0165811,Saturnispora hagleri NRRL Y-27828:0.0129394)1:0.0233711)1:0.0308985)1:0.0776961)1:0.125167)1:0.181222)1:0.143022,((Candida sorboxylosa JCM 1536:0.372151,Pichia terricola NRRL YB-4310:0.256406)1:0.0700447,(Pichia membranifaciens KS47-1:0.213499,((Pichia heedii NRRL Y-10967:0.130518,Pichia nakasei NRRL Y-7686:0.123153)1:0.187264,((Pichia norvegensis NRRL Y-7687:0.307748,Pichia kudriavzevii:0.274245)1:0.047663,(Pichia occidentalis NRRL Y-7552:0.190823,Pichia exigua NRRL Y-10920:0.216283)1:0.0273444)1:0.0202107)1:0.0282289)1:0.0444849)1:0.151672)1:0.0978808)1:0.150478)1:0.0843851)1:0.0446598)1:0.111139)1:0.0367086)1:0.137306)1:0.0425494)1:0.0600483)1:0.0499527)1:0.103505,(Babjeviella inositovora NRRL Y-12698:0.594547,((Cephaloascus albidus:0.18956,Cephaloascus fragrans:0.210025)1:0.210658,((Candida schatavii NRRL Y-17078:0.29428,(Candida fragi NRRL Y-17910:0.0714581,Kurtzmaniella cleridarum NRRL Y-48386:0.0735961)1:0.306068)1:0.108229,(((Candida athensensis NRRL Y-27644:0.132895,(Meyerozyma guilliermondii ATCC 6260:0.0289919,(Candida carpophila JCM 9396:0.0151985,Meyerozyma caribbica:0.0185042)1:0.0206601)1:0.0934175)1:0.329014,(Candida ascalaphidarum NRRL Y-27908:0.414658,((Candida gorgasii NRRL Y-27707:0.221357,Candida tammaniensis NRRL Y-8257:0.186332)1:0.101116,(Yamadazyma scolyti NRRL Y-5512:0.270025,(Yamadazyma tenuis:0.191175,(Yamadazyma nakazawae NRRL Y-7903:0.0860963,Yamadazyma philogaea NRRL Y-7813:0.119211)1:0.13583)1:0.0698957)1:0.0621763)1:0.179539)1:0.0478873)1:0.0252656,(((Millerozyma acaciae JCM 10732:0.318905,(Debaryomyces maramus NRRL Y-2171:0.126252,(Debaryomyces nepalensis NRRL Y-7108:0.107212,(Debaryomyces hansenii:0.0420625,(Debaryomyces prosopidis NRRL Y-27369:0.0489959,(Debaryomyces subglobosus NRRL Y-6666:0.0269918,Debaryomyces fabryi NRRL Y-17914:0.0215588)1:0.00458487)1:0.0217112)1:0.0474478)1:0.0562497)1:0.0791464)1:0.0717927,((Priceomyces carsonii NRRL YB-4275:0.202197,(Priceomyces medius NRRL Y-7122:0.126528,(Priceomyces haplophilus JCM 1635:0.134127,Priceomyces castillae NRRL Y-7501:0.0664317)1:0.052666)1:0.106057)1:0.170928,(((Wickerhamia fluorescens JCM 1821:0.309207,(Teunomyces gatunensis NRRL Y-48064:0.139302,(Teunomyces cretensis NRRL Y-27777:0.0373482,Teunomyces kruisii NRRL Y-17087:0.0354532)1:0.0674172)1:0.152253)1:0.0395823,((Suhomyces pyralidae NRRL Y-27085:0.207777,(Suhomyces tanzawaensis NRRL Y-17324:0.114461,(Suhomyces canberraensis NRRL YB-2417:0.126395,Suhomyces emberorum NRRL Y-27606:0.157814)1:0.0330656)1:0.074523)1:0.0880461,(Aciculoconidium aculeatum NRRL YB-4298:0.278681,(Kodamaea laetipori NRRL Y-27713:0.166081,(Kodamaea ohmeri NRRL Y-1932:0.120016,Candida restingae NRRL Y-27358:0.122045)1:0.175941)1:0.0561324)1:0.13211)1:0.0306706)1:0.0320665,((Scheffersomyces stipitis:0.162145,Scheffersomyces lignosus JCM 9837:0.141854)1:0.103183,(((Spathaspora hagerdaliae:0.0274865,Spathaspora gorwiae UFMG-CM-Y312:0.0270552)1:0.185213,(Spathaspora passalidarum NRRL Y-27907:0.0756431,(Spathaspora arborariae:0.0863436,Spathaspora girioi:0.103206)1:0.0276678)1:0.158335)1:0.0543878,((Candida corydali NRRL Y-27910:0.321211,(Lodderomyces elongisporus:0.271322,(Candida parapsilosis:0.0662414,Candida orthopsilosis:0.0591273)1:0.173632)1:0.103296)1:0.0375885,((Candida dubliniensis CD36:0.0370067,Candida albicans WO-1:0.0309348)1:0.126495,(Candida tropicalis ATCC 200956 MY1012:0.0573369,Candida sojae GF41:0.0691758)1:0.118022)1:0.0968903)1:0.0675366)1:0.119154)1:0.0332128)1:0.0611332)1:0.0307845)1:0.0194503,(((Hyphopichia homilentoma JCM 1507:0.231014,Hyphopichia burtonii NRRL Y-1933:0.195628)1:0.0539724,(Danielozyma ontarioensis NRRL YB-1246:0.28361,(Candida gotoi NRRL Y-27225:0.0656244,(Hyphopichia heimii NRRL Y-7502:0.0226493,Candida rhagii NRRL Y-2594:0.0238606)1:0.068766)1:0.157449)1:0.0369338)1:0.0713511,((Candida heveicola NRRL Y-48716:0.134205,_Candida_ auris:0.137532)1:0.207365,(Candida oregonensis NRRL Y-5850:0.222047,(((Candida intermedia JCM 1607:0.130323,Candida blattae NRRL Y-27698:0.127583)1:0.100258,(Clavispora lusitaniae:0.147865,Clavispora fructus NRRL Y-17072:0.15848)1:0.137841)1:0.0302907,((Candida wancherniae NRRL Y-48709:0.246543,(Metschnikowia bicuspidata var. bicuspidata NRRL YB-4993:0.172847,Candida golubevii NRRL Y-48707:0.168165)1:0.0922754)1:0.0530619,(Candida hawaiiana:0.166731,(Metschnikowia kipukae UWOPS 00-669.2:0.116121,((Metschnikowia hibisci UWOPS 95-797.2:0.0472722,(Metschnikowia shivogae UWOPS 04-310.1:0.0168883,Metschnikowia aberdeeniae SUB 05-213.1:0.0146631)1:0.0315668)1:0.0981931,((Metschnikowia proteae:0.00747509,Metschnikowia drakensbergensis:0.00548386)1:0.0718813,((Metschnikowia arizonensis UWOPS 99-103.4:0.0768031,(Metschnikowia similis UWOPS 03-133.4:0.0158634,(Metschnikowia dekortorum:0.00848135,Metschnikowia bowlesiae:0.00946469)1:0.00906119)1:0.100881)1:0.019975,((Metschnikowia kamakouana UWOPS 04-112.5:0.0238126,(Metschnikowia hawaiiensis UWOPS 87-2203.2:0.0113058,(Metschnikowia hamakuensis UWOPS 04-199.1:0.0101785,Metschnikowia mauinuiana UWOPS 04-190.1:0.00865049)1:0.00277958)1:0.0283861)1:0.0126143,((Candida ipomoeae UWOPS 10-104.1:0.0100707,Metschnikowia borealis SUB 99-207.1:0.0167867)1:0.00210267,((Metschnikowia lochheadii UWOPS 99-661.1:0.00996666,(Metschnikowia matae var. matae UFMG-CM-Y391A:0.00424069,Metschnikowia matae var. maris UFMG-CM-Y397T:0.00348643)1:0.00958686)1:0.00918633,(Metschnikowia continentalis UWOPS 95-402.1:0.00666829,(Metschnikowia santaceciliae UWOPS 01-517a1:0.00622675,Metschnikowia cerradonensis:0.00638518)1:0.00224705)1:0.00605543)1:0.00228128)1:0.0140057)1:0.0477555)1:0.0216892)1:0.0216014)1:0.0448311)1:0.0790685)1:0.148907)1:0.104645)1:0.0330591)1:0.0346064)1:0.191308)1:0.0501198)1:0.0235663)1:0.0497414)1:0.249136)1:0.0750128)1:0.0732652)1:0.049717)1:0.219066)1:0.165959)1:0.126267)1:0.0731174)1:0.168976)1:0.15046)1:0.545914);\",\n \"r2t\" : \"(Schizosaccharomyces pombe:0.126204,(Saitoella complicata:0.0885746,((Arthrobotrys oligospora:0.0619566,(((Botrytis cinerea:0.0159599,Sclerotinia sclerotiorum:0.0144928)100:0.0963903,(Fusarium graminearum:0.0510591,(Neurospora crassa:0.0739745,Thermothelomyces heterothallicus:0.0683393)100:0.0362615)100:0.0584987)100:0.0447412,(((Zymoseptoria tritici:0.0711361,Passalora fulva:0.0715012)100:0.0977923,(Curvularia lunata:0.0396482,Parastagonospora nodorum:0.0402995)100:0.0997238)100:0.0445184,(Xylona heveae:0.0827906,(Coccidioides immitis:0.084686,(Aspergillus glaucus:0.0668904,(Aspergillus nidulans:0.0401227,Aspergillus oryzae:0.0447877)100:0.0146822)100:0.0489525)100:0.0540695)100:0.0225032)100:0.0234296)97:0.0417394)100:0.0878736,((Lipomyces japonicus NRRL Y-17848:0.083055,((Lipomyces suomiensis NRRL Y-17356:0.063608,Lipomyces oligophaga NRRL Y-17247:0.0762265)100:0.0217226,(Lipomyces doorenjongii NRRL Y-27504:0.0786482,(Lipomyces lipofer NRRL Y-11555:0.0650201,(Lipomyces kononenkoae NRRL Y-11553:0.0459803,((Lipomyces starkeyi NRRL Y-11557:0.00681505,Lipomyces starkeyi:0.00528117)100:0.0119879,(Lipomyces mesembrius NRRL Y-27506:0.0232923,Lipomyces arxii NRRL Y-17921:0.0349869)100:0.00929258)100:0.0178152)100:0.0224125)100:0.0117255)100:0.0112742)100:0.0161427)100:0.0443967,(((Trigonopsis variabilis NRRL Y-1579:0.0918385,Trigonopsis vinaria NRRL Y-5715:0.0778916)100:0.0634075,(Botryozyma nematodophila NRRL Y-17705:0.126145,(Tortispora starmeri NRRL Y-63665:0.0822969,(Tortispora caseinolytica NRRL Y-17796:0.0293182,Tortispora ganteri NRRL Y-17035:0.0348557)100:0.0511304)100:0.0413347)100:0.0281241)100:0.0197302,(((Middelhovenomyces tepae NRRL Y-17670:0.111319,((Galactomyces candidus Phaff 72-186:0.0669059,(Dipodascus geniculatus NRRL Y-17628:0.0585418,Dipodascus albidus NRRL Y-12859:0.0802071)100:0.032647)100:0.0352005,((Saprochaete clavata:0.0573717,(Magnusiomyces capitatus:0.0225681,Magnusiomyces capitatus:0.00343673)100:0.0266914)100:0.0426538,(Magnusiomyces tetrasperma NRRL Y-7288:0.0909393,(Magnusiomyces ingens:0.00426038,Magnusiomyces ingens:0.00454468)100:0.0594328)100:0.0145665)100:0.037234)100:0.0271195)100:0.0160277,(((Candida incommunis NRRL Y-17085:0.0714356,Deakozyma indianensis NRRL YB-1937:0.0665043)100:0.0862172,((Wickerhamiella infanticola DS02:0.112297,Wickerhamiella cacticola NRRL Y-27362:0.121855)100:0.0593741,(Candida hispaniensis NRRL Y-5580:0.0908408,((Yarrowia sp. JCM 30694:0.00421429,Yarrowia bubula NRRL Y-63668:0.0066085)100:0.0141797,((Yarrowia deformans JCM 1694:0.00474947,Yarrowia divulgata NRRL Y-63741:0.00788674)100:0.00896605,(Yarrowia lipolytica:0.00855678,(Yarrowia sp. JCM 30696:0.00457866,(Yarrowia sp. JCM 30695:0.00109815,Yarrowia keelungensis JCM 14894:0.000746909)100:0.00339822)100:0.00776074)100:0.0030877)100:0.00797457)100:0.0687327)100:0.084079)99:0.0269638)99:0.0226604,(((Groenewaldozyma salmanticensis NRRL Y-17090:0.11507,(Zygoascus ofunaensis NRRL Y-10998:0.0905002,(Zygoascus hellenicus NRRL Y-7136:0.0177705,Zygoascus meyerae NRRL Y-17319:0.033743)100:0.0524429)100:0.0360027)100:0.0174588,((Spencermartinsiella europaea NRRL Y-48265:0.0911582,Diddensiella caesifluorescens NRRL Y-48781:0.0884185)100:0.0161105,(Sugiyamaella valdiviana:0.0815797,(Sugiyamaella americana NRRL YB-2067:0.0856077,Sugiyamaella lignohabitans CBS 10342:0.0351246)100:0.0195916)100:0.0261745)100:0.0136807)100:0.0169933,(Blastobotrys muscicola NRRL Y-7993:0.11487,((Blastobotrys mokoenaii NRRL Y-27120:0.0956722,(Blastobotrys attinorum Y-27639:0.0521706,(Blastobotrys nivea NRRL Y-17581:0.0858854,Blastobotrys proliferans NRRL Y-17577:0.0888617)100:0.0122257)100:0.014012)100:0.0192743,(Blastobotrys serpentis NRRL Y-48249:0.10963,((Blastobotrys americana NRRL Y-6844:0.0632957,Blastobotrys peoriensis NRRL YB-2290:0.056484)100:0.0312416,(Blastobotrys adeninivorans:0.0201089,Blastobotrys raffinosifermentans:0.016445)100:0.0638897)100:0.0369131)100:0.0165191)100:0.0160658)100:0.0187613)100:0.0218206)99:0.0218424)99:0.0323467,((Nadsonia fulvescens NRRL Y-12810:0.0431276,Nadsonia fulvescens var. elongata DSM 6958:0.0290928)100:0.100074,((Alloascoidea hylecoeti JCM 7604:0.142779,(Sporopachydermia lactativora NRRL Y-11591:0.0716173,Sporopachydermia quercuum JCM 9486:0.060207)100:0.0533148)77:0.0184655,(((Ascoidea asiatica JCM 7603:0.0909876,Ascoidea rubescens:0.0923764)100:0.0555868,(Saccharomycopsis fermentans NRRL Y-17710:0.0670507,(Saccharomycopsis malanga JCM 7620:0.0537866,Saccharomycopsis capsularis NRRL Y-17639:0.0726377)100:0.0293327)100:0.0505221)100:0.0351169,((((Candida ponderosae NRRL YB-2307:0.116821,(Starmera quercuum NRRL YB-4281:0.0867524,(Candida stellimalicola NRRL Y-17912:0.0710683,Starmera amethionina NRRL Y-10978:0.0660149)100:0.038032)100:0.024918)91:0.0146313,((Wickerhamomyces anomalus:0.0497049,Wickerhamomyces ciferrii NRRL Y-1031:0.0512548)100:0.0264792,(((Wickerhamomyces alni NRRL Y-11625:0.0754478,(Wickerhamiella azyma NRRL Y-17067:0.0310146,Wickerhamomyces canadensis NRRL Y-1888:0.0326725)100:0.0453877)100:0.0288606,(Wickerhamomyces bovis NRRL YB-4184:0.083978,((Barnettozyma hawaiiensis NRRL Y-27270:0.0506112,(Barnettozyma populi NRRL Y-12728:0.0521714,Barnettozyma californica NRRL Y-17395:0.0407995)100:0.00921085)100:0.0371517,((Barnettozyma pratensis NRRL Y-12696:0.0622423,Barnettozyma salicaria NRRL Y-6780:0.069559)100:0.0123131,(Candida montana NRRL Y-17326:0.0751889,((Candida orba NRRL Y-27336:0.0339559,Phaffomyces thermotolerans NRRL Y-11709:0.0339438)100:0.0210789,(Phaffomyces antillensis NRRL Y-12881:0.0392326,Phaffomyces opuntiae NRRL Y-11707:0.0320823)100:0.0209823)100:0.0419267)100:0.0220956)100:0.0105821)100:0.0313017)100:0.0153705)100:0.0180182,((Wickerhamomyces hampshirensis NRRL YB-4128:0.0842166,Candida freyschussii:0.0702627)100:0.0145882,(((Cyberlindnera xylosilytica NRRL YB-2097:0.0615196,Cyberlindnera fabianii JCM 3601:0.0530417)100:0.011541,(Cyberlindnera petersonii NRRL YB-3808:0.0626946,(Candida mycetangii NRRL Y-6843:0.0582128,Cyberlindnera americana NRRL Y-2156:0.0598929)100:0.0114685)100:0.0159979)100:0.0264469,((Cyberlindnera maclurae NRRL Y-5377:0.0526604,Cyberlindnera misumaiensis NRRL Y-17389:0.0442506)100:0.0440499,(Cyberlindnera jadinii NRRL Y-1542:0.0725383,(Candida vartiovaarae:0.0625927,(Cyberlindnera mrakii NRRL Y-1364:0.0367754,(Cyberlindnera saturnus NRRL Y-17396:0.0287399,Cyberlindnera suaveolens NRRL Y-17391:0.0232996)100:0.0160669)100:0.0292767)100:0.0102841)100:0.0092162)100:0.0263359)100:0.0154825)100:0.0219838)100:0.0164339)95:0.0119649)100:0.0468189,((Saccharomycodes ludwigii UTAD17:0.114355,((Hanseniaspora vineae:0.0341913,Hanseniaspora osmophila NRRL Y-1613:0.0381317)100:0.0685352,((Hanseniaspora singularis:0.0663886,Hanseniaspora valbyensis NRRL Y-1626:0.0517474)100:0.0155812,(Kloeckera hatyaiensis:0.0523116,(Hanseniaspora pseudoguilliermondii:0.0562921,(Hanseniaspora uvarum:0.0346921,Hanseniaspora clermontiae NRRL Y-27515:0.0475276)100:0.0145255)100:0.0211695)100:0.0279143)100:0.114557)100:0.0384264)100:0.0348094,(((((Eremothecium cymbalariae DBVPG 7215:0.0482528,Eremothecium gossypii ATCC 10895:0.0869488)100:0.0173328,(Eremothecium sinecaudum ATCC 58844:0.0547745,Eremothecium coryli CBS 5749:0.0443996)55:0.00927931)100:0.0479904,(Kluyveromyces aestuarii NRRL YB-4510:0.0661155,(Kluyveromyces marxianus CBS6556:0.0381194,(Kluyveromyces dobzhanskii NRRL Y-1974:0.0402393,Kluyveromyces lactis NRRL Y-1140:0.0242856)100:0.0197354)100:0.0335599)100:0.051824)100:0.0229944,(Lachancea kluyveri:0.0625351,((Lachancea cidri:0.185105,Lachancea mirantina:0.119783)99:0.0288772,((Lachancea dasiensis:0.1214,(Lachancea waltii:0.00819208,(Lachancea meyersii CBS 8951:0.183661,Lachancea nothofagi:0.158248)92:0.0175256)35:0.000265047)81:0.0265036,(Lachancea lanzarotensis CBS 12615:0.0483696,(Lachancea quebecensis:0.0129892,(Lachancea thermotolerans CBS 6340:0.00142213,Lachancea thermotolerans:0.00168073)100:0.00945148)100:0.0453357)95:0.0251145)61:0.0240587)100:0.0154712)100:0.0115994)100:0.0190621,((((Zygosaccharomyces kombuchaensis NRRL YB-4811:0.046758,(Zygosaccharomyces bisporus NRRL Y-12626:0.0360355,Zygosaccharomyces bailii:0.0398601)100:0.0121151)100:0.0202831,(Zygosaccharomyces sapae:0.0121896,(Zygosaccharomyces rouxii v1:0.00340107,Zygosaccharomyces rouxii:0.00320738)100:0.00810975)100:0.0509075)100:0.0714314,((Torulaspora microellipsoides:0.0475723,(Zygotorulaspora florentina NRRL Y-1560:0.0483917,Zygotorulaspora mrakii NRRL Y-12654:0.055265)100:0.0283279)99:0.00902968,(Torulaspora maleeae CBS 10694:0.052034,(Torulaspora delbrueckii:0.0233883,(Torulaspora franciscae NRRL Y-17532:0.0262398,Torulaspora pretoriensis NRRL Y-17251:0.0244877)100:0.0186046)100:0.018761)100:0.0240214)100:0.0161415)100:0.0295256,(((Tetrapisispora blattae:0.0525052,Yueomyces sinensis NRRL Y-17406:0.099179)100:0.0421829,(Vanderwaltozyma polyspora:0.0729678,(Tetrapisispora iriomotensis NRRL Y-27309:0.0560405,(Tetrapisispora phaffii CBS 4417:0.0338951,(Tetrapisispora fleetii NRRL Y-27350:0.0348304,Tetrapisispora namnaoensis NRRL Y-27982:0.0327815)100:0.0179)100:0.0198241)100:0.048753)100:0.0314575)100:0.0246669,((Naumovozyma castellii:0.0505552,(((Kazachstania africana CBS 2517:0.0646844,(Kazachstania viticola NRRL Y-27206:0.0759366,Kazachstania martiniae NRRL Y-409:0.0521419)100:0.0130001)97:0.0077118,((Kazachstania rosinii NRRL Y-17919:0.0596281,Kazachstania spencerorum NRRL Y-17920:0.0768462)100:0.0126981,(Kazachstania turicensis NRRL Y-48834:0.0431203,Kazachstania kunashirensis NRRL Y-27209:0.0559373)100:0.0293573)100:0.0207873)97:0.0114597,(Kazachstania intestinalis NRRL Y-48847:0.0833165,(Kazachstania bromeliacearum NRRL Y-48836:0.079683,((Kazachstania taianensis NRRL Y-48846:0.078128,Kazachstania naganishii CBS 8797:0.0939904)100:0.0218932,((Kazachstania yakushimaensis NRRL Y-48837:0.0243461,Kazachstania transvaalensis NRRL Y-17245:0.0430026)100:0.0585229,(Kazachstania siamensis NRRL Y-48842:0.0457349,(Kazachstania unispora NRRL Y-1556:0.0380544,(Kazachstania solicola NRRL Y-27207:0.0275766,Kazachstania aerobia NRRL Y-27976:0.0259698)100:0.024771)100:0.0190303)100:0.0346524)100:0.0155365)100:0.010997)100:0.0149155)97:0.0121949)100:0.0163685)100:0.0115806,(((Nakaseomyces bacillisporus CBS 7720:0.0602697,_Candida_ castellii CBS 4332:0.0552284)100:0.0196278,(_Candida_ glabrata CBS 138:0.0400934,(_Candida_ bracarensis CBS 10154:0.0249734,(_Candida_ nivariensis CBS 9983:0.0220311,Nakaseomyces delphensis CBS 2170:0.029392)100:0.00532474)100:0.016744)100:0.0575278)100:0.0195602,(Lachancea fermentati:0.180518,(((Saccharomyces bayanus NBRC1948:0.00599558,(Saccharomyces eubayanus:0.0311309,(Saccharomyces pastorianus CBS 1503:0.0081642,Saccharomyces pastorianus CBS 1513:0.0041158)100:0.00354016)100:0.00386148)100:0.0060333,(Candida norvegica:0.0339226,(Saccharomyces bayanus CBS 7001:0.0182511,(Saccharomyces bayanus 623-6C CBS 7001:0.00237523,Saccharomyces uvarum:0.00363307)100:0.00208439)100:0.00457913)100:0.00367531)100:0.0171416,(Saccharomyces arboricola:0.0257175,(Saccharomyces kudriavzevii:0.0231824,((Saccharomyces jurei:0.00897546,(Saccharomyces mikatae IFO 1815:0.00132382,Saccharomyces mikatae:0.00400149)100:0.00689138)100:0.0136218,(Saccharomyces cerevisiae x Saccharomyces kudriavzevii x Saccharomyces uvarum CBS 2834:0.00682362,(Saccharomyces cerevisiae x Saccharomyces kudriavzevii:0.00517659,((Saccharomyces cerevisiae x Saccharomyces eubayanus Hybrid H1:0.00776694,(Saccharomyces pastorianus VTT A-63015:0.00325668,Saccharomyces pastorianus Weihenstephan 34/70:0.0116326)100:0.00241464)100:0.0019361,((Saccharomyces cerevisiae Vin13:0.00163674,((Saccharomyces cerevisiae x Saccharomyces mikatae:0.00797371,(Saccharomyces cerevisiae FostersO:0.00307742,(Saccharomyces paradoxus:0.0129436,Saccharomyces cerevisiae x Saccharomyces paradoxus DBVPG1373xZ1:0.00341844)100:0.00492533)99:0.00226386)88:0.000728143,(Ogataea polymorpha RB11:0.000245516,((Candida tropicalis CBS 94:0.000399229,Ogataea polymorpha CBS 4732:0.000452355)100:0.000174036,((Zygosaccharomyces rouxii CBS 732:0.000356679,Lachancea thermotolerans CBS 6340:0.000527001)87:0.000158257,(Millerozyma farinosa CBS 7064:0.000250795,(Kluyveromyces marxianus CBS 712:0.000321026,(Saccharomyces cerevisiae S288C:0.000481844,Saccharomyces cerevisiae AWRI796:0.00294417)100:0.000752871)98:0.000129624)100:0.000812457)79:6.41111e-05)78:0.000115355)100:0.00113339)88:0.000426612)88:0.000745475,(Candida gropengiesseri:0.00398597,(Candida batistae:0.00191938,((Wickerhamiella domercqiae:0.0731683,Wickerhamiella versatilis JCM 5958:0.0917899)100:0.0201985,((Candida stellata:0.0447414,(Candida davenportii:0.0883913,Starmerella bacillaris NP2:0.0706162)100:0.0389893)100:0.0266105,((Starmerella bombicola JCM 9596:0.085771,(Candida bombi:0.0676886,Candida apicola NRRL Y-50540:0.0505998)100:0.0206182)100:0.0320175,(Candida geochares:0.0607001,(Candida sorbosivorans:0.0414339,(Wickerhamiella galacta:0.00713286,Candida magnoliae:0.0215597)100:0.016667)100:0.00941328)100:0.0286677)100:0.0198253)100:0.0223772)100:0.106092)100:0.00330585)100:0.00340044)88:0.000881557)94:0.0026942)94:0.00647231)94:0.00702113)100:0.00371471)100:0.00556456)100:0.00752715)100:0.0530619)100:0.0292997)100:0.015258)100:0.0168147)100:0.0146565)100:0.0355872)100:0.027864)100:0.102054)100:0.0402833,(((Pachysolen tannophilus NRRL Y-2460:0.0808212,((Peterozyma xylosa NRRL Y-12939:0.0413235,Peterozyma toletana NRRL YB-4247:0.0363934)100:0.079557,(Nakazawaea peltata JCM 9829:0.0790579,(Nakazawaea holstii NRRL Y-2155:0.076221,Nakazawaea wickerhamii NRRL Y-2563:0.0830923)100:0.0236035)100:0.0313818)100:0.0167062)100:0.0309597,(((Citeromyces siamensis NRRL Y-27975:0.0596415,(Citeromyces hawaiiensis NRRL Y-11581:0.0404304,Citeromyces matritensis NRRL Y-2407:0.0405154)100:0.0300409)100:0.0722959,((Komagataella populi NRRL YB-455:0.00452192,Komagataella pseudopastoris NRRL Y-27603:0.00450592)100:0.0174026,(Komagataella pastoris:0.00889631,(Komagataella phaffii:0.000148318,(Komagataella phaffii GS115:4.69073e-05,Komagataella phaffii:0.000106001)100:7.7985e-05)100:0.00811704)100:0.0144677)100:0.140854)100:0.0285972,((Kuraishia ogatae NRRL Y-48474:0.0914258,(Kuraishia molischiana NRRL Y-27899:0.0581477,Kuraishia capsulata:0.0467181)100:0.0478643)100:0.0195164,(Candida boidinii JCM 9604:0.110969,(((Candida succiphila JCM 9445:0.0886966,Ogataea naganishii NRRL Y-7654:0.0959386)100:0.0167412,(Ogataea methylivora NRRL Y-17250:0.0855903,Ogataea ramenticola NRRL YB-1985:0.0987928)100:0.0178331)100:0.0227408,((((Ogataea pilisensis NRRL Y-27598:0.066275,Ogataea nitratoaversa NRRL Y-48449:0.0642773)100:0.028961,(Candida arabinofermentans NRRL YB-2248:0.0849656,(Ogataea trehalophila NRRL Y-6781:0.0487782,Ogataea methanolica JCM 10240:0.0493589)100:0.0293327)100:0.0140467)100:0.0279201,(Ogataea trehaloabstinens NRRL Y-27595:0.099808,((Ogataea zsoltii NRRL Y-27601:0.0533496,(Ogataea glucozyma NRRL YB-2185:0.0502725,(Ogataea henricii NRRL YB-2194:0.0474431,(Ogataea pini NRRL Y-11528:0.000173811,Ogataea populi-albae NRRL Y-48632:0.000238677)100:0.0473245)100:0.0117949)100:0.010016)100:0.0313845,((Ogataea nonfermentans NRRL YB-2203:0.0463412,Ogataea minuta NRRL Y-411:0.0528823)100:0.0269107,(Ogataea philodendri NRRL Y-7210:0.0685447,(Ogataea kodamae NRRL Y-17234:0.0684285,(Ogataea parapolymorpha:0.019301,(Ogataea angusta:0.00598477,Ogataea polymorpha NCYC 495 leu1.1:0.000116775)100:0.00806111)100:0.0330794)100:0.0111215)100:0.0117704)100:0.0279163)100:0.0145388)100:0.0167219)100:0.0177219,((Ambrosiozyma maleeae NRRL Y-63635:0.0833518,((Ambrosiozyma kashinagacola JCM 15019:0.0693266,(Ambrosiozyma pseudovanderkliftii NRRL Y-63632:0.0577148,Ambrosiozyma vanderkliftii NRRL Y-63633:0.0566447)100:0.0243184)100:0.0165422,(Ambrosiozyma monospora JCM 7599:0.0768011,(Ambrosiozyma oregonensis NRRL Y-6106:0.0577061,(Ambrosiozyma philentoma NRRL Y-7523:0.0407241,Ambrosiozyma ambrosiae NRRL Y-7524:0.058601)95:0.0150731)100:0.0404117)100:0.0150307)100:0.0199196)100:0.0274069,((Candida sp. JCM 15000:0.0941246,(Brettanomyces custersianus NRRL Y-6653:0.086231,(Brettanomyces anomalus:0.0318015,(Brettanomyces bruxellensis:0.000593528,(Brettanomyces bruxellensis CBS 2499:0.00109505,Brettanomyces bruxellensis:0.00264587)100:0.000384652)100:0.0247517)100:0.0615694)100:0.0521429)100:0.0778521,((Kregervanrija fluxuum NRRL YB-4273:0.0374345,Kregervanrija delftensis NRRL Y-7119:0.0405164)100:0.0638635,((Martiniozyma abiesophila NRRL Y-11514:0.109633,((Saturnispora silvae NRRL Y-6725:0.0831621,Saturnispora mendoncae NRRL Y-11515:0.067902)100:0.0265947,(Saturnispora saitoi NRRL Y-6671:0.0588065,(Saturnispora zaruensis NRRL Y-7008:0.0528894,(Saturnispora dispora NRRL Y-1447:0.0370446,(Saturnispora hagleri NRRL Y-27828:0.0255079,Saturnispora serradocipensis NRRL Y-48717:0.0340521)100:0.0169599)100:0.0125902)100:0.0247621)100:0.0299834)100:0.0367605)100:0.0308369,((Pichia terricola NRRL YB-4310:0.074898,Candida sorboxylosa JCM 1536:0.0758895)100:0.0245451,((Candida californica:0.0648764,(Pichia membranifaciens NRRL Y-2026:0.0243445,Pichia membranifaciens KS47-1:0.0209896)100:0.0311224)59:0.0177483,((Pichia norvegensis NRRL Y-7687:0.0887783,Pichia kudriavzevii:0.082125)100:0.0177134,((Pichia nakasei NRRL Y-7686:0.067107,Pichia heedii NRRL Y-10967:0.0588032)100:0.0369725,(Pichia occidentalis NRRL Y-7552:0.0675481,Pichia exigua NRRL Y-10920:0.0755201)59:0.0151337)59:0.0107938)59:0.0109712)100:0.0124365)100:0.0326334)100:0.0231644)100:0.0331026)100:0.0335554)100:0.0176088)100:0.0289504)99:0.0137276)100:0.034821)100:0.0193198)100:0.0237829)100:0.0278153,(Babjeviella inositovora NRRL Y-12698:0.0830192,((Cephaloascus fragrans:0.0569461,Cephaloascus albidus:0.0718853)100:0.0346833,((Candida schatavii NRRL Y-17078:0.091576,(Candida fragi NRRL Y-17910:0.0453009,Kurtzmaniella cleridarum NRRL Y-48386:0.0568199)100:0.0648921)100:0.0253452,((((Candida ascalaphidarum NRRL Y-27908:0.098612,Diutina catenulata:0.148142)95:0.0200365,(Candida athensensis NRRL Y-27644:0.0392514,((Meyerozyma guilliermondii:0.000908622,Meyerozyma guilliermondii ATCC 6260:0.00309795)100:0.0101255,(Meyerozyma caribbica:0.009389,Candida carpophila JCM 9396:0.00717367)100:0.00816186)100:0.0269725)100:0.0762289)92:0.0167428,((Candida tammaniensis NRRL Y-8257:0.0674796,Candida gorgasii NRRL Y-27707:0.0694565)100:0.0285249,(Yamadazyma scolyti NRRL Y-5512:0.0774375,(Candida aaseri SH-14:0.0654444,((Yamadazyma laniorum yHMH7:0.0417828,Yamadazyma tenuis:0.0402424)100:0.0282539,(Yamadazyma nakazawae NRRL Y-7903:0.0408872,Yamadazyma philogaea NRRL Y-7813:0.0504395)100:0.0356588)100:0.0194215)100:0.0124815)100:0.0205036)100:0.0585866)77:0.0121471,(((Priceomyces carsonii NRRL YB-4275:0.0773801,(Priceomyces medius NRRL Y-7122:0.0599315,(Priceomyces castillae NRRL Y-7501:0.0479101,Priceomyces haplophilus JCM 1635:0.0517119)100:0.0177603)100:0.0293383)100:0.0429337,(Millerozyma acaciae JCM 10732:0.0740945,(Debaryomyces maramus NRRL Y-2171:0.0742901,((Debaryomyces hansenii:0.0094309,Debaryomyces tyrocola:0.00741868)100:0.0123071,(Debaryomyces fabryi NRRL Y-17914:0.0115779,(Debaryomyces hansenii J6:0.00478424,(Debaryomyces subglobosus NRRL Y-6666:0.00307223,(Debaryomyces prosopidis NRRL Y-27369:0.0266364,Debaryomyces nepalensis NRRL Y-7108:0.0590941)100:0.0214071)100:0.0162527)100:0.0127128)100:0.00837282)100:0.0302908)100:0.0281444)100:0.0204554)98:0.014532,((((Wickerhamia fluorescens JCM 1821:0.0804346,(Teunomyces gatunensis NRRL Y-48064:0.0543253,(Teunomyces kruisii NRRL Y-17087:0.0250798,Teunomyces cretensis NRRL Y-27777:0.0295176)100:0.0240266)100:0.0384231)100:0.0131621,((Aciculoconidium aculeatum NRRL YB-4298:0.0837536,(Kodamaea laetipori NRRL Y-27713:0.0636316,(Kodamaea ohmeri NRRL Y-1932:0.0490485,Candida restingae NRRL Y-27358:0.0479262)100:0.0351338)100:0.0169767)100:0.0342227,(Suhomyces pyralidae NRRL Y-27085:0.0720593,((Suhomyces canberraensis NRRL YB-2417:0.0513793,Suhomyces emberorum NRRL Y-27606:0.0573297)100:0.013494,(Suhomyces tanzawaensis:0.000172874,Suhomyces tanzawaensis NRRL Y-17324:0.000124577)100:0.0429432)100:0.0187886)100:0.0236942)100:0.0114544)100:0.012213,(((Scheffersomyces lignosus JCM 9837:0.0282656,Scheffersomyces shehatae ATY839:0.0176242)100:0.034077,(Scheffersomyces stipitis:0.000518897,Scheffersomyces stipitis NRRL Y-7124:0.00119922)100:0.0475992)100:0.0326218,(((Spathaspora gorwiae UFMG-CM-Y312:0.0172059,Spathaspora sp.:0.017776)100:0.0470127,(Spathaspora arborariae:0.0407776,(Spathaspora sp.:0.0365321,(Spathaspora passalidarum NRRL Y-27907:0.000681504,(Spathaspora passalidarum:0.00100702,Spathaspora passalidarum:0.000326132)100:0.00040554)100:0.0255792)100:0.0120683)100:0.040913)100:0.0204885,((Candida corydali NRRL Y-27910:0.0859408,(Lodderomyces elongisporus:0.0706966,(Candida metapsilosis:0.0259618,(Candida orthopsilosis:0.0216995,Candida parapsilosis:0.0233949)100:0.00841778)100:0.0372902)100:0.0291739)100:0.0147675,((Candida sojae GF41:0.0310027,Candida tropicalis ATCC 200956 MY1012:0.0110004)100:0.0223129,(Candida dubliniensis CD36:0.0709642,(Naumovozyma dairenensis:0.00144647,(Candida albicans WO-1:0.00123288,Candida albicans:0.00103971)100:0.000641177)100:0.0102161)100:0.0290815)100:0.0324332)100:0.0267713)100:0.0394725)95:0.0128346)95:0.02227,(((Hyphopichia homilentoma JCM 1507:0.0587536,Hyphopichia burtonii NRRL Y-1933:0.0713047)100:0.016959,(Danielozyma ontarioensis NRRL YB-1246:0.0873366,(Candida gotoi NRRL Y-27225:0.0455032,(Candida rhagii NRRL Y-2594:0.0222124,Hyphopichia heimii NRRL Y-7502:0.0224423)100:0.0230844)100:0.0392466)100:0.0145792)100:0.0209346,((_Candida_ auris:0.0455892,(Candida heveicola NRRL Y-48716:0.0410977,Candida pseudohaemulonis B12108:0.0394728)100:0.0226688)100:0.0469312,((Candida oregonensis NRRL Y-5850:0.0865896,((Candida intermedia JCM 1607:0.042487,Candida blattae NRRL Y-27698:0.0530799)100:0.0238467,(Clavispora fructus NRRL Y-17072:0.0576833,Clavispora lusitaniae:0.0491396)100:0.0272481)100:0.0102521)96:0.0107527,(Metschnikowia bicuspidata:0.104942,((Candida wancherniae NRRL Y-48709:0.0784867,(Candida golubevii NRRL Y-48707:0.0554815,(Metschnikowia bicuspidata var. bicuspidata NRRL YB-4993:0.0413189,(Metschnikowia fructicola:0.0157945,Metschnikowia fructicola:0.0148367)100:0.0299732)100:0.0118293)100:0.0209009)100:0.0131789,((Metschnikowia drosophilae UWOPS83-1135.3:0.021045,Candida torresii CBS 5152:0.0230134)100:0.0543554,((Metschnikowia orientalis UWOPS99-745.6:0.0433538,Candida hawaiiana:0.0375214)100:0.0152737,(Metschnikowia sp. M2Y3 EBD-CdV M2Y3:0.0331658,((Metschnikowia kipukae UWOPS 00-669.2:0.0297972,(Metschnikowia hibisci UWOPS 95-797.2:0.0265758,(Metschnikowia aberdeeniae SUB 05-213.1:0.0117725,Metschnikowia shivogae UWOPS 04-310.1:0.0110661)100:0.0119074)100:0.015541)58:0.00570717,((Metschnikowia proteae:0.0057267,Metschnikowia drakensbergensis:0.0055943)100:0.0241508,(((Metschnikowia arizonensis UWOPS 99-103.4:0.0370555,Metschnikowia colocasiae UWOPS 03-202.1:0.0171738)93:0.00452229,(Metschnikowia sp. 03-147.1 UWOPS 03-147.1:0.0208946,(Metschnikowia similis UWOPS 03-133.4:0.0111303,(Metschnikowia dekortorum:0.00697665,Metschnikowia bowlesiae:0.00921332)100:0.00571605)100:0.023746)93:0.00417948)100:0.00628612,((Metschnikowia hawaiiensis UWOPS 87-2203.2:0.0301812,Metschnikowia sp. 04-218.3 UWOPS 04-218.3:0.0150044)100:0.0108385,((Metschnikowia lochheadii UWOPS 99-661.1:0.00971309,(Metschnikowia matae var. matae UFMG-CM-Y391A:0.00687815,Metschnikowia matae var. maris UFMG-CM-Y397T:0.00685245)100:0.00661365)100:0.00543424,((Metschnikowia sp. 04-226.1 UWOPS 04-226.1:0.00877917,(Metschnikowia continentalis UWOPS 95-402.1:0.00829922,(Metschnikowia santaceciliae UWOPS 01-517a1:0.00694966,Metschnikowia cerradonensis:0.00643801)100:0.0022256)100:0.00393078)100:0.00346672,((Metschnikowia cubensis MUCL 45751:0.0116299,Metschnikowia sp. 01-655c1 UWOPS 01-655c1:0.010726)100:0.00475537,(Candida ipomoeae UWOPS 10-104.1:0.0120555,(Metschnikowia borealis SUB 99-207.1:0.00434673,Metschnikowia sp. 13-106.1 UWOPS 13-106.1:0.0046889)100:0.0079509)100:0.00239546)100:0.00300571)100:0.00344102)100:0.00898957)100:0.0120361)100:0.00782286)100:0.00621084)58:0.0061066)100:0.0152811)100:0.0320067)56:0.00960016)100:0.0151264)100:0.014359)99:0.0138301)100:0.0445971)100:0.014915)94:0.00905625)92:0.0102603)100:0.0178837)100:0.0562855)100:0.0243772)100:0.0198609)100:0.0259199)57:0.0176658)100:0.0501942)100:0.045588)99:0.0241612)100:0.0456527)100:0.0313927)100:0.0580377)100:0.0449143)1:0.126204);\",\n \"LRF1\" : \"((((((((((((((((((TP53_AmelENSAMEP00000017825:0.0263[&&NHX:D=N:T=9646],TP53_MpfuENSMPUP00000008945:0.066538[&&NHX:D=N:T=9669])speciation:0.032561[&&NHX:D=N:B=99:T=379584:DD=],TP53_CfamENSCAFP00000024579:0.086484[&&NHX:D=N:T=9615])speciation:0.034068[&&NHX:D=N:B=81:T=379584:DD=],TP53_FcatENSFCAP00000008925:0.06619[&&NHX:D=N:T=9685])speciation:0.025911[&&NHX:D=N:B=31:T=33554:DD=],TP53_EcabENSECAP00000006210:0.04971[&&NHX:D=N:T=9796])speciation:0.01224[&&NHX:D=N:T=314145:B=17:DD=],(((TP53_BtauENSBTAP00000001420:0.043108[&&NHX:D=N:T=9913],TP53_OariENSOARP00000016707:0.049064[&&NHX:D=N:T=9940])speciation:0.055294[&&NHX:D=N:B=98:T=9895:DD=],TP53_TtruENSTTRP00000009721:0.022529[&&NHX:D=N:T=9739])speciation:0.022515[&&NHX:D=N:T=91561:B=39:DD=],TP53_SscrENSSSCP00000019016:0.065797[&&NHX:D=N:T=9823])speciation:0.020972[&&NHX:D=N:T=91561:B=35:DD=])speciation:0.006996[&&NHX:D=N:B=9:T=314145:DD=],TP53_SaraENSSARP00000005616:0.149927[&&NHX:D=N:T=42254])speciation:0.013221[&&NHX:D=N:T=314145:B=7:DD=],TP53_PvamENSPVAP00000015400:0.117578[&&NHX:D=N:T=132908])speciation:0.0[&&NHX:D=N:B=1:T=314145:DD=],((ENSMLUG00000006411_MlucENSMLUP00000005861:0.003702[&&NHX:D=N:T=59463],ENSMLUG00000025140_MlucENSMLUP00000016733:0.12569[&&NHX:D=N:T=59463])duplication:0.131525[&&NHX:D=Y:T=59463:B=100],TP53_EeurENSEEUP00000013295:0.183463[&&NHX:D=N:T=9365])speciation:0.042602[&&NHX:D=N:T=314145:B=33:DD=])duplication:0.018327[&&NHX:DD=Y:T=314145:B=0:D=],(((((Trp53_MmusENSMUSP00000104298:0.002681[&&NHX:D=N:T=10090],Trp53_MsspMGP_SPRETEiJ_P0028933:0.017851[&&NHX:D=N:T=10096])speciation:0.064969[&&NHX:D=N:B=100:T=862507:DD=],Tp53_RnorENSRNOP00000074031:0.079068[&&NHX:D=N:T=10116])speciation:0.12872[&&NHX:D=N:T=39107:B=100:DD=],LOC100910954_RnorENSRNOP00000064177:0.056502[&&NHX:D=N:T=10116])duplication:0.0[&&NHX:D=Y:B=5:T=39107],TP53_OpriENSOPRP00000005906:0.185911[&&NHX:D=N:T=9978])speciation:0.0[&&NHX:D=N:T=314147:B=0:DD=],((((TP53_MmurENSMICP00000039812:0.054544[&&NHX:D=N:T=30608],TP53_OgarENSOGAP00000015106:0.095719[&&NHX:D=N:T=30611])duplication:0.012762[&&NHX:D=N:B=52:T=376911:DD=],((((((TP53_HsapENSP00000269305:0.0[&&NHX:D=N:T=9606],TP53_GgorENSGGOP00000009561:0.002907[&&NHX:D=N:T=9595])speciation:0.001345[&&NHX:D=N:B=61:T=207598:DD=],TP53_PtroENSPTRP00000014836:0.000592[&&NHX:D=N:T=9598])speciation:0.00877[&&NHX:D=N:B=61:T=207598:DD=],TP53_PabeENSPPYP00000008923:0.009552[&&NHX:D=N:T=9601])speciation:4.8e-05[&&NHX:D=N:T=9604:B=100:DD=],TP53_NleuENSNLEP00000011861:0.032229[&&NHX:D=N:T=61853])speciation:0.004444[&&NHX:D=N:T=314295:B=97:DD=],((TP53_PanuENSPANP00000019643:0.007102[&&NHX:D=N:T=9555],TP53_CsabENSCSAP00000007551:0.010543[&&NHX:D=N:T=60711])speciation:0.000953[&&NHX:D=N:B=100:T=9528:DD=],TP53_MmulENSMMUP00000035274:0.043449[&&NHX:D=N:T=9544])speciation:0.019535[&&NHX:D=N:T=9528:B=55:DD=])speciation:0.013822[&&NHX:D=N:T=9526:B=52:DD=],TP53_CjacENSCJAP00000027663:0.047099[&&NHX:D=N:T=9483])speciation:0.027286[&&NHX:D=N:B=57:T=314293:DD=])speciation:0.013265[&&NHX:D=N:T=9443:B=4:DD=],TP53_TbelENSTBEP00000010189:0.222843[&&NHX:D=N:T=37347])speciation:0.008121[&&NHX:D=N:B=0:T=314146:DD=],((TP53_ItriENSSTOP00000019678:0.08339[&&NHX:D=N:T=43179],Tp53_CporENSCPOP00000012841:0.120892[&&NHX:D=N:T=10141])speciation:0.018406[&&NHX:D=N:T=9989:B=42:DD=],(ENSOCUG00000001138_OcunENSOCUP00000000989:0.013142[&&NHX:D=N:T=9986],ENSOCUG00000022109_OcunENSOCUP00000025959:0.090881[&&NHX:D=N:T=9986])duplication:0.069194[&&NHX:D=Y:T=9986:B=97])speciation:0.015339[&&NHX:D=N:T=314147:B=15:DD=])speciation:0.019539[&&NHX:D=N:B=0:T=314146:DD=])duplication:0.026935[&&NHX:DD=Y:T=314146:B=0:D=])speciation:0.017095[&&NHX:D=N:T=1437010:B=0:DD=],(((((((ENSLAFG00000028692_LafrENSLAFP00000023554:0.00886[&&NHX:D=N:T=9785],ENSLAFG00000030880_LafrENSLAFP00000027441:0.052436[&&NHX:D=N:T=9785])duplication:0.006909[&&NHX:D=Y:B=0:T=9785],ENSLAFG00000030555_LafrENSLAFP00000027808:0.044446[&&NHX:D=N:T=9785])duplication:0.003043[&&NHX:D=Y:T=9785:B=0],(ENSLAFG00000028299_LafrENSLAFP00000024998:0.011792[&&NHX:D=N:T=9785],ENSLAFG00000032042_LafrENSLAFP00000023389:0.017693[&&NHX:D=N:T=9785])duplication:0.015904[&&NHX:D=Y:T=9785:B=74])duplication:0.0[&&NHX:D=Y:B=0:T=9785],(((ENSLAFG00000027365_LafrENSLAFP00000025852:0.011873[&&NHX:D=N:T=9785],ENSLAFG00000026238_LafrENSLAFP00000027253:0.026457[&&NHX:D=N:T=9785])duplication:0.019571[&&NHX:D=Y:T=9785:B=81],ENSLAFG00000027669_LafrENSLAFP00000028793:0.027495[&&NHX:D=N:T=9785])duplication:0.016599[&&NHX:D=Y:T=9785:B=70],ENSLAFG00000027820_LafrENSLAFP00000028173:0.058133[&&NHX:D=N:T=9785])duplication:0.031788[&&NHX:D=Y:T=9785:B=87])duplication:0.038135[&&NHX:D=Y:T=9785:B=10],(ENSLAFG00000027348_LafrENSLAFP00000027515:0.028441[&&NHX:D=N:T=9785],ENSLAFG00000027474_LafrENSLAFP00000018379:0.03464[&&NHX:D=N:T=9785])duplication:0.131904[&&NHX:D=Y:B=100:T=9785],ENSLAFG00000007483_LafrENSLAFP00000006292:0.058399[&&NHX:D=N:T=9785])duplication:0.0075[&&NHX:D=Y:T=9785:B=23],TP53_PcapENSPCAP00000011892:0.114307[&&NHX:D=N:T=9813])speciation:0.010282[&&NHX:D=N:T=311790:B=18:DD=],(ENSETEG00000008987_EtelENSETEP00000007296:0.0[&&NHX:D=N:T=9371],ENSETEG00000009984_EtelENSETEP00000008111:0.105253[&&NHX:D=N:T=9371])duplication:0.154739[&&NHX:D=Y:B=100:T=9371])speciation:0.044399[&&NHX:D=N:T=311790:B=35:DD=])speciation:0.041158[&&NHX:D=N:B=0:T=9347:DD=],TP53_DnovENSDNOP00000004075:0.078395[&&NHX:D=N:T=9361])speciation:0.080059[&&NHX:D=N:B=0:T=9347:DD=],((TP53_SharENSSHAP00000018268:0.0496[&&NHX:D=N:T=9305],ENSMODG00000007271_MdomENSMODP00000009014:0.172546[&&NHX:D=N:T=13616])speciation:0.024952[&&NHX:D=N:T=9263:B=83:DD=],ENSMEUG00000013135_MeugENSMEUP00000011978:0.069167[&&NHX:D=N:T=9315])speciation:0.225429[&&NHX:D=N:B=83:T=9263:DD=])speciation:0.228895[&&NHX:D=N:B=81:T=32525:DD=],tp53_XtroENSXETP00000053759:0.483686[&&NHX:D=N:T=8364])speciation:0.095084[&&NHX:D=N:B=55:T=32523:DD=],(TP53_PsinENSPSIP00000014905:0.228951[&&NHX:D=N:T=13735],ENSOANG00000011981_OanaENSOANP00000018980:0.553865[&&NHX:D=N:T=9258])speciation:0.126185[&&NHX:D=N:B=48:T=32524:DD=])duplication:0.03737[&&NHX:DD=Y:B=17:T=32523:D=],TP53_LchaENSLACP00000015915:0.317935[&&NHX:D=N:T=7897])speciation:0.062274[&&NHX:D=N:B=13:T=8287:DD=],(((tp53_DrerENSDARP00000051548:0.365455[&&NHX:D=N:T=7955],tp53_AmexENSAMXP00000021366:0.579505[&&NHX:D=N:T=7994])speciation:0.105036[&&NHX:D=N:B=46:T=186626:DD=],((((((tp53_TrubENSTRUP00000030645:0.158124[&&NHX:D=N:T=31033],tp53_TnigENSTNIP00000013035:0.25403[&&NHX:D=N:T=99883])speciation:0.1396[&&NHX:D=N:T=31031:B=100:DD=],tp53_OlatENSORLP00000008029:0.359414[&&NHX:D=N:T=8090])speciation:0.040022[&&NHX:D=N:T=1489872:B=1:DD=],(tp53_GacuENSGACP00000025614:0.249641[&&NHX:D=N:T=69293],tp53_OnilENSONIP00000023874:0.251831[&&NHX:D=N:T=8128])speciation:0.085834[&&NHX:D=N:T=1489872:B=100:DD=])duplication:0.070104[&&NHX:DD=Y:T=1489872:B=0:D=],(tp53_PforENSPFOP00000007556:0.070709[&&NHX:D=N:T=48698],tp53_XmacENSXMAP00000015753:0.165631[&&NHX:D=N:T=8083])speciation:0.290725[&&NHX:D=N:B=100:T=586240:DD=])duplication:0.058888[&&NHX:DD=Y:B=2:T=1489872:D=],ENSGMOG00000007755_GmorENSGMOP00000008291:0.272843[&&NHX:D=N:T=8049])speciation:0.143728[&&NHX:D=N:T=123368:B=3:DD=],TP531ofmany_AmexENSAMXP00000007265:0.383807[&&NHX:D=N:T=7994])speciation:0.129809[&&NHX:D=N:T=186625:B=41:DD=])duplication:0.079851[&&NHX:D=Y:B=6:T=186625],tp53_LocuENSLOCP00000017063:0.263043[&&NHX:D=N:T=7918])speciation:0.079504[&&NHX:D=N:T=41665:B=5:DD=])speciation:0.205725[&&NHX:D=N:B=10:T=117571:DD=],ENSPMAG00000009535_PmarENSPMAP00000010479:0.363682[&&NHX:D=N:T=7757])speciation:0.005138[&&NHX:D=N:B=0:T=7742:DD=],((((((((((((TP63_MgalENSMGAP00000001036:0.00675[&&NHX:D=N:T=9103],TP63_GgalENSGALP00000032705:0.02786[&&NHX:D=N:T=9031])speciation:0.018196[&&NHX:D=N:B=100:T=9005:DD=],TP63_AplaENSAPLP00000012746:0.025285[&&NHX:D=N:T=8839])speciation:0.020559[&&NHX:D=N:B=100:T=1549675:DD=],(TP63_TgutENSTGUP00000009686:0.018245[&&NHX:D=N:T=59729],TP63_FalbENSFALP00000007718:0.02902[&&NHX:D=N:T=59894])speciation:0.022707[&&NHX:D=N:B=100:T=9126:DD=])speciation:0.046097[&&NHX:D=N:T=8825:B=100:DD=],TP63_PsinENSPSIP00000018044:0.123057[&&NHX:D=N:T=13735])speciation:0.005555[&&NHX:D=N:T=1329799:B=37:DD=],TP63_AcarENSACAP00000000376:0.736631[&&NHX:D=N:T=28377])speciation:0.010123[&&NHX:D=N:B=0:T=32561:DD=],((((((((((Trp63_MmusENSMUSP00000110965:0.000847[&&NHX:D=N:T=10090],Trp63_MsspMGP_SPRETEiJ_P0042982:0.004734[&&NHX:D=N:T=10096])speciation:0.021561[&&NHX:D=N:B=100:T=862507:DD=],Tp63_RnorENSRNOP00000033463:0.030383[&&NHX:D=N:T=10116])speciation:0.048568[&&NHX:D=N:T=39107:B=100:DD=],Trp63_DordENSDORP00000001930:0.044582[&&NHX:D=N:T=10020],TP63_ItriENSSTOP00000012357:0.057295[&&NHX:D=N:T=43179])speciation:0.000474[&&NHX:D=N:T=33553:B=0:DD=],TP63_CporENSCPOP00000013308:0.058396[&&NHX:D=N:T=10141])speciation:0.003336[&&NHX:D=N:B=0:T=9989:DD=],TP63_OpriENSOPRP00000002632:0.076764[&&NHX:D=N:T=9978])speciation:0.001386[&&NHX:D=N:B=0:T=314147:DD=],(TP63_OcunENSOCUP00000014157:0.04305[&&NHX:D=N:T=9986],TP63_OgarENSOGAP00000003415:0.053686[&&NHX:D=N:T=30611])speciation:0.018263[&&NHX:D=N:B=56:T=314146:DD=])duplication:0.0[&&NHX:DD=Y:T=314146:B=0:D=],TP63_TbelENSTBEP00000003655:0.050557[&&NHX:D=N:T=37347])speciation:0.000127[&&NHX:D=N:B=0:T=314146:DD=],(((((((TP63_PvamENSPVAP00000008543:0.02784[&&NHX:D=N:T=132908],TP63_MlucENSMLUP00000014213:0.029592[&&NHX:D=N:T=59463])speciation:0.007063[&&NHX:D=N:B=37:T=9397:DD=],(((TP63_AmelENSAMEP00000000831:0.015923[&&NHX:D=N:T=9646],TP63_CfamENSCAFP00000020585:0.020935[&&NHX:D=N:T=9615])speciation:0.003042[&&NHX:D=N:T=379584:B=80:DD=],TP63_MpfuENSMPUP00000003407:0.032827[&&NHX:D=N:T=9669])speciation:0.009414[&&NHX:D=N:B=64:T=379584:DD=],TP63_FcatENSFCAP00000000731:0.02322[&&NHX:D=N:T=9685])speciation:0.017067[&&NHX:D=N:T=33554:B=74:DD=])speciation:0.001436[&&NHX:D=N:T=314145:B=0:DD=],((((TP63_BtauENSBTAP00000020544:0.005072[&&NHX:D=N:T=9913],TP63_OariENSOARP00000021997:0.009983[&&NHX:D=N:T=9940])speciation:0.025469[&&NHX:D=N:T=9895:B=100:DD=],TP63_TtruENSTTRP00000011034:0.022489[&&NHX:D=N:T=9739])speciation:0.005877[&&NHX:D=N:B=58:T=91561:DD=],TP63_SscrENSSSCP00000025960:0.02089[&&NHX:D=N:T=9823])speciation:0.005665[&&NHX:D=N:B=29:T=91561:DD=],TP63_VpacENSVPAP00000011479:0.032735[&&NHX:D=N:T=30538])speciation:0.007589[&&NHX:D=N:B=13:T=91561:DD=])speciation:0.001552[&&NHX:D=N:B=0:T=314145:DD=],(TP63_EcabENSECAP00000016315:0.020605[&&NHX:D=N:T=9796],TP63_EeurENSEEUP00000012623:0.068478[&&NHX:D=N:T=9365])speciation:0.015388[&&NHX:D=N:B=15:T=314145:DD=])speciation:0.00388[&&NHX:D=N:T=314145:B=0:DD=],((((((((TP63_HsapENSP00000264731:0.001872[&&NHX:D=N:T=9606],TP63_GgorENSGGOP00000020551:0.002754[&&NHX:D=N:T=9595])speciation:0.000918[&&NHX:D=N:T=207598:B=46:DD=],TP63_PtroENSPTRP00000027067:0.001869[&&NHX:D=N:T=9598])speciation:0.002874[&&NHX:D=N:T=207598:B=46:DD=],TP63_PabeENSPPYP00000016106:0.004542[&&NHX:D=N:T=9601])speciation:0.000913[&&NHX:D=N:T=9604:B=70:DD=],TP63_NleuENSNLEP00000008197:0.004734[&&NHX:D=N:T=61853])speciation:0.000949[&&NHX:D=N:T=314295:B=66:DD=],((TP63_MmulENSMMUP00000038274:0.003714[&&NHX:D=N:T=9544],TP63_CsabENSCSAP00000005295:0.026509[&&NHX:D=N:T=60711])speciation:0.0[&&NHX:D=N:B=31:T=9528:DD=],TP63_PanuENSPANP00000003169:0.001823[&&NHX:D=N:T=9555])speciation:0.010162[&&NHX:D=N:B=31:T=9528:DD=])speciation:0.010185[&&NHX:D=N:T=9526:B=95:DD=],TP63_CjacENSCJAP00000026376:0.015601[&&NHX:D=N:T=9483])speciation:0.013295[&&NHX:D=N:T=314293:B=100:DD=],TP63_MmurENSMICP00000022696:0.021271[&&NHX:D=N:T=30608])speciation:0.0[&&NHX:D=N:B=42:T=9443:DD=],(TP63_TsyrENSTSYP00000003403:0.025783[&&NHX:D=N:T=1868482],TP63_SaraENSSARP00000011553:0.056367[&&NHX:D=N:T=42254])speciation:0.010618[&&NHX:D=N:B=14:T=1437010:DD=])duplication:0.006497[&&NHX:DD=Y:B=1:T=1437010:D=])duplication:0.0[&&NHX:DD=Y:B=0:T=1437010:D=],(TP63_DnovENSDNOP00000012853:0.025753[&&NHX:D=N:T=9361],TP63_ChofENSCHOP00000009300:0.040693[&&NHX:D=N:T=9358])speciation:0.020456[&&NHX:D=N:B=76:T=9348:DD=])speciation:0.001941[&&NHX:D=N:T=9347:B=0:DD=],((TP63_LafrENSLAFP00000020806:0.016207[&&NHX:D=N:T=9785],TP63_PcapENSPCAP00000004708:0.030306[&&NHX:D=N:T=9813])speciation:0.00755[&&NHX:D=N:T=311790:B=91:DD=],TP63_EtelENSETEP00000001864:0.071017[&&NHX:D=N:T=9371])speciation:0.015236[&&NHX:D=N:T=311790:B=8:DD=])speciation:0.007477[&&NHX:D=N:B=0:T=9347:DD=])duplication:0.052158[&&NHX:DD=Y:B=0:T=9347:D=],((TP63_MdomENSMODP00000018831:0.034607[&&NHX:D=N:T=13616],TP63_MeugENSMEUP00000014131:0.045944[&&NHX:D=N:T=9315])speciation:0.011561[&&NHX:D=N:T=9263:B=100:DD=],TP63_SharENSSHAP00000008666:0.303146[&&NHX:D=N:T=9305])speciation:0.054652[&&NHX:D=N:B=12:T=9263:DD=])speciation:0.017647[&&NHX:D=N:B=2:T=32525:DD=],TP63_OanaENSOANP00000021753:0.079276[&&NHX:D=N:T=9258])speciation:0.043447[&&NHX:D=N:T=40674:B=2:DD=])speciation:0.034349[&&NHX:D=N:T=32524:B=0:DD=],tp63_XtroENSXETP00000055541:0.267401[&&NHX:D=N:T=8364])speciation:0.032348[&&NHX:D=N:B=0:T=32523:DD=],(ENSACAG00000002961_AcarENSACAP00000002870:0.0[&&NHX:D=N:T=28377],ENSACAG00000022533_AcarENSACAP00000021196:1.16541[&&NHX:D=N:T=28377])duplication:0.116614[&&NHX:D=Y:T=28377:B=0])duplication:0.005373[&&NHX:D=Y:T=32523:B=0],TP63_LchaENSLACP00000022643:0.17787[&&NHX:D=N:T=7897])speciation:0.031924[&&NHX:D=N:T=8287:B=0:DD=],(((((((tp63_PforENSPFOP00000001124:0.014737[&&NHX:D=N:T=48698],tp63_XmacENSXMAP00000016461:0.044393[&&NHX:D=N:T=8083])speciation:0.052269[&&NHX:D=N:B=99:T=586240:DD=],tp63_OlatENSORLP00000019616:0.105223[&&NHX:D=N:T=8090])speciation:0.020917[&&NHX:D=N:B=24:T=1489913:DD=],tp63_OnilENSONIP00000024326:0.065197[&&NHX:D=N:T=8128])speciation:0.01928[&&NHX:D=N:T=1489908:B=16:DD=],(tp63_TnigENSTNIP00000016776:0.042973[&&NHX:D=N:T=99883],tp63_TrubENSTRUP00000008025:0.048688[&&NHX:D=N:T=31033])speciation:0.043668[&&NHX:D=N:B=100:T=31031:DD=])speciation:0.020832[&&NHX:D=N:B=77:T=1489872:DD=],(ENSGACG00000013629_GacuENSGACP00000018012:0.069577[&&NHX:D=N:T=69293],ENSGMOG00000000413_GmorENSGMOP00000000401:0.110102[&&NHX:D=N:T=8049])speciation:0.067443[&&NHX:D=N:B=97:T=123368:DD=])duplication:0.040724[&&NHX:DD=Y:B=65:T=123368:D=],(tp63_AmexENSAMXP00000004961:0.092792[&&NHX:D=N:T=7994],tp63_DrerENSDARP00000108362:0.121291[&&NHX:D=N:T=7955])speciation:0.046115[&&NHX:D=N:T=186626:B=86:DD=])speciation:0.034365[&&NHX:D=N:T=186625:B=37:DD=],tp63_LocuENSLOCP00000006202:0.102939[&&NHX:D=N:T=7918])speciation:0.049371[&&NHX:D=N:B=52:T=41665:DD=])speciation:0.110844[&&NHX:D=N:B=0:T=117571:DD=],(((((((((((TP73_LafrENSLAFP00000005892:0.029578[&&NHX:D=N:T=9785],TP73_PcapENSPCAP00000000662:0.051492[&&NHX:D=N:T=9813])speciation:0.003183[&&NHX:D=N:T=311790:B=90:DD=],TP73_EtelENSETEP00000007165:0.095673[&&NHX:D=N:T=9371])speciation:0.033805[&&NHX:D=N:T=311790:B=0:DD=],TP73_DnovENSDNOP00000028722:0.457081[&&NHX:D=N:T=9361])speciation:0.006287[&&NHX:D=N:B=0:T=9347:DD=],((((((((TP73_BtauENSBTAP00000007643:0.009498[&&NHX:D=N:T=9913],TP73_OariENSOARP00000017005:0.019572[&&NHX:D=N:T=9940])speciation:0.012531[&&NHX:D=N:T=9895:B=100:DD=],ENSSSCG00000025685_SscrENSSSCP00000022771:0.057187[&&NHX:D=N:T=9823])speciation:0.018712[&&NHX:D=N:T=91561:B=1:DD=],TP73_TtruENSTTRP00000003223:0.039795[&&NHX:D=N:T=9739])speciation:0.015091[&&NHX:D=N:T=91561:B=0:DD=],(((TP73_AmelENSAMEP00000009745:0.040276[&&NHX:D=N:T=9646],TP73_MpfuENSMPUP00000007349:0.069423[&&NHX:D=N:T=9669])speciation:0.011068[&&NHX:D=N:B=5:T=379584:DD=],TP73_CfamENSCAFP00000028819:0.025289[&&NHX:D=N:T=9615])speciation:0.003214[&&NHX:D=N:B=4:T=379584:DD=],TP73_FcatENSFCAP00000010792:0.059719[&&NHX:D=N:T=9685])speciation:0.021832[&&NHX:D=N:B=20:T=33554:DD=])speciation:0.009094[&&NHX:D=N:T=314145:B=0:DD=],TP73_PvamENSPVAP00000008433:0.078992[&&NHX:D=N:T=132908])speciation:0.005352[&&NHX:D=N:T=314145:B=0:DD=],TP73_EeurENSEEUP00000011975:0.098606[&&NHX:D=N:T=9365])speciation:0.0[&&NHX:D=N:B=0:T=314145:DD=],TP73_EcabENSECAP00000001313:0.038035[&&NHX:D=N:T=9796])speciation:0.007356[&&NHX:D=N:T=314145:B=0:DD=],((((((Trp73_MsspMGP_SPRETEiJ_P0068738:0.0082[&&NHX:D=N:T=10096],Trp73_MmusENSMUSP00000101269:0.011834[&&NHX:D=N:T=10090])speciation:0.027464[&&NHX:D=N:B=100:T=862507:DD=],Tp73_RnorENSRNOP00000052265:0.034464[&&NHX:D=N:T=10116])speciation:0.085459[&&NHX:D=N:T=39107:B=100:DD=],TP73_ItriENSSTOP00000022492:0.061184[&&NHX:D=N:T=43179])speciation:0.008334[&&NHX:D=N:B=2:T=33553:DD=],Trp73_DordENSDORP00000013966:0.076743[&&NHX:D=N:T=10020])speciation:0.0[&&NHX:D=N:T=33553:B=0:DD=],TP73_CporENSCPOP00000009800:0.075508[&&NHX:D=N:T=10141])speciation:0.004958[&&NHX:D=N:T=9989:B=0:DD=],((TP73_MmurENSMICP00000031305:0.033995[&&NHX:D=N:T=30608],TP73_OgarENSOGAP00000005402:0.043894[&&NHX:D=N:T=30611])speciation:0.017054[&&NHX:D=N:T=376911:B=93:DD=],((((((TP73_GgorENSGGOP00000015180:0.00182[&&NHX:D=N:T=9595],TP73_HsapENSP00000367545:0.005775[&&NHX:D=N:T=9606])speciation:0.0[&&NHX:D=N:T=207598:B=92:DD=],TP73_PtroENSPTRP00000000118:0.05274[&&NHX:D=N:T=9598])speciation:0.005412[&&NHX:D=N:B=81:T=207598:DD=],TP73_PabeENSPPYP00000002277:0.013149[&&NHX:D=N:T=9601])speciation:0.000495[&&NHX:D=N:B=30:T=9604:DD=],TP73_NleuENSNLEP00000009887:0.326917[&&NHX:D=N:T=61853])speciation:0.010918[&&NHX:D=N:T=314295:B=0:DD=],((TP73_PanuENSPANP00000007545:0.004788[&&NHX:D=N:T=9555],TP73_CsabENSCSAP00000017283:0.012519[&&NHX:D=N:T=60711])speciation:0.000519[&&NHX:D=N:T=9528:B=86:DD=],TP73_MmulENSMMUP00000040655:0.025402[&&NHX:D=N:T=9544])duplication:0.013713[&&NHX:D=N:B=75:T=9528:DD=])speciation:0.010332[&&NHX:D=N:T=9526:B=0:DD=],TP73_CjacENSCJAP00000005070:0.291972[&&NHX:D=N:T=9483])speciation:0.022859[&&NHX:D=N:B=0:T=314293:DD=])speciation:0.014731[&&NHX:D=N:B=0:T=9443:DD=])speciation:0.020217[&&NHX:D=N:T=314146:B=0:DD=])speciation:0.01086[&&NHX:D=N:T=1437010:B=0:DD=])speciation:0.048685[&&NHX:D=N:T=9347:B=0:DD=],ENSSSCG00000003361_SscrENSSSCP00000003644:0.097446[&&NHX:D=N:T=9823])duplication:0.016508[&&NHX:D=Y:T=9347:B=0],((TP73_MeugENSMEUP00000000705:0.023362[&&NHX:D=N:T=9315],TP73_MdomENSMODP00000008216:0.259151[&&NHX:D=N:T=13616])speciation:0.035881[&&NHX:D=N:B=57:T=9263:DD=],TP73_SharENSSHAP00000006513:0.042193[&&NHX:D=N:T=9305])speciation:0.069704[&&NHX:D=N:T=9263:B=36:DD=])speciation:0.023293[&&NHX:D=N:T=32525:B=2:DD=],TP73_OanaENSOANP00000019815:0.30572[&&NHX:D=N:T=9258])speciation:0.017992[&&NHX:D=N:B=0:T=40674:DD=],(((((TP73_GgalENSGALP00000001485:0.002093[&&NHX:D=N:T=9031],TP73_MgalENSMGAP00000001059:0.036491[&&NHX:D=N:T=9103])speciation:0.047733[&&NHX:D=N:T=9005:B=100:DD=],TP73_AplaENSAPLP00000003415:0.02254[&&NHX:D=N:T=8839])speciation:0.021618[&&NHX:D=N:T=1549675:B=97:DD=],(TP73_TgutENSTGUP00000002829:0.010561[&&NHX:D=N:T=59729],TP73_FalbENSFALP00000010031:0.030208[&&NHX:D=N:T=59894])speciation:0.023763[&&NHX:D=N:T=9126:B=100:DD=])speciation:0.016346[&&NHX:D=N:B=97:T=8825:DD=],TP73_PsinENSPSIP00000004448:0.109544[&&NHX:D=N:T=13735])speciation:0.026517[&&NHX:D=N:T=1329799:B=84:DD=],TP73_AcarENSACAP00000001746:0.128451[&&NHX:D=N:T=28377])speciation:0.019965[&&NHX:D=N:B=67:T=32561:DD=])speciation:0.036745[&&NHX:D=N:T=32524:B=15:DD=],tp73_XtroENSXETP00000010981:0.182635[&&NHX:D=N:T=8364])speciation:0.011019[&&NHX:D=N:B=1:T=32523:DD=],TP73_LchaENSLACP00000021702:0.142378[&&NHX:D=N:T=7897])speciation:0.024057[&&NHX:D=N:B=0:T=8287:DD=],((((((tp73_TnigENSTNIP00000014938:0.027328[&&NHX:D=N:T=99883],tp73_TrubENSTRUP00000038165:0.032469[&&NHX:D=N:T=31033])speciation:0.059199[&&NHX:D=N:T=31031:B=100:DD=],tp73_GacuENSGACP00000008676:0.048591[&&NHX:D=N:T=69293])speciation:0.007086[&&NHX:D=N:T=1489922:B=29:DD=],(((tp73_PforENSPFOP00000010896:0.013197[&&NHX:D=N:T=48698],tp73_XmacENSXMAP00000017403:0.030558[&&NHX:D=N:T=8083])speciation:0.063838[&&NHX:D=N:B=100:T=586240:DD=],tp73_OlatENSORLP00000005521:0.062083[&&NHX:D=N:T=8090])speciation:0.017304[&&NHX:D=N:B=58:T=1489913:DD=],tp73_OnilENSONIP00000002627:0.053778[&&NHX:D=N:T=8128])speciation:0.014746[&&NHX:D=N:T=1489908:B=29:DD=])speciation:0.072637[&&NHX:D=N:B=14:T=1489872:DD=],tp73_GmorENSGMOP00000016675:0.181445[&&NHX:D=N:T=8049])speciation:0.038065[&&NHX:D=N:T=123368:B=98:DD=],(tp73_AmexENSAMXP00000014358:0.086906[&&NHX:D=N:T=7994],tp73_DrerENSDARP00000109674:0.134572[&&NHX:D=N:T=7955])speciation:0.064476[&&NHX:D=N:T=186626:B=100:DD=])speciation:0.04364[&&NHX:D=N:T=186625:B=43:DD=],tp73_LocuENSLOCP00000006343:0.115822[&&NHX:D=N:T=7918])speciation:0.046704[&&NHX:D=N:T=41665:B=14:DD=])speciation:0.167736[&&NHX:D=N:T=117571:B=27:DD=])duplication:0.067299[&&NHX:D=Y:B=0:T=117571],tp63_PmarENSPMAP00000007639:0.797694[&&NHX:D=N:T=7757])speciation:0.076045[&&NHX:D=N:T=7742:B=0:DD=],(('p53/p73-b CintENSCINP00000004447':0.450754[&&NHX:D=N:T=7719],ENSCSAVG00000009788_CsavENSCSAVP00000016659:0.47517[&&NHX:D=N:T=51511])speciation:0.378426[&&NHX:D=N:B=100:T=7718:DD=],(ENSCING00000001960_CintENSCINP00000003956:0.141945[&&NHX:D=N:T=7719],ENSCSAVG00000009964_CsavENSCSAVP00000016940:0.26284[&&NHX:D=N:T=51511])speciation:0.525939[&&NHX:D=N:T=7718:B=100:DD=])duplication:0.603292[&&NHX:D=Y:B=100:T=7718])duplication:0.0[&&NHX:D=N:T=7711:B=0:DD=];\",\n \"LRF2\" : \"((((((((((((((((((TP53_AmelENSAMEP00000017825:0.0263[&&NHX:D=N:T=9646],TP53_MpfuENSMPUP00000008945:0.066538[&&NHX:D=N:T=9669])speciation:0.032561[&&NHX:D=N:B=99:T=379584:DD=],TP53_CfamENSCAFP00000024579:0.086484[&&NHX:D=N:T=9615])speciation:0.034068[&&NHX:D=N:B=81:T=379584:DD=],TP53_FcatENSFCAP00000008925:0.06619[&&NHX:D=N:T=9685])speciation:0.025911[&&NHX:D=N:B=31:T=33554:DD=],TP53_EcabENSECAP00000006210:0.04971[&&NHX:D=N:T=9796])speciation:0.01224[&&NHX:D=N:T=314145:B=17:DD=],(((TP53_BtauENSBTAP00000001420:0.043108[&&NHX:D=N:T=9913],TP53_OariENSOARP00000016707:0.049064[&&NHX:D=N:T=9940])speciation:0.055294[&&NHX:D=N:B=98:T=9895:DD=],TP53_TtruENSTTRP00000009721:0.022529[&&NHX:D=N:T=9739])speciation:0.022515[&&NHX:D=N:T=91561:B=39:DD=],TP53_SscrENSSSCP00000019016:0.065797[&&NHX:D=N:T=9823])speciation:0.020972[&&NHX:D=N:T=91561:B=35:DD=])speciation:0.006996[&&NHX:D=N:B=9:T=314145:DD=],TP53_SaraENSSARP00000005616:0.149927[&&NHX:D=N:T=42254])speciation:0.013221[&&NHX:D=N:T=314145:B=7:DD=],TP53_PvamENSPVAP00000015400:0.117578[&&NHX:D=N:T=132908])speciation:0.0[&&NHX:D=N:B=1:T=314145:DD=],((ENSMLUG00000006411_MlucENSMLUP00000005861:0.003702[&&NHX:D=N:T=59463],ENSMLUG00000025140_MlucENSMLUP00000016733:0.12569[&&NHX:D=N:T=59463])duplication:0.131525[&&NHX:D=Y:T=59463:B=100],TP53_EeurENSEEUP00000013295:0.183463[&&NHX:D=N:T=9365])speciation:0.042602[&&NHX:D=N:T=314145:B=33:DD=])duplication:0.018327[&&NHX:DD=Y:T=314145:B=0:D=],(((((Trp53_MmusENSMUSP00000104298:0.002681[&&NHX:D=N:T=10090],Trp53_MsspMGP_SPRETEiJ_P0028933:0.017851[&&NHX:D=N:T=10096])speciation:0.064969[&&NHX:D=N:B=100:T=862507:DD=],Tp53_RnorENSRNOP00000074031:0.079068[&&NHX:D=N:T=10116])speciation:0.12872[&&NHX:D=N:T=39107:B=100:DD=],LOC100910954_RnorENSRNOP00000064177:0.056502[&&NHX:D=N:T=10116])duplication:0.0[&&NHX:D=Y:B=5:T=39107],TP53_OpriENSOPRP00000005906:0.185911[&&NHX:D=N:T=9978])speciation:0.0[&&NHX:D=N:T=314147:B=0:DD=],((((TP53_MmurENSMICP00000039812:0.054544[&&NHX:D=N:T=30608],TP53_OgarENSOGAP00000015106:0.095719[&&NHX:D=N:T=30611])speciation:0.012762[&&NHX:D=N:B=52:T=376911:DD=],((((((TP53_HsapENSP00000269305:0.0[&&NHX:D=N:T=9606],TP53_GgorENSGGOP00000009561:0.002907[&&NHX:D=N:T=9595])speciation:0.001345[&&NHX:D=N:B=61:T=207598:DD=],TP53_PtroENSPTRP00000014836:0.000592[&&NHX:D=N:T=9598])speciation:0.00877[&&NHX:D=N:B=61:T=207598:DD=],TP53_PabeENSPPYP00000008923:0.009552[&&NHX:D=N:T=9601])speciation:4.8e-05[&&NHX:D=N:T=9604:B=100:DD=],TP53_NleuENSNLEP00000011861:0.032229[&&NHX:D=N:T=61853])speciation:0.004444[&&NHX:D=N:T=314295:B=97:DD=],((TP53_PanuENSPANP00000019643:0.007102[&&NHX:D=N:T=9555],TP53_CsabENSCSAP00000007551:0.010543[&&NHX:D=N:T=60711])speciation:0.000953[&&NHX:D=N:B=100:T=9528:DD=],TP53_MmulENSMMUP00000035274:0.043449[&&NHX:D=N:T=9544])speciation:0.019535[&&NHX:D=N:T=9528:B=55:DD=])speciation:0.013822[&&NHX:D=N:T=9526:B=52:DD=],TP53_CjacENSCJAP00000027663:0.047099[&&NHX:D=N:T=9483])speciation:0.027286[&&NHX:D=N:B=57:T=314293:DD=])speciation:0.013265[&&NHX:D=N:T=9443:B=4:DD=],TP53_TbelENSTBEP00000010189:0.222843[&&NHX:D=N:T=37347])speciation:0.008121[&&NHX:D=N:B=0:T=314146:DD=],((TP53_ItriENSSTOP00000019678:0.08339[&&NHX:D=N:T=43179],Tp53_CporENSCPOP00000012841:0.120892[&&NHX:D=N:T=10141])speciation:0.018406[&&NHX:D=N:T=9989:B=42:DD=],(ENSOCUG00000001138_OcunENSOCUP00000000989:0.013142[&&NHX:D=N:T=9986],ENSOCUG00000022109_OcunENSOCUP00000025959:0.090881[&&NHX:D=N:T=9986])duplication:0.069194[&&NHX:D=Y:T=9986:B=97])speciation:0.015339[&&NHX:D=N:T=314147:B=15:DD=])speciation:0.019539[&&NHX:D=N:B=0:T=314146:DD=])duplication:0.026935[&&NHX:DD=Y:T=314146:B=0:D=])speciation:0.017095[&&NHX:D=N:T=1437010:B=0:DD=],((((((((ENSLAFG00000028692_LafrENSLAFP00000023554:0.00886[&&NHX:D=N:T=9785],ENSLAFG00000030880_LafrENSLAFP00000027441:0.052436[&&NHX:D=N:T=9785])duplication:0.006909[&&NHX:D=Y:B=0:T=9785],ENSLAFG00000030555_LafrENSLAFP00000027808:0.044446[&&NHX:D=N:T=9785])duplication:0.003043[&&NHX:D=Y:T=9785:B=0],(ENSLAFG00000028299_LafrENSLAFP00000024998:0.011792[&&NHX:D=N:T=9785],ENSLAFG00000032042_LafrENSLAFP00000023389:0.017693[&&NHX:D=N:T=9785])duplication:0.015904[&&NHX:D=Y:T=9785:B=74])duplication:0.0[&&NHX:D=Y:B=0:T=9785],(((ENSLAFG00000027365_LafrENSLAFP00000025852:0.011873[&&NHX:D=N:T=9785],ENSLAFG00000026238_LafrENSLAFP00000027253:0.026457[&&NHX:D=N:T=9785])duplication:0.019571[&&NHX:D=Y:T=9785:B=81],ENSLAFG00000027669_LafrENSLAFP00000028793:0.027495[&&NHX:D=N:T=9785])duplication:0.016599[&&NHX:D=Y:T=9785:B=70],ENSLAFG00000027820_LafrENSLAFP00000028173:0.058133[&&NHX:D=N:T=9785])duplication:0.031788[&&NHX:D=Y:T=9785:B=87])duplication:0.038135[&&NHX:D=Y:T=9785:B=10],(ENSLAFG00000027348_LafrENSLAFP00000027515:0.028441[&&NHX:D=N:T=9785],ENSLAFG00000027474_LafrENSLAFP00000018379:0.03464[&&NHX:D=N:T=9785])duplication:0.131904[&&NHX:D=Y:B=100:T=9785])duplication:0.082412[&&NHX:D=Y:T=9785:B=96],ENSLAFG00000007483_LafrENSLAFP00000006292:0.058399[&&NHX:D=N:T=9785])duplication:0.0075[&&NHX:D=Y:T=9785:B=23],TP53_PcapENSPCAP00000011892:0.114307[&&NHX:D=N:T=9813])speciation:0.010282[&&NHX:D=N:T=311790:B=18:DD=],(ENSETEG00000008987_EtelENSETEP00000007296:0.0[&&NHX:D=N:T=9371],ENSETEG00000009984_EtelENSETEP00000008111:0.105253[&&NHX:D=N:T=9371])duplication:0.154739[&&NHX:D=Y:B=100:T=9371])speciation:0.044399[&&NHX:D=N:T=311790:B=35:DD=])speciation:0.041158[&&NHX:D=N:B=0:T=9347:DD=],TP53_DnovENSDNOP00000004075:0.078395[&&NHX:D=N:T=9361])speciation:0.080059[&&NHX:D=N:B=0:T=9347:DD=],((TP53_SharENSSHAP00000018268:0.0496[&&NHX:D=N:T=9305],ENSMODG00000007271_MdomENSMODP00000009014:0.172546[&&NHX:D=N:T=13616])speciation:0.024952[&&NHX:D=N:T=9263:B=83:DD=],ENSMEUG00000013135_MeugENSMEUP00000011978:0.069167[&&NHX:D=N:T=9315])speciation:0.225429[&&NHX:D=N:B=83:T=9263:DD=])speciation:0.228895[&&NHX:D=N:B=81:T=32525:DD=],tp53_XtroENSXETP00000053759:0.483686[&&NHX:D=N:T=8364])speciation:0.095084[&&NHX:D=N:B=55:T=32523:DD=],(TP53_PsinENSPSIP00000014905:0.228951[&&NHX:D=N:T=13735],ENSOANG00000011981_OanaENSOANP00000018980:0.553865[&&NHX:D=N:T=9258])speciation:0.126185[&&NHX:D=N:B=48:T=32524:DD=])duplication:0.03737[&&NHX:DD=Y:B=17:T=32523:D=],TP53_LchaENSLACP00000015915:0.317935[&&NHX:D=N:T=7897])speciation:0.062274[&&NHX:D=N:B=13:T=8287:DD=],(((tp53_DrerENSDARP00000051548:0.365455[&&NHX:D=N:T=7955],tp53_AmexENSAMXP00000021366:0.579505[&&NHX:D=N:T=7994])speciation:0.105036[&&NHX:D=N:B=46:T=186626:DD=],((((((tp53_TrubENSTRUP00000030645:0.158124[&&NHX:D=N:T=31033],tp53_TnigENSTNIP00000013035:0.25403[&&NHX:D=N:T=99883])speciation:0.1396[&&NHX:D=N:T=31031:B=100:DD=],tp53_OlatENSORLP00000008029:0.359414[&&NHX:D=N:T=8090])speciation:0.040022[&&NHX:D=N:T=1489872:B=1:DD=],(tp53_GacuENSGACP00000025614:0.249641[&&NHX:D=N:T=69293],tp53_OnilENSONIP00000023874:0.251831[&&NHX:D=N:T=8128])speciation:0.085834[&&NHX:D=N:T=1489872:B=100:DD=])duplication:0.070104[&&NHX:DD=Y:T=1489872:B=0:D=],(tp53_PforENSPFOP00000007556:0.070709[&&NHX:D=N:T=48698],tp53_XmacENSXMAP00000015753:0.165631[&&NHX:D=N:T=8083])speciation:0.290725[&&NHX:D=N:B=100:T=586240:DD=])duplication:0.058888[&&NHX:DD=Y:B=2:T=1489872:D=],ENSGMOG00000007755_GmorENSGMOP00000008291:0.272843[&&NHX:D=N:T=8049])speciation:0.143728[&&NHX:D=N:T=123368:B=3:DD=],TP531ofmany_AmexENSAMXP00000007265:0.383807[&&NHX:D=N:T=7994])speciation:0.129809[&&NHX:D=N:T=186625:B=41:DD=])duplication:0.079851[&&NHX:D=Y:B=6:T=186625],tp53_LocuENSLOCP00000017063:0.263043[&&NHX:D=N:T=7918])speciation:0.079504[&&NHX:D=N:T=41665:B=5:DD=])speciation:0.205725[&&NHX:D=N:B=10:T=117571:DD=],ENSPMAG00000009535_PmarENSPMAP00000010479:0.363682[&&NHX:D=N:T=7757])speciation:0.005138[&&NHX:D=N:B=0:T=7742:DD=],((((((((((((TP63_MgalENSMGAP00000001036:0.00675[&&NHX:D=N:T=9103],TP63_GgalENSGALP00000032705:0.02786[&&NHX:D=N:T=9031])speciation:0.018196[&&NHX:D=N:B=100:T=9005:DD=],TP63_AplaENSAPLP00000012746:0.025285[&&NHX:D=N:T=8839])speciation:0.020559[&&NHX:D=N:B=100:T=1549675:DD=],(TP63_TgutENSTGUP00000009686:0.018245[&&NHX:D=N:T=59729],TP63_FalbENSFALP00000007718:0.02902[&&NHX:D=N:T=59894])speciation:0.022707[&&NHX:D=N:B=100:T=9126:DD=])speciation:0.046097[&&NHX:D=N:T=8825:B=100:DD=],TP63_PsinENSPSIP00000018044:0.123057[&&NHX:D=N:T=13735])speciation:0.005555[&&NHX:D=N:T=1329799:B=37:DD=],TP63_AcarENSACAP00000000376:0.736631[&&NHX:D=N:T=28377])speciation:0.010123[&&NHX:D=N:B=0:T=32561:DD=],(((((((((((Trp63_MmusENSMUSP00000110965:0.000847[&&NHX:D=N:T=10090],Trp63_MsspMGP_SPRETEiJ_P0042982:0.004734[&&NHX:D=N:T=10096])speciation:0.021561[&&NHX:D=N:B=100:T=862507:DD=],Tp63_RnorENSRNOP00000033463:0.030383[&&NHX:D=N:T=10116])speciation:0.048568[&&NHX:D=N:T=39107:B=100:DD=],Trp63_DordENSDORP00000001930:0.044582[&&NHX:D=N:T=10020])speciation:0.014056[&&NHX:D=N:B=17:T=33553:DD=],TP63_ItriENSSTOP00000012357:0.057295[&&NHX:D=N:T=43179])speciation:0.000474[&&NHX:D=N:T=33553:B=0:DD=],TP63_CporENSCPOP00000013308:0.058396[&&NHX:D=N:T=10141])speciation:0.003336[&&NHX:D=N:B=0:T=9989:DD=],TP63_OpriENSOPRP00000002632:0.076764[&&NHX:D=N:T=9978])speciation:0.001386[&&NHX:D=N:B=0:T=314147:DD=],(TP63_OcunENSOCUP00000014157:0.04305[&&NHX:D=N:T=9986],TP63_OgarENSOGAP00000003415:0.053686[&&NHX:D=N:T=30611])speciation:0.018263[&&NHX:D=N:B=56:T=314146:DD=])duplication:0.0[&&NHX:DD=Y:T=314146:B=0:D=],TP63_TbelENSTBEP00000003655:0.050557[&&NHX:D=N:T=37347])speciation:0.000127[&&NHX:D=N:B=0:T=314146:DD=],(((((((TP63_PvamENSPVAP00000008543:0.02784[&&NHX:D=N:T=132908],TP63_MlucENSMLUP00000014213:0.029592[&&NHX:D=N:T=59463])speciation:0.007063[&&NHX:D=N:B=37:T=9397:DD=],(((TP63_AmelENSAMEP00000000831:0.015923[&&NHX:D=N:T=9646],TP63_CfamENSCAFP00000020585:0.020935[&&NHX:D=N:T=9615])speciation:0.003042[&&NHX:D=N:T=379584:B=80:DD=],TP63_MpfuENSMPUP00000003407:0.032827[&&NHX:D=N:T=9669])speciation:0.009414[&&NHX:D=N:B=64:T=379584:DD=],TP63_FcatENSFCAP00000000731:0.02322[&&NHX:D=N:T=9685])speciation:0.017067[&&NHX:D=N:T=33554:B=74:DD=])speciation:0.001436[&&NHX:D=N:T=314145:B=0:DD=],((((TP63_BtauENSBTAP00000020544:0.005072[&&NHX:D=N:T=9913],TP63_OariENSOARP00000021997:0.009983[&&NHX:D=N:T=9940])speciation:0.025469[&&NHX:D=N:T=9895:B=100:DD=],TP63_TtruENSTTRP00000011034:0.022489[&&NHX:D=N:T=9739])speciation:0.005877[&&NHX:D=N:B=58:T=91561:DD=],TP63_SscrENSSSCP00000025960:0.02089[&&NHX:D=N:T=9823])speciation:0.005665[&&NHX:D=N:B=29:T=91561:DD=],TP63_VpacENSVPAP00000011479:0.032735[&&NHX:D=N:T=30538])speciation:0.007589[&&NHX:D=N:B=13:T=91561:DD=])speciation:0.001552[&&NHX:D=N:B=0:T=314145:DD=],(TP63_EcabENSECAP00000016315:0.020605[&&NHX:D=N:T=9796],TP63_EeurENSEEUP00000012623:0.068478[&&NHX:D=N:T=9365])speciation:0.015388[&&NHX:D=N:B=15:T=314145:DD=])speciation:0.00388[&&NHX:D=N:T=314145:B=0:DD=],((((((((TP63_HsapENSP00000264731:0.001872[&&NHX:D=N:T=9606],TP63_GgorENSGGOP00000020551:0.002754[&&NHX:D=N:T=9595])speciation:0.000918[&&NHX:D=N:T=207598:B=46:DD=],TP63_PtroENSPTRP00000027067:0.001869[&&NHX:D=N:T=9598])speciation:0.002874[&&NHX:D=N:T=207598:B=46:DD=],TP63_PabeENSPPYP00000016106:0.004542[&&NHX:D=N:T=9601])speciation:0.000913[&&NHX:D=N:T=9604:B=70:DD=],TP63_NleuENSNLEP00000008197:0.004734[&&NHX:D=N:T=61853])speciation:0.000949[&&NHX:D=N:T=314295:B=66:DD=],((TP63_MmulENSMMUP00000038274:0.003714[&&NHX:D=N:T=9544],TP63_CsabENSCSAP00000005295:0.026509[&&NHX:D=N:T=60711])speciation:0.0[&&NHX:D=N:B=31:T=9528:DD=],TP63_PanuENSPANP00000003169:0.001823[&&NHX:D=N:T=9555])speciation:0.010162[&&NHX:D=N:B=31:T=9528:DD=])speciation:0.010185[&&NHX:D=N:T=9526:B=95:DD=],TP63_CjacENSCJAP00000026376:0.015601[&&NHX:D=N:T=9483])speciation:0.013295[&&NHX:D=N:T=314293:B=100:DD=],TP63_MmurENSMICP00000022696:0.021271[&&NHX:D=N:T=30608])speciation:0.0[&&NHX:D=N:B=42:T=9443:DD=],(TP63_TsyrENSTSYP00000003403:0.025783[&&NHX:D=N:T=1868482],TP63_SaraENSSARP00000011553:0.056367[&&NHX:D=N:T=42254])speciation:0.010618[&&NHX:D=N:B=14:T=1437010:DD=])duplication:0.006497[&&NHX:DD=Y:B=1:T=1437010:D=])duplication:0.0[&&NHX:DD=Y:B=0:T=1437010:D=],(TP63_DnovENSDNOP00000012853:0.025753[&&NHX:D=N:T=9361],TP63_ChofENSCHOP00000009300:0.040693[&&NHX:D=N:T=9358])speciation:0.020456[&&NHX:D=N:B=76:T=9348:DD=])speciation:0.001941[&&NHX:D=N:T=9347:B=0:DD=],((TP63_LafrENSLAFP00000020806:0.016207[&&NHX:D=N:T=9785],TP63_PcapENSPCAP00000004708:0.030306[&&NHX:D=N:T=9813])speciation:0.00755[&&NHX:D=N:T=311790:B=91:DD=],TP63_EtelENSETEP00000001864:0.071017[&&NHX:D=N:T=9371])speciation:0.015236[&&NHX:D=N:T=311790:B=8:DD=])speciation:0.007477[&&NHX:D=N:B=0:T=9347:DD=])duplication:0.052158[&&NHX:DD=Y:B=0:T=9347:D=],((TP63_MdomENSMODP00000018831:0.034607[&&NHX:D=N:T=13616],TP63_MeugENSMEUP00000014131:0.045944[&&NHX:D=N:T=9315])speciation:0.011561[&&NHX:D=N:T=9263:B=100:DD=],TP63_SharENSSHAP00000008666:0.303146[&&NHX:D=N:T=9305])speciation:0.054652[&&NHX:D=N:B=12:T=9263:DD=])speciation:0.017647[&&NHX:D=N:B=2:T=32525:DD=],TP63_OanaENSOANP00000021753:0.079276[&&NHX:D=N:T=9258])speciation:0.043447[&&NHX:D=N:T=40674:B=2:DD=])speciation:0.034349[&&NHX:D=N:T=32524:B=0:DD=],tp63_XtroENSXETP00000055541:0.267401[&&NHX:D=N:T=8364])speciation:0.032348[&&NHX:D=N:B=0:T=32523:DD=],(ENSACAG00000002961_AcarENSACAP00000002870:0.0[&&NHX:D=N:T=28377],ENSACAG00000022533_AcarENSACAP00000021196:1.16541[&&NHX:D=N:T=28377])duplication:0.116614[&&NHX:D=Y:T=28377:B=0])duplication:0.005373[&&NHX:D=Y:T=32523:B=0],TP63_LchaENSLACP00000022643:0.17787[&&NHX:D=N:T=7897])speciation:0.031924[&&NHX:D=N:T=8287:B=0:DD=],(((((((tp63_PforENSPFOP00000001124:0.014737[&&NHX:D=N:T=48698],tp63_XmacENSXMAP00000016461:0.044393[&&NHX:D=N:T=8083])speciation:0.052269[&&NHX:D=N:B=99:T=586240:DD=],tp63_OlatENSORLP00000019616:0.105223[&&NHX:D=N:T=8090])speciation:0.020917[&&NHX:D=N:B=24:T=1489913:DD=],tp63_OnilENSONIP00000024326:0.065197[&&NHX:D=N:T=8128])speciation:0.01928[&&NHX:D=N:T=1489908:B=16:DD=],(tp63_TnigENSTNIP00000016776:0.042973[&&NHX:D=N:T=99883],tp63_TrubENSTRUP00000008025:0.048688[&&NHX:D=N:T=31033])speciation:0.043668[&&NHX:D=N:B=100:T=31031:DD=])speciation:0.020832[&&NHX:D=N:B=77:T=1489872:DD=],(ENSGACG00000013629_GacuENSGACP00000018012:0.069577[&&NHX:D=N:T=69293],ENSGMOG00000000413_GmorENSGMOP00000000401:0.110102[&&NHX:D=N:T=8049])speciation:0.067443[&&NHX:D=N:B=97:T=123368:DD=])duplication:0.040724[&&NHX:DD=Y:B=65:T=123368:D=],(tp63_AmexENSAMXP00000004961:0.092792[&&NHX:D=N:T=7994],tp63_DrerENSDARP00000108362:0.121291[&&NHX:D=N:T=7955])speciation:0.046115[&&NHX:D=N:T=186626:B=86:DD=])speciation:0.034365[&&NHX:D=N:T=186625:B=37:DD=],tp63_LocuENSLOCP00000006202:0.102939[&&NHX:D=N:T=7918])speciation:0.049371[&&NHX:D=N:B=52:T=41665:DD=])speciation:0.110844[&&NHX:D=N:B=0:T=117571:DD=],(((((((((((TP73_LafrENSLAFP00000005892:0.029578[&&NHX:D=N:T=9785],TP73_PcapENSPCAP00000000662:0.051492[&&NHX:D=N:T=9813])speciation:0.003183[&&NHX:D=N:T=311790:B=90:DD=],TP73_EtelENSETEP00000007165:0.095673[&&NHX:D=N:T=9371])speciation:0.033805[&&NHX:D=N:T=311790:B=0:DD=],TP73_DnovENSDNOP00000028722:0.457081[&&NHX:D=N:T=9361])speciation:0.006287[&&NHX:D=N:B=0:T=9347:DD=],((((((((TP73_BtauENSBTAP00000007643:0.009498[&&NHX:D=N:T=9913],TP73_OariENSOARP00000017005:0.019572[&&NHX:D=N:T=9940])speciation:0.012531[&&NHX:D=N:T=9895:B=100:DD=],ENSSSCG00000025685_SscrENSSSCP00000022771:0.057187[&&NHX:D=N:T=9823])speciation:0.018712[&&NHX:D=N:T=91561:B=1:DD=],TP73_TtruENSTTRP00000003223:0.039795[&&NHX:D=N:T=9739])speciation:0.015091[&&NHX:D=N:T=91561:B=0:DD=],(((TP73_AmelENSAMEP00000009745:0.040276[&&NHX:D=N:T=9646],TP73_MpfuENSMPUP00000007349:0.069423[&&NHX:D=N:T=9669])speciation:0.011068[&&NHX:D=N:B=5:T=379584:DD=],TP73_CfamENSCAFP00000028819:0.025289[&&NHX:D=N:T=9615])speciation:0.003214[&&NHX:D=N:B=4:T=379584:DD=],TP73_FcatENSFCAP00000010792:0.059719[&&NHX:D=N:T=9685])speciation:0.021832[&&NHX:D=N:B=20:T=33554:DD=])speciation:0.009094[&&NHX:D=N:T=314145:B=0:DD=],TP73_PvamENSPVAP00000008433:0.078992[&&NHX:D=N:T=132908])speciation:0.005352[&&NHX:D=N:T=314145:B=0:DD=],TP73_EeurENSEEUP00000011975:0.098606[&&NHX:D=N:T=9365])speciation:0.0[&&NHX:D=N:B=0:T=314145:DD=],TP73_EcabENSECAP00000001313:0.038035[&&NHX:D=N:T=9796])speciation:0.007356[&&NHX:D=N:T=314145:B=0:DD=],((((((Trp73_MsspMGP_SPRETEiJ_P0068738:0.0082[&&NHX:D=N:T=10096],Trp73_MmusENSMUSP00000101269:0.011834[&&NHX:D=N:T=10090])speciation:0.027464[&&NHX:D=N:B=100:T=862507:DD=],Tp73_RnorENSRNOP00000052265:0.034464[&&NHX:D=N:T=10116])speciation:0.085459[&&NHX:D=N:T=39107:B=100:DD=],TP73_ItriENSSTOP00000022492:0.061184[&&NHX:D=N:T=43179])speciation:0.008334[&&NHX:D=N:B=2:T=33553:DD=],Trp73_DordENSDORP00000013966:0.076743[&&NHX:D=N:T=10020])speciation:0.0[&&NHX:D=N:T=33553:B=0:DD=],TP73_CporENSCPOP00000009800:0.075508[&&NHX:D=N:T=10141])speciation:0.004958[&&NHX:D=N:T=9989:B=0:DD=],((TP73_MmurENSMICP00000031305:0.033995[&&NHX:D=N:T=30608],TP73_OgarENSOGAP00000005402:0.043894[&&NHX:D=N:T=30611])speciation:0.017054[&&NHX:D=N:T=376911:B=93:DD=],((((((TP73_GgorENSGGOP00000015180:0.00182[&&NHX:D=N:T=9595],TP73_HsapENSP00000367545:0.005775[&&NHX:D=N:T=9606])speciation:0.0[&&NHX:D=N:T=207598:B=92:DD=],TP73_PtroENSPTRP00000000118:0.05274[&&NHX:D=N:T=9598])speciation:0.005412[&&NHX:D=N:B=81:T=207598:DD=],TP73_PabeENSPPYP00000002277:0.013149[&&NHX:D=N:T=9601])speciation:0.000495[&&NHX:D=N:B=30:T=9604:DD=],TP73_NleuENSNLEP00000009887:0.326917[&&NHX:D=N:T=61853])speciation:0.010918[&&NHX:D=N:T=314295:B=0:DD=],((TP73_PanuENSPANP00000007545:0.004788[&&NHX:D=N:T=9555],TP73_CsabENSCSAP00000017283:0.012519[&&NHX:D=N:T=60711])speciation:0.000519[&&NHX:D=N:T=9528:B=86:DD=],TP73_MmulENSMMUP00000040655:0.025402[&&NHX:D=N:T=9544])speciation:0.013713[&&NHX:D=N:B=75:T=9528:DD=])speciation:0.010332[&&NHX:D=N:T=9526:B=0:DD=],TP73_CjacENSCJAP00000005070:0.291972[&&NHX:D=N:T=9483])speciation:0.022859[&&NHX:D=N:B=0:T=314293:DD=])speciation:0.014731[&&NHX:D=N:B=0:T=9443:DD=])speciation:0.020217[&&NHX:D=N:T=314146:B=0:DD=])speciation:0.01086[&&NHX:D=N:T=1437010:B=0:DD=])speciation:0.048685[&&NHX:D=N:T=9347:B=0:DD=],ENSSSCG00000003361_SscrENSSSCP00000003644:0.097446[&&NHX:D=N:T=9823])duplication:0.016508[&&NHX:D=Y:T=9347:B=0],((TP73_MeugENSMEUP00000000705:0.023362[&&NHX:D=N:T=9315],TP73_MdomENSMODP00000008216:0.259151[&&NHX:D=N:T=13616])speciation:0.035881[&&NHX:D=N:B=57:T=9263:DD=],TP73_SharENSSHAP00000006513:0.042193[&&NHX:D=N:T=9305])speciation:0.069704[&&NHX:D=N:T=9263:B=36:DD=])speciation:0.023293[&&NHX:D=N:T=32525:B=2:DD=],TP73_OanaENSOANP00000019815:0.30572[&&NHX:D=N:T=9258])speciation:0.017992[&&NHX:D=N:B=0:T=40674:DD=],(((((TP73_GgalENSGALP00000001485:0.002093[&&NHX:D=N:T=9031],TP73_MgalENSMGAP00000001059:0.036491[&&NHX:D=N:T=9103])speciation:0.047733[&&NHX:D=N:T=9005:B=100:DD=],TP73_AplaENSAPLP00000003415:0.02254[&&NHX:D=N:T=8839])speciation:0.021618[&&NHX:D=N:T=1549675:B=97:DD=],(TP73_TgutENSTGUP00000002829:0.010561[&&NHX:D=N:T=59729],TP73_FalbENSFALP00000010031:0.030208[&&NHX:D=N:T=59894])speciation:0.023763[&&NHX:D=N:T=9126:B=100:DD=])speciation:0.016346[&&NHX:D=N:B=97:T=8825:DD=],TP73_PsinENSPSIP00000004448:0.109544[&&NHX:D=N:T=13735])speciation:0.026517[&&NHX:D=N:T=1329799:B=84:DD=],TP73_AcarENSACAP00000001746:0.128451[&&NHX:D=N:T=28377])speciation:0.019965[&&NHX:D=N:B=67:T=32561:DD=])speciation:0.036745[&&NHX:D=N:T=32524:B=15:DD=],tp73_XtroENSXETP00000010981:0.182635[&&NHX:D=N:T=8364])speciation:0.011019[&&NHX:D=N:B=1:T=32523:DD=],TP73_LchaENSLACP00000021702:0.142378[&&NHX:D=N:T=7897])speciation:0.024057[&&NHX:D=N:B=0:T=8287:DD=],((((((tp73_TnigENSTNIP00000014938:0.027328[&&NHX:D=N:T=99883],tp73_TrubENSTRUP00000038165:0.032469[&&NHX:D=N:T=31033])speciation:0.059199[&&NHX:D=N:T=31031:B=100:DD=],tp73_GacuENSGACP00000008676:0.048591[&&NHX:D=N:T=69293])speciation:0.007086[&&NHX:D=N:T=1489922:B=29:DD=],(((tp73_PforENSPFOP00000010896:0.013197[&&NHX:D=N:T=48698],tp73_XmacENSXMAP00000017403:0.030558[&&NHX:D=N:T=8083])speciation:0.063838[&&NHX:D=N:B=100:T=586240:DD=],tp73_OlatENSORLP00000005521:0.062083[&&NHX:D=N:T=8090])speciation:0.017304[&&NHX:D=N:B=58:T=1489913:DD=],tp73_OnilENSONIP00000002627:0.053778[&&NHX:D=N:T=8128])speciation:0.014746[&&NHX:D=N:T=1489908:B=29:DD=])speciation:0.072637[&&NHX:D=N:B=14:T=1489872:DD=],tp73_GmorENSGMOP00000016675:0.181445[&&NHX:D=N:T=8049])speciation:0.038065[&&NHX:D=N:T=123368:B=98:DD=],(tp73_AmexENSAMXP00000014358:0.086906[&&NHX:D=N:T=7994],tp73_DrerENSDARP00000109674:0.134572[&&NHX:D=N:T=7955])speciation:0.064476[&&NHX:D=N:T=186626:B=100:DD=])speciation:0.04364[&&NHX:D=N:T=186625:B=43:DD=],tp73_LocuENSLOCP00000006343:0.115822[&&NHX:D=N:T=7918])speciation:0.046704[&&NHX:D=N:T=41665:B=14:DD=])speciation:0.167736[&&NHX:D=N:T=117571:B=27:DD=])duplication:0.067299[&&NHX:D=Y:B=0:T=117571],tp63_PmarENSPMAP00000007639:0.797694[&&NHX:D=N:T=7757])speciation:0.076045[&&NHX:D=N:T=7742:B=0:DD=],(('p53/p73-b CintENSCINP00000004447':0.450754[&&NHX:D=N:T=7719],ENSCSAVG00000009788_CsavENSCSAVP00000016659:0.47517[&&NHX:D=N:T=51511])speciation:0.378426[&&NHX:D=N:B=100:T=7718:DD=],(ENSCING00000001960_CintENSCINP00000003956:0.141945[&&NHX:D=N:T=7719],ENSCSAVG00000009964_CsavENSCSAVP00000016940:0.26284[&&NHX:D=N:T=51511])speciation:0.525939[&&NHX:D=N:T=7718:B=100:DD=])duplication:0.603292[&&NHX:D=Y:B=100:T=7718])duplication:0.0[&&NHX:D=N:T=7711:B=0:DD=];\",\n }\n\n // this make able the corner placement for all UI elements inside\n this.container_d3.style('position', 'relative')\n\n // remove previous placeholder & UI\n this.container_d3.selectAll(\".corner_placeholder\").remove()\n this.container_d3.selectAll(\".modal_data\").remove()\n this.remove_scale()\n this.remove_all_color_legend()\n this.container_d3.selectAll(\".menu_settings\").remove()\n this.container_d3.selectAll(\".empty_message\").remove()\n this.container_d3.select('#histogram-legend').remove();\n\n // remove old meta modal with document. function\n document.querySelectorAll('#modal_meta_' + this.container_object.uid).forEach((el) => { el.remove() })\n document.querySelectorAll('#exampleModal' + this.container_object.uid).forEach((el) => { el.remove() })\n\n this.container_d3.select(\"#menu-node\").remove()\n\n/*\n if (phylo.phylo_embedded && !empty_mode){\n\n tooltip_object[0].hide()\n tooltip_object[3].hide()\n\n\n }\n\n\n */\n\n\n if (empty_mode){\n this.top_left = this.add_top_left_container()\n this.add_data_icon()\n this.add_empty_message()\n return\n }\n\n // Create corner placeholder for UI elements\n this.bottom_left = this.add_bottom_left_container()\n this.bottom_right = this.add_bottom_right_container()\n this.top_left = this.add_top_left_container()\n this.top_right = this.add_top_right_container()\n\n // BOTTOM LEFT\n if (this.viewer.model.settings.use_branch_lenght) {\n this.scale_text = this.add_scale()\n }\n this.loader = this.bottom_left.append('text').style('color', 'red').style('font-size', 'small')\n if (this.container_object.message_loader){\n this.update_loader_message()\n }\n //this.add_root_badge()\n\n // BOTTOM RIGHT\n\n if (this.viewer.model.big_tree){\n this.add_rescale_zoom()\n }\n this.add_maximise()\n this.add_fit_height()\n this.add_zoom()\n\n // TOP LEFT\n if (!this.api.settings.phylostratigraphy) {\n if (this.container_object.models.length > 0) {\n this.add_toggle()\n }\n this.add_data_icon()\n }\n\n // TOP RIGHT\n this.add_search()\n this.add_export()\n this.add_meta()\n this.add_settings()\n this.add_undo()\n this.add_redo()\n\n\n\n // COLOR LEGEND\n if (this.api.settings.compareMode || (this.viewer.model.settings.style.color_accessor['node'] !== null && this.viewer.model.settings.style.color_accessor['node'] !== 'Topology' )){\n this.add_color_legend('node')\n }\n\n\n if (this.viewer.model.settings.style.color_accessor['leaf'] !== null && !this.viewer.model.settings.sync_coloring){\n\n this.viewer.model.set_color_scale('leaf', this.api)\n this.add_color_legend('leaf')\n }\n\n if (this.viewer.model.settings.style.color_accessor['circle'] !== null){\n\n this.viewer.model.set_color_scale('circle', this.api)\n this.add_color_legend('circle')\n }\n\n // Add Stack\n if (this.viewer.model.settings.has_histogram_data && this.viewer.model.settings.show_histogram){\n\n this.add_histogram_legend();\n\n }\n\n }\n\n // MODAL\n\n add_modal_edit_label(node, type){\n\n var mod_html = `\n <div class=\"modal\" id=\"exampleModal_edit\" tabindex=\"-1\">\n <div class=\"modal-dialog modal-dialog-centered modal-lg\">\n <div class=\"modal-content\">\n \n <div class=\"modal-header\" style=\"height: 128px;border:none !important\">\n <h3 class=\"modal-title\" id=\"exampleModalLabel\" style=\"margin: auto; text-align: center\">\n <b>Edit Label</b> <br>\n \n \n </h3>\n \n </div>\n \n <div class=\"modal-body\" style=\"background-color: #f8f9fa; padding: 24px 48px;\">\n \n \n \n <input type=\"text\" id=\"inputPassword6\" class=\"form-control mx-sm-3\" value=\"123456789\">\n \n \n \n \n \n </div>\n \n \n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-primary\" id=\"edit_modal_save\">Save changes</button>\n <button type=\"button\" class=\"btn btn-secondary\" id=\"edit_modal_close\" data-dismiss=\"modal\">Close</button>\n </div>\n \n \n </div>\n\n </div>\n </div>\n </div>\n`\n\n if (type == 'Default' || type == false){\n mod_html = mod_html.replace('123456789', node.data.name)\n }\n else{\n mod_html = mod_html.replace('123456789', node.data.extended_informations[type])\n }\n\n document.getElementById(this.container_object.div_id).insertAdjacentHTML('afterend',mod_html)\n\n document.getElementById('edit_modal_save').addEventListener('click', () => {\n\n\n if (type == 'Default' || type == false){\n node.data.name = document.getElementById('inputPassword6').value;\n }\n else{\n node.data.extended_informations[type] = document.getElementById('inputPassword6').value;\n }\n\n\n\n this.viewer.build_d3_cluster()\n this.viewer.render(node)\n\n document.getElementById('exampleModal_edit').remove()\n document.getElementsByClassName('modal-backdrop')[0].remove()\n\n })\n\n\n document.getElementById('edit_modal_close').addEventListener('click', () => {\n document.getElementById('exampleModal_edit').remove();\n document.getElementsByClassName('modal-backdrop')[0].remove()\n })\n\n\n }\n\n // PLACEHOLDER\n add_bottom_left_container() {\n return this.container_d3.append(\"div\")\n .attr(\"class\",\"corner_placeholder bottom left\")\n .style(\"flex-direction\", \"column\")\n }\n add_bottom_right_container(){\n return this.container_d3.append(\"div\")\n .attr(\"class\",\"corner_placeholder bottom right\")\n .style(\"flex-direction\", \"column\")\n .style( \"align-items\", \"flex-end\")\n }\n add_top_left_container(){\n return this.container_d3.append(\"div\")\n .attr(\"class\",\"corner_placeholder top left\")\n }\n add_top_right_container(){\n var div = this.container_d3.append(\"div\").attr(\"class\",\"corner_placeholder top right\")\n .style(\"flex-direction\",'column')\n .style(\"align-items\",'end')\n\n this.tr_buttons = div.append(\"div\").attr(\"class\",\"tr-button\").style(\"display\",'flex')\n\n this.tr_menus = div.append(\"div\").attr(\"class\",\"tr-menus\")\n\n return div\n }\n\n update_loader_message(){\n this.loader.text(this.container_object.message_loader)\n }\n\n\n add_histogram_legend() {\n\n\n d3__WEBPACK_IMPORTED_MODULE_1__.select('#histogram-legend').remove();\n\n var width = 230;\n var height = 80;\n var svgHeight = height + 25;\n var legendRectSize = 20;\n var left_margin = 25;\n var top_margin = 50;\n\n if (this.api.settings.phylostratigraphy){\n top_margin = 25;\n }\n\n var legendTxtSize = 13;\n // center text in the middle of the legend colored rectangle, rounding it to smaller Y-value\n var legendTxtYPadding = (legendRectSize + legendTxtSize) / 2\n\n if(this.viewer.model.settings.stack.type == \"genes\"){\n var dataLabels = [\"Gained\", \"Duplicated\", \"Retained\", \"Lost\" ]\n } else {\n var dataLabels = [\"Gains\", \"Duplications\", \"Losses\" ]\n }\n\n // to position legends correctly\n var rects = dataLabels.length - 1;\n\n\n var legendSvg = this.viewer.svg.append(\"svg\")\n .attr(\"id\", \"histogram-legend\")\n .attr(\"x\", left_margin)\n .attr(\"y\", top_margin)\n .attr(\"width\", width + \"px\")\n .attr(\"height\", svgHeight + \"px\")\n .append(\"g\")\n\n\n legendSvg.append(\"line\")\n .attr(\"x1\", 0)\n .attr(\"y1\", rects * legendRectSize)\n .attr(\"x2\", 200)\n .attr(\"y2\", rects * legendRectSize)\n .attr(\"class\", \"divline\")\n .attr(\"stroke-width\", 2)\n .attr(\"stroke\", \"black\");\n\n legendSvg.selectAll('rect')\n .data(dataLabels)\n .enter()\n .append('rect')\n .attr('x', 110)\n .attr('y', function(d, i){\n return i * legendRectSize;\n })\n .attr('width', legendRectSize)\n .attr('height', legendRectSize)\n .attr('fill', (d, i, node) => {\n return this.viewer.settings.stack.colorMap[d];\n });\n\n legendSvg.selectAll('text')\n .data(dataLabels)\n .enter()\n .append('text')\n .text(function(d){\n return d;\n })\n .attr('x', 110 + legendRectSize + 5)\n .attr('y', function(d, i){\n return i * legendRectSize + legendTxtYPadding;\n })\n .attr('text-anchor', 'start')\n .attr('alignment-baseline', 'baseline')\n .attr(\"font-size\", legendTxtSize).attr(\"stroke\", \"black\");\n\n\n legendSvg\n .append('text')\n .attr(\"class\", \"legendGeneTotal\")\n .text(\"Total # of \"+this.viewer.model.settings.stack.type)\n .attr('x', 0)\n .attr('y', rects * legendRectSize - 5)\n .attr('text-anchor', 'start')\n .attr(\"font-size\", legendTxtSize).attr(\"stroke\", \"black\");\n\n d3__WEBPACK_IMPORTED_MODULE_1__.selectAll(\".legendGeneTotal\").moveToFront();\n\n }\n\n // DATA ICON\n\n get_modal_adder_corpus(){\n return `\n \n <div class=\"container-fluid\">\n \n <div class=\"card\">\n \n <div class=\"card-body\">\n \n <h5> <b>Step 1: Add data from text or file</b> </h5>\n \n \n <div class=\"row\" style=\" margin-left: 24px\">\n <div class=\"col\" >\n <textarea class=\"form-control\" placeholder=\"Paste or type your tree here\" id=\"exampleFormControlTextarea1s\" rows=\"3\"></textarea>\n\n\n </div>\n <div class=\"col-1 my-auto \"><p class=\"align-middle\" style=\"margin: 0px;\"><b>OR</b></p></div>\n <div class=\"col my-auto\">\n\n <div class=\"input-group mb-3\" style=\"padding-left: 24px;\">\n <input class=\"form-control\" type=\"file\" id=\"add_tree_file_input\"> <div class=\"input-group-append\">\n </div>\n </div>\n\n\n </div>\n </div>\n\n <div class=\"row\" style=\"margin-left: 24px\">\n <div class=\"col\" >\n <h6 class=\"card-subtitle mb-2 text-muted\" style=\"margin-top: 6px\"><small>Example: <a href=\"#\" class=\"t1\">tree #1</a>, <a href=\"#\" class=\"t2\">tree #2</a>, <a href=\"#\" class=\"tbig\">big tree</a>, <a href=\"#\" class=\"nhx_ex\">Extended Newick</a>.</small></h6>\n </div>\n </div>\n \n </div>\n\n \n </div>\n \n <br>\n \n <div class=\"card\">\n \n <div class=\"card-body\">\n \n <h5> <b>Step 2: Choose tree data format </b> </h5>\n \n \n <div class=\"text-center\">\n\n <select class=\"custom-select\" id=\"add_tree_str_select\" style=\"margin-left: 24px;\">\n <option selected value=\"newick\">Newick</option>\n <option value=\"nhx\">Extended Newick</option>\n <option value=\"phyloxml\">PhyloXML</option>\n </select>\n\n\n </div>\n \n <div class=\"form-check\" style=\"padding: 12px 48px 0;\">\n <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"internal_for_branch\" >\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\n Use internal label for branches (e.g. boostrap values)\n </label>\n </div>\n \n \n \n </div>\n\n \n </div>\n \n <br>\n \n \n \n <div class=\"card\">\n <div class=\"card-body\">\n <div style=\"cursor: pointer;\" id=\"toggleStep3\">\n <h5>\n <b>Step 3 (Optional): Add a mapping file</b>\n <a href=\"#\" id=\"menu_help_add_tree\">\n <i class=\"bi-question-circle\"></i>\n </a>\n <i class=\"bi-caret-down float-end\" id=\"caretStep3\"></i>\n <small class=\"float-end\" id=\"expandStep3\">Expand</small>\n </h5>\n </div>\n <br>\n <div id=\"collapseStep3\" style=\"display: none;\">\n STEP3__\n </div>\n </div>\n</div>\n \n <br>\n \n <div style=\"margin: auto; width: fit-content;\">\n \n \n <button type=\"button\" class=\"btn btn-danger\" data-bs-dismiss=\"modal\">Cancel</button>\n <button type=\"button\" id=\"modal_add_tree_final_button\" class=\"btn btn-success\" data-bs-dismiss=\"modal\" >Upload tree</button>\n \n </div>\n \n </div>\n \n \n \n `\n\n\n }\n\n add_data_icon() {\n\n this.container_d3.select(\"#exampleModal\" + this.container_object.uid).remove()\n\n var b = this.top_left.append('button')\n .attr('class', ' dashed_button')\n .attr('id', 'buttonmodal_' + this.container_object.div_id)\n .attr('data-bs-toggle', 'modal')\n .attr('data-bs-target', '#exampleModal' + this.container_object.uid)\n .attr('data-bs-placement', 'right')\n .attr('title', 'Add a new tree')\n .append(\"div\")\n .attr(\"class\", \"label\")\n\n b.html(\" <i class='bi bi-plus' style='color:#888'></i> Add tree\")\n\n let mod_html = this.get_modal_template()\n\n mod_html = mod_html.replace('TEMPLATE_CORPUS', this.get_modal_adder_corpus())\n mod_html = mod_html.replace('TITLE_', 'Upload your tree')\n mod_html = mod_html.replace('SUB_TITLE_', '')\n mod_html = mod_html.replace('STEP3__', this.get_modal_meta_corpus())\n\n\n mod_html = mod_html.replace('exampleFormControlTextarea1s', 'exampleFormControlTextarea1s' + this.container_object.uid)\n mod_html = mod_html.replace('add_tree_file_input', 'add_tree_file_input' + this.container_object.uid)\n mod_html = mod_html.replace('exampleModal', 'exampleModal' + this.container_object.uid)\n mod_html = mod_html.replace('add_tree_str_select', 'add_tree_str_select' + this.container_object.uid)\n mod_html = mod_html.replace('internal_for_branch', 'internal_for_branch' + this.container_object.uid)\n mod_html = mod_html.replace('modal_add_tree_final_button', 'modal_add_tree_final_button' + this.container_object.uid)\n mod_html = mod_html.replace('upload_mapping_close', 'upload_mapping_close' + this.container_object.uid)\n mod_html = mod_html.replace('upload_mapping_validation', 'upload_mapping_validation' + this.container_object.uid)\n\n // META CORPUS\n\n mod_html = mod_html.replaceAll('add_meta_file_input', 'tree_adder_modal_add_mapping_file_input' + this.container_object.uid)\n mod_html = mod_html.replace('mod_meta_card2', 'tree_adder_mod_meta_card2_' + this.container_object.uid)\n mod_html = mod_html.replace('mod_meta_card3', 'tree_adder_mod_meta_card3_' + this.container_object.uid)\n mod_html = mod_html.replace('mod_meta_card2_radio', 'tree_adder_mod_meta_card2_radio' + this.container_object.uid)\n\n mod_html = mod_html.replace('flexCheckChecked', 'tree_adder_flexCheckChecked' + this.container_object.uid)\n mod_html = mod_html.replace('flexCheckDefault', 'tree_adder_flexCheckDefault' + this.container_object.uid)\n\n mod_html = mod_html.replace('mapping_check_nodes', 'tree_adder_mapping_check_nodes' + this.container_object.uid)\n mod_html = mod_html.replace('mapping_check_leaf', 'tree_adder_mapping_check_leaf' + this.container_object.uid)\n mod_html = mod_html.replace('mapping_apply_to_all', 'tree_adder_mapping_apply_to_all' + this.container_object.uid)\n\n\n mod_html = mod_html.replaceAll('add_mapping_ref_select', 'add_mapping_ref_select' + this.container_object.uid)\n\n mod_html = mod_html.replace('collapseStep3', 'collapse3' + this.container_object.uid)\n mod_html = mod_html.replace('toggleStep3', 'toggle3' + this.container_object.uid)\n mod_html = mod_html.replace('caretStep3', 'caret3' + this.container_object.uid)\n mod_html = mod_html.replace('expandStep3', 'expand3' + this.container_object.uid)\n\n\n document.getElementById(this.container_object.div_id).insertAdjacentHTML('afterend', mod_html)\n\n // Add code for the toggle functionality\n\n const toggleElement = document.getElementById('toggle3' + this.container_object.uid);\n const contentElement = document.getElementById('collapse3' + this.container_object.uid);\n const caretElement = document.getElementById('caret3' + this.container_object.uid);\n const expandTextElement = document.getElementById('expand3' + this.container_object.uid);\n\n toggleElement.addEventListener('click', () => {\n const isHidden = contentElement.style.display === 'none';\n contentElement.style.display = isHidden ? 'block' : 'none';\n caretElement.className = isHidden ? 'bi-caret-up float-end' : 'bi-caret-down float-end';\n expandTextElement.textContent = isHidden ? 'Collapse' : 'Expand';\n });\n\n\n\n var modmod = document.getElementById('exampleModal' + this.container_object.uid);\n\n var thaty = this\n\n const add_tree_helpers = function (container_object, str, format, mapping) {\n\n var mapping = (typeof mapping == 'undefined') ? false : mapping;\n\n container_object.add_tree(str, {'data_type': format})\n container_object.current_model = container_object.models.length - 1\n\n // check if internal_for_branch is checked or not and setup default_internal_label_is_for_branch\n\n if (document.getElementById('internal_for_branch' + container_object.uid).checked) {\n container_object.models[container_object.current_model].settings.edge_related_data.push('Data');\n }\n\n if (mapping !== false) {\n\n if (mapping.parameters.apply_to_all) {\n\n // apply add_meta_leaves to all models in the container\n container_object.models.forEach((model) => {\n\n model.settings.use_meta_for_leaf = mapping.parameters.use_meta_for_leaf\n model.settings.use_meta_for_node = mapping.parameters.use_meta_for_node\n\n if (mapping.parameters.use_meta_for_leaf) {\n model.add_meta_leaves(mapping.meta, mapping.parameters.headers, container_object.api, mapping.parameters.reference)\n }\n if (mapping.parameters.use_meta_for_node) {\n model.add_meta_nodes(mapping.meta, mapping.parameters.headers, container_object.api, mapping.parameters.reference)\n }\n\n\n })\n\n }\n else {\n\n let moddy = container_object.models[container_object.current_model]\n\n moddy.settings.use_meta_for_leaf = mapping.parameters.use_meta_for_leaf\n moddy.settings.use_meta_for_node = mapping.parameters.use_meta_for_node\n\n if (moddy.settings.use_meta_for_leaf) {\n moddy.add_meta_leaves(mapping.meta, mapping.parameters.headers, container_object.api, mapping.parameters.reference)\n }\n\n if (moddy.settings.use_meta_for_node) {\n moddy.add_meta_nodes(mapping.meta, mapping.parameters.headers, container_object.api, mapping.parameters.reference)\n }\n\n\n }\n\n\n }\n\n\n document.querySelector('#exampleModal' + container_object.uid).style.display = 'none'\n document.querySelectorAll('.modal-backdrop').forEach(elem => {\n elem.parentNode.removeChild(elem);\n });\n container_object.viewer.set_data(container_object.models[container_object.current_model]);\n container_object.api.stop_all_workers()\n container_object.compute_topology_and_render_bounded_viewer()\n container_object.viewer.render(container_object.viewer.hierarchy);\n //container_object.viewer.update_collapse_level(container_object.models[container_object.current_model].settings.collapse_level)\n\n if (mapping) {\n thaty.open_color_settings()\n }\n\n\n if (thaty.api.settings.compute_distance && thaty.api.bound_container.includes(thaty)) {\n thaty.api.send_worker_distance()\n }\n }\n\n const add_data_from_modal = (format) => {\n\n // mapping information\n var mapping_file = document.getElementById('tree_adder_modal_add_mapping_file_input' + that.container_object.uid).files[0];\n\n\n let s = document.getElementById(\"exampleFormControlTextarea1s\" + this.container_object.uid).value\n\n if (s.length > 0) {\n\n if (mapping_file) {\n\n var parameters = that.get_mapping_parameter_from_UI(true)\n\n\n const reader = new FileReader();\n\n reader.addEventListener('load', (event) => {\n\n var meta = []\n var ref_id = parameters.reference\n\n if (mapping_file.name.split('.').pop() == 'tsv') {\n d3__WEBPACK_IMPORTED_MODULE_1__.tsvParse(event.target.result, (d) => {\n meta[d[ref_id]] = d\n });\n } else {\n d3__WEBPACK_IMPORTED_MODULE_1__.csvParse(event.target.result, (d) => {\n meta[d[ref_id]] = d\n });\n }\n\n\n add_tree_helpers(this.container_object, s, format, {'meta': meta, 'parameters': parameters})\n return\n\n\n });\n reader.readAsText(mapping_file);\n\n\n } else {\n add_tree_helpers(this.container_object, s, format)\n return\n }\n\n\n }\n\n var file = document.getElementById('add_tree_file_input' + this.container_object.uid).files[0];\n\n if (file) {\n var reader = new FileReader();\n reader.readAsText(file, \"UTF-8\");\n reader.onload = (evt) => {\n\n if (mapping_file) {\n var parameters = that.get_mapping_parameter_from_UI(true)\n\n const reader = new FileReader();\n\n reader.addEventListener('load', (event) => {\n\n var meta = []\n\n var ref_id = parameters.reference\n\n\n if (mapping_file.name.split('.').pop() == 'tsv') {\n d3__WEBPACK_IMPORTED_MODULE_1__.tsvParse(event.target.result, (d) => {\n meta[d[ref_id]] = d\n });\n } else {\n d3__WEBPACK_IMPORTED_MODULE_1__.csvParse(event.target.result, (d) => {\n meta[d[ref_id]] = d\n });\n }\n\n add_tree_helpers(this.container_object, evt.target.result, format, {\n 'meta': meta,\n 'parameters': parameters\n })\n return\n\n\n });\n reader.readAsText(mapping_file);\n\n\n } else {\n add_tree_helpers(this.container_object, evt.target.result, format)\n return\n }\n\n\n }\n reader.onerror = function (evt) {\n console.log(\"error reading file\")\n }\n }\n\n\n }\n\n document.getElementById('modal_add_tree_final_button' + this.container_object.uid).onclick = () => {\n\n\n var e = document.getElementById('add_tree_str_select' + this.container_object.uid);\n\n add_data_from_modal(e.value)\n }\n\n modmod.getElementsByClassName('t1')[0].onclick = () => {\n document.getElementById(\"exampleFormControlTextarea1s\" + this.container_object.uid).value = this.examples.small1\n document.getElementById('add_tree_str_select' + this.container_object.uid).value = 'newick'\n };\n\n modmod.getElementsByClassName('t1')[0].onclick = () => {\n document.getElementById(\"exampleFormControlTextarea1s\" + this.container_object.uid).value = this.examples.small1\n document.getElementById('add_tree_str_select' + this.container_object.uid).value = 'newick'\n };\n\n modmod.getElementsByClassName('t2')[0].onclick = () => {\n document.getElementById(\"exampleFormControlTextarea1s\" + this.container_object.uid).value = this.examples.small2\n document.getElementById('add_tree_str_select' + this.container_object.uid).value = 'newick'\n };\n\n modmod.getElementsByClassName('tbig')[0].onclick = () => {\n document.getElementById(\"exampleFormControlTextarea1s\" + this.container_object.uid).value = this.examples.big\n document.getElementById('add_tree_str_select' + this.container_object.uid).value = 'newick'\n };\n\n modmod.getElementsByClassName('nhx_ex')[0].onclick = () => {\n document.getElementById(\"exampleFormControlTextarea1s\" + this.container_object.uid).value = this.examples.nhx\n document.getElementById('add_tree_str_select' + this.container_object.uid).value = 'nhx'\n };\n\n\n // META DATA UPLOADER\n document.getElementById('upload_mapping_validation' + this.container_object.uid).style.display = 'none'\n document.getElementById('upload_mapping_close' + this.container_object.uid).style.display = 'none'\n\n\n var x = modmod.getElementsByClassName('card')\n for (var i = 0; i < x.length; i++) {\n x[i].style.border = 'none';\n }\n\n // Add JS for modal corpus\n var that = this\n\n document.getElementById('tree_adder_modal_add_mapping_file_input' + this.container_object.uid).onchange = function () {\n let input = this.files[0];\n\n if (input) {\n\n document.getElementById('tree_adder_mod_meta_card2_' + that.container_object.uid).style.display = 'block'\n document.getElementById('tree_adder_mod_meta_card3_' + that.container_object.uid).style.display = 'block'\n\n var reader = new FileReader();\n var data;\n\n reader.addEventListener(\"load\", parseFile, false);\n reader.readAsText(input);\n\n function parseFile() {\n\n // load data\n if (input.name.split('.').pop() == 'tsv') {\n data = d3__WEBPACK_IMPORTED_MODULE_1__.tsvParse(reader.result, function (d) {\n return d;\n });\n } else {\n\n data = d3__WEBPACK_IMPORTED_MODULE_1__.csvParse(reader.result, function (d) {\n return d;\n });\n\n }\n\n\n // Get columns + types\n var numerisator = {}\n numerisator['id'] = 'cat'\n data['columns'].forEach((currentElement) => {\n if (currentElement != 'id') {\n numerisator[currentElement] = 'num'\n }\n })\n data.forEach((currentElement) => {\n for (var key of Object.keys(numerisator)) {\n if (isNaN(currentElement[key])) {\n numerisator[key] = 'cat'\n }\n }\n })\n\n\n // Add columns to select\n var select = document.getElementById('add_mapping_ref_select' + that.container_object.uid)\n select.innerHTML = '';\n\n for (var key of Object.keys(numerisator)) {\n var opt = document.createElement('option');\n opt.value = key;\n opt.innerHTML = key;\n select.appendChild(opt);\n }\n\n\n // creates radios\n var radio_container = document.getElementById('tree_adder_mod_meta_card2_radio' + that.container_object.uid)\n radio_container.innerHTML = '';\n\n var get_el = function () {\n return `\n \n <div style = \"padding: 12px 24px 0;\"> <span><b style = \"margin-right: 12px\" > Column: </b> \"NAME_\"</span> <br>\n\n <div class=\"form-check \" style=\"margin-left: 24px\" >\n <input class=\"form-check-input \" name=\"flexRadioDefault\" type=\"radio\" value=\"num\" id=\"RADIO_1\" ATTR_NUM>\n <label class=\"form-check-label\" for=\"RADIO_1\">\n Numerical\n </label>\n </div>\n \n <div class=\"form-check \" style=\"margin-left: 24px\" >\n <input class=\"form-check-input\" name=\"flexRadioDefault\" type=\"radio\" value=\"cat\" id=\"RADIO_2\" ATTR_CAT>\n <label class=\"form-check-label\" for=\"RADIO_2\">\n Categorical\n </label>\n </div>\n \n <div class=\"form-check\" style=\"margin-left: 24px\">\n <input class=\"form-check-input\" name=\"flexRadioDefault\" type=\"radio\" value=\"color\" id=\"RADIO_3\" ATTR_COLOR>\n <label class=\"form-check-label\" for=\"RADIO_3\">\n Color\n </label>\n </div>\n \n \n \n \n \n \n \n </div>\n `\n }\n\n // clean potential old radiobox\n\n for (var key of Object.keys(numerisator)) {\n\n var rad = get_el()\n\n\n rad = rad.replace('NAME_', key)\n rad = rad.replaceAll('flexRadioDefault', 'tree_adder_flexRadioDefault_' + key + that.container_object.uid)\n rad = rad.replace('RADIO_1', that.container_object.uid + 'mapping_header_radiotree_adder_1' + '__' + key)\n rad = rad.replace('RADIO_2', that.container_object.uid + 'mapping_header_radiotree_adder_2' + '__' + key)\n rad = rad.replace('RADIO_3', that.container_object.uid + 'mapping_header_radiotree_adder_3' + '__' + key)\n\n\n if (numerisator[key] == 'num') {\n rad = rad.replace('ATTR_NUM', 'checked')\n rad = rad.replace('ATTR_CAT', '')\n rad = rad.replace('ATTR_COLOR', '')\n }\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_3__.check_if_color)(key)) {\n rad = rad.replace('ATTR_NUM', '')\n rad = rad.replace('ATTR_CAT', '')\n rad = rad.replace('ATTR_COLOR', 'checked')\n } else {\n rad = rad.replace('ATTR_NUM', 'disabled')\n rad = rad.replace('ATTR_CAT', 'checked')\n rad = rad.replace('ATTR_COLOR', '')\n }\n\n\n radio_container.insertAdjacentHTML('beforeend', rad)\n\n }\n radio_container.insertAdjacentHTML('beforeend', '<br>')\n\n }\n\n }\n\n };\n\n document.getElementById(\"menu_help_add_tree\").onclick = function () {\n $('#modal_help').modal('show');\n\n };\n\n\n }\n\n get_modal_template() {\n return `\n <div class=\"modal\" id=\"exampleModal\" tabindex=\"-1\">\n <div class=\"modal-dialog modal-dialog-centered modal-lg\">\n <div class=\"modal-content\">\n \n <div class=\"modal-header\" style=\"height: 128px;border:none !important\">\n <h3 class=\"modal-title\" id=\"exampleModalLabel\" style=\"margin: auto; text-align: center\">\n <b>TITLE_</b> <br>\n \n <small style=\"color:grey\">\n SUB_TITLE_\n </small>\n </h3>\n \n </div>\n \n <div class=\"modal-body\" style=\"background-color: #f8f9fa; padding: 24px 48px;\">\n \n \n TEMPLATE_CORPUS\n \n </div>\n \n \n </div>\n\n </div>\n </div>\n </div>\n`\n }\n\n open_color_settings(){\n document.getElementsByClassName('menu_settings')[0].style.display = 'block'\n document.getElementById('accordion_color' + this.container_object.uid).click()\n }\n\n\n\n // TOGGLE\n add_toggle(){\n var sub_div = this.top_left.append(\"div\")\n .style( \"display\", \"flex\")\n .style('margin', '2px')\n\n\n var butty_putty = sub_div.append('button')\n .on('click', d => {return this.container_object.shift_model(-1)})\n .attr('class', ' square_button')\n .attr('id', 'buttontoggleleft_' + this.container_object.div_id )\n .attr('data-bs-placement', 'bottom')\n .attr('title', 'Load previous tree')\n\n\n butty_putty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', ' bi bi-chevron-left ')\n\n butty_putty.append('p')\n .text('Previous')\n .style('font-size', 'xx-small')\n\n this.tooltip_shiftleft = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('buttontoggleleft_' + this.container_object.div_id))\n\n\n\n var stoggle = sub_div.append('div')\n .attr('class', ' square_button screen_toggle')\n .style('min-width', '92px')\n .style('display', 'flex')\n .style('align-items', 'center')\n .style('width', 'auto')\n\n\n var sd = stoggle.append('div')\n\n\n\n\n sd.append(\"div\")\n .style('cursor', 'text')\n .attr('id', 'input_edit_name'+ this.container_object.uid)\n .attr(\"contenteditable\",\"true\")\n .attr(\"class\",\"label\")\n .style('display', 'inline')\n .text(this.viewer.model.settings.name)\n\n\n\n var ol = sd.append(\"ul\").attr('class', \"progress-indicator\" )\n .style('width', 'auto')\n .style('min-width', \"50px\")\n\n for (var i = 0; i < this.container_object.models.length; i++) {\n\n let li = ol.append('li')\n\n if (i == this.container_object.current_model){\n\n li.attr('class','completed' )\n\n }\n\n li.append('span')\n .attr('class','bubble' )\n\n }\n\n\n sub_div.append('button')\n .attr('class', 'square_button')\n .attr('id', 'button_edit_name_check'+ this.container_object.uid)\n .append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#fff')\n .attr('class', ' bi bi-check ')\n\n sub_div.append('button')\n .attr('class', 'square_button button_edit_name')\n .attr('id', 'button_edit_name_trash'+ this.container_object.uid)\n .append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#fff')\n .attr('class', ' bi bi-trash ')\n\n\n var butty_putty = sub_div.append('button')\n .attr('class', ' square_button')\n .on('click', d => { return this.container_object.shift_model(1)})\n .attr('id', 'buttonshiftright_' + this.container_object.div_id )\n .attr('data-bs-placement', 'bottom')\n .attr('title', 'Load next tree')\n\n\n butty_putty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', ' bi bi-chevron-right ')\n\n butty_putty.append('p')\n .text('Next')\n .style('font-size', 'xx-small')\n\n this.tooltip_shiftright = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('buttonshiftright_' + this.container_object.div_id))\n\n\n\n // bind events and action to editable div\n\n var edit_name = document.querySelector('#input_edit_name'+ this.container_object.uid);\n var edit_name_ok = document.querySelector('#button_edit_name_check'+ this.container_object.uid);\n var edit_name_trash = document.querySelector('#button_edit_name_trash'+ this.container_object.uid);\n\n edit_name.addEventListener(\"keypress\", (e) => {\n if (e.which == 13) {\n event.preventDefault();\n edit_name_ok.style.display = 'none';\n edit_name_trash.style.display = 'none';\n var old_name = this.viewer.model.get_name()\n\n var undo = {'name': 'Rename tree', 'fonction_obj': this.viewer.model, 'fonct': this.viewer.model.set_name, 'argu': [old_name]}\n var redo = {'name': 'Rename tree', 'fonction_obj': this.viewer.model, 'fonct': this.viewer.model.set_name, 'argu': [edit_name.textContent]}\n this.container_object.add_action(undo, redo, true)\n\n this.viewer.model.set_name(edit_name.textContent)\n return false;\n }\n\n\n //You can add delete key event code as well over here for windows users.\n //if(edit_name.textContent.length === 40 && e.keyCode != 8) {\n // e.preventDefault();\n //}\n });\n\n edit_name.addEventListener('focus', (event) => {\n edit_name_ok.style.display = 'inline';\n edit_name_trash.style.display = 'inline';\n });\n\n edit_name.addEventListener('blur', (event) => {\n setTimeout(() => {\n edit_name_ok.style.display = 'none';\n edit_name_trash.style.display = 'none';\n edit_name.textContent = this.viewer.model.get_name()\n }, 300);\n\n });\n\n\n edit_name_trash.addEventListener('click', (event) => {\n this.container_object.remove_current_tree(true)\n\n });\n\n edit_name_ok.addEventListener('click', (event) => {\n var old_name = this.viewer.model.get_name()\n\n var undo = {'name': 'Rename tree', 'fonction_obj': this.viewer.model, 'fonct': this.viewer.model.set_name, 'argu': [old_name]}\n var redo = {'name': 'Rename tree', 'fonction_obj': this.viewer.model, 'fonct': this.viewer.model.set_name, 'argu': [edit_name.textContent]}\n this.container_object.add_action(undo, redo, true)\n\n this.viewer.model.set_name(edit_name.textContent)\n\n });\n\n\n\n\n }\n\n add_rescale_zoom(){\n\n var butty_putty = this.bottom_right.append('button')\n .on('click', d => {\n\n this.viewer.force_zoom_rescaling = true;\n this.viewer.zoomed( {'transform':this.viewer.d3.zoomTransform(this.viewer.svg.node())});\n this.viewer.force_zoom_rescaling = false;\n })\n .attr('class', ' square_button')\n .attr('id', 'buttonscaleviewer_' + this.container_object.div_id )\n .attr('data-bs-placement', 'left')\n .attr('title', 'Optimise text size')\n .style('margin', '2px')\n\n\n butty_putty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', ' bi bi-fonts ')\n\n butty_putty.append('p')\n .text('Optimise text')\n .style('font-size', 'xx-small')\n .style('line-height', 'normal')\n\n\n this.tooltip_fitviewer = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('buttonscaleviewer_' + this.container_object.div_id))\n\n }\n\n add_fit_height() {\n\n var butty_putty = this.bottom_right.append('button')\n .on('click', d => {\n this.viewer.fit_to_viewer_height()\n })\n .attr('class', ' square_button')\n .attr('id', 'buttonfitviewer_' + this.container_object.div_id )\n .attr('data-bs-placement', 'left')\n .attr('title', 'Optimise view (possible collapse/expand)')\n .style('margin', '2px')\n\n\n butty_putty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', ' bi bi-arrows-angle-contract ')\n\n butty_putty.append('p')\n .text('Optimise view')\n .style('font-size', 'xx-small')\n .style('line-height', 'normal')\n\n this.tooltip_fitviewer = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('buttonfitviewer_' + this.container_object.div_id))\n\n }\n\n add_maximise() {\n\n var butty_putty= this.bottom_right.append('button')\n .on('click', d => {\n this.viewer.maximise_zoom()\n })\n .attr('class', ' square_button')\n .attr('id', 'button_maximise_zoom_' + this.container_object.div_id )\n .attr('data-bs-placement', 'left')\n .attr('title', 'Fit tree into viewer (no collapse/expand)')\n .style('margin', '2px')\n\n\n butty_putty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', ' bi bi-arrows-fullscreen ')\n\n butty_putty.append('p')\n .text('Fit screen')\n .style('font-size', 'xx-small')\n\n this.tooltip_fitviewer = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('button_maximise_zoom_' + this.container_object.div_id))\n\n }\n\n // BADGE ROOTING\n add_root_badge() {\n\n\n\n this.bottom_left.append('button')\n .attr('class', ' square_button')\n .style('padding', '4px')\n .style('margin', '2px')\n .style('cursor', 'default')\n .style('color', 'white')\n .style('background', 'rgb(136, 136, 136)')\n .append(\"div\")\n .on('click', d => { return this.container_object.toggle_rooting()})\n .attr(\"class\", \"label\")\n .append('small')\n .html(this.viewer.model.rooted ? 'Rooted Tree <i class=\\\"bi bi-sync-alt\\\"></i>' : 'Unrooted Tree <i class=\\\"bi bi-sync-alt\\\"></i> ')\n }\n\n // ZOOM\n add_zoom(){\n\n var butty_putty =this.bottom_right.append('button')\n .on('click', d => {return this.viewer.zoom_in()})\n .attr('class', ' square_button')\n .attr('id', 'buttonzoomplus_' + this.container_object.div_id )\n .attr('data-bs-placement', 'left')\n .attr('title', 'Zoom in')\n .style('margin', '2px')\n\n\n\n\n butty_putty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', ' bi bi-zoom-in ')\n\n butty_putty.append('p')\n .text('Zoom in')\n .style('font-size', 'xx-small')\n\n this.tooltip_zoomplus = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('buttonzoomplus_' + this.container_object.div_id))\n\n\n var butty_putty = this.bottom_right.append('button')\n .on('click', d => {return this.viewer.zoom_out()})\n .attr('class', ' square_button')\n .style('margin', '2px')\n .attr('id', 'buttonzoomminus_' + this.container_object.div_id )\n .attr('data-bs-placement', 'left')\n .attr('title', 'Zoom out')\n\n\n\n butty_putty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', ' bi bi-zoom-out ')\n\n butty_putty.append('p')\n .text('Zoom out')\n .style('font-size', 'xx-small')\n\n this.tooltip_zoomminus = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('buttonzoomminus_' + this.container_object.div_id))\n\n }\n\n // SCALE\n add_scale(){\n\n var scaleLineLateralPadding = 10\n var scaleLineBottomPadding = 10\n\n\n var gg = this.viewer.svg_d3.node().append('g')\n .attr(\"class\", 'scale')\n .attr(\"transform\", \"translate(0,\" + (this.viewer.height - scaleLineBottomPadding) + \")\")\n\n gg.append(\"path\")\n .attr(\"d\", (d) => {return \"M\" + scaleLineLateralPadding + \",20L\" + (this.scale_pixel_length) + \",20\"})\n .attr(\"class\", 'scale_line')\n\n\n var scale_text = gg.append(\"text\")\n .attr(\"class\", 'scale_text')\n .attr(\"x\", this.scale_pixel_length/2)\n .attr(\"y\", 10)\n .attr(\"fill\", \"#555\")\n .attr('text-anchor', 'middle')\n .attr(\"dy\", \".2em\")\n .text(d => {return this.compute_scale()})\n\n\n return scale_text\n\n\n\n }\n remove_scale(){this.container_d3.select(\".scale\").remove()}\n\n update_scale_value(zoom_scale){\n this.scale_text.text(this.compute_scale(zoom_scale))\n\n }\n\n compute_scale(zoom_scale){\n var zoom_scale = zoom_scale || 1;\n return (this.viewer.scale_branch_length.invert(this.scale_pixel_length)/zoom_scale).toFixed(4);\n }\n\n //COLORING\n add_color_legend(type){\n\n\n var type = (typeof type !== 'undefined') && (type != 'both') ? type : 'node';\n\n var tt = this.viewer.model.settings.extended_data_type[this.viewer.model.settings.style.color_accessor[type]]\n var acc = this.viewer.model.settings.style.color_accessor[type];\n\n if ( tt === 'cat' || tt === 'color'){return}\n\n this.container_d3.select(\".colorlegend_\" + type).remove()\n\n let top_padding = 16;\n let left_padding = 16;\n let width = 16;\n let height = 100;\n let gutter = 8;\n let rect_height = height/100;\n\n var offset = type == 'node' ? (this.viewer.height/2) + 30 : type == 'leaf' ? this.viewer.height/2-height - 10 : this.viewer.height/2 - 2*height - 40;\n\n let gg = this.viewer.svg_d3.node().append('g')\n .attr(\"class\", 'colorlegend_' + type)\n\n\n var values = []\n\n if (this.viewer.model.settings.intercolor[type]) {\n for (let i = 0; i < 100; i++) {\n let n = this.viewer.model.settings.intercolor[type]((i / 100).toFixed(2));\n values.push(this.viewer.model.settings.colorScale[type](n));\n }\n }\n\n gg.selectAll(\"rect\")\n .data(values)\n .join(\"rect\")\n .attr(\"x\", left_padding)\n .attr(\"y\", (d, i) => offset + i)\n .attr(\"width\", width)\n .attr(\"height\", rect_height)\n .attr(\"fill\", d => d);\n\n gg.append(\"text\")\n .attr(\"x\", left_padding + width + gutter )\n .attr(\"y\", offset - 6 )\n .attr(\"fill\", \"#555\")\n .attr('text-anchor', 'start')\n .attr(\"dy\", \".2em\")\n .text(() => {\n var ms = this.viewer.model.settings.style;\n\n if (ms.color_accessor[type]){\n var n = ms.color_extent_max[type][ms.color_accessor[type]];\n return Number.isInteger(n) ? n : parseFloat(n).toFixed(3);\n\n }\n return 1\n })\n\n gg.append(\"text\")\n .attr(\"x\", left_padding + width + gutter )\n .attr(\"y\", offset + height + 10 )\n .attr(\"fill\", \"#555\")\n .attr('text-anchor', 'start')\n .attr(\"dy\", \".2em\")\n .text(() => {\n var ms = this.viewer.model.settings.style;\n\n if (ms.color_accessor[type]){\n\n var n;\n\n if (ms.color_extent_max[type][ms.color_accessor[type]] == ms.color_extent_min[type][ms.color_accessor[type]]){\n n = ms.color_extent_min[type][ms.color_accessor[type]]-1;\n }else{\n n = ms.color_extent_min[type][ms.color_accessor[type]];\n }\n\n\n return Number.isInteger(n) ? n : parseFloat(n).toFixed(3);\n\n }\n return 0\n })\n\n\n var xx = gutter\n var yy = offset\n\n yy += type == 'node' ? 5 : height;\n\n gg.append(\"text\")\n .attr(\"fill\", \"#555\")\n .attr('transform', \"translate(\"+xx+\", \" +yy+ \")rotate(-90)\")\n .attr('text-anchor', () => {return type == 'node' ? 'end' : 'start'})\n .attr(\"dy\", \".2em\")\n .text(() => {\n var ms = this.viewer.model.settings.style;\n return ms.color_accessor[type] ? ms.color_accessor[type] : \"Topology\"\n\n\n })\n\n }\n\n remove_color_legend(type){\n type = type == 'both' ? 'node' : type\n this.container_d3.select(\".colorlegend_\" + type).remove()\n }\n\n remove_all_color_legend(){\n this.container_d3.selectAll(\".colorlegend_node\").remove()\n this.container_d3.selectAll(\".colorlegend_leaf\").remove()\n this.container_d3.selectAll(\".colorlegend_circle\").remove()\n }\n\n // SEARCH\n\n autocomplete(inp, arr) {\n\n var that = this\n\n\n /*the autocomplete function takes two arguments,\n the text field element and an array of possible autocompleted values:*/\n var currentFocus;\n /*execute a function when someone writes in the text field:*/\n\n inp.addEventListener(\"input\", function(e) {\n\n\n\n var a, b, i, val = this.value;\n /*close any already open lists of autocompleted values*/\n closeAllLists();\n if (!val) { return false;}\n currentFocus = -1;\n /*create a DIV element that will contain the items (values):*/\n a = document.createElement(\"DIV\");\n a.setAttribute(\"id\", this.id + \"autocomplete-list\");\n a.setAttribute(\"class\", \"autocomplete-items\");\n /*append the DIV element as a child of the autocomplete container:*/\n this.parentNode.appendChild(a);\n /*for each item in the array...*/\n for (i = 0; i < arr.length; i++) {\n if (arr[i].toUpperCase().includes(val.toUpperCase()) ){\n //if (arr[i].substr(0, val.length).toUpperCase() === val.toUpperCase()) {\n /*create a DIV element for each matching element:*/\n b = document.createElement(\"DIV\");\n /*make the matching letters bold:*/\n var start_index = arr[i].toUpperCase().indexOf(val.toUpperCase())\n b.innerHTML += arr[i].substr(0, start_index);\n b.innerHTML += \"<strong>\" + arr[i].substr(start_index, val.length) + \"</strong>\";\n b.innerHTML += arr[i].substr(start_index + val.length);\n /*insert a input field that will hold the current array item's value:*/\n b.innerHTML += \"<input type='hidden' value='\" + arr[i] + \"'>\";\n /*execute a function when someone clicks on the item value (DIV element):*/\n b.addEventListener(\"click\", function(e) {\n /*insert the value for the autocomplete text field:*/\n that.dismiss_blur = true\n inp.value = this.getElementsByTagName(\"input\")[0].value;\n\n //document.getElementById('buttonsearch_' + this.container_object.div_id ).focus();\n that.container_object.highlight_node(inp.value)\n\n //that.viewer.maximise_zoom()\n\n /*close the list of autocompleted values,\n (or any other open lists of autocompleted values:*/\n closeAllLists();\n });\n a.appendChild(b);\n }\n }\n });\n /*execute a function presses a key on the keyboard:*/\n inp.addEventListener(\"keydown\", function(e) {\n var x = document.getElementById(this.id + \"autocomplete-list\");\n if (x) x = x.getElementsByTagName(\"div\");\n if (e.keyCode == 40) {\n /*If the arrow DOWN key is pressed,\n increase the currentFocus variable:*/\n currentFocus++;\n /*and and make the current item more visible:*/\n addActive(x);\n } else if (e.keyCode == 38) { //up\n /*If the arrow UP key is pressed,\n decrease the currentFocus variable:*/\n currentFocus--;\n /*and and make the current item more visible:*/\n addActive(x);\n } else if (e.keyCode == 13) {\n /*If the ENTER key is pressed, prevent the form from being submitted,*/\n e.preventDefault();\n if (currentFocus > -1) {\n /*and simulate a click on the \"active\" item:*/\n if (x) x[currentFocus].click();\n }\n }\n });\n function addActive(x) {\n /*a function to classify an item as \"active\":*/\n if (!x) return false;\n /*start by removing the \"active\" class on all items:*/\n removeActive(x);\n if (currentFocus >= x.length) currentFocus = 0;\n if (currentFocus < 0) currentFocus = (x.length - 1);\n /*add class \"autocomplete-active\":*/\n x[currentFocus].classList.add(\"autocomplete-active\");\n }\n function removeActive(x) {\n /*a function to remove the \"active\" class from all autocomplete items:*/\n for (var i = 0; i < x.length; i++) {\n x[i].classList.remove(\"autocomplete-active\");\n }\n }\n function closeAllLists(elmnt) {\n /*close all autocomplete lists in the document,\n except the one passed as an argument:*/\n var x = document.getElementsByClassName(\"autocomplete-items\");\n for (var i = 0; i < x.length; i++) {\n if (elmnt != x[i] && elmnt != inp) {\n x[i].parentNode.removeChild(x[i]);\n }\n }\n }\n /*execute a function when someone clicks in the document:*/\n document.addEventListener(\"click\", function (e) {\n closeAllLists(e.target);\n });\n\n\n }\n\n add_search(){\n\n\n this.container_d3.selectAll(\"#searchinp\" + this.viewer.uid).remove()\n\n // add input\n this.search_input = this.tr_buttons.append('input')\n .attr('class', ' search_input')\n .style('display', 'none')\n .style('height', '56px')\n .attr('id', \"searchinp\" + this.viewer.uid )\n\n var input_el = document.getElementById(\"searchinp\" + this.viewer.uid );\n\n // add search button\n var search_but = this.tr_buttons.append('button')\n .attr('class', ' square_button search_button')\n .attr('id', 'buttonsearch_' + this.container_object.div_id )\n .attr('data-bs-placement', 'bottom')\n .attr('title', 'search for label')\n .style('border-top-left-radius', '8px')\n .style('border-bottom-left-radius', '8px')\n .style('margin', '2px')\n .on(\"click\", d => {\n var display = input_el.style.display;\n\n if (display == 'none'){\n let search_el = document.getElementById('buttonsearch_' + this.container_object.div_id );\n\n input_el.style.display = 'inline-block';\n search_el.style.borderTopLeftRadius = '0px';\n search_el.style.borderBottomLeftRadius = '0px';\n }\n else{\n this.container_object.highlight_node(document.getElementById(\"searchinp\" + this.viewer.uid).value)\n //this.viewer.maximise_zoom()\n\n input_el.style.display = 'none';\n search_el.style.borderTopLeftRadius = '8px';\n search_el.style.borderBottomLeftRadius = '8px';\n document.getElementById('searchinp' + this.viewer.uid + 'autocomplete-list').remove();\n }\n })\n\n\n search_but.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', ' bi bi-search ')\n\n search_but.append('p')\n .text('Search')\n .style('font-size', 'xx-small')\n\n this.tooltip_search = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('buttonsearch_' + this.container_object.div_id))\n\n\n\n let search_el = document.getElementById('buttonsearch_' + this.container_object.div_id );\n\n this.autocomplete(document.getElementById(\"searchinp\" + this.viewer.uid ), this.viewer.model.settings.suggestions)\n\n input_el.addEventListener(\"keyup\", ({key}) => {\n if (key === \"Enter\") {\n this.container_object.highlight_node(document.getElementById(\"searchinp\" + this.viewer.uid).value)\n //this.viewer.maximise_zoom()\n }\n })\n\n input_el.addEventListener(\"blur\", (e) => {\n\n setTimeout(() => {\n\n if (this.dismiss_blur){\n this.dismiss_blur = false\n\n }\n else{\n input_el.style.display = 'none';\n search_el.style.borderTopLeftRadius = '8px';\n search_el.style.borderBottomLeftRadius = '8px';\n document.getElementById('searchinp' + this.viewer.uid + 'autocomplete-list').remove();\n\n }\n }, 200);\n\n })\n\n\n }\n\n // META\n get_modal_meta_corpus(){\n return `\n\n <div class=\"container-fluid\">\n \n <div class=\"card\">\n \n <div class=\"card-body\">\n \n <h5> <b>Step 3.1: Select your mapping file</b> </h5>\n \n\n <div class=\"input-group mb-3\" style=\"padding: 24px 24px 0;\">\n <input class=\"form-control\" type=\"file\" id=\"add_meta_file_input\" > \n </div>\n \n <p style=\"padding: 0 24px;\"><small>\n <b>Accepted format:</b> .csv or .tsv with column names in the first row. Use the selector below to choose a reference column matching leaf or node names in the input file.\n </small></p>\n \n <div class=\"text-center\" style=\"margin-left: 48px;margin-right: 48px;\">\n \n <div class=\"form-floating\">\n <select class=\"form-select\" id=\"add_mapping_ref_select\" aria-label=\"Floating label select example\">\n <option value=\"id\" selected>id</option>\n </select>\n <label for=\"add_mapping_ref_select\">Select reference column name</label>\n </div>\n \n \n </div>\n \n \n\n </div>\n \n </div>\n\n <br>\n \n <div class=\"card\" id=\"mod_meta_card2\" style=\"display: none\">\n \n <div class=\"card-body\" id=\"mod_meta_card2_radio\" >\n \n <h5> <b>Step 3.2: Configure mapping data types</b> </h5>\n \n \n \n </div>\n \n </div>\n \n <br>\n \n <div class=\"card\" id=\"mod_meta_card3\" style=\"display: none\">\n \n <div class=\"card-body\">\n \n <h5> <b>Step 3.2: Choose a target for additional data</b> </h5>\n \n <div class=\"form-check\" style=\"padding: 12px 48px 0;\">\n <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"mapping_check_leaf\" checked>\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\n Apply to leaves\n </label>\n </div>\n <div class=\"form-check\" style=\"padding: 12px 48px 0;\">\n <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"mapping_check_nodes\" checked>\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n Apply to Nodes\n </label>\n \n \n \n \n </div>\n \n <br>\n \n <h5> <b>Optional</b> </h5>\n \n <div class=\"form-check\" style=\"padding: 12px 48px 0;\">\n <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"mapping_apply_to_all\">\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\n Apply to all trees\n </label>\n </div>\n \n\n </div>\n \n </div>\n \n <br>\n \n <div style=\"margin: auto; width: fit-content;\">\n \n <button type=\"button\" id=\"upload_mapping_close\" class=\"btn btn-danger\" data-bs-dismiss=\"modal\">Cancel</button>\n <button type=\"button\" id=\"upload_mapping_validation\" class=\"btn btn-success\" data-bs-dismiss=\"modal\" disabled >Upload mapping file</button>\n</div>\n \n \n \n </div>\n \n `\n }\n\n add_meta(){\n\n let mod_html = this.get_modal_template()\n\n\n mod_html = mod_html.replace('TEMPLATE_CORPUS', this.get_modal_meta_corpus())\n mod_html = mod_html.replace('TITLE_', 'Upload your own mapping file')\n mod_html = mod_html.replace('SUB_TITLE_', 'to add additional information to leaves and nodes')\n\n mod_html = mod_html.replace('exampleModal', 'modal_meta_' + this.container_object.uid)\n mod_html = mod_html.replaceAll('add_meta_file_input', 'modal_add_mapping_file_input' + this.container_object.uid)\n\n mod_html = mod_html.replace('mod_meta_card2', 'mod_meta_card2_' + this.container_object.uid)\n mod_html = mod_html.replace('mod_meta_card3', 'mod_meta_card3_' + this.container_object.uid)\n mod_html = mod_html.replace('mod_meta_card2_radio', 'mod_meta_card2_radio' + this.container_object.uid)\n\n mod_html = mod_html.replace('flexCheckChecked', 'flexCheckChecked' + this.container_object.uid)\n mod_html = mod_html.replace('flexCheckDefault', 'flexCheckDefault' + this.container_object.uid)\n\n mod_html = mod_html.replace('upload_mapping_validation', 'upload_mapping_validation' + this.container_object.uid)\n mod_html = mod_html.replace('mapping_check_nodes', 'mapping_check_nodes' + this.container_object.uid)\n mod_html = mod_html.replace('mapping_check_leaf', 'mapping_check_leaf' + this.container_object.uid)\n mod_html = mod_html.replace('mapping_apply_to_all', 'mapping_apply_to_all' + this.container_object.uid)\n\n\n mod_html = mod_html.replaceAll('add_mapping_ref_select', 'add_mapping_ref_select_modal' + this.container_object.uid)\n\n mod_html = mod_html.replaceAll('Step 3.1', 'Step 1')\n mod_html = mod_html.replaceAll('Step 3.2', 'Step 2')\n\n document.getElementById(this.container_object.div_id).insertAdjacentHTML('afterend',mod_html)\n\n // Add JS for modal corpus\n var that = this\n\n document.getElementById('modal_add_mapping_file_input' + this.container_object.uid).onchange = function() {\n\n let input = this.files[0];\n\n if (input) {\n\n document.getElementById('mod_meta_card2_' + that.container_object.uid).style.display = 'block'\n document.getElementById('mod_meta_card3_' + that.container_object.uid).style.display = 'block'\n document.getElementById('upload_mapping_validation' + that.container_object.uid).disabled = false;\n\n\n var reader = new FileReader();\n var data;\n\n reader.addEventListener(\"load\", parseFile, false);\n reader.readAsText(input);\n function parseFile(){\n\n // load data\n if (input.name.split('.').pop() == 'tsv'){\n data = d3__WEBPACK_IMPORTED_MODULE_1__.tsvParse(reader.result, function(d){\n return d;\n });\n }\n else{\n\n data = d3__WEBPACK_IMPORTED_MODULE_1__.csvParse(reader.result, function(d){\n return d;\n });\n\n }\n\n\n // Get columns + types\n var numerisator = {}\n numerisator['id'] = 'cat'\n data['columns'].forEach((currentElement) => { if (currentElement != 'id'){ numerisator[currentElement] = 'num'}})\n data.forEach((currentElement) => {\n for (var key of Object.keys(numerisator)) {\n if (isNaN(currentElement[key])){\n numerisator[key] = 'cat'\n }\n }\n })\n\n // Add columns to select\n var select = document.getElementById('add_mapping_ref_select_modal' + that.container_object.uid)\n select.innerHTML = ''\n for (var key of Object.keys(numerisator)){\n var opt = document.createElement('option');\n opt.value = key;\n opt.innerHTML = key;\n select.appendChild(opt);\n }\n\n\n\n // creates radios\n var radio_container = document.getElementById( 'mod_meta_card2_radio' + that.container_object.uid)\n radio_container.innerHTML = ''\n\n var get_el = function(){return `\n \n <div style = \"padding: 12px 24px 0;\"> <span><b style = \"margin-right: 12px\" > Column: </b> \"NAME_\"</span> <br>\n\n <div class=\"form-check \" style=\"margin-left: 24px\" >\n <input class=\"form-check-input \" name=\"flexRadioDefault\" type=\"radio\" value=\"num\" id=\"RADIO_1\" ATTR_NUM>\n <label class=\"form-check-label\" for=\"RADIO_1\">\n Numerical\n </label>\n </div>\n \n <div class=\"form-check \" style=\"margin-left: 24px\" >\n <input class=\"form-check-input\" name=\"flexRadioDefault\" type=\"radio\" value=\"cat\" id=\"RADIO_2\" ATTR_CAT>\n <label class=\"form-check-label\" for=\"RADIO_2\">\n Categorical\n </label>\n </div>\n \n <div class=\"form-check\" style=\"margin-left: 24px\">\n <input class=\"form-check-input\" name=\"flexRadioDefault\" type=\"radio\" value=\"color\" id=\"RADIO_3\" ATTR_COLOR>\n <label class=\"form-check-label\" for=\"RADIO_3\">\n Color\n </label>\n </div>\n \n \n \n \n \n \n \n </div>\n `}\n\n for (var key of Object.keys(numerisator)){\n\n var rad = get_el()\n\n\n rad = rad.replace('NAME_', key)\n rad = rad.replaceAll('flexRadioDefault', 'flexRadioDefault_' + key + that.container_object.uid )\n rad = rad.replace('RADIO_1', that.container_object.uid + 'mapping_header_radio1' + '__' + key )\n rad = rad.replace('RADIO_2', that.container_object.uid + 'mapping_header_radio2' + '__' + key )\n rad = rad.replace('RADIO_3', that.container_object.uid + 'mapping_header_radio3' + '__' + key )\n\n\n if (numerisator[key] == 'num') {\n rad = rad.replace('ATTR_NUM', 'checked')\n rad = rad.replace('ATTR_CAT', '')\n rad = rad.replace('ATTR_COLOR', '')\n }\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_3__.check_if_color)(numerisator[key])) {\n rad = rad.replace('ATTR_NUM', '')\n rad = rad.replace('ATTR_CAT', '')\n rad = rad.replace('ATTR_COLOR', 'checked')\n }\n else {\n rad = rad.replace('ATTR_NUM', 'disabled')\n rad = rad.replace('ATTR_CAT', 'checked')\n rad = rad.replace('ATTR_COLOR', '')\n }\n\n\n\n radio_container.insertAdjacentHTML('beforeend',rad)\n\n }\n radio_container.insertAdjacentHTML('beforeend','<br>')\n\n }\n\n }\n\n else {\n document.getElementById('upload_mapping_validation' + that.container_object.uid).disabled = true;\n }\n };\n\n document.getElementById('upload_mapping_validation' + this.container_object.uid).onclick = function(){\n\n\n var file = document.getElementById('modal_add_mapping_file_input' + that.container_object.uid).files[0];\n\n if (file) {\n\n var parameters = that.get_mapping_parameter_from_UI()\n\n const reader = new FileReader();\n\n reader.addEventListener('load', (event) => {\n\n var meta = []\n var ref_id = parameters.reference\n\n if (file.name.split('.').pop() == 'tsv'){\n d3__WEBPACK_IMPORTED_MODULE_1__.tsvParse(event.target.result, (d) => {meta[d[ref_id]] = d});\n }\n else{\n d3__WEBPACK_IMPORTED_MODULE_1__.csvParse(event.target.result, (d) => {meta[d[ref_id]] = d});\n }\n\n\n\n if (parameters.apply_to_all){\n // apply add_meta_leaves to all models in the container\n that.container_object.models.forEach((model) => {\n\n model.settings.use_meta_for_leaf = parameters.use_meta_for_leaf\n model.settings.use_meta_for_node = parameters.use_meta_for_node\n\n if (parameters.use_meta_for_leaf){\n model.add_meta_leaves(meta, parameters.headers, that.container_object.api, parameters.reference)\n }\n if (parameters.use_meta_for_node){\n model.add_meta_nodes(meta, parameters.headers, that.container_object.api, parameters.reference)\n }\n\n\n })\n\n }\n else {\n\n that.viewer.model.settings.use_meta_for_leaf = parameters.use_meta_for_leaf\n that.viewer.model.settings.use_meta_for_node = parameters.use_meta_for_node\n\n if (that.viewer.model.settings.use_meta_for_leaf){\n that.viewer.model.add_meta_leaves(meta, parameters.headers, that.container_object.api, parameters.reference)\n }\n\n if (that.viewer.model.settings.use_meta_for_node){\n that.viewer.model.add_meta_nodes(meta, parameters.headers, that.container_object.api, parameters.reference)\n }\n\n\n }\n\n that.viewer.interface = new Interface(that.viewer, that.viewer.container_object)\n\n that.open_color_settings()\n\n });\n reader.readAsText(file);\n\n }\n\n\n }\n\n\n // add the button\n var ex_b = this.tr_buttons.append('button')\n .attr('id', 'button_meta' + this.container_object.uid)\n .attr('data-bs-placement', 'bottom')\n .attr('title', 'Add additional informations to the tree')\n .attr('data-bs-toggle', 'modal')\n .attr('data-bs-target', '#modal_meta_' + this.container_object.uid )\n\n var divybuty = ex_b.attr('class', ' square_button')\n .style('margin', '2px')\n\n divybuty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', 'bi bi-file-earmark-medical')\n\n divybuty.append('p')\n .text('Mapping')\n .style('font-size', 'xx-small')\n\n\n }\n\n get_mapping_parameter_from_UI(modal){\n\n var modal = (typeof modal == 'undefined') ? false : modal;\n\n var p = {'headers': {}}\n\n if (modal){\n var prefix = this.container_object.uid + 'mapping_header_radiotree_adder_'\n }\n else{\n var prefix = this.container_object.uid + 'mapping_header_radio'\n }\n\n var checkies = document.querySelectorAll(`[id^=\"${prefix}\"]`);\n\n\n\n checkies.forEach(element => {\n\n if (element.checked) {\n var column_type = element.value\n var column_name = element.id.split('__').pop()\n\n\n p['headers'][column_name] = column_type\n }\n\n\n });\n\n if (modal){\n p['use_meta_for_node'] = document.getElementById( 'tree_adder_mapping_check_nodes' + this.container_object.uid).checked\n p['use_meta_for_leaf'] = document.getElementById( 'tree_adder_mapping_check_leaf' + this.container_object.uid).checked\n p['apply_to_all'] = document.getElementById( 'tree_adder_mapping_apply_to_all' + this.container_object.uid).checked\n p['reference'] = document.getElementById( 'add_mapping_ref_select' + this.container_object.uid).value\n }\n else{\n p['use_meta_for_node'] = document.getElementById( 'mapping_check_nodes' + this.container_object.uid).checked\n p['use_meta_for_leaf'] = document.getElementById( 'mapping_check_leaf' + this.container_object.uid).checked\n p['apply_to_all'] = document.getElementById( 'mapping_apply_to_all' + this.container_object.uid).checked\n p['reference'] = document.getElementById( 'add_mapping_ref_select_modal' + this.container_object.uid).value\n }\n\n\n return p\n }\n\n // EXPORT\n add_export() {\n\n // add the button\n var ex_b = this.tr_buttons.append('button')\n .attr('id', 'button_export' + this.container_object.uid)\n .attr('data-bs-placement', 'bottom')\n .attr('title', 'Export this tree as graphic or text file')\n\n var divybuty = ex_b.attr('class', ' square_button')\n .style('margin', '2px')\n .on(\"click\", d => {\n if (this.menu_export.style('display') === 'none') {\n this.menu_settings.style(\"display\", 'none') // make it more general to all menu/button\n ex_b.style('background-color', '#CCC');\n document.getElementById(\"button_settings\" + this.container_object.uid).style.backgroundColor = 'rgba(239, 239, 239, 0.95)';\n return this.menu_export.style(\"display\", 'block')\n }\n ex_b.style('background-color', 'rgba(239, 239, 239, 0.95)');\n return this.menu_export.style(\"display\", 'none')\n })\n\n divybuty.append(\"div\")\n .attr(\"class\", \"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', 'bi-file-earmark-arrow-up')\n\n divybuty.append('p')\n .text('Download')\n .style('font-size', 'xx-small')\n\n\n this.tooltip_export = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('button_export' + this.container_object.uid))\n\n\n // add the sub menu container\n this.menu_export = this.tr_menus.append('div')\n .style(\"background-color\", '#aaa')\n .attr('class', 'menu_export')\n\n\n // ADD THE ACCORDION SYSTEM\n\n this.menu_exportimage_b = this.menu_export.append('button').attr('class', 'accordion').text(\"Export as Graphic\")\n this.menu_exportimage_p = this.menu_export.append('div').attr('class', 'panel').append(\"div\").style(\"padding\", \"6px\")\n\n this.export_as = this.menu_exportimage_p.append('div')\n .style('display', 'flex')\n\n this.export_as.append('button') // todo clean click\n .attr('class', ' square_button')\n .on(\"click\", d => {\n this.screen_shot('png')\n })\n .style('margin', '2px')\n .style('flex-grow', '1')\n .append(\"text\")\n .text(\"PNG\")\n\n\n this.export_as.append('button')\n .attr('class', ' square_button')\n .on(\"click\", d => { // todo clean\n this.screen_shot('svg')\n })\n .style('margin', '2px')\n .style('flex-grow', '1')\n .append(\"text\")\n .text(\"SVG\")\n\n\n this.menu_exportfile_b = this.menu_export.append('button').attr('class', 'accordion').text(\"Export as Text\")\n this.menu_exportfile_p = this.menu_export.append('div').attr('class', 'panel').append(\"div\").style(\"padding\", \"6px\")\n\n this.export_as = this.menu_exportfile_p.append('div')\n .style('display', 'flex')\n\n this.export_as.append('button')\n .attr('class', ' square_button')\n .on(\"click\", d => {\n this.container_object.export_as_newick()\n })\n .style('margin', '2px')\n .style('flex-grow', '1')\n .append(\"text\")\n .text(\"Newick\")\n\n this.export_as.append('button')\n .attr('class', ' square_button')\n .on(\"click\", d => {\n this.container_object.export_as_nhx()\n })\n .style('margin', '2px')\n .style('flex-grow', '1')\n .append(\"text\")\n .text(\"NHX\")\n\n }\n\n screen_shot(format) {\n\n var svg = this.viewer.d3.select(\"#svg\" + this.viewer.uid)\n this.addLogo(svg);\n var name = svg.attr(\"id\");\n var svgString = this.getSVGString(svg.node());\n\n if(format === 'svg') {\n\n var blob = new Blob([svgString], {\"type\": \"image/svg+xml;base64,\"+ btoa(svgString)});\n file_saver__WEBPACK_IMPORTED_MODULE_0__.saveAs(blob, name+\".svg\");\n svg.select(\"#exportLogo\").remove();\n\n }\n else if (format === 'png'){\n var exportElement = svg.node();\n var width = exportElement.getBoundingClientRect().width;\n var height = exportElement.getBoundingClientRect().height;\n this.svgString2Image(svgString, 2 * width, 2 * height, 'png', save);\n svg.select(\"#exportLogo\").remove();\n\n function save(dataBlob, filesize) {\n var filename = (name) ? name+\".\" : \"\";\n file_saver__WEBPACK_IMPORTED_MODULE_0__.saveAs(dataBlob, filename+'phylo.io.png'); // FileSaver.js function\n }\n\n }\n\n }\n\n // UNDO\n add_undo(){\n\n var divybuty = this.tr_buttons.append('button')\n .attr('class', ' square_button')\n .attr('id', 'buttonundo_' + this.container_object.div_id )\n .attr('data-bs-placement', 'bottom')\n .attr('title', d=> { return this.container_object.history_actions.length > 0 ? 'Undo ' + this.container_object.get_last_action().name : 'Nothing to undo' })\n .style('margin', '2px')\n .on(\"click\", d => {\n this.api.undoing = true;\n var cta = this.container_object.pop_last_action();\n cta = cta.undo\n if (cta && typeof cta.fonct === 'function') {\n cta.fonct.apply(cta.fonction_obj, cta.argu);\n\n if (cta.refresh_interface) {\n let empty = this.container_object.models.length <= 0;\n this.container_object.interface = new Interface(this.viewer, this.container_object, empty);\n }\n } else {\n console.error('Invalid cta or cta.fonct:', cta);\n }\n this.api.undoing = false;\n })\n\n\n\n\n\n divybuty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', 'bi-arrow-counterclockwise')\n\n divybuty.append('p')\n .text('Undo')\n .style('font-size', 'xx-small')\n\n this.tooltip_undo = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('buttonundo_' + this.container_object.div_id))\n\n }\n\n add_redo(){\n\n var divybuty = this.tr_buttons.append('button')\n .attr('class', ' square_button')\n .attr('id', 'buttonredo_' + this.container_object.div_id )\n .attr('data-bs-placement', 'bottom')\n .attr('title', d=> { return this.container_object.history_actions.length > 0 ? 'Redo ' + this.container_object.get_last_action().redo.name : 'Nothing to redo' })\n .style('margin', '2px')\n .on(\"click\", d => {\n var cta = this.container_object.pop_redo_action();\n cta = cta.redo\n if (cta && typeof cta.fonct === 'function') {\n cta.fonct.apply(cta.fonction_obj, cta.argu);\n\n if (cta.refresh_interface) {\n let empty = this.container_object.models.length <= 0;\n this.container_object.interface = new Interface(this.viewer, this.container_object, empty);\n }\n } else {\n console.error('Invalid cta or cta.fonct:', cta);\n }\n })\n\n divybuty.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', 'bi-arrow-clockwise')\n\n divybuty.append('p')\n .text('Redo')\n .style('font-size', 'xx-small')\n\n this.tooltip_undo = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('buttonredo_' + this.container_object.div_id))\n\n }\n\n toggle_select_node_face(cid){\n\n var acc = document.getElementById(\"accordion_branch\"+cid)\n\n\n if (acc.classList.contains('active')) {\n\n document.getElementById('selectlt' + cid).style.display = 'block';\n document.getElementById('selectlb' + cid).style.display = 'block';\n document.getElementById('selectr' + cid).style.display = 'block';\n\n document.getElementById('selectlt' + cid).style.top = -90 + 'px';\n document.getElementById('selectlb' + cid).style.top = -40 + 'px';\n document.getElementById('selectr' + cid).style.top = -60 + 'px';\n\n document.getElementById('selectlt' + cid).style.left = '30px';\n document.getElementById('selectlb' + cid).style.left = '30px';\n document.getElementById('selectr' + cid).style.left = '130px';\n\n }\n else{\n document.getElementById('selectlt' + cid).style.display = 'none';\n document.getElementById('selectlb' + cid).style.display = 'none';\n document.getElementById('selectr' + cid).style.display = 'none';\n }\n }\n\n // SETTINGS\n add_settings() {\n\n // add the buttons\n var set_b = this.tr_buttons.append('button')\n .attr('data-bs-placement', 'bottom')\n .attr('title', 'Viewer settings')\n\n set_b.attr('class', ' square_button')\n set_b.attr('id', 'button_settings' + this.container_object.uid)\n .style('margin', '2px')\n .on(\"click\", d => {\n if (this.menu_settings.style('display') === 'none') { //make it as funtion\n this.menu_export.style(\"display\", 'none')\n set_b.style('background-color', '#CCC');\n document.getElementById(\"button_export\" + this.container_object.uid).style.backgroundColor = 'rgba(239, 239, 239, 0.95)';\n return this.menu_settings.style(\"display\", 'block')\n }\n set_b.style('background-color', 'rgba(239, 239, 239, 0.95)');\n return this.menu_settings.style(\"display\", 'none')\n })\n\n set_b.append(\"div\")\n .attr(\"class\",\"label\")\n .append('i')\n .style('color', '#888')\n .attr('class', 'bi bi-sliders')\n\n set_b.append('p')\n .text('Settings')\n .style('font-size', 'xx-small')\n\n\n\n this.tooltip_settings = new bootstrap__WEBPACK_IMPORTED_MODULE_2__.Tooltip(document.getElementById('button_settings' + this.container_object.uid))\n\n\n // add the menu\n this.menu_settings = this.tr_menus.append('div')\n .attr('class', 'menu_settings')\n\n\n // ADD THE ACCORDION SYSTEM todo close other when open one\n\n this.menu_general_b = this.menu_settings.append('button').attr('id', 'accordion_tree'+this.container_object.uid).attr('class', 'accordion').text(\"Tree\")\n this.menu_general_p = this.menu_settings.append('div').attr('class', 'panel').append(\"div\").style(\"padding\", \"14px\")\n this.menu_tree_b = this.menu_settings.append('button').attr('id', 'accordion_branch'+this.container_object.uid).attr('class', 'accordion').text(\"Branches & Labels\")\n this.menu_tree_p = this.menu_settings.append('div').attr('class', 'panel').append(\"div\").style(\"padding\", \"14px\")\n\n\n //this.menu_metadata_b = this.menu_settings.append('button').attr('id', 'accordion_color'+this.container_object.uid).attr('class', 'accordion').text(\"Additional Information\")\n //this.menu_metadata_p = this.menu_settings.append('div').attr('class', 'panel').append(\"div\").style(\"padding\", \"14px\")\n\n this.menu_coloring_b = this.menu_settings.append('button').attr('id', 'accordion_color'+this.container_object.uid).attr('class', 'accordion').text(\"Coloring\")\n this.menu_coloring_panel = this.menu_settings.append('div').attr('class', 'panel').attr('id', 'coloring_panel' + this.container_object.uid)\n this.menu_coloring_p = this.menu_coloring_panel.append(\"div\").style(\"padding\", \"14px\").attr('id', 'coloring_p' + this.container_object.uid)\n\n this.menu_search_b = this.menu_settings.append('button').attr('id', 'accordion_branch'+this.container_object.uid).attr('class', 'accordion').text(\"Search options\")\n this.menu_search_p = this.menu_settings.append('div').attr('class', 'panel').append(\"div\").style(\"padding\", \"14px\")\n\n if (this.viewer.model.settings.has_histogram_data && this.viewer.model.settings.show_histogram ) {\n this.menu_stack_b = this.menu_settings.append('button').attr('class', 'accordion').text(\"Bar Graph\")\n this.menu_stack_p = this.menu_settings.append('div').attr('class', 'panel').append(\"div\").style(\"padding\", \"14px\")\n\n\n\n this.slider_sts = this.add_slider_UI(this.menu_stack_p, \"Bar height\", 40, 300, this.viewer.model.settings.stack.stackHeight, 5, \"slider_stack_height_\",\n (e ) =>{this.viewer.update_stack_height(e.target.value)})\n\n this.slider_sts = this.add_slider_UI(this.menu_stack_p, \"Bar width\", 10, 150, this.viewer.model.settings.stack.stackWidth, 5, \"slider_stack_width_\",\n (e ) =>{this.viewer.update_stack_width(e.target.value)})\n\n this.slider_sts = this.add_slider_UI(this.menu_stack_p, \"Label size\", 6, 40, this.viewer.model.settings.stack.legendTxtSize, 1, \"slider_stack_text_size_\",\n (e ) =>{this.viewer.update_stack_font(e.target.value)})\n\n this.menu_stack_p.append(\"p\").text('Labels').style('margin-bottom', \"0px\")\n\n\n this.stack_type = this.menu_stack_p.append('div')\n .style('display', 'flex')\n .style('margin-bottom', \"14px\")\n\n\n\n this.stack_type.append('button') // todo clean click\n .attr('class', ' square_button')\n .attr('id', 'stack_type_events')\n .style('background-color', d => {return this.viewer.model.settings.stack.type === 'events' ? 'rgb(204, 204, 204)': null })\n .on(\"click\", d => {\n this.viewer.update_stack_type('events')\n this.viewer. d3.select(\"#stack_type_events\").style('background-color','rgb(204, 204, 204)')\n this.viewer.d3.select(\"#stack_type_genes\").style('background-color', null)\n })\n .style('margin', '2px')\n .style('flex-grow', '1')\n .append(\"text\")\n .text(\"Events\")\n\n\n this.stack_type.append('button')\n .attr('class', ' square_button')\n .attr('id', 'stack_type_genes')\n .style('background-color', d => {return this.viewer.model.settings.stack.type === 'genes' ? 'rgb(204, 204, 204)': null })\n .on(\"click\", d => {\n this.viewer.update_stack_type('genes')\n this.viewer.d3.select(\"#stack_type_genes\").style('background-color','rgb(204, 204, 204)')\n this.viewer.d3.select(\"#stack_type_events\").style('background-color', null)\n })\n .style('margin', '2px')\n .style('flex-grow', '1')\n .append(\"text\")\n .text(\"Genes\")\n\n this.add_swicth_UI(this.menu_stack_p, (this.viewer.model.settings.stack.maxStackHeight === 'ratio'),\"Fix stack height\", this.viewer.toggle_height_max_ratio.bind(this.viewer))\n\n this.add_swicth_UI(this.menu_stack_p, this.viewer.model.settings.stack.showHistogramValues,\"Show numbers\", this.viewer.toggle_show_stack_number.bind(this.viewer))\n\n if (this.viewer.model.settings.stack.has_support){\n this.add_swicth_UI(this.menu_stack_p, this.viewer.model.settings.stack.only_support,\"remove low coverage hogs\", this.viewer.toggle_only_support.bind(this.viewer))\n\n }\n\n\n\n\n }\n\n // ADD LOGIC TO ACCORDION todo add it general or to this div only\n var acc = document.getElementById(this.container_object.div_id).getElementsByClassName(\"accordion\");\n var that = this;\n var i;\n\n for (i = 0; i < acc.length; i++) {\n acc[i].addEventListener(\"click\", function(e) {\n\n this.classList.toggle(\"active\");\n\n var panel = this.nextElementSibling;\n if (panel.style.maxHeight) {\n panel.style.maxHeight = null;\n } else {\n panel.style.maxHeight = panel.scrollHeight + \"px\";\n }\n\n //that.toggle_select_node_face(that.container_object.uid)\n\n /*\n\n var checkExist = setInterval(function() {\n\n var obs_h = panel.style.maxHeight ? panel.getBoundingClientRect().height : 0\n var exp_h = panel.style.maxHeight ? panel.scrollHeight : 0\n\n if (obs_h == exp_h ) {\n that.toggle_select_node_face(that.container_object.uid)\n clearInterval(checkExist);\n }\n\n else {\n console.log(obs_h, exp_h )\n }\n }, 200);\n\n */\n\n });\n\n\n }\n\n // ADD TOGGLE BRANCH LENGTH\n if(this.viewer.model.settings.has_branch_lenght){\n this.add_swicth_UI(this.menu_general_p, !this.viewer.model.settings.use_branch_lenght,\"Ignore branch length\", this.viewer.toggle_use_length.bind(this.viewer))\n }\n\n this.add_swicth_UI(this.menu_general_p, this.viewer.model.settings.align_tip,\"Align leaves\", this.viewer.toggle_align_tip.bind(this.viewer))\n\n this.add_swicth_UI(this.menu_general_p, this.viewer.model.settings.mirror,\"Mirror tree\", this.viewer.toggle_mirror.bind(this.viewer))\n\n // ADD SLIDER RESIZE X/Y\n /*\n this.slider_v = this.add_slider_UI(this.menu_general_p, \"Tree height\", 2, 1000, this.viewer.model.settings.tree.node_vertical_size, 1, \"slider_node_vertical_size_\",\n (e ) =>{this.viewer.modify_node_size('vertical', e.target.value - this.viewer.model.settings.tree.node_vertical_size)})\n\n this.slider_h = this.add_slider_UI(this.menu_general_p, \"Tree width\", 2, 1000, this.viewer.model.settings.tree.node_horizontal_size, 1, \"slider_node_horyzontal_size_\",\n (e ) =>{this.viewer.modify_node_size('horizontal', e.target.value - this.viewer.model.settings.tree.node_horizontal_size)})\n */\n\n\n //this.buttons_height = this.add_quartet_buttons(this.menu_general_p, \"Tree height\", \"buton_vertical_size_\", this.container_object.modify_node_size_percent, 'vertical')\n //this.buttons_width = this.add_quartet_buttons(this.menu_general_p, \"Tree width\", \"buton_horyzontal_size_\", this.container_object.modify_node_size_percent, 'horizontal')\n\n this.add_quartet_buttons_single_line(this.menu_general_p, \"Tree height\", \"buton_vertical_size_\", this.container_object.modify_node_size_percent, 'vertical')\n this.add_quartet_buttons_single_line(this.menu_general_p, \"Tree width\", \"buton_horyzontal_size_\", this.container_object.modify_node_size_percent, 'horizontal')\n\n\n // ADD SELECT LEFT NODE LABEL\n this.add_node_face_UI(this.menu_tree_p, this.container_object.uid)\n\n // ADD TOGGLE INTERNAL LABEL\n //this.add_swicth_UI(this.menu_tree_p, this.viewer.model.settings.display_internal_label,\"Show internal label\", this.viewer.toggle_internal_label.bind(this.viewer))\n\n\n // ADD TOGGLE show internal name for triangle\n this.add_swicth_UI(this.menu_tree_p, this.viewer.model.settings.use_internal_node_name_for_triangles,\"Show collapsed subtrees name\", this.viewer.toggle_triangle_name.bind(this.viewer))\n\n // ADD TOGGLE tooltips\n this.add_swicth_UI(this.menu_tree_p, this.viewer.model.settings.subsample_label,\"Subsample labels\", this.viewer.toggle_subsample.bind(this.viewer))\n\n // ADD TOGGLE LEAF LABEL\n this.add_swicth_UI(this.menu_tree_p, this.viewer.model.settings.display_leaves,\"Show leaf labels\", this.viewer.toggle_leaves.bind(this.viewer))\n\n // ADD TOGGLE NODE LABEL\n this.add_swicth_UI(this.menu_tree_p, this.viewer.model.settings.display_leaves,\"Show node labels\", this.viewer.toggle_node_labels.bind(this.viewer))\n\n // ADD TOGGLE tooltips\n this.add_swicth_UI(this.menu_tree_p, this.viewer.model.settings.show_tooltips,\"Show data tooltips\", this.viewer.toggle_tooltips.bind(this.viewer))\n\n if (this.viewer.model.settings.has_duplications){\n // ADD TOGGLE DUPLICATION\n this.add_swicth_UI(this.menu_tree_p, this.viewer.model.settings.display_duplication,\"Show duplications\", this.viewer.toggle_duplication.bind(this.viewer))\n\n }\n\n //this.add_quartet_buttons(this.menu_tree_p, \"Node radius\", \"buton_node_radius_\", this.container_object.update_node_radius_percent )\n this.add_quartet_buttons_single_line(this.menu_tree_p, \"Node radius\", \"buton_node_radius_\", this.container_object.update_node_radius_percent)\n\n\n //this.add_quartet_buttons(this.menu_tree_p, \"Line width\", \"buton_line_width_\", this.container_object.update_line_width_percent)\n this.add_quartet_buttons_single_line(this.menu_tree_p, \"Line width\", \"buton_line_width_\", this.container_object.update_line_width_percent)\n\n\n\n // COLLAPSE\n this.slider_c = this.add_slider_UI(this.menu_general_p,\n this.viewer.model.settings.collapse_level == 0 ? \"Autocollapse: Off\" : \"Autocollapse: \" + this.viewer.model.settings.collapse_level,\n 0, this.viewer.model.settings.tree.max_depth , this.viewer.model.settings.collapse_level, 0,\"slider_collapse_level_\",)\n document.getElementById(\"slider_collapse_level_\" + this.container_object.uid).onchange = (e) => {\n\n\n this.viewer.update_collapse_level(e.target.value, false)\n var lab = e.target.value == 0 ? \"Autocollapse: Off\" : \"Autocollapse: \" + this.viewer.model.settings.collapse_level;\n\n document.getElementById(\"slider_collapse_level_\" + this.container_object.uid)\n .parentElement.previousSibling.innerHTML = lab;\n\n }\n\n\n if (this.api.settings.compareMode) {\n // equalize tree\n this.menu_general_p.append(\"p\").text('Equalize trees')\n .style('margin-bottom', '0px')\n\n\n this.equalize_div = this.menu_general_p.append('div')\n .style('display', 'flex')\n .style('margin-top', '0px')\n\n\n this.equalize_div.append('button')\n .attr('class', ' square_button')\n .attr('id', 'equ_reroot' + this.viewer.uid)\n .on(\"click\", d => {\n this.container_object.reroot_to_compared_tree()\n })\n .style('margin', '2px')\n .style('flex-grow', '1')\n .append(\"text\")\n .text(\"Reroot\")\n\n\n this.equalize_div.append('button')\n .attr('class', ' square_button')\n .attr('id', 'equ_reorder' + this.viewer.uid)\n .on(\"click\", d => {\n this.container_object.reorder_to_compared_tree()\n })\n .style('margin', '2px')\n .style('flex-grow', '1')\n .append(\"text\")\n .text(\"Reorder\")\n }\n\n\n // ADD TOGGLE MULTIPLE SEARCH\n this.add_swicth_UI(this.menu_search_p, this.viewer.model.settings.multiple_search,\"Keep queries highlighted\", this.viewer.toggle_multiple_search.bind(this.viewer))\n\n // ADD reset search button\n\n this.search_button_div = this.menu_search_p.append('div')\n .style('display', 'flex')\n .style('margin-top', '0px')\n\n\n this.search_button_div.append('button')\n .attr('class', ' square_button')\n .attr('id', 'reset_search' + this.viewer.uid)\n .on(\"click\", d => {\n this.container_object.remove_highlight_node();\n this.viewer.set_data(this.container_object.models[this.container_object.current_model])\n this.viewer.render(this.viewer.hierarchy)\n })\n .style('margin', '2px')\n .style('flex-grow', '1')\n .append(\"text\")\n .text(\"Reset search\")\n\n /*\n // ADDITIONAL DATA\n var meta_div = this.menu_metadata_p.append('div')\n .style('display','block')\n //.style('margin','8px')\n\n\n meta_div.append('p').text(\"Mapping file\").style('font-weight','bold')\n\n\n meta_div.append('input')\n .attr('id','filemeta' + this.container_object.uid )\n .attr('type','file')\n .style('margin-bottom','16px')\n\n\n this.add_swicth_UI(this.menu_metadata_p, this.viewer.model.settings.use_meta_for_leaf,\"Apply to leaves\", this.viewer.toggle_use_meta_for_leaf.bind(this.viewer) )\n this.add_swicth_UI(this.menu_metadata_p, this.viewer.model.settings.use_meta_for_node,\"Apply to nodes\", this.viewer.toggle_use_meta_for_node.bind(this.viewer))\n\n\n this.meta_div = this.menu_metadata_p.append('div')\n .style('display', 'flex')\n .style('margin-top', '0px')\n\n\n this.button_meta = this.meta_div.append('button')\n .attr('id','button_add_meta' + this.container_object.uid )\n .on(\"click\", (e) => {\n\n var file = document.getElementById('filemeta' + this.container_object.uid).files[0];\n\n if (file) {\n const reader = new FileReader();\n reader.addEventListener('load', (event) => {\n\n var meta = []\n\n d3.csvParse(event.target.result, (d) => {meta[d.id] = d});\n\n if (this.viewer.model.settings.use_meta_for_leaf){\n this.viewer.model.add_meta_leaves(meta)\n }\n\n if (this.viewer.model.settings.use_meta_for_node){\n this.viewer.model.add_meta_nodes(meta)\n }\n\n this.viewer.interface = new Interface(this.viewer, this.viewer.container_object)\n\n });\n reader.readAsText(file);\n\n }\n\n\n\n })\n .attr('class', ' square_button')\n .style('border-radius', '2px')\n .style('flex-grow', '1')\n .style('background-color', '#CCC')\n .text('Use this file')\n\n\n */\n\n\n // COLORING\n\n this.add_settings_coloring()\n\n }\n\n\n add_node_coloring_UI(container_div){\n\n var that = this;\n\n container_div.append('p').text(\"Nodes\").style('font-weight','bold').style('margin-top','8px')\n\n var drop = container_div.append('div')\n .style('display','block')\n .style('margin-left','8px')\n\n\n var options = Array.from(this.viewer.model.settings.colorlabels['node'])\n options.push(\"None\")\n\n if (options.length > 0){\n\n // SELECT DATA\n\n options.unshift('None')\n\n drop.append('label').text(\"Data\");\n\n var selectcoloring = drop.append('select')\n .attr('id','selectcoloringcircle' + this.container_object.uid )\n .attr('class','select')\n .style('float','right')\n .on('change', function(){\n\n that.on_change_coloring_scheme('circle', this.value)\n })\n\n selectcoloring.selectAll('option').data(options).enter()\n .append('option')\n .attr('value', function (d) {\n return d; })\n .property(\"selected\", (d) => { return d == this.viewer.model.settings.style.color_accessor['circle'] })\n .text(function (d) { return d; });\n\n\n this.color_circle_div = container_div.append('div')\n\n this.minmax_circle_div = container_div.append('div')\n\n\n if (this.viewer.model.settings.style.color_accessor['circle'] !== null) {\n\n this.create_color_scheme_picker('circle')\n\n this.create_min_max_picker('circle')\n }\n\n\n\n }\n else {\n drop.style('float','right').append('label').text(\"No Data available\");\n container_div.append('br')\n\n }\n\n }\n\n add_color_collapsing(container_div) {\n\n var that = this;\n\n // Add button for collapse uncolored taxon\n this.collapse_color_button_div = container_div.append('div')\n .style('display', 'flex')\n .style('margin-top', '0px')\n\n\n this.collapse_color_button_div.append('button')\n .attr('class', ' square_button')\n .attr('id', 'collapse_color_search' + this.viewer.uid)\n .on(\"click\", d => {\n this.container_object.collapse_node_not_colored()\n this.viewer.build_d3_cluster()\n this.viewer.render(this.viewer.hierarchy)\n this.viewer.maximise_zoom()\n })\n .style('margin', '12px 0px')\n .style('flex-grow', '1')\n .append(\"text\")\n .text(\"Collapse uncolored subtrees \")\n\n // Add select for select uncolored\n\n var color_triangle_div = container_div.append('div')\n .style('display','flex')\n .style('float', 'right')\n\n\n var options_triangle = ['Leaves', 'Nodes', 'Both'];\n\n color_triangle_div.append('label')\n .text(\"Using\")\n .style('margin-right', '8px')\n\n var selectcoloring_triangle = color_triangle_div.append('select')\n .attr('id','selectcol_uncol' + this.container_object.uid )\n .attr('class','select')\n .style('float','right')\n .on('change', function(){\n that.viewer.model.settings.selected_collapse_uncolored = this.value;\n\n /*\n that.container_object.collapse_node_not_colored()\n that.viewer.build_d3_cluster()\n that.viewer.render(that.viewer.hierarchy)\n that.viewer.maximise_zoom()\n\n */\n\n })\n\n\n selectcoloring_triangle.selectAll('option').data(options_triangle).enter()\n .append('option')\n .attr('value', function (d) {\n return d; })\n .property(\"selected\", (d) => { return d == this.viewer.model.settings.selected_collapse_uncolored })\n .text(function (d) { return d; });\n\n container_div.append('br')\n\n\n // Add button for collapse unicolored taxon\n this.collapse_unicolor_button_div = container_div.append('div')\n .style('display', 'flex')\n .style('margin-top', '0px')\n\n this.collapse_unicolor_button_div.append('button')\n .attr('class', ' square_button')\n .attr('id', 'collapse_unicolor_search' + this.viewer.uid)\n .on(\"click\", d => {\n this.container_object.collapse_node_same_color()\n this.viewer.build_d3_cluster()\n this.viewer.render(this.viewer.hierarchy)\n this.viewer.maximise_zoom()\n })\n .style('margin', '12px 0px')\n .style('flex-grow', '1')\n .append(\"text\")\n .text(\"Collapse monocolored subtrees \")\n\n // Add select for select unicolored\n\n var color_unicolor_div = container_div.append('div')\n .style('display','flex')\n .style('float', 'right')\n\n var _options_triangle = ['Leaves', 'Nodes', 'Both'];\n\n color_unicolor_div.append('label')\n .text(\"Using\")\n .style('margin-right', '8px')\n\n var selectcoloring_mono = color_unicolor_div.append('select')\n .attr('id','selectcol_uncol' + this.container_object.uid )\n .attr('class','select')\n .style('float','right')\n\n .on('change', function(){\n that.viewer.model.settings.selected_collapse_monocolored = this.value;\n /*\n that.container_object.collapse_node_same_color()\n that.viewer.build_d3_cluster()\n that.viewer.render(that.viewer.hierarchy)\n that.viewer.maximise_zoom()\n\n */\n })\n\n\n\n\n selectcoloring_mono.selectAll('option').data(_options_triangle).enter()\n .append('option')\n .attr('value', function (d) {\n return d; })\n .property(\"selected\", (d) => { return d == this.viewer.model.settings.selected_collapse_monocolored })\n .text(function (d) { return d; });\n\n container_div.append('br')\n }\n\n add_settings_coloring(){\n\n var that = this;\n\n\n if (this.viewer.model.settings.sync_coloring){\n\n this.menu_coloring_p.append('p').text(\"Branches & Leaves\").style('font-weight','bold')\n\n var color_both_div = this.menu_coloring_p.append('div')\n .style('display','block')\n .style('margin-left','8px')\n\n var options_leaf = Array.from(this.viewer.model.settings.colorlabels['leaf'])\n var options_node = Array.from(this.viewer.model.settings.colorlabels['node'])\n\n var options = [...new Set( options_leaf.concat(options_node))]\n\n if (options.length > 0){\n\n // SELECT DATA\n options.unshift('None')\n color_both_div.append('label').text(\"Data\")\n\n var selectcoloring_both = color_both_div.append('select')\n .attr('id','selectcoloring_both' + this.container_object.uid )\n .attr('class','select')\n .style('float','right')\n .on('change', function(){\n that.on_change_coloring_scheme('both', this.value)\n })\n\n selectcoloring_both.selectAll('option').data(options).enter()\n .append('option')\n .attr('value', function (d) {\n return d; })\n .property(\"selected\", (d) => { return d == this.viewer.model.settings.style.color_accessor['node'] })\n .text(function (d) { return d; });\n\n\n this.color_leaf_both = this.menu_coloring_p.append('div')\n\n this.minmax_leaf_both = this.menu_coloring_p.append('div')\n\n this.create_color_scheme_picker('both')\n\n this.create_min_max_picker('both')\n\n }\n else {\n color_both_div.style('float','right').append('label').text(\"No Data available\");\n this.menu_coloring_p.append('br')\n\n }\n\n }\n\n else {\n this.menu_coloring_p.append('p').text(\"Leaf Labels\").style('font-weight','bold')\n\n var color_leaves_div = this.menu_coloring_p.append('div')\n .style('display','block')\n .style('margin-left','8px')\n\n var options = Array.from(this.viewer.model.settings.colorlabels['leaf'])\n\n\n if (options.length > 0){\n\n // SELECT DATA\n\n options.unshift('None')\n\n color_leaves_div.append('label').text(\"Data\")\n\n var selectcoloring_leaf = color_leaves_div.append('select')\n .attr('id','selectcoloring_leaf' + this.container_object.uid )\n .attr('class','select')\n .style('float','right')\n .on('change', function(){\n\n that.on_change_coloring_scheme('leaf', this.value)\n\n })\n\n selectcoloring_leaf.selectAll('option').data(options).enter()\n .append('option')\n .attr('value', function (d) {\n return d; })\n .property(\"selected\", (d) => { return d == this.viewer.model.settings.style.color_accessor['leaf'] })\n .text(function (d) { return d; });\n\n\n this.color_leaf_div = this.menu_coloring_p.append('div')\n\n this.minmax_leaf_div = this.menu_coloring_p.append('div')\n\n }\n else {\n color_leaves_div.style('float','right').append('label').text(\"No Data available\");\n this.menu_coloring_p.append('br')\n\n }\n\n if (this.viewer.model.settings.style.color_accessor['leaf'] !== null) {\n\n this.color_leaf_div = this.menu_coloring_p.append('div')\n\n this.minmax_leaf_div = this.menu_coloring_p.append('div')\n\n this.create_color_scheme_picker('leaf')\n\n this.create_min_max_picker('leaf')\n }\n\n\n this.menu_coloring_p.append('p').text(\"Branches\").style('font-weight','bold').style('margin-top','8px')\n\n var drop = this.menu_coloring_p.append('div')\n .style('display','block')\n .style('margin-left','8px')\n\n\n drop.append('label').text(\"Data\");\n\n var selectcoloring = drop.append('select')\n .attr('id','selectcoloring' + this.container_object.uid )\n .attr('class','select')\n .style('float','right')\n .on('change', function(){\n\n that.on_change_coloring_scheme('node', this.value)\n\n })\n\n var options = Array.from(this.viewer.model.settings.colorlabels['node'])\n options.push(\"None\")\n\n if (this.viewer.model.settings.style.color_accessor['node'] !== null) {\n\n selectcoloring.selectAll('option').data(options).enter().append('option').attr('value', function (d) {\n return d;\n })\n .property(\"selected\", (d) => {\n return d == this.viewer.model.settings.style.color_accessor['node']\n })\n .text(function (d) {\n return d;\n });\n\n\n this.color_node_div = this.menu_coloring_p.append('div')\n\n this.minmax_node_div = this.menu_coloring_p.append('div')\n\n this.create_color_scheme_picker('node')\n\n this.create_min_max_picker('node')\n }\n }\n\n this.add_node_coloring_UI(this.menu_coloring_p)\n\n this.menu_coloring_p.append('hr').style('margin', '20px 0px 4px 0px')\n\n this.add_color_collapsing(this.menu_coloring_p)\n\n this.menu_coloring_p.append('hr').style('margin', '20px 0px 4px 0px')\n\n\n // add sync coloring\n this.add_swicth_UI(this.menu_coloring_p, this.viewer.model.settings.sync_coloring,\"Link branch & leaf coloring\", this.viewer.toggle_sync_coloring.bind(this.viewer))\n\n var color_triangle_div = this.menu_coloring_p.append('div')\n .style('display','block')\n //.style('margin-left','8px')\n\n var options_triangle = ['None', 'Leaves', 'Branches'];\n\n color_triangle_div.append('label').text(\"Color collapsed subtrees by\")\n\n var selectcoloring_triangle = color_triangle_div.append('select')\n .attr('id','selectcoloring_triangle' + this.container_object.uid )\n .attr('class','select')\n .style('float','right')\n .on('change', function(){\n that.viewer.model.settings.selected_triangle_coloring = this.value;\n that.viewer.render(that.viewer.hierarchy)\n\n })\n\n selectcoloring_triangle.selectAll('option').data(options_triangle).enter()\n .append('option')\n .attr('value', function (d) {\n return d; })\n .property(\"selected\", (d) => { return d == this.viewer.model.settings.selected_triangle_coloring })\n .text(function (d) { return d; });\n }\n\n on_change_coloring_scheme(type, val){\n\n if (type == 'both'){\n this.viewer.model.settings.style.color_accessor['node'] = val === 'None' ? null : val;\n this.viewer.model.settings.style.color_accessor['leaf'] = val === 'None' ? null : val;\n var acc = this.viewer.model.settings.style.color_accessor['node']\n }\n else {\n this.viewer.model.settings.style.color_accessor[type] = val === 'None' ? null : val;\n\n var acc = this.viewer.model.settings.style.color_accessor[type]\n }\n\n\n\n if (!(acc in this.viewer.model.settings.style.number_domain)) {\n this.viewer.model.settings.style.number_domain[acc] = 3\n }\n\n this.create_color_scheme_picker(type)\n\n this.create_min_max_picker(type)\n\n if (type == 'both') {\n this.viewer.model.set_color_scale('node', this.api);\n this.viewer.model.set_color_scale('leaf', this.api);\n }\n else{\n this.viewer.model.set_color_scale(type, this.api);\n }\n this.viewer.render(this.viewer.hierarchy)\n\n\n if (type == 'both') {\n this.remove_color_legend('node');\n this.remove_color_legend('leaf');\n }\n else{\n this.remove_color_legend(type);\n }\n\n\n\n if (type == 'both' && this.viewer.model.settings.style.color_accessor['node']) {\n this.add_color_legend('node')\n }\n else if (this.viewer.model.settings.style.color_accessor[type]){\n this.add_color_legend(type);\n }\n\n this.menu_coloring_panel.style(\"max-height\", this.menu_coloring_p.style(\"height\"))\n\n\n }\n\n create_color_scheme_picker(type){\n\n var that = this;\n\n var acc = type == 'both' ? this.viewer.model.settings.style.color_accessor['node'] : this.viewer.model.settings.style.color_accessor[type]\n\n var type_acc = this.viewer.model.settings.extended_data_type[acc]\n\n if (type == 'leaf'){\n var container_ = this.color_leaf_div\n container_.html('')\n }\n\n else if (type == 'node'){\n var container_ = this.color_node_div\n container_.html('')\n\n\n }\n\n else if (type == 'both'){\n var container_ = this.color_leaf_both\n container_.html('')\n\n }\n else if (type == 'circle'){\n var container_ = this.color_circle_div\n container_.html('')\n }\n\n if (!acc){return}\n\n if (type_acc == 'num'){\n\n var domain_leaf = container_.append('div')\n .style('display','block')\n .style('margin','8px')\n .style('margin-bottom','12px')\n\n domain_leaf.append('label').text(\"Nb. of colors\");\n\n domain_leaf.append('input')\n .attr('id','inputcoloring_' + type + this.container_object.uid )\n .attr('type','number')\n .attr('name','quantity')\n .attr('min','2')\n .attr('value', this.viewer.model.settings.style.number_domain[acc])\n .attr('max','5')\n .style('float','right')\n .on('change', (d) => {\n\n delete this.viewer.model.settings.style.color_domain[acc]\n\n this.viewer.model.settings.style.number_domain[acc] = parseInt(document.getElementById('inputcoloring_' + type + this.container_object.uid ).value);\n this.create_color_picker(type)\n if (type == 'both') {\n this.viewer.model.set_color_scale('node', this.api);\n this.viewer.model.set_color_scale('leaf', this.api);\n }\n else{\n this.viewer.model.set_color_scale(type, this.api);\n }\n this.viewer.render(this.viewer.hierarchy)\n\n })\n\n\n var colcol = container_.append('div')\n .style('display','block')\n .style('margin','8px')\n\n colcol.append('label').text(\"Color\");\n\n colcol.append(\"span\").attr('id',type + '_colorspan_' + this.container_object.uid );\n\n this.create_color_picker(type)\n\n }\n\n else if (type_acc == 'color' ){\n container_.append('label').text(\"Use color loaded\").style('float', 'right');\n container_.append('br')\n if (type == 'both') {\n this.viewer.model.set_color_scale('node', this.api);\n this.viewer.model.set_color_scale('leaf', this.api);\n }\n else{\n this.viewer.model.set_color_scale(type, this.api);\n }\n this.viewer.render(this.viewer.hierarchy)\n }\n\n else if (type_acc == 'cat' || typeof type_acc == 'undefined'){\n\n var color_scheme_div = container_.append('div')\n .style('display','block')\n .style('margin-left','8px')\n\n var options = Object.keys(d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_4__)\n .filter(key => key.startsWith('interpolate'))\n .reduce((acc, key) => { acc[key.replace('interpolate', '')] = d3__WEBPACK_IMPORTED_MODULE_1__[key]; return acc; }, {})\n\n var options_name = Object.keys(options)\n\n\n // SELECT DATA\n color_scheme_div.append('label').text(\"Color scheme\")\n\n var selectcoloring_both = color_scheme_div.append('select')\n .attr('id','selectcoloring_scheme' + this.container_object.uid )\n .attr('class','select')\n .style('float','right')\n .on('change', function(){\n\n if (type == 'both') {\n var cs = that.api.get_color_scale(that.viewer.model.settings.style.color_accessor['node']);\n cs.update_scheme(options[this.value], this.value );\n cs.update();\n that.viewer.model.set_color_scale('node', that.api);\n\n var cs = that.api.get_color_scale(that.viewer.model.settings.style.color_accessor['leaf']);\n cs.update_scheme(options[this.value], this.value );\n cs.update();\n that.viewer.model.set_color_scale('leaf', that.api);\n\n }\n else{\n var cs = that.api.get_color_scale(that.viewer.model.settings.style.color_accessor[type]);\n cs.update_scheme(options[this.value], this.value );\n cs.update();\n that.viewer.model.set_color_scale(type, that.api);\n\n }\n that.viewer.render(that.viewer.hierarchy)\n\n })\n\n var type_scheme = type == 'both' ? 'node' : type\n\n selectcoloring_both.selectAll('option').data(options_name).enter()\n .append('option')\n .attr('value', function (d) { return d })\n .property(\"selected\", (d) => { return d == this.api.get_color_scale(this.viewer.model.settings.style.color_accessor[type_scheme]).scheme_name })\n .text(function (d) { return d; });\n\n\n }\n\n else{\n container_.append('label').text(\"\");\n }\n\n\n\n\n}\n\n create_min_max_picker(type){\n\n var acc = type == 'both' ? this.viewer.model.settings.style.color_accessor['node'] : this.viewer.model.settings.style.color_accessor[type]\n var type_acc = this.viewer.model.settings.extended_data_type[acc]\n\n\n if (type == 'leaf'){\n var container_ = this.minmax_leaf_div\n container_.html('')\n\n var val_min = this.viewer.model.settings.style.color_extent_min[type][acc]\n var val_max = this.viewer.model.settings.style.color_extent_max[type][acc]\n }\n\n else if (type == 'node'){\n var container_ = this.minmax_node_div\n container_.html('')\n\n var val_min = this.viewer.model.settings.style.color_extent_min[type][acc]\n var val_max = this.viewer.model.settings.style.color_extent_max[type][acc]\n }\n\n else if (type == 'circle'){\n var container_ = this.minmax_circle_div\n container_.html('')\n\n var max_ = this.viewer.model.settings.style.color_extent_max\n var min_ = this.viewer.model.settings.style.color_extent_min\n\n if (max_['circle'][acc] === undefined){\n max_['circle'][acc] = max_['node'][acc];\n }\n if (min_['circle'][acc] === undefined){\n min_['circle'][acc] = min_['node'][acc];\n }\n\n\n var val_min = this.viewer.model.settings.style.color_extent_min['circle'][acc]\n var val_max = this.viewer.model.settings.style.color_extent_max['circle'][acc]\n\n }\n\n else if (type == 'both'){\n var container_ = this.minmax_leaf_both\n container_.html('')\n\n if (this.viewer.model.settings.style.color_extent_min['node'][acc] !=100000){\n var val_min = this.viewer.model.settings.style.color_extent_min['node'][acc]\n var val_max = this.viewer.model.settings.style.color_extent_max['node'][acc]\n }\n else{\n var val_min = this.viewer.model.settings.style.color_extent_min['leaf'][acc]\n var val_max = this.viewer.model.settings.style.color_extent_max['leaf'][acc]\n }\n\n\n }\n\n if (type_acc == 'num'){\n\n var min_ = container_.append('div')\n .style('display','block')\n .style('margin','8px')\n .style('margin-bottom','12px')\n\n min_.append('label').text(\"Min scale value\");\n\n min_.append('input')\n .attr('type','number')\n .attr('name','quantity')\n .attr('min','-9999999999')\n .attr('value', val_min)\n .attr('max','9999999999')\n .style('float','right')\n .on('change', (d) => {\n\n if (type == 'both'){\n this.viewer.model.settings.style.color_extent_min['leaf'][acc] = parseFloat(d.target.value)\n this.viewer.model.settings.style.color_extent_min['node'][acc] = parseFloat(d.target.value)\n\n this.viewer.model.set_color_scale('node', this.api);\n this.viewer.model.set_color_scale('leaf', this.api);\n this.viewer.render(this.viewer.hierarchy)\n this.remove_color_legend('node')\n this.remove_color_legend('leaf')\n this.add_color_legend('node')\n }\n\n else {\n this.viewer.model.settings.style.color_extent_min[type][acc] = parseFloat(d.target.value)\n\n this.viewer.model.set_color_scale(type, this.api);\n this.viewer.render(this.viewer.hierarchy)\n this.remove_color_legend(type)\n this.add_color_legend(type)\n }\n\n\n })\n\n var max_ = container_.append('div')\n .style('display','block')\n .style('margin','8px')\n .style('margin-bottom','12px')\n\n max_.append('label').text(\"Max scale value\");\n\n max_.append('input')\n .attr('type','number')\n .attr('name','quantity')\n .attr('min','-9999999999')\n .attr('value', val_max)\n .attr('max','9999999999')\n .style('float','right')\n .on('change', (d) => {\n if (type == 'both'){\n this.viewer.model.settings.style.color_extent_max['node'][acc] = parseFloat(d.target.value)\n this.viewer.model.settings.style.color_extent_max['leaf'][acc] = parseFloat(d.target.value)\n\n this.viewer.model.set_color_scale('node', this.api);\n this.viewer.model.set_color_scale('leaf', this.api);\n this.viewer.render(this.viewer.hierarchy)\n this.remove_color_legend('node')\n this.remove_color_legend('leaf')\n this.add_color_legend('node')\n }\n else {\n this.viewer.model.settings.style.color_extent_max[type][acc] = parseFloat(d.target.value)\n\n this.viewer.model.set_color_scale(type, this.api);\n this.viewer.render(this.viewer.hierarchy)\n this.remove_color_legend(type)\n this.add_color_legend(type)\n }\n\n })\n\n // add button to auto setup min and max from other viewer. It need to accound for compare mode and for other contrainer\n\n if (this.api.settings.compareMode){\n\n var button_ = container_.append('div')\n .style('display','flex')\n .style('margin','8px')\n .style('margin-bottom','12px')\n\n button_.append('button')\n .attr('class', ' square_button')\n .attr('id', 'auto_minmax_' + type + this.container_object.uid)\n .on(\"click\", d => {\n\n // get the other compared container using bound_container and .viewer to select wich is the one bind to current interface and not\n // the one that is compared\n\n var con1 = this.api.bound_container[0]\n var con2 = this.api.bound_container[1]\n var other_viewer = con1.viewer == this.viewer ? con2.viewer.model.settings.style : con1.viewer.model.settings.style\n\n\n if (type == 'both'){\n\n\n this.viewer.model.settings.style.color_extent_max['node'][acc] = other_viewer.color_extent_max['node'][acc]\n this.viewer.model.settings.style.color_extent_max['leaf'][acc] = other_viewer.color_extent_max['leaf'][acc]\n\n this.viewer.model.settings.style.color_extent_min['node'][acc] = other_viewer.color_extent_min['node'][acc]\n this.viewer.model.settings.style.color_extent_min['leaf'][acc] = other_viewer.color_extent_min['leaf'][acc]\n\n this.viewer.model.set_color_scale('node', this.api);\n this.viewer.model.set_color_scale('leaf', this.api);\n this.viewer.render(this.viewer.hierarchy)\n this.remove_color_legend('node')\n this.remove_color_legend('leaf')\n this.add_color_legend('node')\n\n min_.select('input').property('value', this.viewer.model.settings.style.color_extent_min['leaf'][acc])\n max_.select('input').property('value', this.viewer.model.settings.style.color_extent_max['leaf'][acc])\n\n }\n else {\n this.viewer.model.settings.style.color_extent_max[type][acc] = other_viewer.color_extent_max[type][acc]\n this.viewer.model.settings.style.color_extent_min[type][acc] = other_viewer.color_extent_min[type][acc]\n\n this.viewer.model.set_color_scale(type, this.api);\n this.viewer.render(this.viewer.hierarchy)\n this.remove_color_legend(type)\n this.add_color_legend(type)\n\n min_.select('input').property('value', this.viewer.model.settings.style.color_extent_min[type][acc])\n max_.select('input').property('value', this.viewer.model.settings.style.color_extent_max[type][acc])\n }\n\n\n\n })\n .style('margin', '2px')\n .style('flex-grow', '1')\n .append(\"text\")\n .text(\"Auto min/max\")\n\n }\n\n }\n\n\n}\n\n create_color_picker(type){\n\n var colspan = d3__WEBPACK_IMPORTED_MODULE_1__.select(\"#\" + type + '_colorspan_' + this.container_object.uid)\n\n colspan.html(\"\")\n\n var acc = type == 'both' ? this.viewer.model.settings.style.color_accessor['node'] : this.viewer.model.settings.style.color_accessor[type]\n var number = this.viewer.model.settings.style.number_domain[acc];\n\n if (!(acc in this.viewer.model.settings.style.color_domain)) {\n this.viewer.model.settings.style.color_domain[acc] = this.viewer.model.settings.style.color_domain_default\n\n var default_color = this.viewer.model.settings.style.color_domain_default\n\n var w = Math.round(135/number);\n var color = []\n\n switch (number) {\n case 2:\n color = [default_color[0], default_color[4]]\n break;\n case 3:\n color = [default_color[0],default_color[2], default_color[4]]\n break;\n case 4:\n color = [default_color[0],default_color[1],default_color[2], default_color[4]]\n break;\n case 5:\n color = default_color\n\n }\n\n this.viewer.model.settings.style.color_domain[acc] = color\n }\n else {\n var color = this.viewer.model.settings.style.color_domain[acc]\n }\n\n\n\n for (let i = 0; i < number; i++) {\n var idd = type + '_color_picker_' + this.viewer.container_object.uid + '_' + i;\n colspan.append(\"span\").style('display',' inline-block').style('float','right')\n .html(\"<input class='colpicker_\" + type + \"' type=\\\"color\\\" id=\\\"\"+idd+\"\\\" style='width:\" + w +\"px;'name=\\\"favcolor\\\" value=\\\"\" + color[i] + \"\\\">\")\n\n d3__WEBPACK_IMPORTED_MODULE_1__.select(\"#\" + idd).on('change', () => {\n\n\n this.update_color_pickers(type)\n\n if (type == 'both'){\n this.viewer.model.set_color_scale('node', this.api);\n this.viewer.model.set_color_scale('leaf', this.api);\n }\n else {\n this.viewer.model.set_color_scale(type, this.api);\n }\n\n this.viewer.model.set_color_scale('node', this.api);\n this.viewer.model.set_color_scale('leaf', this.api);\n this.viewer.render(this.viewer.hierarchy)\n this.remove_color_legend(type)\n this.add_color_legend(type)\n\n\n })\n\n }\n\n }\n\n update_color_pickers(type){\n\n var colspan = d3__WEBPACK_IMPORTED_MODULE_1__.select(\"#\" + type + '_colorspan_' + this.container_object.uid)\n\n\n var new_col = []\n colspan.selectAll(\".colpicker_\" + type).each(function(d){\n new_col.push(this.value)\n })\n\n var acc = type == 'both' ? this.viewer.model.settings.style.color_accessor['node'] :this.viewer.model.settings.style.color_accessor[type]\n\n this.viewer.model.settings.style.color_domain[acc] = new_col\n\n\n }\n\n add_swicth_UI(parent, checked, label, f){\n\n var lab = parent.append('label').style(\"display\", 'inline-block')\n .attr(\"class\",\"switch\")\n\n lab.append('input').attr('type', 'checkbox' ).property('checked', checked);\n lab.append('span').attr(\"class\",\"slider_t round\")\n .on('click', (d) => { f()} )\n\n parent.append('p').text(label).style(\"display\", 'inline-block').style(\"margin-left\", '12px')\n parent.append('br')\n\n }\n\n add_node_face_UI(parent,container_id){\n\n var w = 220;\n var h = 160;\n var gutter = 20\n\n var color_line = 'gray';\n\n var s = parent.append(\"svg\")\n .attr('display', 'block')\n .attr(\"width\", w )\n .attr(\"height\", h+ gutter)\n\n // vertical\n s.append('line')\n .attr(\"x1\", w/3)\n .attr(\"y1\", gutter)\n .attr(\"x2\", w/3)\n .attr(\"y2\", h-gutter)\n .attr(\"stroke\", color_line)\n\n // middle line\n s.append('line')\n .attr(\"x1\", gutter/2)\n .attr(\"y1\", h/2)\n .attr(\"x2\", w/3)\n .attr(\"y2\", h/2)\n .attr(\"stroke\", color_line)\n\n s.append('circle')\n .attr('cx', w/3)\n .attr('cy', h/2)\n .attr('r', 5)\n .attr('stroke', 'black')\n .attr('fill', '#69a3b2');\n\n s.append(\"text\")\n .attr(\"x\", w/3 - gutter)\n .attr(\"y\", h/2 - gutter)\n .attr(\"dy\", \".35em\")\n .text('A');\n\n s.append(\"text\")\n .attr(\"x\", w/3 + gutter)\n .attr(\"y\", h/2 )\n .attr(\"dy\", \".35em\")\n .text('B');\n\n s.append(\"text\")\n .attr(\"x\", w/3 - gutter)\n .attr(\"y\", h/2 + gutter)\n .attr(\"dy\", \".35em\")\n .text('C');\n\n\n\n // top horizontal\n s.append('line')\n .attr(\"stroke\", color_line)\n .attr(\"x1\", w/3)\n .attr(\"y1\", gutter)\n .attr(\"x2\", w-3*gutter)\n .attr(\"y2\", gutter);\n\n s.append(\"text\")\n .attr(\"x\", w-2.5*gutter)\n .attr(\"y\", gutter - 4)\n .attr(\"dy\", \".35em\")\n .text('...');\n\n // bottom horizontal\n s.append('line')\n .attr(\"stroke\", color_line)\n .attr(\"x1\", w/3)\n .attr(\"y1\", h-gutter)\n .attr(\"x2\", w-3*gutter)\n .attr(\"y2\", h-gutter);\n\n\n s.append('circle')\n .attr('cx', w-3*gutter)\n .attr('cy', h-gutter)\n .attr('r', 2)\n .attr('fill', 'black');\n\n s.append(\"text\")\n .attr(\"x\", w-2*gutter)\n .attr(\"y\", h-gutter)\n .attr(\"dy\", \".35em\")\n .text('E');\n\n s.append(\"text\")\n .attr(\"x\", w-4*gutter)\n .attr(\"y\", h-2*gutter)\n .attr(\"dy\", \".35em\")\n .text('D');\n\n s.append(\"text\")\n .attr(\"x\", w-4*gutter)\n .attr(\"y\", h)\n .attr(\"dy\", \".35em\")\n .text('F');\n\n\n\n\n // NODE DATUM\n\n parent.append(\"p\").text('Node labels')\n .style('margin-bottom','0px')\n .style('font-weight','bold')\n\n\n var l = Array.from(this.viewer.model.settings.labels['node'])\n\n var options = [\"None\", 'Topology']\n options = options.concat(l)\n\n var that = this\n\n parent.append('text').style('display','inline').text('A').style('margin-right','4px').style('margin-left','12px')\n var selectlt = parent.append('select').attr('id','selectlt' + container_id ).attr('class','select_node_face').on('change', function(){\n\n var value = this.value === 'None' ? false : this.value\n\n that.viewer.model.settings.display_internal_label_left_top = value\n\n that.viewer.render(that.viewer.hierarchy)\n\n })\n parent.append('br')\n\n parent.append('text').style('display','inline').text('B').style('margin-right','4px').style('margin-left','12px')\n var selectr = parent.append('select').attr('id','selectr' + container_id ).attr('class','select_node_face').on('change', function(){\n\n var value = this.value === 'None' ? false : this.value\n\n that.viewer.model.settings.display_internal_label = value\n\n that.viewer.render(that.viewer.hierarchy)\n\n })\n parent.append('br')\n\n parent.append('text').style('display','inline').text('C').style('margin-right','4px').style('margin-left','12px')\n var selectlb = parent.append('select').attr('id','selectlb' + container_id ).attr('class','select_node_face').on('change', function(){\n\n var value = this.value === 'None' ? false : this.value\n\n that.viewer.model.settings.display_internal_label_left_bottom = value\n\n that.viewer.render(that.viewer.hierarchy)\n\n })\n parent.append('br')\n\n selectlt.selectAll('option').data(options).enter().append('option').attr('value', function (d) { return d; }).text(function (d) { return d; });\n selectlb.selectAll('option').data(options).enter().append('option').attr('value', function (d) { return d; }).text(function (d) { return d; });\n selectr.selectAll('option').data(options).enter().append('option').attr('value', function (d) { return d; }).text(function (d) { return d; });\n\n this.add_quartet_buttons_single_line(this.menu_tree_p, \"Font size\", \"buton_node_label_\", this.container_object.update_font_size_node_percent)\n\n\n parent.append('br')\n\n // LEAF DATUM\n\n parent.append(\"p\").text('Leaf labels')\n .style('margin-bottom','0px')\n .style('font-weight','bold')\n\n\n var l2 = Array.from(this.viewer.model.settings.labels['leaf'])\n\n var options2 = [\"None\"]\n options2 = options2.concat(l2)\n\n var options2_name = [\"Default\"]\n options2_name = options2_name.concat(l2)\n\n var that = this\n\n parent.append('text').style('display','inline').text('D').style('margin-right','4px').style('margin-left','12px')\n var selectltl = parent.append('select').attr('id','selectltl' + container_id ).attr('class','select_node_face').on('change', function(){\n\n var value = this.value === 'None' ? false : this.value\n\n that.viewer.model.settings.display_leaf_label_left_top = value\n\n that.viewer.render(that.viewer.hierarchy)\n\n })\n parent.append('br')\n\n parent.append('text').style('display','inline').text('E').style('margin-right','4px').style('margin-left','12px')\n var selectrl = parent.append('select').attr('id','selectrl' + container_id ).attr('class','select_node_face').on('change', function(){\n\n var value = this.value === 'None' ? false : this.value\n\n that.viewer.model.settings.display_leaf_label = value\n\n that.viewer.render(that.viewer.hierarchy)\n\n })\n parent.append('br')\n\n parent.append('text').style('display','inline').text('F').style('margin-right','4px').style('margin-left','12px')\n var selectlbl = parent.append('select').attr('id','selectlbl' + container_id ).attr('class','select_node_face').on('change', function(){\n\n var value = this.value === 'None' ? false : this.value\n\n that.viewer.model.settings.display_leaf_label_left_bottom = value\n\n that.viewer.render(that.viewer.hierarchy)\n\n })\n\n\n\n selectltl.selectAll('option').data(options2).enter().append('option').attr('value', function (d) { return d; }).text(function (d) { return d; });\n selectlbl.selectAll('option').data(options2).enter().append('option').attr('value', function (d) { return d; }).text(function (d) { return d; });\n selectrl.selectAll('option').data(options2_name).enter().append('option').attr('value', function (d) { return d; }).text(function (d) { return d; });\n\n this.add_quartet_buttons_single_line(this.menu_tree_p, \"Font size\", \"buton_leaf_label_size_\", this.container_object.update_font_size_leaf_percent)\n\n parent.append('br')\n\n\n function selectElement(id, valueToSelect) {\n let element = document.getElementById(id);\n element.value = valueToSelect;\n }\n\n selectElement('selectr' + container_id, this.viewer.model.settings.display_internal_label == false ? \"None\" : this.viewer.model.settings.display_internal_label )\n selectElement('selectlb' + container_id, this.viewer.model.settings.display_internal_label_left_bottom == false ? \"None\" : this.viewer.model.settings.display_internal_label_left_bottom )\n selectElement('selectlt' + container_id, this.viewer.model.settings.display_internal_label_left_top == false ? \"None\" : this.viewer.model.settings.display_internal_label_left_top )\n\n selectElement('selectrl' + container_id, this.viewer.model.settings.display_leaf_label == false ? \"Default\" : this.viewer.model.settings.display_leaf_label )\n selectElement('selectlbl' + container_id, this.viewer.model.settings.display_leaf_label_left_bottom == false ? \"None\" : this.viewer.model.settings.display_leaf_label_left_bottom )\n selectElement('selectltl' + container_id, this.viewer.model.settings.display_leaf_label_left_top == false ? \"None\" : this.viewer.model.settings.display_leaf_label_left_top )\n\n\n }\n\n add_quartet_buttons_single_line(parent, label, id, f, aux){\n\n var f = f || function(){};\n var aux = aux || null;\n\n var container = parent.append('div')\n .style('display', 'flex')\n .style('align-items', 'center');\n\n container.append(\"p\").text(label)\n .style('margin-bottom','0px')\n .style('font-weight','bold')\n .style('font-size','small')\n .style('margin-right','8px')\n\n var buttons = container.append('div')\n .style('display', 'flex')\n .style('margin-top', '0px')\n .style('margin-bottom', '4px')\n\n\n var butty_putty1 = buttons.append('button')\n .attr('class', ' square_button mini')\n .style('border-radius', '0px')\n .style('padding', '2px')\n .attr('id', id + 'first' + this.container_object.uid )\n .on(\"click\", (e) => f.call(this.container_object,-0.50, aux ) )\n .style('margin', '2px')\n .style('flex-grow', '1')\n\n\n\n\n butty_putty1.append('p')\n .text('- 50%')\n .style('font-size', 'xx-small')\n .style('line-height', 'normal')\n .style('margin-bottom', '4px')\n\n var butty_putty2 = buttons.append('button')\n .attr('class', ' square_button mini')\n .style('border-radius', '0px')\n .style('padding', '2px')\n .attr('id', id + 'second' + this.container_object.uid )\n .on(\"click\", (e) => f.call(this.container_object,-0.20, aux ) )\n .style('margin', '2px')\n .style('flex-grow', '1')\n\n\n\n butty_putty2.append('p')\n .text('- 20%')\n .style('font-size', 'xx-small')\n .style('line-height', 'normal')\n .style('margin-bottom', '4px')\n\n\n var butty_putty3 = buttons.append('button')\n .attr('class', ' square_button mini')\n .style('border-radius', '0px')\n .style('padding', '2px')\n .attr('id', id + 'third' + this.container_object.uid )\n .on(\"click\", (e) => f.call(this.container_object,0.20, aux ) )\n .style('margin', '2px')\n .style('flex-grow', '1')\n\n\n\n\n butty_putty3.append('p')\n .text('+ 20%')\n .style('font-size', 'xx-small')\n .style('line-height', 'normal')\n .style('margin-bottom', '4px')\n\n\n\n var butty_putty4 = buttons.append('button')\n .attr('class', ' square_button mini')\n .style('border-radius', '0px')\n .style('padding', '2px')\n .attr('id', id + 'fourth' + this.container_object.uid )\n .on(\"click\", (e) => f.call(this.container_object,0.50, aux ) )\n .style('margin', '2px')\n .style('flex-grow', '1')\n\n\n\n butty_putty4.append('p')\n .text('+ 50%')\n .style('font-size', 'xx-small')\n .style('line-height', 'normal')\n .style('margin-bottom', '4px')\n\n return buttons\n\n\n\n }\n\n add_quartet_buttons(parent, label, id, f, aux){\n\n var f = f || function(){};\n var aux = aux || null;\n\n parent.append(\"p\").text(label)\n .style('margin-bottom','0px')\n .style('font-weight','bold')\n\n var buttons = parent.append('div')\n .style('display', 'flex')\n .style('margin-top', '0px')\n .style('margin-bottom', '4px')\n\n\n var butty_putty1 = buttons.append('button')\n .attr('class', ' square_button')\n .style('border-radius', '0px')\n .style('padding', '2px')\n .attr('id', id + 'first' + this.container_object.uid )\n .on(\"click\", (e) => f.call(this.container_object,-0.50, aux ) )\n .style('margin', '2px')\n .style('flex-grow', '1')\n\n\n butty_putty1.append(\"div\").append('i')\n .style('color', '#888')\n .style('font-size', '12px')\n .attr('class', ' bi bi-dash ')\n\n butty_putty1.append('p')\n .text('-50%')\n .style('font-size', 'xx-small')\n .style('line-height', 'normal')\n .style('margin-bottom', '4px')\n\n var butty_putty2 = buttons.append('button')\n .attr('class', ' square_button')\n .style('border-radius', '0px')\n .style('padding', '2px')\n .attr('id', id + 'second' + this.container_object.uid )\n .on(\"click\", (e) => f.call(this.container_object,-0.20, aux ) )\n .style('margin', '2px')\n .style('flex-grow', '1')\n\n\n butty_putty2.append(\"div\").append('i')\n .style('color', '#888')\n .style('font-size', '8px')\n .attr('class', ' bi bi-dash ')\n\n butty_putty2.append('p')\n .text('-20%')\n .style('font-size', 'xx-small')\n .style('line-height', 'normal')\n .style('margin-bottom', '4px')\n\n\n var butty_putty3 = buttons.append('button')\n .attr('class', ' square_button')\n .style('border-radius', '0px')\n .style('padding', '2px')\n .attr('id', id + 'third' + this.container_object.uid )\n .on(\"click\", (e) => f.call(this.container_object,0.20, aux ) )\n .style('margin', '2px')\n .style('flex-grow', '1')\n\n\n\n butty_putty3.append(\"div\").append('i')\n .style('color', '#888')\n .style('font-size', '8px')\n .attr('class', ' bi bi-plus ')\n\n butty_putty3.append('p')\n .text('+20%')\n .style('font-size', 'xx-small')\n .style('line-height', 'normal')\n .style('margin-bottom', '4px')\n\n\n\n var butty_putty4 = buttons.append('button')\n .attr('class', ' square_button')\n .style('border-radius', '0px')\n .style('padding', '2px')\n .attr('id', id + 'fourth' + this.container_object.uid )\n .on(\"click\", (e) => f.call(this.container_object,0.50, aux ) )\n .style('margin', '2px')\n .style('flex-grow', '1')\n\n\n\n butty_putty4.append(\"div\").append('i')\n .style('color', '#888')\n .style('font-size', '12px')\n .attr('class', ' bi bi-plus ')\n\n butty_putty4.append('p')\n .text('+50%')\n .style('font-size', 'xx-small')\n .style('line-height', 'normal')\n .style('margin-bottom', '4px')\n\n return buttons\n\n\n\n }\n\n add_slider_UI(parent, label, min, max, current, step, id, f){\n\n var f = f || function(){};\n\n parent.append(\"p\").text(label).style('margin-bottom','0px').style('font-weight','bold')\n\n var d = parent.append('div')\n .attr(\"class\",\"slidecontainer\")\n\n var input = d.append('input').attr(\"class\",\"slider\")\n .attr('type', 'range' )\n .attr('min', min )\n .attr('max', max )\n .attr('value', current )\n //.attr('step', step )\n .attr('id', id + this.container_object.uid )\n .on('click', (e) => { f(e)} )\n .style('margin-bottom','12px')\n\n return input\n\n\n\n }\n\n update_slider(slide ,value){\n slide.attr('value', value);\n }\n\n //OLD PHYLO COPY PASTE todo clean\n // Below are the functions that handle actual exporting:\n // getSVGString ( svgNode ) and svgString2Image( svgString, width, height, format, callback )\n getSVGString( svgNode ) {\n svgNode.setAttribute('xlink', 'http://www.w3.org/1999/xlink');\n var cssStyleText = getCSSStyles( svgNode );\n appendCSS( cssStyleText, svgNode );\n\n var serializer = new XMLSerializer();\n var svgString = serializer.serializeToString(svgNode);\n svgString = svgString.replace(/(\\w+)?:?xlink=/g, 'xmlns:xlink='); // Fix root xlink without namespace\n svgString = svgString.replace(/NS\\d+:href/g, 'xlink:href'); // Safari NS namespace fix\n\n return svgString;\n\n function getCSSStyles( parentElement ) {\n var selectorTextArr = [];\n\n // Add Parent element Id and Classes to the list\n selectorTextArr.push( '#'+parentElement.id );\n for (var c = 0; c < parentElement.classList.length; c++)\n if ( !contains('.'+parentElement.classList[c], selectorTextArr) )\n selectorTextArr.push( '.'+parentElement.classList[c] );\n\n // Add Children element Ids and Classes to the list\n var nodes = parentElement.getElementsByTagName(\"*\");\n for (var i = 0; i < nodes.length; i++) {\n var id = nodes[i].id;\n if ( !contains('#'+id, selectorTextArr) )\n selectorTextArr.push( '#'+id );\n\n var classes = nodes[i].classList;\n for (var c = 0; c < classes.length; c++)\n if ( !contains('.'+classes[c], selectorTextArr) )\n selectorTextArr.push( '.'+classes[c] );\n }\n\n // Extract CSS Rules\n var extractedCSSText = \"\";\n for (var i = 0; i < document.styleSheets.length; i++) {\n var s = document.styleSheets[i];\n\n try {\n if(!s.cssRules) continue;\n } catch( e ) {\n if(e.name !== 'SecurityError') throw e; // for Firefox\n continue;\n }\n\n var cssRules = s.cssRules;\n for (var r = 0; r < cssRules.length; r++) {\n if ( contains( cssRules[r].selectorText, selectorTextArr ) )\n extractedCSSText += cssRules[r].cssText;\n }\n }\n\n\n return extractedCSSText;\n\n function contains(str,arr) {\n return arr.indexOf( str ) === -1 ? false : true;\n }\n\n }\n\n function appendCSS( cssText, element ) {\n var styleElement = document.createElement(\"style\");\n styleElement.setAttribute(\"type\",\"text/css\");\n styleElement.innerHTML = cssText;\n var refNode = element.hasChildNodes() ? element.children[0] : null;\n element.insertBefore( styleElement, refNode );\n }\n }\n\n svgString2Image( svgString, width, height, format, callback ) {\n var format = format ? format : 'png';\n\n var imgsrc = 'data:image/svg+xml;base64,'+ btoa( unescape( encodeURIComponent( svgString ) ) ); // Convert SVG string to dataurl\n\n var canvas = document.createElement(\"canvas\");\n var context = canvas.getContext(\"2d\");\n\n canvas.width = width;\n canvas.height = height;\n\n var image = new Image;\n image.onload = function() {\n\n context.clearRect ( 0, 0, width, height );\n context.fillStyle = \"#ffffff\";\n context.fillRect(0, 0, width, height);\n context.drawImage(image, 0, 0, width, height);\n\n canvas.toBlob( function(blob) {\n var filesize = Math.round( blob.length/1024 ) + ' KB';\n if ( callback ) callback( blob, filesize );\n });\n };\n image.src = imgsrc;\n }\n\n addLogo(svg) {\n // TODO load with ajax\n var logo_xml = '<svg id=\"exportLogo\" x=\"0\" y=\"0\"><g id=\"g4169\"> <path d=\"m 29.606259,23.679171 1.905511,0 c 0.193778,0.617882 0.290669,1.188505 0.290672,1.711869 0.466506,-0.545171 1.022728,-0.99222 1.668668,-1.341146 0.653108,-0.348904 1.295455,-0.523362 1.927043,-0.523373 0.976073,1.1e-5 1.86603,0.261698 2.669869,0.78506 0.810999,0.523383 1.442581,1.221215 1.894747,2.093495 0.459321,0.865028 0.688986,1.802739 0.688998,2.813134 -1.2e-5,1.010407 -0.229677,1.951752 -0.688998,2.824038 -0.452166,0.865023 -1.083748,1.559219 -1.894747,2.082592 -0.803839,0.516105 -1.693796,0.774156 -2.669869,0.774157 -0.638765,-1e-6 -1.284701,-0.163554 -1.937809,-0.490663 -0.653117,-0.334377 -1.20575,-0.770521 -1.657902,-1.308434 l 0,6.542172 -1.711731,0 0,-12.713622 c -2e-6,-0.552441 -0.04665,-1.170313 -0.139953,-1.853616 -0.08613,-0.683283 -0.20096,-1.148504 -0.344499,-1.395663 m 2.196183,5.539039 c -3e-6,1.133981 0.355261,2.093499 1.065795,2.878557 0.717702,0.777793 1.561006,1.166688 2.529916,1.166687 0.954543,10e-7 1.79067,-0.392528 2.508385,-1.177592 0.717697,-0.785056 1.07655,-1.740939 1.076561,-2.867652 -1.1e-5,-1.1267 -0.358864,-2.082583 -1.076561,-2.867652 -0.717715,-0.79232 -1.553842,-1.188485 -2.508385,-1.188495 -0.96891,10e-6 -1.812214,0.396175 -2.529916,1.188495 -0.710534,0.785069 -1.065798,1.740952 -1.065795,2.867652\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4145\" /> <path d=\"m 43.224746,34.75725 0,-16.279106 1.711731,0 0,7.152775 c 0.437798,-0.610593 0.94378,-1.112159 1.517951,-1.504699 0.581337,-0.399789 1.151913,-0.599688 1.71173,-0.599699 0.602867,1.1e-5 1.141147,0.123585 1.614841,0.370723 0.473678,0.23989 0.854062,0.570633 1.141153,0.99223 0.287074,0.421615 0.502386,0.897739 0.645937,1.428373 0.143531,0.523382 0.215302,1.083101 0.215312,1.679158 l 0,6.760245 -1.6902,0 0,-6.760245 c -8e-6,-0.33437 -0.0323,-0.65421 -0.09689,-0.959518 -0.05742,-0.305294 -0.154315,-0.603326 -0.290672,-0.894097 -0.136371,-0.298024 -0.337329,-0.534268 -0.602873,-0.708736 -0.265559,-0.181718 -0.584938,-0.272581 -0.958139,-0.272591 -0.473692,10e-6 -0.96891,0.243524 -1.485653,0.730544 -0.509576,0.487036 -0.925846,1.05039 -1.24881,1.69006 -0.315795,0.632417 -0.47369,1.177598 -0.473687,1.635543 l 0,5.53904 -1.711731,0\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4147\" /> <path d=\"m 53.581256,23.679171 1.776325,0 3.423461,8.472114 3.337338,-8.472114 1.797856,0 -6.4163,16.388142 -1.819387,0 2.22848,-5.658979 -4.327773,-10.729163\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4149\" /> <path d=\"m 67.415055,34.75725 -1.71173,0 0,-16.279106 1.71173,0 0,16.279106\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4151\" /> <path d=\"m 80.882824,26.361462 c 0.523914,0.872297 0.785877,1.824546 0.785889,2.856748 -1.2e-5,1.032215 -0.261975,1.984463 -0.785889,2.856749 -0.523937,0.872291 -1.234467,1.562854 -2.131589,2.071689 -0.897143,0.501566 -1.873223,0.752348 -2.928244,0.752349 -1.062213,-1e-6 -2.04547,-0.250783 -2.949776,-0.752349 -0.897136,-0.508835 -1.607665,-1.199398 -2.131589,-2.071689 -0.523928,-0.872286 -0.78589,-1.824534 -0.785889,-2.856749 -10e-7,-1.032202 0.261961,-1.984451 0.785889,-2.856748 0.523924,-0.87955 1.234453,-1.570111 2.131589,-2.071688 0.904306,-0.508825 1.887563,-0.763242 2.949776,-0.763253 1.055021,1.1e-5 2.031101,0.254428 2.928244,0.763253 0.897122,0.501577 1.607652,1.192138 2.131589,2.071688 m -9.20459,2.856748 c -3e-6,1.126713 0.405501,2.082596 1.216513,2.867652 0.811004,0.785064 1.794261,1.177593 2.949775,1.177592 1.1555,10e-7 2.142346,-0.392528 2.960541,-1.177592 0.818175,-0.792325 1.227268,-1.748208 1.227279,-2.867652 -1.1e-5,-1.112162 -0.409104,-2.060776 -1.227279,-2.845844 -0.818195,-0.792321 -1.805041,-1.188485 -2.960541,-1.188495 -1.155514,10e-6 -2.138771,0.396174 -2.949775,1.188495 -0.811012,0.785068 -1.216516,1.733682 -1.216513,2.845844\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4153\" /> <path d=\"m 84.532366,34.0049 c -2e-6,-0.247148 0.08612,-0.457951 0.258374,-0.63241 0.172247,-0.181725 0.380382,-0.272588 0.624405,-0.27259 0.244018,2e-6 0.452152,0.09087 0.624405,0.27259 0.179424,0.174459 0.269137,0.385262 0.269141,0.63241 -4e-6,0.239881 -0.08972,0.454318 -0.269141,0.643314 -0.17943,0.181727 -0.387564,0.27259 -0.624405,0.27259 -0.236846,0 -0.444981,-0.09087 -0.624405,-0.27259 -0.172252,-0.188996 -0.258376,-0.403433 -0.258374,-0.643314\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee\" id=\"path4155\" /> <path d=\"m 89.527608,21.08411 c -10e-7,-0.239866 0.08253,-0.447035 0.247608,-0.621507 0.172248,-0.174444 0.380383,-0.261673 0.624406,-0.261687 0.23684,1.4e-5 0.437798,0.08724 0.602874,0.261687 0.172246,0.174472 0.258371,0.381641 0.258374,0.621507 -3e-6,0.247162 -0.08254,0.457964 -0.247609,0.632409 -0.165075,0.167203 -0.369621,0.250796 -0.613639,0.250783 -0.244023,1.3e-5 -0.452158,-0.08358 -0.624406,-0.250783 -0.165074,-0.174445 -0.247609,-0.385247 -0.247608,-0.632409 m 1.356465,13.67314 -0.968904,0 0,-11.056271 0.968904,0 0,11.056271\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee\" id=\"path4157\" /> <path d=\"m 99.593447,23.526521 c 0.753583,1.1e-5 1.474873,0.149027 2.163883,0.447048 0.68899,0.298043 1.28468,0.701476 1.78709,1.210302 0.50238,0.508844 0.90072,1.115812 1.19499,1.820905 0.29424,0.705108 0.44137,1.442918 0.44139,2.213434 -2e-5,0.777797 -0.14715,1.519242 -0.44139,2.224339 -0.29427,0.705104 -0.69261,1.312071 -1.19499,1.820905 -0.50241,0.501568 -1.0981,0.905001 -1.78709,1.210301 -0.68901,0.298033 -1.4103,0.447049 -2.163883,0.447049 -1.543077,0 -2.860068,-0.556084 -3.950979,-1.668254 -1.090916,-1.112166 -1.636373,-2.456945 -1.636372,-4.03434 -10e-7,-1.032202 0.247608,-1.984451 0.742827,-2.856748 0.502393,-0.87955 1.180625,-1.570111 2.0347,-2.071688 0.861243,-0.508825 1.797849,-0.763242 2.809824,-0.763253 m -4.629212,5.691689 c -2e-6,1.301171 0.452153,2.416973 1.356467,3.347412 0.911483,0.923175 2.009573,1.38476 3.294277,1.384759 1.284681,10e-7 2.379191,-0.461584 3.283511,-1.384759 0.91147,-0.930439 1.36721,-2.046241 1.36722,-3.347412 -1e-5,-1.293889 -0.45575,-2.402423 -1.36722,-3.325603 -0.90432,-0.923164 -1.99883,-1.38475 -3.283511,-1.38476 -1.284704,10e-6 -2.382794,0.461596 -3.294277,1.38476 -0.904314,0.92318 -1.356469,2.031714 -1.356467,3.325603\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee\" id=\"path4159\" /> </g> <g id=\"g4014\" transform=\"translate(12.84,20.592727)\"> <g transform=\"translate(0,-0.065)\" id=\"g3992\"> <polygon style=\"fill:#939598\" id=\"polygon461\" points=\"5.7,0.23 11.86,0.23 11.86,1.65 7.12,1.65 7.12,6.04 11.86,6.04 11.86,7.46 11.86,7.46 5.7,7.46 \" class=\"cls-2\" /> <polygon style=\"fill:#939598\" id=\"polygon463\" points=\"0,7.08 3.51,7.08 3.51,8.49 1.43,8.49 1.45,15.84 12.68,15.84 12.68,17.26 12.68,17.26 0.04,17.26 \" class=\"cls-2\" /> <polygon style=\"fill:#939598\" id=\"polygon465\" points=\"10.49,11.02 10.49,12.44 10.49,12.44 2.84,12.44 2.84,7.79 4.26,7.79 4.26,11.02 \" class=\"cls-2\" transform=\"translate(0,-0.15225398)\" /> <polygon style=\"fill:#bcbec0\" id=\"polygon467\" points=\"4.26,4.55 4.26,7.79 4.26,7.79 2.84,7.79 2.84,3.13 6.41,3.13 6.41,4.55 \" class=\"cls-3\" transform=\"matrix(1,0,0,0.85463687,0,0.4549866)\" /> <rect style=\"fill:#939598;fill-opacity:1\" id=\"rect3926-3\" width=\"1.4240631\" height=\"1.7319686\" x=\"2.8396611\" y=\"7.0799503\" /> <rect style=\"fill:#939598;fill-opacity:1\" id=\"rect3926-6\" width=\"1.3864813\" height=\"1.6934805\" x=\"5.7012329\" y=\"2.9206221\" /> </g> <g id=\"g4005\"> <g id=\"g3984\"> <polygon class=\"cls-2\" points=\"94.93,12.33 94.93,10.91 99.87,10.91 99.87,6.46 94.93,6.46 94.93,5.04 101.29,5.04 101.29,12.33 101.29,12.33 \" id=\"polygon453\" style=\"fill:#939598\" /> <polygon class=\"cls-2\" points=\"94.72,17.36 94.72,15.94 104.87,15.94 104.9,5.41 102.74,5.41 102.74,3.99 106.32,3.99 106.29,17.36 106.29,17.36 \" id=\"polygon455\" style=\"fill:#939598\" /> <polygon class=\"cls-2\" points=\"95.51,1.42 95.51,0 103.45,0 103.45,4.7 103.45,4.7 102.03,4.7 102.03,1.42 \" id=\"polygon457\" style=\"fill:#939598\" /> <polygon class=\"cls-3\" points=\"102.03,7.97 102.03,4.7 103.45,4.7 103.45,9.39 103.45,9.39 100.65,9.39 100.65,7.97 \" id=\"polygon459\" style=\"fill:#bcbec0\" /> <rect y=\"3.9876499\" x=\"102.02941\" height=\"1.4238259\" width=\"1.4579451\" id=\"rect3926\" style=\"fill:#939598;fill-opacity:1\" /> <rect y=\"7.884686\" x=\"99.887817\" height=\"1.6934805\" width=\"1.397205\" id=\"rect3926-7\" style=\"fill:#939598;fill-opacity:1\" /> </g> </g> </g> </g> </svg>';\n\n\n svg.append(\"g\").html(logo_xml);\n\n }\n\n add_empty_message(){\n\n\n this.container_d3.selectAll(\".empty_message\").remove()\n\n\n /*if (phylo.phylo_embedded){\n\n if (phylo.bound_container[0]==this.container_object){\n tooltip_object[0].show()\n tooltip_object[3].show()\n }\n\n }\n\n */\n\n\n\n this.viewer.svg_d3.node().append('g')\n .attr(\"class\", 'empty_message')\n .attr('width',this.viewer.width )\n .attr(\"transform\", \"translate(\"+ (this.viewer.width/2)+\",\" + (this.viewer.height/2) + \")\")\n .append(\"text\")\n .attr(\"fill\", \"#333\")\n .attr('text-anchor', 'middle')\n .style('font-size', '1.2em')\n .html('No tree here! You can <a href=\"#\" id=\"add_tree_link' + this.container_object.uid +'\">add a tree</a> or use the examples below.')\n\n document.querySelector('#add_tree_link'+ this.container_object.uid).addEventListener('click', event => {\n $('#exampleModal' + this.container_object.uid).modal('show')\n });\n\n\n\n this.viewer.svg_d3.node().append('text')\n .attr(\"class\", 'empty_message')\n .attr(\"transform\", \"translate(\"+ (this.viewer.width/2)+\",\" + (this.viewer.height/2 + 24) + \")\")\n .attr('text-anchor', 'middle')\n .attr(\"fill\", \"#bbb\")\n .html(\"Ready to use examples: <a id='ex1\"+ this.container_object.uid +\"' style='cursor:pointer;text-decoration: underline'> Tree collection #1</a> - <a style='cursor:pointer;text-decoration: underline' id='ex2\"+ this.container_object.uid +\"'>Tree collection #2</a> \")\n\n\n\n document.querySelector('#ex1'+ this.container_object.uid).addEventListener('click', event => {\n this.container_object.add_tree(this.examples[\"LRF1\"],{'data_type': 'nhx'})\n this.container_object.add_tree(this.examples[\"r2t\"])\n this.container_object.add_tree(this.examples[\"unrooted1\"])\n this.container_object.add_tree(this.examples[\"small1\"])\n\n\n this.api.start()\n });\n\n document.querySelector('#ex2'+ this.container_object.uid).addEventListener('click', event => {\n\n this.container_object.add_tree(this.examples[\"LRF2\"],{'data_type': 'nhx'})\n this.container_object.add_tree(this.examples[\"rokas\"])\n this.container_object.add_tree(this.examples[\"nhx\"],{'data_type': 'nhx'})\n this.container_object.add_tree(this.examples[\"unrooted2\"])\n this.container_object.add_tree(this.examples[\"small2\"])\n this.container_object.add_tree(this.examples[\"stack\"],{'data_type': 'json', 'use_branch_lenght': false, 'show_histogram':true, 'collapse_level': 2})\n this.api.start()\n });\n\n }\n\n\n}\n\n//# sourceURL=webpack://PhyloIO/./src/interface.js?");
8718
8606
 
8719
8607
  /***/ }),
8720
8608
 
@@ -8736,7 +8624,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
8736
8624
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8737
8625
 
8738
8626
  "use strict";
8739
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Model)\n/* harmony export */ });\n/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ \"./node_modules/d3/index.js\");\n/* harmony import */ var minhashjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! minhashjs */ \"./node_modules/minhashjs/index.js\");\n/* harmony import */ var biojs_io_newick__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! biojs-io-newick */ \"./node_modules/biojs-io-newick/src/index.js\");\n\n\n\n\nvar uid_model = 0\nvar uid_untitle_counter = 0\n;\nconst { parse_nhx } = __webpack_require__(/*! ./utils.js */ \"./src/utils.js\")\n\nclass Model {\n\n constructor(data, settings, from_raw_data = true) {\n\n this.zoom;\n this.settings = {\n 'uid': null,\n 'domain_extended_data' : {},\n 'extended_data_type' : {'Topology': 'num'},\n 'labels' : {'leaf' : new Set(), 'node':new Set()},\n 'colorlabels' :{'leaf' : new Set(), 'node':new Set([\"Topology\"])},\n 'display_leaves' : true,\n 'mirror': false,\n 'name': null,\n 'first_time_render': true,\n 'data_type' : 'newick',\n 'use_branch_lenght' : true,\n 'show_tooltips' : false,\n 'subsample_label' : true,\n 'display_internal_label' : false,\n 'display_internal_label_left_top' : false,\n 'display_internal_label_left_bottom' : false,\n 'display_duplication' : false,\n 'has_branch_lenght' : true,\n 'has_duplications' : false,\n 'dessimode': false,\n 'multiple_search':false,\n 'show_histogram' : false,\n 'align_tip' : false,\n 'use_meta_for_leaf' : true,\n 'use_meta_for_node' : false,\n 'has_histogram_data' : false,\n 'similarity': [],\n 'style': {\n 'font_size_internal' : 14,\n 'color_accessor' : {'leaf' : null, 'node': \"Topology\"},\n 'color_extent_min': {'leaf' : {}, 'node': {\"Topology\":0}},\n 'color_extent_max':{'leaf' : {}, 'node': {\"Topology\":1}},\n 'number_domain':{'leaf' : '3', 'node': '5'},\n 'color_domain':{'leaf' : ['#253494', '#2C7FB8', '#41B6C4', '#C7E9B4', '#FFFFCC'], 'node': ['#253494', '#2C7FB8', '#41B6C4', '#C7E9B4', '#FFFFCC']},\n 'color_domain_default':{'leaf' : ['#253494', '#2C7FB8', '#41B6C4', '#C7E9B4', '#FFFFCC'], 'node': ['#253494', '#2C7FB8', '#41B6C4', '#C7E9B4', '#FFFFCC']},\n },\n 'tree': {\n 'node_vertical_size' : 30,\n 'node_horizontal_size' : 40,\n 'node_radius' : 6, // move to style\n 'line_width' : 3,// move to style\n 'font_size':14, // move to style\n 'max_depth' : 0,\n },\n 'collapse_level': 0,\n 'stack' : {\n 'type': 'genes',//'events',\n 'showHistogramValues' : false,\n 'showHistogramSummaryValue' : true,\n 'legendTxtSize' : 12,\n 'margin' : 8,\n 'xInitialRightMargin' : 45,\n 'stackHeight' : 120,\n 'stackWidth' : 30,\n 'maxStackHeight': 'max', // ratio -> stack height fixed | max -> largest data = stack height\n 'has_support' : false,\n 'only_support' : false,\n\n },\n }\n\n if (settings) {\n\n for(var key in settings) {\n\n if (key == 'labels_array_leaf'){\n var value = settings[key];\n this.settings['labels']['leaf'] = new Set(value);\n }\n if (key == 'labels_array_node'){\n var value = settings[key];\n this.settings['labels']['node'] = new Set(value);\n }\n if (key == 'colorlabels_array_leaf'){\n var value = settings[key];\n this.settings['colorlabels']['leaf'] = new Set(value);\n }\n\n if (key == 'colorlabels_array_node'){\n var value = settings[key];\n this.settings['colorlabels']['node'] = new Set(value);\n }\n\n else{\n var value = settings[key];\n this.settings[key] = value;\n }\n\n\n }\n\n }\n\n this.settings.name = this.settings.name ? this.settings.name : \"Untitled \" + uid_untitle_counter++\n\n this.uid = null\n this.input_data = data;\n this.leaves = []\n\n\n\n if (from_raw_data){\n this.uid = uid_model++;\n this.settings.uid = this.uid;\n this.data = this.factory(this.parse());\n }\n else{\n this.uid = settings.uid;\n this.settings.uid = this.uid;\n this.data = data\n data.leaves = this.get_leaves(data)\n this.traverse(data, function(n,c){\n n.leaves = this.get_leaves(n)\n })\n }\n\n this.data.root = true;\n this.data.elementS = {}\n this.data.elementBCN = {}\n this.rooted = this.data.children.length !== 3\n this.big_tree = (this.leaves.length > 500)\n\n // check that histogram data is present and compute\n if(this.settings.show_histogram && this.data.evolutionaryEvents) {\n this.settings.has_histogram_data = true;\n this.largestGenome = 0;\n this.largestEvents = 0; // todo\n\n this.traverse(this.data , function(n,c){\n\n let g = n.nr_hogs ? n.nr_hogs : n.nr_proteins\n if (g > this.largestGenome ) {this.largestGenome = g;}\n\n if (n.evolutionaryEvents){\n\n var ga = n.evolutionaryEvents.gained ? n.evolutionaryEvents.gained : 0\n var l = n.evolutionaryEvents.lost ? n.evolutionaryEvents.lost : 0\n var d = n.evolutionaryEvents.duplications ? n.evolutionaryEvents.duplications : 0\n\n let e = ga + l + d\n\n\n if (e > this.largestEvents ) {this.largestEvents = e;}\n\n }\n\n if (this.settings.stack.has_support){\n\n let g_support = n.nr_hogs_support ? n.nr_hogs_support : n.nr_proteins_support\n if (g_support > this.largestGenome_support ) {this.largestGenome_support = g_support;}\n\n if (n.evolutionaryEvents_support){\n\n\n var ga_support = n.evolutionaryEvents_support.gained ? n.evolutionaryEvents_support.gained : 0\n var l_support = n.evolutionaryEvents_support.lost ? n.evolutionaryEvents_support.lost : 0\n var d_support = n.evolutionaryEvents_support.duplications ? n.evolutionaryEvents_support.duplications : 0\n\n let e_support = ga_support + l_support + d_support\n\n if (e_support > this.largestEvents_support ) {this.largestEvents_support = e_support;}\n\n }\n }\n\n\n\n })\n\n\n }\n\n }\n\n get_name(){\n return this.settings.name\n }\n\n set_name(name){\n this.settings.name = name\n }\n\n traverse(o,func_pre, func_post) {\n\n if (func_pre){\n func_pre.apply(this,[o,o[\"children\"]])\n }\n\n if(o[\"children\"]){\n\n for (var c in o[\"children\"] ) {\n\n var child = o[\"children\"][c]\n\n child = this.traverse(child, func_pre, func_post)\n\n if (func_post) {\n func_post.apply(this,[child,o])\n }\n\n\n }\n\n\n }\n\n return o\n\n }\n\n traverse_hierarchy(o,func_pre, func_post) {\n\n var children = o[\"children\"] ? o[\"children\"] : o[\"_children\"]\n\n if (func_pre){\n func_pre.apply(this,[o,children])\n }\n\n if(children ){\n\n for (var c in children) {\n\n var child = children[c]\n\n child = this.traverse_hierarchy(child, func_pre, func_post)\n\n if (func_post) {\n func_post.apply(this,[child,o])\n }\n\n\n }\n\n\n }\n\n return o\n\n }\n\n set_parent(node,parent){\n node.parent = parent\n }\n\n set_cumulated_length(node, children){\n if (node.parent) {\n node.depth = node.parent.depth + 1\n node.distance_to_root = node.parent.distance_to_root + node.branch_length\n }\n else{\n node.distance_to_root = 0\n node.depth = 0}\n\n }\n\n factory(json){ // todo do one traversal with all in one function\n\n var p;\n\n //has_branch_lenght\n this.settings.has_branch_lenght = false;\n\n json.children.forEach((child) => {\n if (typeof child.branch_length != 'undefined') { this.settings.has_branch_lenght = true; }\n })\n\n if (this.settings.has_branch_lenght) {\n this.settings.labels['node'].add('Length')\n this.settings.colorlabels['node'].add('Length')\n this.settings.extended_data_type['Length'] = 'num'\n\n this.settings.style.color_extent_max['node']['Length'] = 0;\n this.settings.style.color_extent_min['node']['Length'] = 1000000000;\n }\n\n\n // if branch size is not used put 1\n if (!this.settings.has_branch_lenght) {\n p = this.traverse(json, function(n,c){n.branch_length=1})\n p.branch_length = 0 // root\n }\n else{ // sanity check\n p = this.traverse(json, function(n,c){if (typeof n.branch_length == 'undefined') {n.branch_length=1} })\n if (typeof p.branch_length == 'undefined') {p.branch_length=1}\n }\n\n // set parent attribute\n p = this.traverse(json, null , this.set_parent)\n\n // compute cumulated lenght\n p = this.traverse(p, this.set_cumulated_length , null)\n\n this.traverse(p, function(n,c){\n\n n.extended_informations = {}\n n.elementS = {}\n n.elementBCN = {}\n\n if(n.branch_length){\n n.extended_informations['Length'] = n.branch_length;\n if (this.settings.style.color_extent_max['node']['Length'] < n.branch_length){\n this.settings.style.color_extent_max['node']['Length'] = n.branch_length\n }\n\n if (this.settings.style.color_extent_min['node']['Length'] > n.branch_length){\n this.settings.style.color_extent_min['node']['Length'] = n.branch_length\n }\n }\n\n if (typeof c !== 'undefined' && typeof n.name !== 'undefined' && n.name !== \"\" ) {\n n.extended_informations['Data'] = n.name;\n this.settings.labels['node'].add('Data')\n this.settings.extended_data_type['Data'] = 'num'\n\n if (!isNaN(n.name)){\n\n if (!this.settings.colorlabels['node'].has('Data')){\n this.settings.colorlabels['node'].add('Data');\n this.settings.style.color_extent_max['node']['Data'] = 0;\n this.settings.style.color_extent_min['node']['Data'] = 1000000000;\n }\n\n if (this.settings.style.color_extent_max['node']['Data'] <n.name){\n this.settings.style.color_extent_max['node']['Data'] = n.name\n }\n\n if (this.settings.style.color_extent_min['node']['Data'] > n.name){\n this.settings.style.color_extent_min['node']['Data'] = n.name\n }\n\n }\n\n else {this.settings.extended_data_type['Data'] = 'cat'}\n }\n\n if(n.data_nhx && Object.keys(n.data_nhx).length > 0){\n\n Object.entries(n.data_nhx).forEach(([key, value]) => {\n\n this.settings.labels['node'].add(key)\n\n switch(key){\n case 'Ev':\n if (value == 'duplication') {\n n.duplication = true\n this.settings.has_duplications = true;\n }\n n.extended_informations.events = value\n n.extended_informations[key] = value\n this.settings.extended_data_type['Ev'] = 'cat'\n break;\n case 'DD':\n case 'D':\n if (value == 'Y') {\n n.duplication = true\n this.settings.has_duplications = true;\n\n }\n else if (value == 'N'){\n n.duplication = false\n this.settings.has_duplications = true;\n }\n n.extended_informations.events = value\n n.extended_informations[key] = value\n this.settings.extended_data_type['D'] = 'cat'\n break;\n default:\n n.extended_informations[key] = value\n this.settings.extended_data_type[key] = 'cat'\n break;\n }\n });\n\n\n }\n\n\n if (n.depth > this.settings.tree.max_depth){\n this.settings.tree.max_depth = n.depth\n }\n if (!(n.hasOwnProperty('children'))){\n this.leaves.push(n)\n n.correspondingLeaf = {}\n\n }\n\n n.leaves = this.get_leaves(n)\n\n })\n\n this.settings.suggestions = [] // autocomplete name\n this.traverse(json, function(n,c){\n if (n.name !== ''){this.settings.suggestions.push(n.name)}}) //todo add id also and ncBI and more + check empty cfucntion\n return p\n }\n\n build_hierarchy_mockup(){\n return d3__WEBPACK_IMPORTED_MODULE_0__.hierarchy(this.data, d => d.children );\n }\n\n parse(){\n\n if (this.settings.data_type === \"newick\") {\n return biojs_io_newick__WEBPACK_IMPORTED_MODULE_2__.parse_newick(this.input_data);\n }\n\n else if (this.settings.data_type === \"nhx\") {\n return parse_nhx(this.input_data);\n }\n\n else if (this.settings.data_type === \"json\") {\n return this.input_data\n }\n\n\n\n\n }\n\n collapse(data, action){\n if (!data.children){return}\n if (action) {data.collapse = true}\n else if (action == false){data.collapse = false}\n else{data.collapse ? data.collapse = false : data.collapse = true;}\n\n }\n\n collapseAll(data, action){\n if (action) {\n this.traverse(data, (n,c) => {\n this.collapse(n, true)\n //n.collapse = true\n } , null)}\n else if (action == false){\n this.traverse(data, (n,c) => {\n this.collapse(n, false)\n //n.collapse = false\n } , null)}\n\n\n }\n\n get_all_collapse(data){\n\n var collapsed = []\n\n this.traverse(data, (n,c) => {if (n.collapse){\n collapsed.push(n)\n }}, null)\n\n return collapsed\n\n }\n\n apply_collapse_to_list(collapsed){\n this.traverse(this.data, (n,c) => {\n if (collapsed.includes(n)){\n this.collapse(n, true)\n }\n else{\n this.collapse(n, false)\n }\n } , null)\n }\n\n swap_subtrees(data){\n var e = data.children.pop()\n data.children.unshift(e)\n data.leaves = this.get_leaves(data)\n }\n\n unswap_subtrees(data){\n var e = data.children.shift()\n data.children.push(e)\n data.leaves = this.get_leaves(data)\n\n }\n\n reroot(data){\n\n // extract meta data (zoom)\n var meta = this.zoom;\n\n // create new root r\n\n var root = {\"children\": [], \"name\": \"\", \"branch_length\": 0, \"extended_informations\": {}}\n\n for (var key in data.extended_informations) {\n if (data.extended_informations.hasOwnProperty(key)) {\n root.extended_informations[key] = null\n }\n }\n\n // source and target node of the clicked edges\n var parent = data.parent\n var child = data\n\n // insert new root node between target and source and connect\n root.children.push(child)\n parent.children.push(root)\n this.set_parent(child, root )\n this.set_parent(root, parent )\n const index = parent.children.indexOf(child);\n if (index > -1) {\n parent.children.splice(index, 1);\n }\n\n // ajust distance now that distance target/source is splitted in two\n var old_distance = child.branch_length\n\n child.branch_length = old_distance/2\n child.extended_informations['Length'] = old_distance/2\n\n parent.branch_length_before_reverse = parent.branch_length\n parent.branch_length = old_distance /2\n parent.extended_informations['Length'] = old_distance/2\n\n\n\n // While we are at the old root reverse child/parent order\n var parent = parent\n var child = root\n var stack = []\n\n while (parent.root != true) {\n\n stack.push([parent,child])\n\n child = parent\n parent = parent.parent\n\n\n parent.branch_length_before_reverse = parent.branch_length\n if (child.branch_length_before_reverse){\n parent.branch_length = child.branch_length_before_reverse\n parent.extended_informations['Length'] = child.branch_length_before_reverse\n }\n else{\n parent.branch_length = child.branch_length\n parent.extended_informations['Length'] = child.branch_length\n }\n\n\n }\n stack.push([parent,child])\n for (var e in stack){\n var p = stack[e][0]\n var c = stack[e][1]\n\n this.reverse_order(p,c)\n\n }\n\n // Remove old root\n\n var old_root = parent\n var leading_branch = parent.parent\n\n\n\n if (old_root.children.length == 1){\n\n const ce = leading_branch.children.indexOf(old_root);\n if (ce > -1) {\n leading_branch.children.splice(ce, 1);\n }\n\n var i = 0,len = old_root.children.length;\n while (i < len) {\n let c = old_root.children[i]\n c.parent = leading_branch\n leading_branch.children.push(c)\n i++\n }\n\n old_root = null\n\n\n\n }\n\n // For multifurcation we need to keep the root\n else {\n old_root.root = false\n old_root.branch_length = leading_branch.branch_length\n parent.extended_informations['Length'] = leading_branch.branch_length\n }\n\n\n // configure new root\n root.zoom = meta\n this.data = root;\n this.data.root = true;\n\n root.leaves = this.get_leaves(root)\n\n\n this.traverse(root, function(n,c){\n n.leaves = this.get_leaves(n)\n })\n\n\n\n }\n\n trim(branch){\n\n // source and target node of the clicked edges\n var parent = branch.parent\n var child = branch\n\n var untrim_data = {\n \"parent\" : null,\n \"floating\" : null,\n \"untrim_data\" : null,\n \"index\": null,\n \"root_mode\": false,\n }\n\n\n if (parent.children.length > 2) {\n untrim_data.index = this.detach_child(parent,child)\n\n untrim_data.parent = parent;\n untrim_data.floating = false;\n untrim_data.child = child;\n\n return untrim_data;\n }\n\n else{\n\n if (typeof parent.parent == 'undefined'){ // parent is root\n untrim_data.root_mode = true;\n\n var sibling = parent.children[0] == child ? parent.children[1] : parent.children[0]\n untrim_data.index = this.detach_child(parent, sibling)\n\n this.data = sibling;\n\n untrim_data.parent = null;\n untrim_data.floating = parent;\n untrim_data.child = sibling;\n\n return untrim_data;\n\n }\n\n else{\n\n this.detach_child(parent.parent, parent)\n var sibling = parent.children[0] == child ? parent.children[1] : parent.children[0]\n untrim_data.index = this.detach_child(parent, sibling)\n this.attach_child(parent.parent, sibling)\n\n untrim_data.parent = parent.parent;\n untrim_data.floating = parent;\n untrim_data.child = sibling;\n\n return untrim_data;\n\n }\n\n\n }\n\n }\n\n untrim(parent, floating, child, index, root_mode){\n\n if (floating != false){\n if (root_mode){\n this.data = floating\n this.attach_child(floating,child, index)\n\n }else{\n this.detach_child(parent,child)\n this.attach_child(parent,floating)\n this.attach_child(floating,child, index)\n }\n\n }\n else {\n this.attach_child(parent,child, index)\n }\n }\n\n detach_child(parent, child){\n var index = parent.children.indexOf(child);\n if (index > -1) {\n parent.children.splice(index, 1);\n }\n return index\n }\n\n attach_child(parent,child_to_adopt, index){\n\n if (typeof index !== 'undefined') {\n parent.children.splice( index, 0, child_to_adopt );\n child_to_adopt.parent = parent;\n\n } else {\n parent.children.push(child_to_adopt);\n child_to_adopt.parent = parent;\n }\n\n\n }\n\n interleave_node(parent, to_insert,child){\n this.detach_child(parent, child)\n this.attach_child(parent,to_insert)\n this.attach_child(to_insert, child)\n }\n\n store_zoomTransform(zoom){\n\n this.zoom = {\n \"k\":zoom.k,\n \"x\":zoom.x,\n \"y\":zoom.y,\n };\n }\n\n /**\n Description:\n Creates list of leaves of each node in subtree rooted at v\n\n Note:\n Difference between deep leaf list and leaves in:\n (A:0.1,B:0.2,(C:0.3,D:0.4):0.5);\n - Root has leaves: A, B, C and D (terminal leaves)\n - Root has deep leaves: A, B, C, D and CD (terminal leaves + intermediate leaves)\n */\n createDeepLeafList(filter) {\n\n function is_leaf(str) {\n return !str.includes(\"||\");\n }\n\n var build_deepLeafList = function(child, node){\n\n if ( child.hasOwnProperty('children') ){\n var dp = child.deepLeafList.filter(is_leaf).sort()\n if (!dp.every((e) => e === '')){\n child.deepLeafList.push(dp.join('||'));\n }\n\n }\n\n node.deepLeafList = node.deepLeafList.concat(child.deepLeafList)\n }\n\n var build_deepLeafLeaves = function(node,children){\n\n if (!(node.hasOwnProperty('children') )){\n\n if (typeof filter != 'undefined') {\n if (filter.includes(node.name)){\n node.deepLeafList = [node.name]\n }\n else{\n node.deepLeafList = []\n }\n\n }\n else{\n node.deepLeafList = [node.name]\n }\n\n }\n else {\n node.deepLeafList = []\n }\n\n\n }\n\n this.traverse(this.data, build_deepLeafLeaves, build_deepLeafList)\n\n }\n\n createMinHash(){\n\n var assign_hash = function(node,children){\n\n node.min_hash = new minhashjs__WEBPACK_IMPORTED_MODULE_1__.MinHash.MinHash()\n node.deepLeafList.map(function(w) { node.min_hash.update(w) });\n }\n\n this.traverse(this.data, assign_hash, null)\n }\n\n removeMinHash(){\n\n var remove_hash = function(node,children){\n\n node.min_hash = null\n }\n\n this.traverse(this.data, remove_hash, null)\n\n }\n\n reverse_order(parent,child) {\n\n child.children.push(parent)\n parent.parent =child\n\n const b = parent.children.indexOf(child);\n if (b > -1) {\n parent.children.splice(b, 1);\n }\n\n }\n\n get_leaves(node){\n\n\n var l = []\n\n this.traverse(node, function(n,c){\n if (!(n.hasOwnProperty('children'))){\n l.push(n)\n }\n\n\n })\n return l\n }\n\n remove_circularity(){ // safe my model\n var data = Object.assign({}, this.data);\n\n this.traverse(data, function(n,c){\n n.parent=null;\n n.leaves=null;\n n.correspondingLeaf = {}\n n.elementBCN = null})\n\n return data\n }\n\n remove_circularity_only_parent_and_leaves(){ // safe my model\n var data = Object.assign({}, this.data);\n\n this.traverse(data, function(n,c){\n n.parent=null;\n n.leaves=null;\n })\n\n return data\n }\n\n add_circularity_back(){\n\n this.data.leaves = this.get_leaves(this.data)\n\n this.traverse(this.data, function(n,c){n.leaves = this.get_leaves(n)}, this.set_parent)\n\n\n }\n\n add_meta_leaves(meta, headers, api){\n\n // headers: column_name -> type\n\n Object.keys(headers).forEach(item => {\n if (item != 'id' || item != 'Length' ) {\n\n this.settings.extended_data_type[item] = headers[item]\n this.settings.domain_extended_data[item] = []\n this.settings.labels['leaf'].add(item)\n this.settings.colorlabels['leaf'].add(item)\n\n if (headers[item] == 'num'){\n this.settings.style.color_extent_max['leaf'][item] = 0\n this.settings.style.color_extent_min['leaf'][item] = 100000\n }\n }\n\n })\n\n this.get_leaves(this.data).forEach(d => {\n if (d.name in meta){\n\n Object.entries(meta[d.name]).forEach(item => {\n if (item[0] != 'id'){\n\n d.extended_informations[item[0]]= item[1]\n\n if (this.settings.extended_data_type[item[0]] == 'num' && !isNaN(item[1])) {\n\n item[1] = item[1].toString().indexOf('.') != -1 ? parseFloat(item[1]) : parseInt(item[1])\n\n if (this.settings.style.color_extent_max['leaf'][item[0]] < item[1]) {\n this.settings.style.color_extent_max['leaf'][item[0]] = item[1]\n }\n\n if (this.settings.style.color_extent_min['leaf'][item[0]] > item[1]) {\n this.settings.style.color_extent_min['leaf'][item[0]] = item[1]\n }\n\n }\n\n if (this.settings.extended_data_type[item[0]] == 'cat'){\n\n var cs = api.get_color_scale(item[0])\n cs.add_value_to_map(item[1])\n\n this.settings.domain_extended_data[item[0]].push(item[1])\n }\n\n }\n\n })\n\n }\n\n })\n\n\n Object.keys(headers).forEach(item => {\n if (item != 'id' || item != 'Length' ) {\n\n\n if (headers[item] == 'cat'){\n api.get_color_scale(item).update()\n\n }\n }\n\n })\n\n\n\n }\n\n add_meta_nodes(meta, headers, api){\n\n\n Object.keys(headers).forEach(item => {\n if (item != 'id' || item != 'Length' ) {\n this.settings.extended_data_type[item] = headers[item]\n this.settings.domain_extended_data[item] = []\n this.settings.labels['node'].add(item)\n this.settings.colorlabels['node'].add(item)\n\n if (headers[item] == 'num'){\n this.settings.style.color_extent_max['node'][item] = 0\n this.settings.style.color_extent_min['node'][item] = 100000\n }\n }\n\n })\n\n\n this.traverse(this.data, function(n,c){\n\n if (n.extended_informations['Data'] in meta){\n\n Object.entries(meta[n.extended_informations['Data']]).forEach(item => {\n if (item[0] != 'id'){\n n.extended_informations[item[0]]= item[1]\n\n if (this.settings.extended_data_type[item[0]] == 'cat'){\n\n var cs = api.get_color_scale(item[0])\n cs.add_value_to_map(item[1])\n\n }\n\n else if (this.settings.extended_data_type[item[0]] == 'num' && !isNaN(item[1]) ) {\n\n item[1] = item[1].toString().indexOf('.') != -1 ? parseFloat(item[1]) : parseInt(item[1])\n\n if (this.settings.style.color_extent_max['node'][item[0]] < item[1]) {\n this.settings.style.color_extent_max['node'][item[0]] = item[1]\n }\n\n if (this.settings.style.color_extent_min['node'][item[0]] > item[1]) {\n this.settings.style.color_extent_min['node'][item[0]] = item[1]\n }\n\n }\n }\n })\n\n }\n })\n\n Object.keys(headers).forEach(item => {\n\n if (item != 'id' || item != 'Length' ) {\n\n\n if (headers[item] == 'cat'){\n api.get_color_scale(item).update()\n\n }\n }\n\n })\n }\n\n get_node_by_leafset(lset){\n\n function setsAreEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n\n return Array.from(a).every(element => {\n return b.has(element);\n });\n }\n\n lset = new Set(lset.map(leaf => leaf.toString()))\n\n var target = false\n\n\n var check = function(node,children){\n\n var nl = new Set(node.leaves.map(leaf => leaf.name.replaceAll(\"'\", '').toString()))\n\n if ( setsAreEqual(nl,lset)){\n target = node\n }\n\n }\n\n this.traverse(this.data, check, null)\n\n return target\n }\n\n};\n\n//# sourceURL=webpack://PhyloIO/./src/model.js?");
8627
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Model)\n/* harmony export */ });\n/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ \"./node_modules/d3/index.js\");\n/* harmony import */ var minhashjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! minhashjs */ \"./node_modules/minhashjs/index.js\");\n/* harmony import */ var biojs_io_newick__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! biojs-io-newick */ \"./node_modules/biojs-io-newick/src/index.js\");\n\n\n\n\nvar uid_model = 0\nvar uid_untitle_counter = 0\n;\nconst { parse_nhx } = __webpack_require__(/*! ./utils.js */ \"./src/utils.js\");\nconst { phyloXml } = __webpack_require__(/*! ./phyloxml.js */ \"./src/phyloxml.js\");\n\nclass Model {\n\n constructor(data, settings, from_raw_data = true) {\n\n this.zoom;\n this.settings = {\n 'uid': null,\n 'domain_extended_data' : {},\n 'edge_related_data' : ['Length'],\n 'default_internal_label_is_for_branch': false,\n 'extended_data_type' : {'Topology': 'num'},\n 'labels' : {'leaf' : new Set(), 'node':new Set()},\n 'colorlabels' :{'leaf' : new Set(), 'node':new Set([\"Topology\"])},\n 'display_leaves' : true,\n 'display_nodes_labels' : true,\n 'mirror': false,\n 'name': null,\n 'first_time_render': true,\n 'data_type' : 'newick',\n 'use_branch_lenght' : true,\n 'show_tooltips' : false,\n 'subsample_label' : true,\n 'use_internal_node_name_for_triangles' : true,\n 'display_internal_label' : false,\n 'display_internal_label_left_top' : false,\n 'display_internal_label_left_bottom' : false,\n 'display_leaf_label' : false,\n 'display_leaf_label_left_top' : false,\n 'display_leaf_label_left_bottom' : false,\n 'display_duplication' : false,\n 'has_branch_lenght' : true,\n 'has_duplications' : false,\n 'multiple_search':false,\n 'show_histogram' : false,\n 'align_tip' : false,\n 'use_meta_for_leaf' : true,\n 'use_meta_for_node' : false,\n 'has_histogram_data' : false,\n 'similarity': [],\n 'style': {\n 'font_size_internal' : 14,\n 'color_accessor' : {'leaf' : null, 'node': \"Topology\", 'circle': null},\n 'color_extent_min': {'leaf' : {}, 'node': {\"Topology\":0}, 'circle': {} },\n 'color_extent_max':{'leaf' : {}, 'node': {\"Topology\":1}, 'circle': {}},\n 'number_domain':{ 'Topology': 5, 'Length': 5},\n 'color_domain':{'Topology' : ['#253494', '#2C7FB8', '#41B6C4', '#C7E9B4', '#FFFFCC'], 'Length': ['#253494', '#2C7FB8', '#41B6C4', '#C7E9B4', '#FFFFCC']},\n 'color_domain_default': ['#253494', '#2C7FB8', '#41B6C4', '#C7E9B4', '#FFFFCC'],\n },\n 'tree': {\n 'node_vertical_size' : 30,\n 'node_horizontal_size' : 40,\n 'node_radius' : 6, // move to style\n 'line_width' : 3,// move to style\n 'font_size':14, // move to style\n 'max_depth' : 0,\n },\n 'collapse_level': 0,\n 'stack' : {\n 'type': 'genes',//'events',\n 'showHistogramValues' : false,\n 'showHistogramSummaryValue' : true,\n 'legendTxtSize' : 12,\n 'margin' : 8,\n 'xInitialRightMargin' : 45,\n 'stackHeight' : 120,\n 'stackWidth' : 30,\n 'maxStackHeight': 'max', // ratio -> stack height fixed | max -> largest data = stack height\n 'has_support' : false,\n 'only_support' : false,\n\n },\n 'sync_coloring': false,\n 'selected_triangle_coloring': 'None',\n 'selected_collapse_uncolored': 'Leaves',\n 'selected_collapse_monocolored': 'Leaves',\n 'colorScale': {'leaf' : null, 'node':null, 'circle': {}},\n 'intercolor': {'leaf' : null, 'node': null, 'circle': {}}\n }\n\n if (settings) {\n\n for(var key in settings) {\n\n if (key == 'labels_array_leaf'){\n var value = settings[key];\n this.settings['labels']['leaf'] = new Set(value);\n }\n if (key == 'labels_array_node'){\n var value = settings[key];\n this.settings['labels']['node'] = new Set(value);\n }\n if (key == 'colorlabels_array_leaf'){\n var value = settings[key];\n this.settings['colorlabels']['leaf'] = new Set(value);\n }\n\n if (key == 'colorlabels_array_node'){\n var value = settings[key];\n this.settings['colorlabels']['node'] = new Set(value);\n }\n\n else{\n var value = settings[key];\n this.settings[key] = value;\n }\n\n\n }\n\n }\n\n this.settings.name = this.settings.name ? this.settings.name : \"Untitled \" + uid_untitle_counter++\n\n this.uid = null\n this.input_data = data;\n this.leaves = []\n\n\n\n if (from_raw_data){\n this.uid = uid_model++;\n this.settings.uid = this.uid;\n this.data = this.factory(this.parse());\n }\n else{\n this.uid = settings.uid;\n this.settings.uid = this.uid;\n this.data = data\n data.leaves = this.get_leaves(data)\n this.traverse(data, function(n,c){\n n.leaves = this.get_leaves(n)\n })\n this.set_color_scale('node');\n this.set_color_scale('leaf');\n }\n\n this.data.root = true;\n this.data.elementS = {}\n this.data.elementBCN = {}\n this.rooted = this.data.children.length !== 3\n this.big_tree = (this.leaves.length > 500)\n\n // check that histogram data is present and compute\n if(this.settings.show_histogram && this.data.evolutionaryEvents) {\n this.settings.has_histogram_data = true;\n this.largestGenome = 0;\n this.largestEvents = 0; // todo\n\n this.traverse(this.data , function(n,c){\n\n let g = n.nr_hogs ? n.nr_hogs : n.nr_proteins\n if (g > this.largestGenome ) {this.largestGenome = g;}\n\n if (n.evolutionaryEvents){\n\n var ga = n.evolutionaryEvents.gained ? n.evolutionaryEvents.gained : 0\n var l = n.evolutionaryEvents.lost ? n.evolutionaryEvents.lost : 0\n var d = n.evolutionaryEvents.duplications ? n.evolutionaryEvents.duplications : 0\n\n let e = ga + l + d\n\n\n if (e > this.largestEvents ) {this.largestEvents = e;}\n\n }\n\n if (this.settings.stack.has_support){\n\n let g_support = n.nr_hogs_support ? n.nr_hogs_support : n.nr_proteins_support\n if (g_support > this.largestGenome_support ) {this.largestGenome_support = g_support;}\n\n if (n.evolutionaryEvents_support){\n\n\n var ga_support = n.evolutionaryEvents_support.gained ? n.evolutionaryEvents_support.gained : 0\n var l_support = n.evolutionaryEvents_support.lost ? n.evolutionaryEvents_support.lost : 0\n var d_support = n.evolutionaryEvents_support.duplications ? n.evolutionaryEvents_support.duplications : 0\n\n let e_support = ga_support + l_support + d_support\n\n if (e_support > this.largestEvents_support ) {this.largestEvents_support = e_support;}\n\n }\n }\n\n\n\n })\n\n\n }\n\n }\n\n set_all_color_scale(){\n this.set_color_scale('node');\n this.set_color_scale('leaf');\n this.set_color_scale('circle');\n }\n\n remove_all_color_scale(){\n this.settings.colorScale ={'leaf' : null, 'node':null, 'circle': {}}\n this.settings.intercolor ={'leaf' : null, 'node':null, 'circle': {}}\n }\n\n\n\n get_name(){\n return this.settings.name\n }\n\n set_name(name){\n this.settings.name = name\n }\n\n traverse(o,func_pre, func_post) {\n\n if (func_pre){\n func_pre.apply(this,[o,o[\"children\"]])\n }\n\n if(o[\"children\"]){\n\n for (var c in o[\"children\"] ) {\n\n var child = o[\"children\"][c]\n\n child = this.traverse(child, func_pre, func_post)\n\n if (func_post) {\n func_post.apply(this,[child,o])\n }\n\n\n }\n\n\n }\n\n return o\n\n }\n\n set_color_scale(type, api){\n\n\n var type = (typeof type !== 'undefined') ? type : 'node';\n var api = (typeof type !== 'undefined') ? api : null;\n\n\n var colorScaleDomain = false;\n var colorScaleRange;\n var number;\n\n\n if (typeof this != \"undefined\" && this) {\n\n\n // If categorical do special\n var acc = this.settings.style.color_accessor[type]\n var type_acc = this.settings.extended_data_type[acc]\n\n\n if (acc === null){\n this.settings.colorScale[type] = null\n return\n }\n\n\n if (type_acc == 'cat'){\n\n this.settings.colorScale[type] = api.get_color_scale(acc)\n\n\n //var dom = this.settings.domain_extended_data[acc]\n //this.settings.colorScale[type] = d3.scaleOrdinal().domain(dom).range(d3.schemePaired);\n return\n }\n\n else if (type_acc == 'color'){\n\n this.settings.colorScale[type] = null\n return\n }\n\n\n\n number = this.settings.style.number_domain[acc]\n\n\n if (this.settings.style.color_accessor[type] != null && this.settings.style.color_accessor[type] != 'Topology' ) {\n\n var ms = this.settings.style;\n\n var ca = ms.color_accessor[type];\n\n if (ms.color_extent_max[type][ca] == ms.color_extent_min[type][ca]){\n this.settings.intercolor[type] = d3__WEBPACK_IMPORTED_MODULE_0__.interpolate( ms.color_extent_max[type][ca], ms.color_extent_max[type][ca]-1)\n }else{\n this.settings.intercolor[type] = d3__WEBPACK_IMPORTED_MODULE_0__.interpolate( ms.color_extent_max[type][ca], ms.color_extent_min[type][ca])\n }\n\n\n colorScaleRange = this.settings.style.color_domain[acc];\n\n }\n\n else {\n this.settings.intercolor[type] = d3__WEBPACK_IMPORTED_MODULE_0__.interpolate(1,0)\n colorScaleRange = this.settings.style.color_domain[acc];\n }\n\n\n\n }\n else {\n\n number = 5;\n colorScaleRange = ['#253494', '#2C7FB8', '#41B6C4', '#C7E9B4', '#FFFFCC']\n this.settings.intercolor[type] = d3__WEBPACK_IMPORTED_MODULE_0__.interpolate(1, 0);\n }\n\n\n switch (number) {\n case 2:\n colorScaleDomain = [this.settings.intercolor[type](0),this.settings.intercolor[type](1)]\n break;\n case 3:\n colorScaleDomain = [this.settings.intercolor[type](0),this.settings.intercolor[type](0.5) , this.settings.intercolor[type](1)]\n break;\n case 4:\n colorScaleDomain = [this.settings.intercolor[type](0),this.settings.intercolor[type](0.33),this.settings.intercolor[type](0.66) , this.settings.intercolor[type](1)]\n break;\n case 5:\n colorScaleDomain = [this.settings.intercolor[type](0),this.settings.intercolor[type](0.25) ,this.settings.intercolor[type](0.5) ,this.settings.intercolor[type](0.75) , this.settings.intercolor[type](1)]\n\n }\n\n\n this.settings.colorScale[type] = d3__WEBPACK_IMPORTED_MODULE_0__.scaleLinear()\n .domain(colorScaleDomain)\n .range(colorScaleRange);\n\n\n\n }\n\n traverse_hierarchy(o,func_pre, func_post) {\n\n var children = o[\"children\"] ? o[\"children\"] : o[\"_children\"]\n\n if (func_pre){\n func_pre.apply(this,[o,children])\n }\n\n if(children ){\n\n for (var c in children) {\n\n var child = children[c]\n\n child = this.traverse_hierarchy(child, func_pre, func_post)\n\n if (func_post) {\n func_post.apply(this,[child,o])\n }\n\n\n }\n\n\n }\n\n return o\n\n }\n\n set_parent(node,parent){\n node.parent = parent\n }\n\n set_cumulated_length(node, children){\n if (node.parent) {\n node.depth = node.parent.depth + 1\n node.distance_to_root = node.parent.distance_to_root + node.branch_length\n }\n else{\n node.distance_to_root = 0\n node.depth = 0}\n\n }\n\n factory(json){ // todo do one traversal with all in one function\n\n var p;\n\n //has_branch_lenght\n this.settings.has_branch_lenght = false;\n\n json.children.forEach((child) => {\n if (typeof child.branch_length != 'undefined') { this.settings.has_branch_lenght = true; }\n })\n\n if (this.settings.has_branch_lenght) {\n this.settings.labels['node'].add('Length')\n this.settings.labels['leaf'].add('Length')\n this.settings.colorlabels['node'].add('Length')\n this.settings.colorlabels['leaf'].add('Length')\n this.settings.extended_data_type['Length'] = 'num'\n\n this.settings.style.color_extent_max['node']['Length'] = 0;\n this.settings.style.color_extent_min['node']['Length'] = 1000000000;\n\n this.settings.style.color_extent_max['leaf']['Length'] = 0;\n this.settings.style.color_extent_min['leaf']['Length'] = 1000000000;\n }\n\n\n // if branch size is not used put 1\n if (!this.settings.has_branch_lenght) {\n p = this.traverse(json, function(n,c){n.branch_length=1})\n p.branch_length = 0 // root\n }\n else{ // sanity check\n p = this.traverse(json, function(n,c){if (typeof n.branch_length == 'undefined') {n.branch_length=1} })\n if (typeof p.branch_length == 'undefined') {p.branch_length=1}\n }\n\n // set parent attribute\n p = this.traverse(json, null , this.set_parent)\n\n // compute cumulated lenght\n p = this.traverse(p, this.set_cumulated_length , null)\n\n this.traverse(p, function(n,c){\n\n n.extended_informations = {}\n n.elementS = {}\n n.elementBCN = {}\n n.force_label_show = null;\n\n if(n.branch_length){\n n.extended_informations['Length'] = n.branch_length;\n if (this.settings.style.color_extent_max['node']['Length'] < n.branch_length){\n this.settings.style.color_extent_max['node']['Length'] = n.branch_length\n this.settings.style.color_extent_max['leaf']['Length'] = n.branch_length\n }\n\n if (this.settings.style.color_extent_min['node']['Length'] > n.branch_length){\n this.settings.style.color_extent_min['node']['Length'] = n.branch_length\n this.settings.style.color_extent_min['leaf']['Length'] = n.branch_length\n }\n }\n\n if (typeof c !== 'undefined' && typeof n.name !== 'undefined' && n.name !== \"\" ) {\n n.extended_informations['Data'] = n.name;\n this.settings.labels['node'].add('Data')\n this.settings.labels['leaf'].add('Data')\n this.settings.extended_data_type['Data'] = 'num'\n\n if (!isNaN(n.name)){\n\n if (!this.settings.colorlabels['node'].has('Data')){\n this.settings.colorlabels['node'].add('Data');\n this.settings.style.color_extent_max['node']['Data'] = 0;\n this.settings.style.color_extent_min['node']['Data'] = 1000000000;\n }\n\n if (this.settings.style.color_extent_max['node']['Data'] <n.name){\n this.settings.style.color_extent_max['node']['Data'] = n.name\n }\n\n if (this.settings.style.color_extent_min['node']['Data'] > n.name){\n this.settings.style.color_extent_min['node']['Data'] = n.name\n }\n\n }\n\n else {this.settings.extended_data_type['Data'] = 'cat'}\n }\n\n if(n.data_nhx && Object.keys(n.data_nhx).length > 0){\n\n Object.entries(n.data_nhx).forEach(([key, value]) => {\n\n this.settings.labels['node'].add(key)\n this.settings.labels['leaf'].add(key)\n\n this.settings.colorlabels['node'].add(key)\n this.settings.colorlabels['leaf'].add(key)\n\n\n switch(key){\n case 'Ev':\n if (value == 'duplication') {\n n.duplication = true\n this.settings.has_duplications = true;\n }\n n.extended_informations.events = value\n n.extended_informations[key] = value\n this.settings.extended_data_type['Ev'] = 'cat'\n break;\n case 'DD':\n case 'D':\n if (value == 'Y') {\n n.duplication = true\n this.settings.has_duplications = true;\n\n }\n else if (value == 'N'){\n n.duplication = false\n this.settings.has_duplications = true;\n }\n n.extended_informations.events = value\n n.extended_informations[key] = value\n this.settings.extended_data_type['D'] = 'cat'\n break;\n case 'XB':\n case 'B':\n this.settings.edge_related_data.push(key)\n n.extended_informations[key] = value\n this.settings.extended_data_type[key] = 'num'\n default:\n n.extended_informations[key] = value\n this.settings.extended_data_type[key] = 'cat'\n break;\n }\n });\n\n\n }\n // phyloxml specific attributes\n for (let attr of [\"taxonomies\", \"sequences\"]) {\n if (n.hasOwnProperty(attr)) {\n Object.entries(n[attr][0]).forEach(([key, value]) => {\n n.extended_informations[attr + \"_\" + key] = value;\n this.settings.extended_data_type[attr + \"_\" + key] = \"cat\";\n });\n if (n.name === undefined || n.name === \"\") {\n if (attr === \"taxonomies\" && n.taxonomies[0].hasOwnProperty(\"scientific_name\")) {\n n.name = n.taxonomies[0].scientific_name;\n } else if (attr === \"sequences\" && n.sequence.hasOwnProperty(\"name\")) {\n n.name = n.sequences[0].name;\n }\n }\n }\n }\n if (n.hasOwnProperty(\"date\")){\n n.extended_informations['date'] = n.date;\n this.settings.extended_data_type['date'] = \"cat\";\n }\n\n if (n.depth > this.settings.tree.max_depth){\n this.settings.tree.max_depth = n.depth\n }\n if (!(n.hasOwnProperty('children'))){\n this.leaves.push(n)\n n.correspondingLeaf = {}\n\n }\n\n n.leaves = this.get_leaves(n)\n\n })\n\n // check the type of all extended data\n this.traverse(p, function(n,c){\n\n for (var key in n.extended_informations){\n if (n.extended_informations.hasOwnProperty(key)) {\n\n if (this.settings.extended_data_type[key] === 'num'){\n continue\n }\n\n if (!isNaN(n.extended_informations[key])){\n this.settings.extended_data_type[key] = 'num'\n }\n\n }\n }\n\n })\n\n\n this.settings.colorlabels['node'].forEach( (value) => {\n if (this.settings.extended_data_type[value] === 'num' && value !== 'Topology' ) {\n this.settings.style.color_extent_max['node'][value] = 0\n this.settings.style.color_extent_min['node'][value] = 1000000000\n }\n });\n\n this.settings.colorlabels['leaf'].forEach( (value) => {\n if (this.settings.extended_data_type[value] === 'num' ) {\n this.settings.style.color_extent_max['leaf'][value] = 0\n this.settings.style.color_extent_min['leaf'][value] = 1000000000\n }\n });\n\n\n this.traverse(p, function(n,c) {\n for (var key in n.extended_informations) {\n\n if (n.extended_informations.hasOwnProperty(key)) {\n\n\n\n if (this.settings.extended_data_type[key] === 'num') {\n\n // check if min and max are set for node and leaf\n\n var val = n.extended_informations[key].toString().indexOf('.') != -1 ? parseFloat(n.extended_informations[key]) : parseInt(n.extended_informations[key])\n\n if (this.settings.style.color_extent_max['node'][key] < val) {\n this.settings.style.color_extent_max['node'][key] = val\n\n }\n\n if (this.settings.style.color_extent_min['node'][key] > val) {\n this.settings.style.color_extent_min['node'][key] = val\n }\n\n if (this.settings.style.color_extent_max['leaf'][key] < val) {\n this.settings.style.color_extent_max['leaf'][key] = val\n }\n\n if (this.settings.style.color_extent_min['leaf'][key] > val) {\n this.settings.style.color_extent_min['leaf'][key] = val\n }\n\n }\n\n }\n }\n\n })\n\n\n\n this.settings.suggestions = [] // autocomplete name\n this.traverse(json, function(n,c){\n\n if (n.name !== ''){this.settings.suggestions.push(n.name)}}) //todo add id also and ncBI and more + check empty cfucntion\n\n return p\n }\n\n build_hierarchy_mockup(){\n return d3__WEBPACK_IMPORTED_MODULE_0__.hierarchy(this.data, d => d.children );\n }\n\n parse(){\n\n if (this.settings.data_type === \"newick\") {\n return biojs_io_newick__WEBPACK_IMPORTED_MODULE_2__.parse_newick(this.input_data);\n }\n\n else if (this.settings.data_type === \"nhx\") {\n return parse_nhx(this.input_data);\n }\n\n else if (this.settings.data_type === \"json\") {\n return this.input_data\n }\n else if (this.settings.data_type === \"phyloxml\") {\n let phylogenies = phyloXml.parse(this.input_data);\n if (phylogenies === undefined || phylogenies.length === 0){\n console.error(\"No phylogenies found\");\n return {};\n } else if (phylogenies.length > 1) {\n console.log(\"dataset contains more than one phylogenies: \"+phylogenies.length + \" Will only use the first one\");\n }\n return phylogenies[0].children[0]; // return toplevel clade which is returned as children[0].\n }\n }\n\n collapse(data, action){\n if (!data.children){return}\n if (action) {data.collapse = true}\n else if (action == false){data.collapse = false}\n else{data.collapse ? data.collapse = false : data.collapse = true;}\n\n }\n\n toggle_show_label(data){\n data.force_label_show || data.force_label_show == null ? data.force_label_show = false : data.force_label_show = true;\n }\n\n collapseAll(data, action){\n if (action) {\n this.traverse(data, (n,c) => {\n this.collapse(n, true)\n //n.collapse = true\n } , null)}\n else if (action == false){\n this.traverse(data, (n,c) => {\n this.collapse(n, false)\n //n.collapse = false\n } , null)}\n\n\n }\n\n get_all_collapse(data){\n\n var collapsed = []\n\n this.traverse(data, (n,c) => {if (n.collapse){\n collapsed.push(n)\n }}, null)\n\n return collapsed\n\n }\n\n apply_collapse_to_list(collapsed){\n this.traverse(this.data, (n,c) => {\n if (collapsed.includes(n)){\n this.collapse(n, true)\n }\n else{\n this.collapse(n, false)\n }\n } , null)\n }\n\n swap_subtrees(data){\n var e = data.children.pop()\n data.children.unshift(e)\n data.leaves = this.get_leaves(data)\n }\n\n unswap_subtrees(data){\n var e = data.children.shift()\n data.children.push(e)\n data.leaves = this.get_leaves(data)\n\n }\n\n reroot(data){\n\n // extract meta data (zoom)\n var meta = this.zoom;\n\n // create new root r\n\n var root = {\"children\": [], \"name\": \"\", \"branch_length\": 0, \"extended_informations\": {}}\n\n\n for (var key in data.extended_informations) {\n\n if (this.settings.edge_related_data.includes(key)) {\n root.extended_informations[key] = data.extended_informations[key]\n }\n\n else{\n root.extended_informations[key] = null\n }\n\n }\n\n // source and target node of the clicked edges\n var parent = data.parent\n var child = data\n\n // insert new root node between target and source and connect\n root.children.push(child)\n parent.children.push(root)\n this.set_parent(child, root )\n this.set_parent(root, parent )\n const index = parent.children.indexOf(child);\n if (index > -1) {\n parent.children.splice(index, 1);\n }\n\n // ajust distance now that distance target/source is splitted in two\n var old_distance = child.branch_length\n\n child.branch_length = old_distance/2\n child.extended_informations['Length'] = old_distance/2\n\n parent.branch_length_before_reverse = parent.branch_length\n parent.branch_length = old_distance /2\n parent.extended_informations['Length'] = old_distance/2\n\n // Until we reach the old root reverse child/parent order\n var child = root\n var stack = []\n\n while (parent.root != true) {\n\n stack.push([parent,child])\n\n child = parent\n parent = parent.parent\n\n parent.values_before_reverse = {}\n parent.branch_length_before_reverse = parent.branch_length\n\n for (var value of this.settings.edge_related_data) {\n\n parent.values_before_reverse[value] = parent.extended_informations[value]\n\n if (value=== 'Length'){\n parent.branch_length = child.branch_length_before_reverse || child.branch_length;\n parent.extended_informations['Length'] = parent.branch_length;\n\n }\n else{\n if ( child.values_before_reverse && value in child.values_before_reverse){\n parent.extended_informations[value] = child.values_before_reverse[value]\n }\n else{\n parent.extended_informations[value] = child.extended_informations[value]\n child.extended_informations[value] = null\n }\n\n }\n\n\n\n }\n\n\n }\n stack.push([parent,child])\n for (var e in stack){\n var p = stack[e][0]\n var c = stack[e][1]\n\n this.reverse_order(p,c)\n\n }\n\n // Remove old root\n\n var old_root = parent\n var leading_branch = parent.parent\n\n\n\n if (old_root.children.length == 1){\n\n const ce = leading_branch.children.indexOf(old_root);\n if (ce > -1) {\n leading_branch.children.splice(ce, 1);\n }\n\n var i = 0,len = old_root.children.length;\n while (i < len) {\n let c = old_root.children[i]\n c.parent = leading_branch\n leading_branch.children.push(c)\n i++\n }\n\n old_root = null\n\n\n\n }\n\n // For multifurcation we need to keep the root\n else {\n old_root.root = false\n old_root.branch_length = leading_branch.branch_length\n parent.extended_informations['Length'] = leading_branch.branch_length\n }\n\n\n for (var key of this.settings.edge_related_data) {\n\n for (var childy of root.children) {\n\n childy.extended_informations[key] = root.extended_informations[key]\n\n }\n\n root.extended_informations[key] = null\n }\n\n\n // configure new root\n root.zoom = meta\n this.data = root;\n this.data.root = true;\n\n root.leaves = this.get_leaves(root)\n\n\n this.traverse(root, function(n,c){\n n.leaves = this.get_leaves(n)\n n.values_before_reverse = {}\n n.branch_length_before_reverse = undefined\n })\n\n\n\n }\n\n trim(branch){\n\n // source and target node of the clicked edges\n var parent = branch.parent\n var child = branch\n\n var untrim_data = {\n \"parent\" : null,\n \"floating\" : null,\n \"untrim_data\" : null,\n \"index\": null,\n \"root_mode\": false,\n }\n\n\n if (parent.children.length > 2) {\n untrim_data.index = this.detach_child(parent,child)\n\n untrim_data.parent = parent;\n untrim_data.floating = false;\n untrim_data.child = child;\n\n return untrim_data;\n }\n\n else{\n\n if (typeof parent.parent == 'undefined'){ // parent is root\n untrim_data.root_mode = true;\n\n var sibling = parent.children[0] == child ? parent.children[1] : parent.children[0]\n untrim_data.index = this.detach_child(parent, sibling)\n\n this.data = sibling;\n\n untrim_data.parent = null;\n untrim_data.floating = parent;\n untrim_data.child = sibling;\n\n return untrim_data;\n\n }\n\n else{\n\n this.detach_child(parent.parent, parent)\n var sibling = parent.children[0] == child ? parent.children[1] : parent.children[0]\n untrim_data.index = this.detach_child(parent, sibling)\n this.attach_child(parent.parent, sibling)\n\n untrim_data.parent = parent.parent;\n untrim_data.floating = parent;\n untrim_data.child = sibling;\n\n return untrim_data;\n\n }\n\n\n }\n\n }\n\n untrim(parent, floating, child, index, root_mode){\n\n if (floating != false){\n if (root_mode){\n this.data = floating\n this.attach_child(floating,child, index)\n\n }else{\n this.detach_child(parent,child)\n this.attach_child(parent,floating)\n this.attach_child(floating,child, index)\n }\n\n }\n else {\n this.attach_child(parent,child, index)\n }\n }\n\n detach_child(parent, child){\n var index = parent.children.indexOf(child);\n if (index > -1) {\n parent.children.splice(index, 1);\n }\n return index\n }\n\n attach_child(parent,child_to_adopt, index){\n\n if (typeof index !== 'undefined') {\n parent.children.splice( index, 0, child_to_adopt );\n child_to_adopt.parent = parent;\n\n } else {\n parent.children.push(child_to_adopt);\n child_to_adopt.parent = parent;\n }\n\n\n }\n\n interleave_node(parent, to_insert,child){\n this.detach_child(parent, child)\n this.attach_child(parent,to_insert)\n this.attach_child(to_insert, child)\n }\n\n store_zoomTransform(zoom){\n\n this.zoom = {\n \"k\":zoom.k,\n \"x\":zoom.x,\n \"y\":zoom.y,\n };\n }\n\n /**\n Description:\n Creates list of leaves of each node in subtree rooted at v\n\n Note:\n Difference between deep leaf list and leaves in:\n (A:0.1,B:0.2,(C:0.3,D:0.4):0.5);\n - Root has leaves: A, B, C and D (terminal leaves)\n - Root has deep leaves: A, B, C, D and CD (terminal leaves + intermediate leaves)\n */\n createDeepLeafList(filter) {\n\n function is_leaf(str) {\n return !str.includes(\"|__|\");\n }\n\n var build_deepLeafList = function(child, node){\n\n if ( child.hasOwnProperty('children') ){\n var dp = child.deepLeafList.filter(is_leaf).sort()\n if (!dp.every((e) => e === '')){\n child.deepLeafList.push(dp.join('|__|'));\n }\n\n }\n\n node.deepLeafList = node.deepLeafList.concat(child.deepLeafList)\n }\n\n var build_deepLeafLeaves = function(node,children){\n\n if (!(node.hasOwnProperty('children') )){\n\n if (typeof filter != 'undefined') {\n if (filter.includes(node.name)){\n node.deepLeafList = [node.name]\n }\n else{\n node.deepLeafList = []\n }\n\n }\n else{\n node.deepLeafList = [node.name]\n }\n\n }\n else {\n node.deepLeafList = []\n }\n\n\n }\n\n this.traverse(this.data, build_deepLeafLeaves, build_deepLeafList)\n\n }\n\n createMinHash(){\n\n var assign_hash = function(node,children){\n\n node.min_hash = new minhashjs__WEBPACK_IMPORTED_MODULE_1__.MinHash.MinHash()\n node.deepLeafList.map(function(w) { node.min_hash.update(w) });\n }\n\n this.traverse(this.data, assign_hash, null)\n }\n\n removeMinHash(){\n\n var remove_hash = function(node,children){\n\n node.min_hash = null\n }\n\n this.traverse(this.data, remove_hash, null)\n\n }\n\n reverse_order(parent,child) {\n\n child.children.push(parent)\n parent.parent =child\n\n const b = parent.children.indexOf(child);\n if (b > -1) {\n parent.children.splice(b, 1);\n }\n\n }\n\n get_leaves(node){\n\n\n var l = []\n\n this.traverse(node, function(n,c){\n if (!(n.hasOwnProperty('children'))){\n l.push(n)\n }\n\n\n })\n return l\n }\n\n remove_circularity(){ // safe my model\n var data = Object.assign({}, this.data);\n\n this.traverse(data, function(n,c){\n n.parent=null;\n n.leaves=null;\n n.correspondingLeaf = {}\n n.elementBCN = null})\n\n return data\n }\n\n remove_circularity_only_parent_and_leaves(){ // safe my model\n var data = Object.assign({}, this.data);\n\n this.traverse(data, function(n,c){\n n.parent=null;\n n.leaves=null;\n })\n\n return data\n }\n\n add_circularity_back(){\n\n this.data.leaves = this.get_leaves(this.data)\n\n this.traverse(this.data, function(n,c){n.leaves = this.get_leaves(n)}, this.set_parent)\n\n\n }\n\n add_meta_leaves(meta, headers, api, reference){\n\n // headers: column_name -> type\n\n Object.keys(headers).forEach(item => {\n\n\n if (item != reference || item != 'Length' ) {\n\n this.settings.extended_data_type[item] = headers[item]\n this.settings.domain_extended_data[item] = []\n this.settings.labels['leaf'].add(item)\n this.settings.colorlabels['leaf'].add(item)\n\n if (headers[item] == 'num'){\n this.settings.style.color_extent_max['leaf'][item] = 0\n this.settings.style.color_extent_min['leaf'][item] = 100000\n }\n }\n\n })\n\n this.get_leaves(this.data).forEach(d => {\n if (d.name in meta){\n\n Object.entries(meta[d.name]).forEach(item => {\n if (item[0] != reference){\n\n d.extended_informations[item[0]]= item[1]\n\n if (this.settings.extended_data_type[item[0]] == 'num' && !isNaN(item[1])) {\n\n item[1] = item[1].toString().indexOf('.') != -1 ? parseFloat(item[1]) : parseInt(item[1])\n\n if (this.settings.style.color_extent_max['leaf'][item[0]] < item[1]) {\n this.settings.style.color_extent_max['leaf'][item[0]] = item[1]\n }\n\n if (this.settings.style.color_extent_min['leaf'][item[0]] > item[1]) {\n this.settings.style.color_extent_min['leaf'][item[0]] = item[1]\n }\n\n }\n\n if (this.settings.extended_data_type[item[0]] == 'cat'){\n\n var cs = api.get_color_scale(item[0])\n cs.add_value_to_map(item[1])\n\n this.settings.domain_extended_data[item[0]].push(item[1])\n }\n\n }\n\n })\n\n }\n\n })\n\n\n Object.keys(headers).forEach(item => {\n if (item != reference || item != 'Length' ) {\n\n\n if (headers[item] == 'cat'){\n api.get_color_scale(item).update()\n\n }\n }\n\n })\n\n\n\n }\n\n add_meta_nodes(meta, headers, api, reference){\n\n\n Object.keys(headers).forEach(item => {\n if (item != reference|| item != 'Length' ) {\n this.settings.extended_data_type[item] = headers[item]\n this.settings.domain_extended_data[item] = []\n this.settings.labels['node'].add(item)\n this.settings.colorlabels['node'].add(item)\n\n if (headers[item] == 'num'){\n this.settings.style.color_extent_max['node'][item] = 0\n this.settings.style.color_extent_min['node'][item] = 100000\n }\n }\n\n })\n\n this.traverse(this.data, function(n,c){\n\n var name_value = n.name in meta ? n.name : n.extended_informations['Data'] in meta ? n.extended_informations['Data'] : false\n\n if (name_value){\n\n Object.entries(meta[name_value]).forEach(item => {\n\n if (item[0] != reference){\n n.extended_informations[item[0]]= item[1]\n\n if (this.settings.extended_data_type[item[0]] == 'cat'){\n\n var cs = api.get_color_scale(item[0])\n cs.add_value_to_map(item[1])\n\n }\n\n else if (this.settings.extended_data_type[item[0]] == 'num' && !isNaN(item[1]) ) {\n\n item[1] = item[1].toString().indexOf('.') != -1 ? parseFloat(item[1]) : parseInt(item[1])\n\n if (this.settings.style.color_extent_max['node'][item[0]] < item[1]) {\n this.settings.style.color_extent_max['node'][item[0]] = item[1]\n }\n\n if (this.settings.style.color_extent_min['node'][item[0]] > item[1]) {\n this.settings.style.color_extent_min['node'][item[0]] = item[1]\n }\n\n }\n }\n })\n\n }\n })\n\n Object.keys(headers).forEach(item => {\n\n if (item != reference || item != 'Length' ) {\n\n\n if (headers[item] == 'cat'){\n api.get_color_scale(item).update()\n\n }\n }\n\n })\n }\n\n get_node_by_leafset(lset){\n\n function setsAreEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n\n return Array.from(a).every(element => {\n return b.has(element);\n });\n }\n\n lset = new Set(lset.map(leaf => leaf.toString()))\n\n var target = false\n\n\n var check = function(node,children){\n\n var nl = new Set(node.leaves.map(leaf => leaf.name.replaceAll(\"'\", '').toString()))\n\n if ( setsAreEqual(nl,lset)){\n target = node\n }\n\n }\n\n this.traverse(this.data, check, null)\n\n return target\n }\n\n};\n\n//# sourceURL=webpack://PhyloIO/./src/model.js?");
8628
+
8629
+ /***/ }),
8630
+
8631
+ /***/ "./src/phyloxml.js":
8632
+ /*!*************************!*\
8633
+ !*** ./src/phyloxml.js ***!
8634
+ \*************************/
8635
+ /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
8636
+
8637
+ eval("/**\n * Copyright (C) 2019 Christian M. Zmasek\n * Copyright (C) 2019 J. Craig Venter Institute\n * All rights reserved\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\n *\n * Created by czmasek on 7/7/2016.\n */\n\n// v 1.0.0\n// 2019-05-16\n//\n// phyloxml.js is a JavaScript program for reading (SAX style parser)\n// and writing phylogenetic trees in phyloXML format.\n//\n// phyloXML website: http://www.phyloxml.org/\n//\n// Availability:\n// https://github.com/cmzmasek/phyloxml-js\n// https://www.npmjs.com/package/phyloxml\n//\n// Dependencies:\n// sax.js (1.2.4): https://www.npmjs.com/package/sax/v/1.2.4\n//\n//\n// Example:\n// This basic example shows how to parse a phyloXML formatted String into to a\n// object representing a phylogenetic tree. Followed by printing some elements\n// and then converting the object back to a phyloXML formatted String.\n//\n// Change './phyloxml' to 'phyloxml' if you use this code outside of this package\n//\n// var phyloXml = require('./phyloxml').phyloXml;\n//\n// phlyoXmlFormattedString = '<phyloxml xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ' +\n// 'xmlns=\"http://www.phyloxml.org\" ' +\n// 'xsi:schemaLocation=\"http://www.phyloxml.org http://www.phyloxml.org/1.10/phyloxml.xsd\">' +\n// '<phylogeny rooted=\"true\" rerootable=\"false\">' +\n// '<clade><branch_length>0.2</branch_length>' +\n// '<clade><branch_length>0.4</branch_length><name>A</name></clade>' +\n// '<clade><branch_length>0.6</branch_length><name>B</name></clade>' +\n// '</clade>' +\n// '</phylogeny>' +\n// '</phyloxml>';\n//\n// var phylogeneticTree = phyloXml.parse(phlyoXmlFormattedString, {trim: true, normalize: true})[0];\n//\n// console.log('Root branch length : ' + phylogeneticTree.children[0].branch_length);\n// console.log('Node A name : ' + phylogeneticTree.children[0].children[0].name);\n// console.log('Node A branch length: ' + phylogeneticTree.children[0].children[0].branch_length);\n// console.log('Node B name : ' + phylogeneticTree.children[0].children[1].name);\n// console.log('Node B branch length: ' + phylogeneticTree.children[0].children[1].branch_length);\n//\n// console.log('Entire tree in phyloXML format:');\n// console.log(phyloXml.toPhyloXML(phylogeneticTree, 4));\n//\n//\n// Synchronous parsing of phyloXML-formatted String:\n//\n// var px = require('./phyloxml').phyloXml;\n// var phys = px.parse(phyloxmlText, {trim: true, normalize: true});\n// console.log(px.toPhyloXML(phys[0], 6));\n//\n//\n// Asynchronous parsing of phyloXML-formatted Stream:\n//\n// var fs = require('fs');\n// var px = require('./phyloxml').phyloXml;\n// var stream = fs.createReadStream(xmlFile, {encoding: 'utf8'});\n// px.parseAsync(stream, {trim: true, normalize: true});\n\n\n(function phyloXml() {\n\n \"use strict\";\n\n var sax = null;\n if ( true && module.exports && !__webpack_require__.g.xmldocAssumeBrowser) {\n // Being used in a Node-like environment\n sax = __webpack_require__(/*! sax */ \"./node_modules/sax/lib/sax.js\");\n }\n else if (typeof window !== \"undefined\") {\n // Attached to the Window object in a browser\n sax = window.sax;\n if (!sax) {\n throw new Error(\"Expected sax to be defined. Make sure you are including sax.js before this file.\");\n }\n }\n else {\n sax = this.sax;\n if (!sax) {\n throw new Error(\"Expected sax to be defined. Make sure you are including sax.js before this file.\");\n }\n }\n\n // --------------------------------------------------------------\n // phyloXML constants\n // --------------------------------------------------------------\n\n // Accession\n var ACCESSION = 'accession';\n var ACCESSION_SOURCE_ATTR = 'source';\n var ACCESSION_COMMENT_ATTR = 'comment';\n\n // Annotation\n var ANNOTATION = 'annotation';\n var ANNOTATION_REF_ATTR = 'ref';\n var ANNOTATION_SOURCE_ATTR = 'source';\n var ANNOTATION_EVIDENCE_ATTR = 'evidence';\n var ANNOTATION_TYPE_ATTR = 'type';\n var ANNOTATION_DESC = 'desc';\n\n // Clade\n var CLADE = 'clade';\n var CLADE_BRANCH_LENGTH = 'branch_length';\n var CLADE_ID_SOURCE_ATTR = 'id_source';\n var CLADE_COLLAPSE_ATTR = 'collapse';\n var CLADE_NAME = 'name';\n var CLADE_WIDTH = 'width';\n\n // Clade Relation\n var CLADE_RELATION = 'clade_relation';\n var CLADE_RELATION_DISTANCE_ATTR = 'distance';\n var CLADE_RELATION_ID_REF_0_ATTR = 'id_ref_0';\n var CLADE_RELATION_ID_REF_1_ATTR = 'id_ref_1';\n var CLADE_RELATION_TYPE_ATTR = 'type';\n\n // Sequence Relation\n var SEQUENCE_RELATION = 'sequence_relation';\n var SEQUENCE_RELATION_DISTANCE_ATTR = 'distance';\n var SEQUENCE_RELATION_ID_REF_0_ATTR = 'id_ref_0';\n var SEQUENCE_RELATION_ID_REF_1_ATTR = 'id_ref_1';\n var SEQUENCE_RELATION_TYPE_ATTR = 'type';\n\n // Color\n var COLOR = 'color';\n var COLOR_RED = 'red';\n var COLOR_GREEN = 'green';\n var COLOR_BLUE = 'blue';\n var COLOR_ALPHA = 'alpha';\n\n // Confidence\n var CONFIDENCE = 'confidence';\n var CONFIDENCE_TYPE_ATTR = 'type';\n var CONFIDENCE_STDDEV_ATTR = 'stddev';\n var CONFIDENCES = 'confidences';\n\n // Cross References\n var CROSS_REFERENCES = 'cross_references';\n\n // Date\n var DATE = 'date';\n var DATE_UNIT_ATTR = 'unit';\n var DATE_DESC = 'desc';\n var DATE_VALUE = 'value';\n var DATE_MINIMUM = 'minimum';\n var DATE_MAXIMUM = 'maximum';\n\n // Distribution\n var DISTRIBUTION = 'distribution';\n var DISTRIBUTION_DESC = 'desc';\n\n // Domain Architecture\n var DOMAIN_ARCHITECTURE = 'domain_architecture';\n var DOMAIN_ARCHITECTURE_LENGTH_ATTR = 'length';\n\n // Events\n var EVENTS = 'events';\n var EVENTS_TYPE = 'type';\n var EVENTS_DUPLICATIONS = 'duplications';\n var EVENTS_SPECIATIONS = 'speciations';\n var EVENTS_LOSSES = 'losses';\n\n // Id\n var ID = 'id';\n var ID_PROVIDER_ATTR = 'provider';\n\n // Mol Seq\n var MOLSEQ = 'mol_seq';\n var MOLSEQ_IS_ALIGNED_ATTR = 'is_aligned';\n\n // Phylogeny\n var PHYLOGENY = 'phylogeny';\n\n // Phyloxml\n var PHYLOXML = 'phyloxml';\n\n // Point\n var POINT = 'point';\n var POINT_ALT_UNIT_ATTR = 'alt_unit';\n var POINT_GEODETIC_DATUM_ATTR = 'geodetic_datum';\n var POINT_LAT = 'lat';\n var POINT_LONG = 'long';\n var POINT_ALT = 'alt';\n\n // Property\n var PROPERTY = 'property';\n var PROPERTY_REF_ATTR = 'ref';\n var PROPERTY_ID_REF_ATTR = 'id_ref';\n var PROPERTY_UNIT_ATTR = 'unit';\n var PROPERTY_DATATYPE_ATTR = 'datatype';\n var PROPERTY_APPLIES_TO_ATTR = 'applies_to';\n var PROPERTIES = 'properties';\n\n // Protein Domain\n var PROTEINDOMAIN = 'domain';\n var PROTEINDOMAIN_FROM_ATTR = 'from';\n var PROTEINDOMAIN_TO_ATTR = 'to';\n var PROTEINDOMAIN_CONFIDENCE_ATTR = 'confidence';\n var PROTEINDOMAIN_ID_ATTR = 'id';\n\n // Reference\n var REFERENCE = 'reference';\n var REFERENCE_DOI_ATTR = 'doi';\n var REFERENCE_DESC = 'desc';\n\n // Sequence\n var SEQUENCE = 'sequence';\n var SEQUENCE_ID_SOURCE_ATTR = 'id_source';\n var SEQUENCE_ID_REF_ATTR = 'id_ref';\n var SEQUENCE_TYPE_ATTR = 'type';\n var SEQUENCE_SYMBOL = 'symbol';\n var SEQUENCE_NAME = 'name';\n var SEQUENCE_GENE_NAME = 'gene_name';\n var SEQUENCE_LOCATION = 'location';\n var SEQUENCES = 'sequences';\n\n // Taxonomy\n var TAXONOMY = 'taxonomy';\n var TAXONOMY_ID_SOURCE_ATTR = 'id_source';\n var TAXONOMY_CODE = 'code';\n var TAXONOMY_SCIENTIFIC_NAME = 'scientific_name';\n var TAXONOMY_AUTHORITY = 'authority';\n var TAXONOMY_COMMON_NAME = 'common_name';\n var TAXONOMY_SYNONYM = 'synonym';\n var TAXONOMY_RANK = 'rank';\n var TAXONOMIES = 'taxonomies';\n var TAXONOMY_SYNONYMS = 'synonyms';\n\n // Uri\n var URI = 'uri';\n var URI_TYPE_ATTR = 'type';\n var URI_DESC_ATTR = 'desc';\n\n // Phylogeny\n var PHYLOGENY_ROOTED_ATTR = 'rooted';\n var PHYLOGENY_REROOTABLE_ATTR = 'rerootable';\n var PHYLOGENY_BRANCH_LENGTH_UNIT_ATTR = 'branch_length_unit';\n var PHYLOGENY_TYPE_ATTR = 'type';\n var PHYLOGENY_NAME = 'name';\n var PHYLOGENY_DESCRIPTION = 'description';\n var PHYLOGENY_DATE = 'date';\n\n // Simple_Characteristics (to be deprecated!)\n var X_SIMPLE_CHARACTERISTICS = 'Simple_Characteristics';\n var X_SIMPLE_CHARACTERISTIC_COUNTRY = 'Country';\n var X_SIMPLE_CHARACTERISTIC_YEAR = 'Year';\n var X_SIMPLE_CHARACTERISTIC_HOST = 'Host';\n var X_SIMPLE_CHARACTERISTIC_HA = 'HA';\n var X_SIMPLE_CHARACTERISTIC_NA = 'NA';\n\n // appType (special for Virus BRC)\n var APPTYPE = 'flu_type';\n\n // Unknown source, id, confidence type:\n var UNKNOWN = 'unknown';\n\n // --------------------------------------------------------------\n // Instance variables\n // --------------------------------------------------------------\n var _phylogenies = null;\n var _phylogeny = null;\n var _cladeStack = null;\n var _tagStack = null;\n var _objectStack = null;\n\n // --------------------------------------------------------------\n // Others\n // --------------------------------------------------------------\n var PROPERTY_REF_RE = /[a-zA-Z0-9_]+:\\S+/;\n var PROPERTY_UNIT_RE = /[a-zA-Z0-9_]+:\\S+/;\n var PROPERTY_DATATYPE_RE = /xsd:\\S+/;\n\n // --------------------------------------------------------------\n // Functions for object creation\n // --------------------------------------------------------------\n function newAccession(tag) {\n var parent = _tagStack.get(1);\n if (!(parent === SEQUENCE || parent === CROSS_REFERENCES)) {\n throw new PhyloXmlError(\"found accession outside of sequence or cross-references\");\n }\n var acc = {};\n acc.value = null;\n acc.source = getAttribute(ACCESSION_SOURCE_ATTR, tag.attributes);\n acc.comment = getAttribute(ACCESSION_COMMENT_ATTR, tag.attributes);\n if (!acc.source) {\n acc.source = UNKNOWN;\n }\n if (parent === SEQUENCE) {\n getCurrentObject().accession = acc;\n }\n else {\n addToArrayInCurrentObjectUnnamed(acc);\n }\n _objectStack.push(acc);\n }\n\n function newAnnotation(tag) {\n var parent = _tagStack.get(1);\n if (parent != SEQUENCE) {\n throw new PhyloXmlError(\"found annotation outside of sequence\");\n }\n var ann = {};\n ann.evidence = getAttribute(ANNOTATION_EVIDENCE_ATTR, tag.attributes);\n ann.ref = getAttribute(ANNOTATION_REF_ATTR, tag.attributes);\n ann.source = getAttribute(ANNOTATION_SOURCE_ATTR, tag.attributes);\n ann.type = getAttribute(ANNOTATION_TYPE_ATTR, tag.attributes);\n addToArrayInCurrentObject('annotations', ann);\n _objectStack.push(ann);\n }\n\n function newBranchColor() {\n var parent = _tagStack.get(1);\n if (parent != CLADE) {\n throw new PhyloXmlError(\"found branch color outside of clade\");\n }\n var col = {};\n col.red = 0;\n col.green = 0;\n col.blue = 0;\n getCurrentObject().color = col;\n _objectStack.push(col);\n }\n\n function newClade(tag) {\n var newClade = {};\n newClade.branch_length = getAttributeAsFloat(CLADE_BRANCH_LENGTH, tag.attributes);\n newClade.collapse = getAttributeAsBoolean(CLADE_COLLAPSE_ATTR, tag.attributes);\n if (CLADE_ID_SOURCE_ATTR in tag.attributes) {\n newClade.id_source = tag.attributes[CLADE_ID_SOURCE_ATTR];\n }\n if (_phylogeny === null) {\n var phylogeny_data = _objectStack.pop();\n if (!_objectStack.isEmpty()) {\n throw new PhyloXmlError('severe phyloXML format error');\n }\n _phylogeny = phylogeny_data;\n _phylogeny.children = [newClade];\n }\n else {\n var currClade = getCurrentClade();\n if (currClade.children === undefined) {\n currClade.children = [newClade];\n }\n else {\n currClade.children.push(newClade);\n }\n }\n _cladeStack.push(newClade);\n _objectStack.push(newClade);\n }\n\n function newCladeRelation(tag) {\n var cr = {};\n cr.distance = getAttributeAsFloat(CLADE_RELATION_DISTANCE_ATTR, tag.attributes);\n cr.id_ref_0 = getAttribute(CLADE_RELATION_ID_REF_0_ATTR, tag.attributes);\n cr.id_ref_1 = getAttribute(CLADE_RELATION_ID_REF_1_ATTR, tag.attributes);\n cr.type = getAttribute(CLADE_RELATION_TYPE_ATTR, tag.attributes);\n addToArrayInCurrentObject('clade_relations', cr);\n _objectStack.push(cr);\n }\n\n function newSequenceRelation(tag) {\n var sr = {};\n sr.distance = getAttributeAsFloat(SEQUENCE_RELATION_DISTANCE_ATTR, tag.attributes);\n sr.id_ref_0 = getAttribute(SEQUENCE_RELATION_ID_REF_0_ATTR, tag.attributes);\n sr.id_ref_1 = getAttribute(SEQUENCE_RELATION_ID_REF_1_ATTR, tag.attributes);\n sr.type = getAttribute(SEQUENCE_RELATION_TYPE_ATTR, tag.attributes);\n addToArrayInCurrentObject('sequence_relations', sr);\n _objectStack.push(sr);\n }\n\n function newConfidence(tag) {\n var conf = {};\n conf.value = null;\n conf.type = getAttribute(CONFIDENCE_TYPE_ATTR, tag.attributes);\n conf.stddev = getAttributeAsFloat(CONFIDENCE_STDDEV_ATTR, tag.attributes);\n var parent = _tagStack.get(1);\n if (parent === CLADE || parent === PHYLOGENY) {\n addToArrayInCurrentObject(CONFIDENCES, conf);\n }\n else if (parent === ANNOTATION || parent === EVENTS || parent === CLADE_RELATION || parent === SEQUENCE_RELATION) {\n getCurrentObject().confidence = conf;\n }\n _objectStack.push(conf);\n }\n\n function newCrossReferences() {\n var parent = _tagStack.get(1);\n if (parent != SEQUENCE) {\n throw new PhyloXmlError(\"found cross-reference outside of sequence\");\n }\n var xrefs = [];\n getCurrentObject().cross_references = xrefs;\n _objectStack.push(xrefs);\n }\n\n function newDate(tag) {\n var date = {};\n date.unit = getAttribute(DATE_UNIT_ATTR, tag.attributes);\n getCurrentObject().date = date;\n _objectStack.push(date);\n }\n\n function newDistribution(tag) {\n var dist = {};\n dist.desc = null;\n dist.unit = getAttribute(DATE_UNIT_ATTR, tag.attributes);\n addToArrayInCurrentObject('distributions', dist);\n _objectStack.push(dist);\n }\n\n function newDomainArchitecture(tag) {\n var da = {};\n da.domains = null;\n da.length = getAttributeAsInt(DOMAIN_ARCHITECTURE_LENGTH_ATTR, tag.attributes);\n getCurrentObject().domain_architecture = da;\n _objectStack.push(da);\n }\n\n function newEvents() {\n var events = {};\n getCurrentObject().events = events;\n _objectStack.push(events);\n }\n\n function newId(tag) {\n var i = {};\n i.value = null;\n i.provider = getAttribute(ID_PROVIDER_ATTR, tag.attributes);\n getCurrentObject().id = i;\n _objectStack.push(i);\n }\n\n function newMolecularSequence(tag) {\n var mol_seq = {};\n mol_seq.is_aligned = getAttributeAsBoolean(MOLSEQ_IS_ALIGNED_ATTR, tag.attributes);\n getCurrentObject().mol_seq = mol_seq;\n _objectStack.push(mol_seq);\n }\n\n function newPoint(tag) {\n var p = {};\n p.alt_unit = getAttribute(POINT_ALT_UNIT_ATTR, tag.attributes);\n p.geodetic_datum = getAttribute(POINT_GEODETIC_DATUM_ATTR, tag.attributes);\n var parent = _tagStack.get(1);\n if (parent === DISTRIBUTION) {\n addToArrayInCurrentObject('points', p);\n }\n _objectStack.push(p);\n }\n\n function newProperty(tag) {\n var prop = {};\n prop.ref = getAttribute(PROPERTY_REF_ATTR, tag.attributes);\n prop.unit = getAttribute(PROPERTY_UNIT_ATTR, tag.attributes);\n prop.datatype = getAttribute(PROPERTY_DATATYPE_ATTR, tag.attributes);\n prop.applies_to = getAttribute(PROPERTY_APPLIES_TO_ATTR, tag.attributes);\n prop.id_ref = getAttribute(PROPERTY_ID_REF_ATTR, tag.attributes);\n\n if (!prop.ref) {\n throw new PhyloXmlError('property ref is missing');\n }\n if (!prop.datatype) {\n throw new PhyloXmlError('property data-type is missing');\n }\n if (!prop.applies_to) {\n throw new PhyloXmlError('property applies-to is missing');\n }\n if (!PROPERTY_REF_RE.test(prop.ref)) {\n throw new PhyloXmlError('property ref is ill-formatted: ' + prop.ref);\n }\n if (!PROPERTY_DATATYPE_RE.test(prop.datatype)) {\n throw new PhyloXmlError('property data-type is ill-formatted: ' + prop.datatype);\n }\n if (prop.unit && !PROPERTY_UNIT_RE.test(prop.unit)) {\n throw new PhyloXmlError('property unit is ill-formatted: ' + prop.unit);\n }\n\n addToArrayInCurrentObject(PROPERTIES, prop);\n _objectStack.push(prop);\n }\n\n function newProteinDomain(tag) {\n var pd = {};\n pd.name = null;\n pd.from = getAttributeAsInt(PROTEINDOMAIN_FROM_ATTR, tag.attributes);\n pd.to = getAttributeAsInt(PROTEINDOMAIN_TO_ATTR, tag.attributes);\n pd.confidence = getAttributeAsFloat(PROTEINDOMAIN_CONFIDENCE_ATTR, tag.attributes);\n pd.id = getAttribute(PROTEINDOMAIN_ID_ATTR, tag.attributes);\n addToArrayInCurrentObject('domains', pd);\n _objectStack.push(pd);\n }\n\n function newReference(tag) {\n var reference = {};\n reference.doi = getAttribute(REFERENCE_DOI_ATTR, tag.attributes);\n addToArrayInCurrentObject('references', reference);\n _objectStack.push(reference);\n }\n\n function newSequence(tag) {\n var seq = {};\n seq.type = getAttribute(SEQUENCE_TYPE_ATTR, tag.attributes);\n seq.id_source = getAttribute(SEQUENCE_ID_SOURCE_ATTR, tag.attributes);\n seq.id_ref = getAttribute(SEQUENCE_ID_REF_ATTR, tag.attributes);\n addToArrayInCurrentObject(SEQUENCES, seq);\n _objectStack.push(seq);\n }\n\n function newTaxonomy(tag) {\n var tax = {};\n tax.id_source = getAttribute(TAXONOMY_ID_SOURCE_ATTR, tag.attributes);\n addToArrayInCurrentObject(TAXONOMIES, tax);\n _objectStack.push(tax);\n }\n\n function newUri(tag) {\n var uri = {};\n uri.value = null;\n uri.desc = getAttribute(URI_DESC_ATTR, tag.attributes);\n uri.type = getAttribute(URI_TYPE_ATTR, tag.attributes);\n addToArrayInCurrentObject('uris', uri);\n _objectStack.push(uri);\n }\n\n function newPhylogeny(tag) {\n var phy = {};\n phy.rooted = getAttributeAsBoolean(PHYLOGENY_ROOTED_ATTR, tag.attributes);\n if (phy.rooted === undefined) {\n phy.rooted = true;\n }\n phy.rerootable = getAttributeAsBoolean(PHYLOGENY_REROOTABLE_ATTR, tag.attributes);\n if (phy.rerootable === undefined) {\n phy.rerootable = true;\n }\n phy.branch_length_unit = getAttribute(PHYLOGENY_BRANCH_LENGTH_UNIT_ATTR, tag.attributes);\n phy.type = getAttribute(PHYLOGENY_TYPE_ATTR, tag.attributes);\n _objectStack.push(phy);\n }\n\n function newSimpleCharacteristics() {\n //To be deprecated.\n var sc = {};\n getCurrentObject().simple_characteristics = sc;\n _objectStack.push(sc);\n }\n\n\n // --------------------------------------------------------------\n // Functions for processing text\n // --------------------------------------------------------------\n\n function inAccession(text) {\n getCurrentObject().value = text;\n }\n\n function inAnnotation(text) {\n if (getCurrentTag() === ANNOTATION_DESC) {\n getCurrentObject().desc = text;\n }\n }\n\n function inAppType(text) {\n if (getCurrentTag() === APPTYPE) {\n getCurrentObject().desc = text;\n }\n }\n\n function inBranchColor(text) {\n if (getCurrentTag() === COLOR_RED) {\n getCurrentObject().red = parseIntNumber(text);\n }\n else if (getCurrentTag() === COLOR_GREEN) {\n getCurrentObject().green = parseIntNumber(text);\n }\n else if (getCurrentTag() === COLOR_BLUE) {\n getCurrentObject().blue = parseIntNumber(text);\n }\n if (getCurrentTag() === COLOR_ALPHA) {\n getCurrentObject().alpha = parseIntNumber(text);\n }\n }\n\n function inClade(text) {\n if (getCurrentTag() === CLADE_NAME) {\n getCurrentClade().name = text;\n }\n else if (getCurrentTag() === CLADE_BRANCH_LENGTH) {\n getCurrentClade().branch_length = parseFloatNumber(text);\n }\n else if (getCurrentTag() === CLADE_WIDTH) {\n getCurrentClade().width = parseFloatNumber(text);\n }\n }\n\n function inConfidence(text) {\n getCurrentObject().value = parseFloatNumber(text);\n }\n\n function inDate(text) {\n if (getCurrentTag() === DATE_DESC) {\n getCurrentObject().desc = text;\n }\n else if (getCurrentTag() === DATE_VALUE) {\n getCurrentObject().value = parseFloatNumber(text);\n }\n else if (getCurrentTag() === DATE_MINIMUM) {\n getCurrentObject().minimum = parseFloatNumber(text);\n }\n else if (getCurrentTag() === DATE_MAXIMUM) {\n getCurrentObject().maximum = parseFloatNumber(text);\n }\n }\n\n function inDistribution(text) {\n if (getCurrentTag() === DISTRIBUTION_DESC) {\n getCurrentObject().desc = text;\n }\n }\n\n function inEvents(text) {\n if (getCurrentTag() === EVENTS_TYPE) {\n getCurrentObject().type = text;\n }\n else if (getCurrentTag() === EVENTS_DUPLICATIONS) {\n getCurrentObject().duplications = parseIntNumber(text);\n }\n else if (getCurrentTag() === EVENTS_SPECIATIONS) {\n getCurrentObject().speciations = parseIntNumber(text);\n }\n else if (getCurrentTag() === EVENTS_LOSSES) {\n getCurrentObject().losses = parseIntNumber(text);\n }\n }\n\n function inId(text) {\n getCurrentObject().value = text;\n }\n\n function inMolecularSequence(text) {\n getCurrentObject().value = text;\n }\n\n function inPoint(text) {\n if (getCurrentTag() === POINT_LAT) {\n getCurrentObject().lat = text;\n }\n else if (getCurrentTag() === POINT_LONG) {\n getCurrentObject().long = text;\n }\n else if (getCurrentTag() === POINT_ALT) {\n getCurrentObject().alt = text;\n }\n }\n\n function inProperty(text) {\n getCurrentObject().value = text;\n }\n\n function inProteinDomain(text) {\n getCurrentObject().name = text;\n }\n\n function inPhylogeny(text) {\n if (getCurrentTag() === PHYLOGENY_NAME) {\n getCurrentObject().name = text;\n }\n else if (getCurrentTag() === PHYLOGENY_DESCRIPTION) {\n getCurrentObject().description = text;\n }\n else if (getCurrentTag() === PHYLOGENY_DATE) {\n getCurrentObject().date = text;\n }\n }\n\n function inReference(text) {\n if (getCurrentTag() === REFERENCE_DESC) {\n getCurrentObject().desc = text;\n }\n }\n\n function inSequence(text) {\n if (getCurrentTag() === SEQUENCE_SYMBOL) {\n getCurrentObject().symbol = text;\n }\n else if (getCurrentTag() === SEQUENCE_NAME) {\n getCurrentObject().name = text;\n }\n else if (getCurrentTag() === SEQUENCE_GENE_NAME) {\n getCurrentObject().gene_name = text;\n }\n else if (getCurrentTag() === SEQUENCE_LOCATION) {\n getCurrentObject().location = text;\n }\n }\n\n function inTaxonomy(text) {\n if (getCurrentTag() === TAXONOMY_CODE) {\n getCurrentObject().code = text;\n }\n else if (getCurrentTag() === TAXONOMY_SCIENTIFIC_NAME) {\n getCurrentObject().scientific_name = text;\n }\n else if (getCurrentTag() === TAXONOMY_AUTHORITY) {\n getCurrentObject().authority = text;\n }\n else if (getCurrentTag() === TAXONOMY_COMMON_NAME) {\n getCurrentObject().common_name = text;\n }\n else if (getCurrentTag() === TAXONOMY_SYNONYM) {\n addToArrayInCurrentObject(TAXONOMY_SYNONYMS, text);\n }\n else if (getCurrentTag() === TAXONOMY_RANK) {\n getCurrentObject().rank = text;\n }\n }\n\n function inUri(text) {\n getCurrentObject().value = text;\n }\n\n function inSimpleCharacteristics(text) {\n //To be deprecated.\n if (getCurrentTag() === X_SIMPLE_CHARACTERISTIC_COUNTRY) {\n getCurrentObject().country = text;\n }\n else if (getCurrentTag() === X_SIMPLE_CHARACTERISTIC_HOST) {\n getCurrentObject().host = text;\n }\n else if (getCurrentTag() === X_SIMPLE_CHARACTERISTIC_YEAR) {\n getCurrentObject().year = text;\n }\n else if (getCurrentTag() === X_SIMPLE_CHARACTERISTIC_HA) {\n getCurrentObject().ha = text;\n }\n else if (getCurrentTag() === X_SIMPLE_CHARACTERISTIC_NA) {\n getCurrentObject().na = text;\n }\n }\n\n // --------------------------------------------------------------\n // Functions for SAX parser\n // --------------------------------------------------------------\n function phyloxmlOnopentag(tag) {\n _tagStack.push(tag.name);\n switch (tag.name) {\n case CLADE:\n newClade(tag);\n break;\n case ACCESSION:\n newAccession(tag);\n break;\n case ANNOTATION:\n newAnnotation(tag);\n break;\n case CLADE_RELATION:\n if (_tagStack.get(1) === PHYLOGENY) {\n newCladeRelation(tag);\n }\n break;\n case COLOR:\n newBranchColor();\n break;\n case CONFIDENCE:\n newConfidence(tag);\n break;\n case CROSS_REFERENCES:\n newCrossReferences();\n break;\n case DATE:\n if (_tagStack.get(1) === CLADE) {\n newDate(tag);\n }\n break;\n case DISTRIBUTION:\n newDistribution(tag);\n break;\n case DOMAIN_ARCHITECTURE:\n newDomainArchitecture(tag);\n break;\n case EVENTS:\n newEvents();\n break;\n case ID:\n newId(tag);\n break;\n case MOLSEQ:\n newMolecularSequence(tag);\n break;\n case POINT:\n newPoint(tag);\n break;\n case PROTEINDOMAIN:\n newProteinDomain(tag);\n break;\n case PHYLOGENY:\n newPhylogeny(tag);\n break;\n case PROPERTY:\n newProperty(tag);\n break;\n case REFERENCE:\n newReference(tag);\n break;\n case SEQUENCE:\n newSequence(tag);\n break;\n case SEQUENCE_RELATION:\n if (_tagStack.get(1) === PHYLOGENY) {\n newSequenceRelation(tag);\n }\n break;\n case TAXONOMY:\n newTaxonomy(tag);\n break;\n case URI:\n newUri(tag);\n break;\n case X_SIMPLE_CHARACTERISTICS:\n //To be deprecated.\n newSimpleCharacteristics();\n break;\n default:\n }\n }\n\n function phyloxmlOnclosetag(tag) {\n if (tag === CLADE) {\n _tagStack.pop();\n _objectStack.pop();\n _cladeStack.pop();\n }\n else if (\n tag === ACCESSION\n || tag === ANNOTATION\n || ( tag === CLADE_RELATION && (_tagStack.get(1) === PHYLOGENY) )\n || tag === COLOR\n || tag === CONFIDENCE\n || tag === CROSS_REFERENCES\n || ( tag === DATE && (_tagStack.get(1) === CLADE) )\n || tag === DISTRIBUTION\n || tag === TAXONOMY\n || tag === ID\n || tag === EVENTS\n || tag === MOLSEQ\n || tag === REFERENCE\n || tag === DOMAIN_ARCHITECTURE\n || tag === PROTEINDOMAIN\n || tag === SEQUENCE\n || ( tag === SEQUENCE_RELATION && (_tagStack.get(1) === PHYLOGENY) )\n || tag === PROPERTY\n || tag === POINT\n || tag === URI\n || tag === X_SIMPLE_CHARACTERISTICS) {\n _tagStack.pop();\n _objectStack.pop();\n }\n else if (!(tag === PHYLOGENY || tag === PHYLOXML)) {\n _tagStack.pop();\n }\n else if (tag === PHYLOGENY) {\n phyloxmlOnClosetagSanityCheck();\n _phylogenies.push(_phylogeny);\n startNewPhylogeny();\n }\n }\n\n function phyloxmlOntext(text) {\n var parentTag = _tagStack.get(1);\n var currentTag = _tagStack.peek();\n if (parentTag === CLADE) {\n inClade(text);\n }\n else if (parentTag === ANNOTATION) {\n inAnnotation(text);\n }\n else if (parentTag === COLOR) {\n inBranchColor(text);\n }\n else if (parentTag === DATE) {\n inDate(text);\n }\n else if (parentTag === DISTRIBUTION) {\n inDistribution(text);\n }\n else if (parentTag === EVENTS) {\n inEvents(text);\n }\n else if (parentTag === REFERENCE) {\n inReference(text);\n }\n else if (parentTag === PHYLOGENY) {\n inPhylogeny(text);\n }\n else if (parentTag === POINT) {\n inPoint(text);\n }\n else if (parentTag === SEQUENCE) {\n inSequence(text);\n }\n else if (parentTag === TAXONOMY) {\n inTaxonomy(text);\n }\n if (currentTag === ACCESSION) {\n inAccession(text);\n }\n else if (currentTag === APPTYPE) {\n inAppType(text);\n }\n else if (currentTag === CONFIDENCE) {\n inConfidence(text);\n }\n else if (currentTag === ID) {\n inId(text);\n }\n else if (currentTag === MOLSEQ) {\n inMolecularSequence(text);\n }\n else if (currentTag === PROTEINDOMAIN) {\n inProteinDomain(text);\n }\n else if (currentTag === PROPERTY) {\n inProperty(text);\n }\n else if (currentTag === URI) {\n inUri(text);\n }\n else if (parentTag === X_SIMPLE_CHARACTERISTICS) {\n inSimpleCharacteristics(text);\n }\n }\n\n function phyloxmlOnerror(error) {\n throw error;\n }\n\n function addPhyloxmlParserEvents(sax_parser) {\n sax_parser.onopentag = phyloxmlOnopentag;\n sax_parser.onclosetag = phyloxmlOnclosetag;\n sax_parser.ontext = phyloxmlOntext;\n sax_parser.onerror = phyloxmlOnerror;\n // Ignoring: oncdata, oncomment, ondoctype\n }\n\n // --------------------------------------------------------------\n // Helper functions\n // --------------------------------------------------------------\n function getCurrentClade() {\n return _cladeStack.peek();\n }\n\n function getCurrentTag() {\n return _tagStack.peek();\n }\n\n function getCurrentObject() {\n return _objectStack.peek();\n }\n\n function getAttribute(attribute_name, attributes) {\n if (attribute_name in attributes) {\n return attributes[attribute_name];\n }\n return undefined;\n }\n\n function getAttributeAsInt(attribute_name, attributes) {\n if (attribute_name in attributes) {\n return parseIntNumber(attributes[attribute_name]);\n }\n return undefined;\n }\n\n function getAttributeAsFloat(attribute_name, attributes) {\n if (attribute_name in attributes) {\n return parseFloatNumber(attributes[attribute_name]);\n }\n return undefined;\n }\n\n function getAttributeAsBoolean(attribute_name, attributes) {\n if (attribute_name in attributes) {\n return parseBoolean(attributes[attribute_name]);\n }\n return undefined;\n }\n\n function addToArrayInCurrentObject(name, value) {\n var parent = null;\n if (getCurrentObject()) {\n parent = getCurrentObject();\n }\n else {\n parent = _phylogeny;\n }\n var ary = parent[name];\n if (ary) {\n ary.push(value);\n }\n else {\n parent[name] = [value];\n }\n }\n\n function addToArrayInCurrentObjectUnnamed(value) {\n var obj = getCurrentObject();\n obj.push(value);\n }\n\n function parseFloatNumber(text) {\n var f = parseFloat(text);\n if (isNaN(f)) {\n throw new PhyloXmlError(\"could not parse floating point number from '\" + text + \"'\");\n }\n return f;\n }\n\n function parseIntNumber(text) {\n var i = parseInt(text);\n if (isNaN(i)) {\n throw new PhyloXmlError(\"could not parse integer number from '\" + text + \"'\");\n }\n return i;\n }\n\n function parseBoolean(text) {\n if (text === 'true') {\n return true;\n }\n else if (text === 'false') {\n return false;\n }\n else {\n throw new PhyloXmlError(\"could not parse boolean from '\" + text + \"'\");\n }\n }\n\n function startNewPhylogeny() {\n _phylogeny = null;\n _cladeStack = new Stack();\n _tagStack = new Stack();\n _objectStack = new Stack();\n }\n\n function phyloxmlOnClosetagSanityCheck() {\n if (!(_cladeStack.isEmpty() && _objectStack.isEmpty() )) {\n throw new PhyloXmlError('severe phyloXML format error')\n }\n }\n\n function finalSanityCheck() {\n if (!_tagStack.isEmpty()) {\n throw new PhyloXmlError('severe phyloXML format error');\n }\n }\n\n // --------------------------------------------------------------\n // Stack\n // --------------------------------------------------------------\n function Stack() {\n this._stack = [];\n this.pop = function () {\n var p = this._stack.pop();\n if (p === undefined) {\n throw new Error('severe phyloXML format error')\n }\n return p;\n };\n this.push = function (item) {\n this._stack.push(item);\n };\n this.peek = function () {\n return this._stack[this._stack.length - 1];\n };\n this.get = function (i) {\n return this._stack[this._stack.length - (1 + i)];\n };\n this.length = function () {\n return this._stack.length;\n };\n this.isEmpty = function () {\n return this._stack.length < 1;\n };\n }\n\n // --------------------------------------------------------------\n // phyloXML error\n // --------------------------------------------------------------\n function PhyloXmlError(message) {\n this.name = 'phyloXmlError';\n this.message = message || 'phyloXML format error';\n }\n\n PhyloXmlError.prototype = Object.create(Error.prototype);\n\n // --------------------------------------------------------------\n // To phyloXML\n // --------------------------------------------------------------\n phyloXml.toPhyloXML_ = function (phy, dec) {\n var x = '';\n var ind = '';\n openPhyloXml();\n openPhylogeny(phy, [PHYLOGENY_ROOTED_ATTR, PHYLOGENY_REROOTABLE_ATTR,\n PHYLOGENY_BRANCH_LENGTH_UNIT_ATTR, PHYLOGENY_TYPE_ATTR]);\n addSingleElement(PHYLOGENY_NAME, phy.name);\n addSingleElement(PHYLOGENY_DESCRIPTION, phy.description);\n addSingleElement(PHYLOGENY_DATE, phy.date);\n if (phy.children && phy.children.length === 1) {\n toPhyloXMLhelper(phy.children[0]);\n }\n closePhylogeny();\n closePhyloXml();\n return x;\n\n function toPhyloXMLhelper(node) {\n var l;\n var i;\n\n openClade(node, [CLADE_ID_SOURCE_ATTR, CLADE_COLLAPSE_ATTR]);\n\n addSingleElement(CLADE_NAME, node.name);\n\n if (node[CLADE_BRANCH_LENGTH]) {\n addSingleElement(CLADE_BRANCH_LENGTH, (dec && dec > 0) ? roundNumber(node[CLADE_BRANCH_LENGTH], dec) : node[CLADE_BRANCH_LENGTH]);\n }\n\n if (node[CONFIDENCES] && node[CONFIDENCES].length > 0) {\n l = node[CONFIDENCES].length;\n for (i = 0; i < l; ++i) {\n var conf = node[CONFIDENCES][i];\n if (!conf[CONFIDENCE_TYPE_ATTR]) {\n conf[CONFIDENCE_TYPE_ATTR] = UNKNOWN;\n }\n addSingleElement(CONFIDENCE, conf.value, conf,\n [CONFIDENCE_TYPE_ATTR, CONFIDENCE_STDDEV_ATTR]);\n }\n }\n\n addSingleElement(CLADE_WIDTH, node[CLADE_WIDTH]);\n\n if (node[COLOR]) {\n var col = node[COLOR];\n open(COLOR);\n addSingleElement(COLOR_RED, col[COLOR_RED]);\n addSingleElement(COLOR_GREEN, col[COLOR_GREEN]);\n addSingleElement(COLOR_BLUE, col[COLOR_BLUE]);\n addSingleElement(COLOR_ALPHA, col[COLOR_ALPHA]);\n close(COLOR);\n }\n\n if (node[TAXONOMIES] && node[TAXONOMIES].length > 0) {\n l = node[TAXONOMIES].length;\n for (i = 0; i < l; ++i) {\n var tax = node[TAXONOMIES][i];\n open(TAXONOMY, tax, [TAXONOMY_ID_SOURCE_ATTR]);\n if (tax[ID]) {\n if (!tax[ID][ID_PROVIDER_ATTR]) {\n tax[ID][ID_PROVIDER_ATTR] = UNKNOWN;\n }\n addSingleElement(ID, tax[ID].value, tax[ID],\n [ID_PROVIDER_ATTR]);\n }\n addSingleElement(TAXONOMY_CODE, tax[TAXONOMY_CODE]);\n addSingleElement(TAXONOMY_SCIENTIFIC_NAME, tax[TAXONOMY_SCIENTIFIC_NAME]);\n addSingleElement(TAXONOMY_AUTHORITY, tax[TAXONOMY_AUTHORITY]);\n addSingleElement(TAXONOMY_COMMON_NAME, tax[TAXONOMY_COMMON_NAME]);\n if (tax[TAXONOMY_SYNONYMS] && tax[TAXONOMY_SYNONYMS].length > 0) {\n var ll = tax[TAXONOMY_SYNONYMS].length;\n for (var ii = 0; ii < ll; ++ii) {\n addSingleElement(TAXONOMY_SYNONYM, tax[TAXONOMY_SYNONYMS][ii]);\n }\n }\n addSingleElement(TAXONOMY_RANK, tax[TAXONOMY_RANK]);\n close(TAXONOMY);\n }\n }\n\n if (node[SEQUENCES] && node[SEQUENCES].length > 0) {\n l = node[SEQUENCES].length;\n for (i = 0; i < l; ++i) {\n var seq = node[SEQUENCES][i];\n open(SEQUENCE, seq, [SEQUENCE_TYPE_ATTR, SEQUENCE_ID_SOURCE_ATTR, SEQUENCE_ID_REF_ATTR]);\n addSingleElement(SEQUENCE_SYMBOL, seq[SEQUENCE_SYMBOL]);\n if (seq[ACCESSION]) {\n if (!seq[ACCESSION][ACCESSION_SOURCE_ATTR]) {\n seq[ACCESSION][ACCESSION_SOURCE_ATTR] = UNKNOWN;\n }\n addSingleElement(ACCESSION, seq[ACCESSION].value, seq[ACCESSION],\n [ACCESSION_SOURCE_ATTR, ACCESSION_COMMENT_ATTR]);\n }\n addSingleElement(SEQUENCE_NAME, seq[SEQUENCE_NAME]);\n addSingleElement(SEQUENCE_GENE_NAME, seq[SEQUENCE_GENE_NAME]);\n addSingleElement(SEQUENCE_LOCATION, seq[SEQUENCE_LOCATION]);\n if (seq[MOLSEQ]) {\n addSingleElement(MOLSEQ, seq[MOLSEQ].value, seq[MOLSEQ],\n [MOLSEQ_IS_ALIGNED_ATTR]);\n }\n close(SEQUENCE);\n }\n }\n\n if (node[EVENTS]) {\n var ev = node[EVENTS];\n open(EVENTS);\n addSingleElement(EVENTS_TYPE, ev[EVENTS_TYPE]);\n addSingleElement(EVENTS_DUPLICATIONS, ev[EVENTS_DUPLICATIONS]);\n addSingleElement(EVENTS_SPECIATIONS, ev[EVENTS_SPECIATIONS]);\n addSingleElement(EVENTS_LOSSES, ev[EVENTS_LOSSES]);\n if (ev[CONFIDENCE]) {\n var evconf = ev[CONFIDENCE];\n addSingleElement(CONFIDENCE, evconf.value, evconf,\n [CONFIDENCE_TYPE_ATTR, CONFIDENCE_STDDEV_ATTR]);\n }\n close(EVENTS);\n }\n\n if (node[PROPERTIES] && node[PROPERTIES].length > 0) {\n l = node[PROPERTIES].length;\n for (i = 0; i < l; ++i) {\n var prop = node[PROPERTIES][i];\n if (!prop[PROPERTY_APPLIES_TO_ATTR]) {\n throw new PhyloXmlError(\"property applies-to is missing\");\n }\n if (!prop[PROPERTY_DATATYPE_ATTR]) {\n throw new PhyloXmlError(\"property data-type is missing\");\n }\n if (!prop[PROPERTY_REF_ATTR]) {\n throw new PhyloXmlError(\"property ref is missing\");\n }\n addSingleElement(PROPERTY, prop.value, prop, [PROPERTY_REF_ATTR,\n PROPERTY_UNIT_ATTR, PROPERTY_DATATYPE_ATTR, PROPERTY_APPLIES_TO_ATTR,\n PROPERTY_ID_REF_ATTR]);\n }\n }\n\n if (node.children) {\n l = node.children.length;\n for (i = 0; i < l; ++i) {\n toPhyloXMLhelper(node.children[i]);\n }\n }\n else if (node._children) {\n l = node._children.length;\n for (i = 0; i < l; ++i) {\n toPhyloXMLhelper(node._children[i]);\n }\n }\n\n closeClade();\n\n } // toPhyloXMLhelper\n\n function addSingleElement(elemName, elemValue, object, attributeNames) {\n if ((elemValue !== null) && (elemValue !== undefined)) {\n if (typeof elemValue === 'string' || elemValue instanceof String) {\n elemValue = elemValue.trim();\n if (elemValue.length > 0) {\n if ((elemValue.indexOf('&') > -1) || ( elemValue.indexOf('<') > -1) || ( elemValue.indexOf('>') > -1)\n || (elemValue.indexOf('\"') > -1) || ( elemValue.indexOf(\"'\") > -1)) {\n elemValue = replaceUnsafeChars(elemValue);\n }\n }\n else {\n return;\n }\n }\n x += ( ind + '<' + elemName);\n if (object && attributeNames && attributeNames.length > 0) {\n addAttributes(object, attributeNames);\n }\n x += ( '>' + elemValue + '</' + elemName + '>\\n');\n }\n }\n\n function open(elemName, object, attributeNames) {\n if (object && attributeNames && attributeNames.length > 0) {\n x += ( ind + '<' + elemName);\n addAttributes(object, attributeNames);\n x += '>\\n';\n }\n else {\n x += (ind + '<' + elemName + '>\\n' );\n }\n ind = ind + ' ';\n }\n\n function close(elemName) {\n reduceInd();\n x += ( ind + '</' + elemName + '>\\n' );\n }\n\n function openClade(object, attributeNames) {\n if (object && attributeNames && attributeNames.length > 0) {\n x += ind + '<clade';\n addAttributes(object, attributeNames);\n x += '>\\n';\n }\n else {\n x += ind + '<clade>\\n';\n }\n ind = ind + ' ';\n }\n\n function closeClade() {\n reduceInd();\n x += ind + '</clade>\\n';\n }\n\n function openPhylogeny(object, attributeNames) {\n if (object[PHYLOGENY_ROOTED_ATTR] === undefined ||\n object[PHYLOGENY_ROOTED_ATTR] === null) {\n object[PHYLOGENY_ROOTED_ATTR] = true;\n }\n if (object[PHYLOGENY_REROOTABLE_ATTR] === undefined ||\n object[PHYLOGENY_REROOTABLE_ATTR] === null) {\n object[PHYLOGENY_REROOTABLE_ATTR] = true;\n }\n if (object && attributeNames && attributeNames.length > 0) {\n x += ' <phylogeny';\n addAttributes(object, attributeNames);\n x += '>\\n';\n }\n else {\n x += ' <phylogeny>\\n';\n }\n ind = ' ';\n }\n\n function closePhylogeny() {\n ind = ' ';\n x += ' </phylogeny>\\n';\n }\n\n function openPhyloXml() {\n ind = '';\n x += '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n x += '<phyloxml xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.phyloxml.org http://www.phyloxml.org/1.20/phyloxml.xsd\" xmlns=\"http://www.phyloxml.org\">\\n';\n }\n\n function closePhyloXml() {\n x += '</phyloxml>\\n';\n }\n\n function addAttributes(object, attributeNames) {\n var l = attributeNames.length;\n for (var i = 0; i < l; ++i) {\n var attributeName = attributeNames[i];\n if (attributeName && ( object[attributeName] !== undefined && object[attributeName] !== null )) {\n x += (' ' + attributeName + '=\"' + object[attributeName] + '\"' );\n }\n }\n }\n\n function roundNumber(num, dec) {\n return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);\n }\n\n function replaceUnsafeChars(str) {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n }\n\n function reduceInd() {\n var l = ind.length;\n ind = '';\n for (var i = 0; i <= l - 2; ++i) {\n ind += ' ';\n }\n }\n\n }; // toPhyloXML_\n\n\n // --------------------------------------------------------------\n // Main functions\n // --------------------------------------------------------------\n\n /**\n * To parse phyloXML formatted trees from a stream asynchronously.\n *\n * @param stream - The stream to be parsed.\n * @param parseOptions - Options dict for the SAX parser.\n * (example: {trim: true, normalize: true}).\n */\n phyloXml.parseAsync = function (stream, parseOptions) {\n _phylogenies = [];\n startNewPhylogeny();\n var sax_parser = sax.createStream(true, parseOptions);\n addPhyloxmlParserEvents(sax_parser);\n stream.pipe(sax_parser);\n\n sax_parser.on('end', function () {\n finalSanityCheck();\n var len = _phylogenies.length;\n console.log(\"parsed \" + len + \" trees\");\n // for (var i = 0; i < len; ++i) {\n // do something, for example:\n // var str = JSON.stringify(_phylogenies[i], null, 2);\n //}\n });\n\n process.stdout.on('drain', function () {\n stream.resume();\n });\n };\n\n /**\n * To parse a phyloXML formatted source.\n *\n * @param source - The source.\n * @param parseOptions - Options dict for the SAX parser\n * (example: {trim: true, normalize: true}).\n * @returns {*} - Array of phylogentic tree objects.\n */\n phyloXml.parse = function (source, parseOptions) {\n source && ( source = source.toString().trim());\n\n if (!source) {\n throw new Error('phyloXML source is empty');\n }\n\n _phylogenies = [];\n startNewPhylogeny();\n var sax_parser = sax.parser(true, parseOptions);\n addPhyloxmlParserEvents(sax_parser);\n\n sax_parser.onend = function () {\n finalSanityCheck();\n };\n\n sax_parser.write(source).close();\n return _phylogenies;\n };\n\n\n /**\n * To convert a phylogentic tree object to a phyloXML formatted string.\n *\n * @param phy - A phylogentic tree object.\n * @param decPointsMax - Maximal number of decimal points for branch lengths (optional).\n * @returns A phyloXML formatted string.\n */\n phyloXml.toPhyloXML = function (phy, decPointsMax) {\n return phyloXml.toPhyloXML_(phy, decPointsMax);\n };\n\n // --------------------------------------------------------------\n // For exporting\n // --------------------------------------------------------------\n if ( true && module.exports && !__webpack_require__.g.xmldocAssumeBrowser)\n module.exports.phyloXml = phyloXml;\n else if (typeof window !== \"undefined\")\n window.phyloXml = phyloXml;\n else\n this.phyloXml = phyloXml;\n})();\n\n\n//# sourceURL=webpack://PhyloIO/./src/phyloxml.js?");
8740
8638
 
8741
8639
  /***/ }),
8742
8640
 
@@ -8746,7 +8644,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
8746
8644
  \**********************/
8747
8645
  /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
8748
8646
 
8749
- eval("const fs = __webpack_require__(/*! file-saver */ \"./node_modules/file-saver/dist/FileSaver.min.js\")\nconst d3 = __webpack_require__(/*! d3 */ \"./node_modules/d3/index.js\");\n\nfunction traverse(o,func_pre, func_post) {\n\n if (func_pre){\n func_pre.apply(this,[o,o[\"children\"]])\n }\n\n if(o[\"children\"]){\n\n for (var c in o[\"children\"] ) {\n\n var child = o[\"children\"][c]\n\n child = traverse(child, func_pre, func_post)\n\n if (func_post) {\n func_post.apply(this,[child,o])\n }\n\n\n }\n\n\n }\n\n return o\n\n}\n\nfunction build_table(hierarchy){\n\n traverse(hierarchy, function(node,children){\n delete node.left_\n delete node.right_\n delete node.weight_\n }, null)\n\n var n = hierarchy.leaves().length\n var X = Array.from(new Array(n), _ => Array(3).fill(null));\n var S2I = {} //Array(n).fill(0)\n var I2S = Array(n).fill(null)\n var n_edges = 0\n\n var nzl = []\n traverse(hierarchy, null, function(node,children){nzl.push(node)})\n nzl.push(hierarchy)\n var nz = nzl.entries()\n\n var n1 = nz.next()\n var n2 = nz.next()\n var i = 0\n\n while (true) {\n\n var node = n1.value[1]\n var node2 = n2.value[1]\n var p = node.parent\n var ii;\n\n // Do work\n if (!(node.hasOwnProperty('children'))) {\n I2S[i] = node.data.name\n S2I[I2S[i]] = i\n node.weight_ = 0\n node.left_ = i\n node.right_ = i\n i += 1\n }\n\n // propagate up\n if (typeof p != \"undefined\"){\n p.left_ = p.hasOwnProperty('left_') ? Math.min(p.left_, node.left_) : node.left_\n p.right_ = p.hasOwnProperty('right_') ? Math.max(p.right_, node.right_) : node.right_\n if (p.hasOwnProperty('weight_')){ p.weight_ = p.weight_ + node.weight_ + 1} else {p.weight_ = node.weight_ +=1}\n }\n\n if (node.hasOwnProperty('children')) {\n\n if( node2.hasOwnProperty('weight_') && node2.weight_ > 0 ){ii = node.left_} else { ii = node.right_}\n X[ii][0] = node.left_\n X[ii][1] = node.right_\n if (node.data.hasOwnProperty('branch_length')){\n X[ii][2] = node.data.branch_length\n }\n else {\n X[ii][2] = 1\n }\n\n\n n_edges += 1\n\n }\n\n n1 = n2\n n2 = nz.next()\n\n if (n2.done){\n\n\n // process seed node, w=0\n ii = hierarchy.leaves().length-1\n X[ii][0] = n1.value[1].left_\n X[ii][1] = n1.value[1].right_\n X[ii][2] = n1.value[1].data.branch_length\n n_edges += 1\n\n break\n }\n\n }\n\n\n\n if (X[0][0] !== null){\n X[0] = Array(3).fill(null)\n\n }\n\n n_edges = 0\n for (const n2Key in X) {\n if (X[n2Key][0] !== null){\n n_edges++\n }\n\n }\n\n var leaf_to_dist = {}\n\n hierarchy.leaves().forEach( e=> { leaf_to_dist[e.data.name] = e.data.branch_length })\n\n\n return {'table': X, 'n_edges': n_edges, 'I2S': I2S, 'S2I': S2I, 'leaf_dict': leaf_to_dist}\n\n\n}\n\nfunction reverse_order(child,parent){\n\n child.children.push(parent)\n parent.parent =child\n\n const b = parent.children.indexOf(child);\n if (b > -1) {\n parent.children.splice(b, 1);\n }\n}\n\nfunction reroot_hierarchy(hierarchy, leaf_name){\n\n\n let leaf = hierarchy.leaves().find(element => element.data.name == leaf_name );\n\n // INVERT PATH TO ROOT\n var ancestors = leaf.ancestors()\n leaf.children = []\n leaf.root = true\n\n\n //leaf.branch_length_before_reverse = leaf.data.branch_length\n\n/*\n for (var j = 0; j < leaf.parent.children.length; j++) {\n\n if (leaf.parent.children[j] != leaf){\n\n leaf.data.branch_length = leaf.parent.children[j].data.branch_length\n break\n\n }\n\n }\n\n */\n\n\n var index\n for (index = 0; index < ancestors.length; index++) {\n\n let child = (index === 0) ? leaf : ancestors[index-1]\n let parent = ancestors[index]\n\n\n /*\n parent.branch_length_before_reverse = parent.data.branch_length\n if (child.branch_length_before_reverse){\n parent.data.branch_length = child.branch_length_before_reverse\n }\n else{\n parent.data.branch_length = child.data.branch_length\n }\n */\n\n\n reverse_order(child,parent)\n }\n\n //DESTROY ROOT\n var old_root_children = ancestors[ancestors.length-1].children\n\n var c = ancestors[ancestors.length-2].children.indexOf(ancestors[ancestors.length-1]);\n if (c > -1) {\n ancestors[ancestors.length-2].children.splice(c, 1);\n }\n for (var j = 0; j < old_root_children.length; j++) {\n\n let parent = old_root_children[j]\n let child = ancestors[ancestors.length-2]\n\n child.children.push(parent)\n parent.parent =child\n }\n\n leaf.parent = null\n leaf.data.branch_length = leaf.children[0].data.branch_length\n\n return leaf\n}\n\nfunction addLogo(svg) {\n // TODO load with ajax\n var logo_xml = '<svg id=\"exportLogo\" x=\"0\" y=\"0\"><g id=\"g4169\"> <path d=\"m 29.606259,23.679171 1.905511,0 c 0.193778,0.617882 0.290669,1.188505 0.290672,1.711869 0.466506,-0.545171 1.022728,-0.99222 1.668668,-1.341146 0.653108,-0.348904 1.295455,-0.523362 1.927043,-0.523373 0.976073,1.1e-5 1.86603,0.261698 2.669869,0.78506 0.810999,0.523383 1.442581,1.221215 1.894747,2.093495 0.459321,0.865028 0.688986,1.802739 0.688998,2.813134 -1.2e-5,1.010407 -0.229677,1.951752 -0.688998,2.824038 -0.452166,0.865023 -1.083748,1.559219 -1.894747,2.082592 -0.803839,0.516105 -1.693796,0.774156 -2.669869,0.774157 -0.638765,-1e-6 -1.284701,-0.163554 -1.937809,-0.490663 -0.653117,-0.334377 -1.20575,-0.770521 -1.657902,-1.308434 l 0,6.542172 -1.711731,0 0,-12.713622 c -2e-6,-0.552441 -0.04665,-1.170313 -0.139953,-1.853616 -0.08613,-0.683283 -0.20096,-1.148504 -0.344499,-1.395663 m 2.196183,5.539039 c -3e-6,1.133981 0.355261,2.093499 1.065795,2.878557 0.717702,0.777793 1.561006,1.166688 2.529916,1.166687 0.954543,10e-7 1.79067,-0.392528 2.508385,-1.177592 0.717697,-0.785056 1.07655,-1.740939 1.076561,-2.867652 -1.1e-5,-1.1267 -0.358864,-2.082583 -1.076561,-2.867652 -0.717715,-0.79232 -1.553842,-1.188485 -2.508385,-1.188495 -0.96891,10e-6 -1.812214,0.396175 -2.529916,1.188495 -0.710534,0.785069 -1.065798,1.740952 -1.065795,2.867652\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4145\" /> <path d=\"m 43.224746,34.75725 0,-16.279106 1.711731,0 0,7.152775 c 0.437798,-0.610593 0.94378,-1.112159 1.517951,-1.504699 0.581337,-0.399789 1.151913,-0.599688 1.71173,-0.599699 0.602867,1.1e-5 1.141147,0.123585 1.614841,0.370723 0.473678,0.23989 0.854062,0.570633 1.141153,0.99223 0.287074,0.421615 0.502386,0.897739 0.645937,1.428373 0.143531,0.523382 0.215302,1.083101 0.215312,1.679158 l 0,6.760245 -1.6902,0 0,-6.760245 c -8e-6,-0.33437 -0.0323,-0.65421 -0.09689,-0.959518 -0.05742,-0.305294 -0.154315,-0.603326 -0.290672,-0.894097 -0.136371,-0.298024 -0.337329,-0.534268 -0.602873,-0.708736 -0.265559,-0.181718 -0.584938,-0.272581 -0.958139,-0.272591 -0.473692,10e-6 -0.96891,0.243524 -1.485653,0.730544 -0.509576,0.487036 -0.925846,1.05039 -1.24881,1.69006 -0.315795,0.632417 -0.47369,1.177598 -0.473687,1.635543 l 0,5.53904 -1.711731,0\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4147\" /> <path d=\"m 53.581256,23.679171 1.776325,0 3.423461,8.472114 3.337338,-8.472114 1.797856,0 -6.4163,16.388142 -1.819387,0 2.22848,-5.658979 -4.327773,-10.729163\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4149\" /> <path d=\"m 67.415055,34.75725 -1.71173,0 0,-16.279106 1.71173,0 0,16.279106\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4151\" /> <path d=\"m 80.882824,26.361462 c 0.523914,0.872297 0.785877,1.824546 0.785889,2.856748 -1.2e-5,1.032215 -0.261975,1.984463 -0.785889,2.856749 -0.523937,0.872291 -1.234467,1.562854 -2.131589,2.071689 -0.897143,0.501566 -1.873223,0.752348 -2.928244,0.752349 -1.062213,-1e-6 -2.04547,-0.250783 -2.949776,-0.752349 -0.897136,-0.508835 -1.607665,-1.199398 -2.131589,-2.071689 -0.523928,-0.872286 -0.78589,-1.824534 -0.785889,-2.856749 -10e-7,-1.032202 0.261961,-1.984451 0.785889,-2.856748 0.523924,-0.87955 1.234453,-1.570111 2.131589,-2.071688 0.904306,-0.508825 1.887563,-0.763242 2.949776,-0.763253 1.055021,1.1e-5 2.031101,0.254428 2.928244,0.763253 0.897122,0.501577 1.607652,1.192138 2.131589,2.071688 m -9.20459,2.856748 c -3e-6,1.126713 0.405501,2.082596 1.216513,2.867652 0.811004,0.785064 1.794261,1.177593 2.949775,1.177592 1.1555,10e-7 2.142346,-0.392528 2.960541,-1.177592 0.818175,-0.792325 1.227268,-1.748208 1.227279,-2.867652 -1.1e-5,-1.112162 -0.409104,-2.060776 -1.227279,-2.845844 -0.818195,-0.792321 -1.805041,-1.188485 -2.960541,-1.188495 -1.155514,10e-6 -2.138771,0.396174 -2.949775,1.188495 -0.811012,0.785068 -1.216516,1.733682 -1.216513,2.845844\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4153\" /> <path d=\"m 84.532366,34.0049 c -2e-6,-0.247148 0.08612,-0.457951 0.258374,-0.63241 0.172247,-0.181725 0.380382,-0.272588 0.624405,-0.27259 0.244018,2e-6 0.452152,0.09087 0.624405,0.27259 0.179424,0.174459 0.269137,0.385262 0.269141,0.63241 -4e-6,0.239881 -0.08972,0.454318 -0.269141,0.643314 -0.17943,0.181727 -0.387564,0.27259 -0.624405,0.27259 -0.236846,0 -0.444981,-0.09087 -0.624405,-0.27259 -0.172252,-0.188996 -0.258376,-0.403433 -0.258374,-0.643314\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee\" id=\"path4155\" /> <path d=\"m 89.527608,21.08411 c -10e-7,-0.239866 0.08253,-0.447035 0.247608,-0.621507 0.172248,-0.174444 0.380383,-0.261673 0.624406,-0.261687 0.23684,1.4e-5 0.437798,0.08724 0.602874,0.261687 0.172246,0.174472 0.258371,0.381641 0.258374,0.621507 -3e-6,0.247162 -0.08254,0.457964 -0.247609,0.632409 -0.165075,0.167203 -0.369621,0.250796 -0.613639,0.250783 -0.244023,1.3e-5 -0.452158,-0.08358 -0.624406,-0.250783 -0.165074,-0.174445 -0.247609,-0.385247 -0.247608,-0.632409 m 1.356465,13.67314 -0.968904,0 0,-11.056271 0.968904,0 0,11.056271\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee\" id=\"path4157\" /> <path d=\"m 99.593447,23.526521 c 0.753583,1.1e-5 1.474873,0.149027 2.163883,0.447048 0.68899,0.298043 1.28468,0.701476 1.78709,1.210302 0.50238,0.508844 0.90072,1.115812 1.19499,1.820905 0.29424,0.705108 0.44137,1.442918 0.44139,2.213434 -2e-5,0.777797 -0.14715,1.519242 -0.44139,2.224339 -0.29427,0.705104 -0.69261,1.312071 -1.19499,1.820905 -0.50241,0.501568 -1.0981,0.905001 -1.78709,1.210301 -0.68901,0.298033 -1.4103,0.447049 -2.163883,0.447049 -1.543077,0 -2.860068,-0.556084 -3.950979,-1.668254 -1.090916,-1.112166 -1.636373,-2.456945 -1.636372,-4.03434 -10e-7,-1.032202 0.247608,-1.984451 0.742827,-2.856748 0.502393,-0.87955 1.180625,-1.570111 2.0347,-2.071688 0.861243,-0.508825 1.797849,-0.763242 2.809824,-0.763253 m -4.629212,5.691689 c -2e-6,1.301171 0.452153,2.416973 1.356467,3.347412 0.911483,0.923175 2.009573,1.38476 3.294277,1.384759 1.284681,10e-7 2.379191,-0.461584 3.283511,-1.384759 0.91147,-0.930439 1.36721,-2.046241 1.36722,-3.347412 -1e-5,-1.293889 -0.45575,-2.402423 -1.36722,-3.325603 -0.90432,-0.923164 -1.99883,-1.38475 -3.283511,-1.38476 -1.284704,10e-6 -2.382794,0.461596 -3.294277,1.38476 -0.904314,0.92318 -1.356469,2.031714 -1.356467,3.325603\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee\" id=\"path4159\" /> </g> <g id=\"g4014\" transform=\"translate(12.84,20.592727)\"> <g transform=\"translate(0,-0.065)\" id=\"g3992\"> <polygon style=\"fill:#939598\" id=\"polygon461\" points=\"5.7,0.23 11.86,0.23 11.86,1.65 7.12,1.65 7.12,6.04 11.86,6.04 11.86,7.46 11.86,7.46 5.7,7.46 \" class=\"cls-2\" /> <polygon style=\"fill:#939598\" id=\"polygon463\" points=\"0,7.08 3.51,7.08 3.51,8.49 1.43,8.49 1.45,15.84 12.68,15.84 12.68,17.26 12.68,17.26 0.04,17.26 \" class=\"cls-2\" /> <polygon style=\"fill:#939598\" id=\"polygon465\" points=\"10.49,11.02 10.49,12.44 10.49,12.44 2.84,12.44 2.84,7.79 4.26,7.79 4.26,11.02 \" class=\"cls-2\" transform=\"translate(0,-0.15225398)\" /> <polygon style=\"fill:#bcbec0\" id=\"polygon467\" points=\"4.26,4.55 4.26,7.79 4.26,7.79 2.84,7.79 2.84,3.13 6.41,3.13 6.41,4.55 \" class=\"cls-3\" transform=\"matrix(1,0,0,0.85463687,0,0.4549866)\" /> <rect style=\"fill:#939598;fill-opacity:1\" id=\"rect3926-3\" width=\"1.4240631\" height=\"1.7319686\" x=\"2.8396611\" y=\"7.0799503\" /> <rect style=\"fill:#939598;fill-opacity:1\" id=\"rect3926-6\" width=\"1.3864813\" height=\"1.6934805\" x=\"5.7012329\" y=\"2.9206221\" /> </g> <g id=\"g4005\"> <g id=\"g3984\"> <polygon class=\"cls-2\" points=\"94.93,12.33 94.93,10.91 99.87,10.91 99.87,6.46 94.93,6.46 94.93,5.04 101.29,5.04 101.29,12.33 101.29,12.33 \" id=\"polygon453\" style=\"fill:#939598\" /> <polygon class=\"cls-2\" points=\"94.72,17.36 94.72,15.94 104.87,15.94 104.9,5.41 102.74,5.41 102.74,3.99 106.32,3.99 106.29,17.36 106.29,17.36 \" id=\"polygon455\" style=\"fill:#939598\" /> <polygon class=\"cls-2\" points=\"95.51,1.42 95.51,0 103.45,0 103.45,4.7 103.45,4.7 102.03,4.7 102.03,1.42 \" id=\"polygon457\" style=\"fill:#939598\" /> <polygon class=\"cls-3\" points=\"102.03,7.97 102.03,4.7 103.45,4.7 103.45,9.39 103.45,9.39 100.65,9.39 100.65,7.97 \" id=\"polygon459\" style=\"fill:#bcbec0\" /> <rect y=\"3.9876499\" x=\"102.02941\" height=\"1.4238259\" width=\"1.4579451\" id=\"rect3926\" style=\"fill:#939598;fill-opacity:1\" /> <rect y=\"7.884686\" x=\"99.887817\" height=\"1.6934805\" width=\"1.397205\" id=\"rect3926-7\" style=\"fill:#939598;fill-opacity:1\" /> </g> </g> </g> </g> </svg>';\n\n svg.append(\"g\").html(logo_xml);\n\n}\n\nfunction getSVGString( svgNode ) {\n svgNode.setAttribute('xlink', 'http://www.w3.org/1999/xlink');\n var cssStyleText = getCSSStyles(svgNode);\n cssStyleText += \"* {font-family:Helvetica}\"\n appendCSS( cssStyleText, svgNode );\n\n var serializer = new XMLSerializer();\n var svgString = serializer.serializeToString(svgNode);\n svgString = svgString.replace(/(\\w+)?:?xlink=/g, 'xmlns:xlink='); // Fix root xlink without namespace\n svgString = svgString.replace(/NS\\d+:href/g, 'xlink:href'); // Safari NS namespace fix\n\n return svgString;\n\n function getCSSStyles( parentElement ) {\n var selectorTextArr = [];\n\n // Add Parent element Id and Classes to the list\n selectorTextArr.push( '#'+parentElement.id );\n for (var c = 0; c < parentElement.classList.length; c++)\n if ( !contains('.'+parentElement.classList[c], selectorTextArr) )\n selectorTextArr.push( '.'+parentElement.classList[c] );\n\n // Add Children element Ids and Classes to the list\n var nodes = parentElement.getElementsByTagName(\"*\");\n for (var i = 0; i < nodes.length; i++) {\n var id = nodes[i].id;\n if ( !contains('#'+id, selectorTextArr) )\n selectorTextArr.push( '#'+id );\n\n var classes = nodes[i].classList;\n for (var c = 0; c < classes.length; c++)\n if ( !contains('.'+classes[c], selectorTextArr) )\n selectorTextArr.push( '.'+classes[c] );\n }\n\n // Extract CSS Rules\n var extractedCSSText = \"\";\n for (var i = 0; i < document.styleSheets.length; i++) {\n var s = document.styleSheets[i];\n\n try {\n if(!s.cssRules) continue;\n } catch( e ) {\n if(e.name !== 'SecurityError') throw e; // for Firefox\n continue;\n }\n\n var cssRules = s.cssRules;\n for (var r = 0; r < cssRules.length; r++) {\n if ( contains( cssRules[r].selectorText, selectorTextArr ) )\n extractedCSSText += cssRules[r].cssText;\n }\n }\n\n\n return extractedCSSText;\n\n function contains(str,arr) {\n return arr.indexOf( str ) === -1 ? false : true;\n }\n\n }\n\n function appendCSS( cssText, element ) {\n var styleElement = document.createElement(\"style\");\n styleElement.setAttribute(\"type\",\"text/css\");\n styleElement.innerHTML = cssText;\n var refNode = element.hasChildNodes() ? element.children[0] : null;\n element.insertBefore( styleElement, refNode );\n }\n}\n\nfunction svgString2Image( svgString, width, height, format, callback ) {\n var format = format ? format : 'png';\n\n var imgsrc = 'data:image/svg+xml;base64,'+ btoa( unescape( encodeURIComponent( svgString ) ) ); // Convert SVG string to dataurl\n\n var canvas = document.createElement(\"canvas\");\n var context = canvas.getContext(\"2d\");\n\n canvas.width = width;\n canvas.height = height;\n\n var image = new Image;\n image.onload = function() {\n\n context.clearRect ( 0, 0, width, height );\n context.fillStyle = \"#ffffff\";\n context.fillRect(0, 0, width, height);\n context.drawImage(image, 0, 0, width, height);\n\n canvas.toBlob( function(blob) {\n var filesize = Math.round( blob.length/1024 ) + ' KB';\n if ( callback ) callback( blob, filesize );\n });\n };\n image.src = imgsrc;\n}\n\nfunction screen_shot({ svg1, svg2, format } = {}){\n\n addLogo(svg1);\n var name1 = svg1.attr(\"id\");\n var svgString1 = getSVGString(svg1.node());\n\n var t = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" version=\\\"1.1\\\">\\n\" +\n \"\\n\" +\n \" <g transform=\\\"translate(0,0)\\\">\\n\" +\n svgString1 +\n \" </g>\\n\"\n\n if(svg2){\n\n addLogo(svg2);\n var name2 = svg2.attr(\"id\");\n var svgString2 = getSVGString(svg2.node());\n\n var w = svg2.node().getBoundingClientRect().width\n var h = svg2.node().getBoundingClientRect().height\n\n t += '<line x1=\"' + (w + 5) +'\" y1=\"0\" x2=\"' + (w + 5) +'\" y2=\"' + h+'\" stroke=\"black\" />'\n\n t += \" <g transform=\\\"translate(\" + (w + 10) +\",0)\\\">\\n\" +\n svgString2 +\n \" </g>\\n\"\n\n }\n\n t += \"</svg> \"\n\n if(format === 'svg') {\n\n var blob = new Blob([t], {\"type\": \"image/svg+xml;base64,\"+ btoa(t)});\n fs.saveAs(blob, name1+\".svg\");\n svg1.select(\"#exportLogo\").remove();\n if(svg2){svg2.select(\"#exportLogo\").remove();}\n\n }\n\n else if (format === 'png'){\n\n\n\n var wi = svg1.node().getBoundingClientRect().width\n var he = svg1.node().getBoundingClientRect().height\n\n if(svg2){\n wi = wi*2;\n }\n\n svgString2Image(t, wi, he, 'png', save);\n\n svg1.select(\"#exportLogo\").remove();\n if(svg2){svg2.select(\"#exportLogo\").remove();}\n\n function save(dataBlob, filesize) {\n var filename = (name) ? name+\".\" : \"\";\n fs.saveAs(dataBlob, filename+'phylo.io.png'); // FileSaver.js function\n }\n\n }\n}\n\n//Adapted from Extended Newick format parser in JavaScript.\n//Copyright (c) Miguel Pignatelli 2014 based on Jason Davies\nfunction parse_nhx(s) {\n var ancestors = [];\n var tree = {'data_nhx' : {}};\n // var tokens = s.split(/\\s*(;|\\(|\\)|,|:)\\s*/);\n //[&&NHX:D=N:G=ENSG00000139618:T=9606]\n var tokens = s.split( /\\s*(;|\\(|\\)|\\[|\\]|,|:|=)\\s*/ );\n for (var i=0; i<tokens.length; i++) {\n var token = tokens[i];\n switch (token) {\n case '(': // new children\n var subtree = {'data_nhx' : {}};\n tree.children = [subtree];\n ancestors.push(tree);\n tree = subtree;\n break;\n case ',': // another branch\n var subtree = {'data_nhx' : {}};\n ancestors[ancestors.length-1].children.push(subtree);\n tree = subtree;\n break;\n case ')': // optional name next\n tree = ancestors.pop();\n break;\n case ':': // optional length next\n break;\n default:\n var x = tokens[i-1];\n // var x2 = tokens[i-2];\n if (x == ')' || x == '(' || x == ',') {\n tree.name = token;\n }\n else if (x == ':') {\n var test_type = typeof token;\n if(!isNaN(token)){\n tree.branch_length = parseFloat(token);\n }\n // tree.length = parseFloat(token);\n }\n else if (x == '='){\n tree['data_nhx'][tokens[i-2]] = token\n }\n else {\n var test;\n }\n }\n }\n return tree;\n};\n\nfunction save_file_as(filename, data) {\n const blob = new Blob([data], {type: 'text/csv'});\n if(window.navigator.msSaveOrOpenBlob) {\n window.navigator.msSaveBlob(blob, filename);\n }\n else{\n const elem = window.document.createElement('a');\n elem.href = window.URL.createObjectURL(blob);\n elem.download = filename;\n document.body.appendChild(elem);\n elem.click();\n document.body.removeChild(elem);\n }\n}\n\nfunction compute_RF_Euc(X1,X2){\n\n var n_good = 0\n var euclidian = 0.00\n\n var x2_processed = []\n\n for (var i = 0; i < X1.table.length; i++) {\n var s1 = X1.table[i][0]\n var e1 = X1.table[i][1]\n var w1 = Math.abs(e1-s1)\n\n if (w1 > 0){\n\n var species = X1.I2S.slice(s1,e1+1)\n var index = []\n\n for (const [name, idx] of Object.entries(X2.S2I)) {\n if (species.includes(name)) {index.push(idx)}\n }\n\n if (index.length <= 0) {\n continue\n }\n\n var s2 = Math.min.apply(null,index)\n var e2 = Math.max.apply(null,index)\n var w2 = Math.abs(e2-s2)\n\n if (w1 == w2) {\n\n\n if (X2.table[e2][0] == s2 && X2.table[e2][1] == e2) {\n n_good += 1\n euclidian += Math.abs(parseFloat(X1.table[i][2]) - parseFloat(X2.table[e2][2]) )\n x2_processed.push(e2)\n }\n else if (X2.table[s2][0] == s2 && X2.table[s2][1] == e2){\n\n n_good += 1\n euclidian += Math.abs(parseFloat(X1.table[i][2]) - parseFloat(X2.table[s2][2]) )\n x2_processed.push(s2)\n\n }\n else{\n euclidian += parseFloat(X1.table[i][2])\n\n }\n\n }\n\n\n else{\n euclidian += parseFloat(X1.table[i][2])\n }\n\n\n\n\n\n\n }\n\n }\n\n\n for (var k = 1; k < X2.table.length; k++) {\n if (!x2_processed.includes(k)){\n\n var d = parseFloat(X2.table[k][2])\n\n if(!isNaN(d)) {\n euclidian += d\n x2_processed.push(k)\n }\n\n }\n }\n\n var leaf_dist = 0.00\n for (var key of Object.keys(X1.leaf_dict)) {\n\n leaf_dist += Math.abs(X1.leaf_dict[key] - X2.leaf_dict[key])\n }\n\n var euc = euclidian + leaf_dist\n\n\n return {\n 'E':euc.toFixed(2),\n 'RF': (X1.n_edges + X2.n_edges -2*n_good),\n 'good':n_good,\n 'L':X1.n_edges,\n 'R':X2.n_edges,\n\n }\n}\n\nfunction get_intersection_leaves(h1, h2){\n\n var leaves1 = h1.leaves().map(x => x.data.name);\n var leaves2 = h2.leaves().map(x => x.data.name);\n return Array.from(new Set(leaves1.filter(value => leaves2.includes(value))))\n}\n\nfunction r_child(parent,child){\n let index = parent.children.indexOf(child);\n if (index > -1) {\n parent.children.splice(index, 1);\n }\n}\n\nfunction get_duplicated(array){\n return array.filter((e, i, a) => a.indexOf(e) !== i)\n}\n\nfunction remove_from_array(array, to_remove){\n\n return array.filter(element => !to_remove.includes(element));\n\n}\n\nfunction remove_duplicated_and_unnamed_leaves_hierarchy(h){\n\n var leaf_space = []\n\n h.eachAfter(d => {\n\n if (d.parent && !d.children){\n\n if (d.data.name.length === 0){\n r_child(d.parent,d)\n d= null;\n }\n else {\n leaf_space.push(d.data.name)\n }\n }\n\n\n });\n\n var dup = get_duplicated(leaf_space)\n\n\n var to_keep = remove_from_array(leaf_space, dup)\n\n return filter_leaves_hierarchy(h, to_keep)\n}\n\nfunction filter_leaves_hierarchy(h, leaves_to_keep){\n\n\n h.eachAfter(d => {\n\n if (d.children && d.parent){\n\n if (d.children.length === 0){\n r_child(d.parent, d)\n d = null\n }\n\n else if (d.children.length === 1){\n r_child(d.parent, d)\n d.parent.children.push(d.children[0])\n d.children[0].parent = d.parent\n d = null\n\n }\n }\n\n else if (d.parent){\n\n if (!leaves_to_keep.includes(d.data.name)){\n r_child(d.parent,d)\n d= null;\n }\n }\n\n\n });\n\n if (Array.from(new Set(h.leaves().map(x => x.data.name))).length == leaves_to_keep.length){\n return h\n }\n\n return false\n}\n\nfunction check_whole_hierarchy_labelled(hierarchy ){\n\n\n traverse(hierarchy, function(node,children){\n\n if (typeof node.data['duplication'] === 'undefined' ){\n node.data['duplication'] = false\n }\n\n\n }, null)\n\n return\n}\n\nfunction buildX(hierarchy){\n\n/*\n Define the table X according to (Day 1985) to have contiguous integers for\n each clade, and define a clade by the left-most and right-most identifiers,\n such as [4,7] for the clade [4,5,6,7].\n\n Note we extend the table to contain the following fields,\n which will be populated later in the algorithm:\n 3: node defining the clade in T1\n 4: node defining the clade in T2\n 5: size of the island rooted in the clade in T1\n 6: size of the island rooted in the clade in T2\n 7: labels in the island rooted in the clade in T1\n 8: labels in the island rooted in the clade in T2\n\n */\n\n var X = []\n var n = hierarchy.leaves().length\n var tax2id = {}\n var n2bip = new Map();\n\n function buildX_r(T){\n if (T.children == null && T._children == null){\n // left right id2taxon nodeT1 nodeT2 sizeIsland1 sizeIsland2 labels1 labels2\n X.push([0,0,T.data.name,0,0,0,0,new Set(),new Set()])\n i = X.length -1\n tax2id[T.data.name] = i\n return [i,i]\n }\n\n else{\n let min_l = n\n let max_r = 0\n\n for (var j = 0; j < T.children.length; j++) {\n var c = T.children[j]\n\n var [l,r] = buildX_r(c)\n min_l = Math.min(l,min_l)\n max_r = Math.max(r,max_r)\n\n }\n\n X[min_l][0]=X[max_r][0]=min_l\n X[min_l][1]=X[max_r][1]=max_r\n X[min_l][3]=X[max_r][3]=T\n n2bip.set(T, [min_l,max_r]);\n\n\n return [min_l,max_r]\n }\n\n }\n\n buildX_r(hierarchy)\n\n return [X, tax2id, n2bip]\n}\n\nfunction findgood(hierarchy,X,tax2id){\n\n\n function findgood_r(T){\n\n if (T.children == null && T._children == null){\n var i = tax2id[T.data.name]\n\n return [i,i,1]\n }\n else {\n var min_l = n\n var max_r=0\n var tot_w=0\n\n for (var j = 0; j < T.children.length; j++) {\n\n var c = T.children[j]\n\n var [l, r, w] = findgood_r(c)\n\n min_l = Math.min(l, min_l)\n max_r = Math.max(r, max_r)\n tot_w += w\n }\n\n if (max_r-min_l+1 == tot_w){\n\n if (X[min_l][0]==min_l && X[min_l][1]==max_r){\n X[min_l][4]= T\n n2bip.set(T, [min_l,max_r]);\n }\n else if (X[max_r][0]==min_l && X[max_r][1]==max_r) {\n X[max_r][4]=T\n n2bip.set(T, [min_l,max_r]);\n }\n }\n\n return [min_l,max_r,tot_w]\n\n\n }\n }\n\n var n2bip = new Map();\n var n = hierarchy.leaves().length\n\n findgood_r(hierarchy)\n\n return(n2bip)\n}\n\nfunction getIslandsDay(t,X,n2bip,isT1){\n\n /*\n An island is separated from the rest of the tree\n by good edges. In the traversal below, we do a preorder\n traversal and create a new island whenever we meet a clade\n defined in X\n ____\n /\n **** x6\n * \\___\n **** x3 ......\n * \\___ ______x7\n ----x1 / ...\n * **** x4 ____\n **** x2 ``-- /\n *********** x5\n \\_____\n\n */\n\n function mytraversal(t,parentIslandId=0){\n\n if (t.children == null && t._children == null){\n return\n }\n\n if (n2bip.has(t)){\n var [l,r] = n2bip.get(t)\n }\n else {\n var l = 0;\n var r = 0;\n }\n\n var row = -1\n\n if (X[l][0]===l && X[l][1]===r && X[l][4]!==0){\n row = l\n }\n\n else if (X[r][0]===l && X[r][1]===r && X[r][4]!==0){\n row = r\n }\n\n // CLADE IS COMMON\n if (row > -1){\n\n // end of previous island, so new island.\n islandId = row\n X[row][off+2].add(t.data.duplication)\n\n\n for (var j = 0; j < t.children.length; j++) {\n var c = t.children[j]\n mytraversal(c,islandId)\n\n }\n\n }\n else {\n // continue previous island\n var islandId = parentIslandId\n\n X[islandId][off+2].add(t.data.duplication)\n X[islandId][off] += 1\n\n for (var j = 0; j < t.children.length; j++) {\n var c = t.children[j]\n\n mytraversal(c,islandId)\n\n }\n\n }\n\n }\n\n\n var off;\n\n if (isT1){\n off = 5\n }\n else{\n off = 6\n }\n\n mytraversal(t)\n\n return\n\n}\n\n// ADAPTED FROM https://github.com/DessimozLab/pylabeledrf\nfunction compute_LRF(t1, t2){\n\n var [ X, tax2id, n12bip ] = buildX(t1)\n\n var n22bip = findgood(t2,X,tax2id)\n\n getIslandsDay(t1,X,n12bip,true)\n getIslandsDay(t2,X,n22bip,false)\n\n\n var rf = 0;\n var subs = 0;\n\n for (var i = 0; i < X.length; i++) {\n\n if (X[i][4] != 0){\n\n rf += X[i][5]+X[i][6]\n\n let intersection = new Set( [...X[i][7]].filter(x => X[i][8].has(x)));\n\n if ( intersection.size == 0){\n subs +=1\n }\n }\n }\n\n return rf+subs\n\n}\n\nfunction prepare_and_run_distance(m1,m2){\n\n var distance = {\n 'no_distance_message': true,\n 'clade': false,\n 'Cl_good': false,\n 'Cl_left': false,\n 'Cl_right': false,\n 'RF': false,\n 'RF_good': false,\n 'RF_left': false,\n 'RF_right': false,\n 'Euc': false,\n 'LRF':false\n }\n\n // CHECK INTERSECTING LEAVES\n var h1_raw = d3.hierarchy(m1.data, d => d.children );\n var h2_raw = d3.hierarchy(m2.data, d => d.children );\n\n var h1 = remove_duplicated_and_unnamed_leaves_hierarchy(h1_raw)\n var h2 = remove_duplicated_and_unnamed_leaves_hierarchy(h2_raw)\n\n var intersection = get_intersection_leaves(h1,h2)\n\n if (intersection.length == 0){\n distance.no_distance_message = 'No leaves in common to compute distance.'\n return distance\n }\n\n // FILTER TREE TO KEEP ONLY INTERSECTING LEAVES\n var hierachy1 = filter_leaves_hierarchy(h1, intersection )\n var table1 = build_table(hierachy1 )\n\n var hierachy2 = filter_leaves_hierarchy(h2, intersection )\n var table2 = build_table(hierachy2 )\n\n // CLADISTIC DISTANCE & EUCLIDIAN\n var r = compute_RF_Euc(table1,table2)\n distance.clade = r.RF\n distance.Cl_good = r.good\n distance.Cl_left = r.L\n distance.Cl_right = r.R\n distance.Euc = r.E\n\n // RF\n var hierarchy_mockup_rerooted1 = reroot_hierarchy(hierachy1, intersection[0])\n var hierarchy_mockup_rerooted2 = reroot_hierarchy(hierachy2, intersection[0])\n\n // build tables\n var X1 = build_table(hierarchy_mockup_rerooted1)\n var X2 = build_table(hierarchy_mockup_rerooted2)\n\n var r2 = compute_RF_Euc(X1,X2)\n distance.RF = r2.RF\n distance.RF_good = r2.good\n distance.RF_left = r2.L\n distance.RF_right = r2.R\n\n\n // LRF\n if ( m1.settings.has_duplications && m2.settings.has_duplications) {\n check_whole_hierarchy_labelled(hierarchy_mockup_rerooted1)\n check_whole_hierarchy_labelled(hierarchy_mockup_rerooted2)\n\n distance.LRF = compute_LRF(hierarchy_mockup_rerooted1, hierarchy_mockup_rerooted2,'duplication' )\n }\n\n return distance\n}\n\nmodule.exports = {prepare_and_run_distance, build_table, reroot_hierarchy, screen_shot, parse_nhx, save_file_as, compute_RF_Euc, get_intersection_leaves, filter_leaves_hierarchy, remove_duplicated_and_unnamed_leaves_hierarchy};\n\n\n\n\n//# sourceURL=webpack://PhyloIO/./src/utils.js?");
8647
+ eval("const fs = __webpack_require__(/*! file-saver */ \"./node_modules/file-saver/dist/FileSaver.min.js\")\nconst d3 = __webpack_require__(/*! d3 */ \"./node_modules/d3/index.js\");\n\nfunction traverse(o,func_pre, func_post) {\n\n if (func_pre){\n func_pre.apply(this,[o,o[\"children\"]])\n }\n\n if(o[\"children\"]){\n\n for (var c in o[\"children\"] ) {\n\n var child = o[\"children\"][c]\n\n child = traverse(child, func_pre, func_post)\n\n if (func_post) {\n func_post.apply(this,[child,o])\n }\n\n\n }\n\n\n }\n\n return o\n\n}\n\nfunction build_table(hierarchy){\n\n traverse(hierarchy, function(node,children){\n delete node.left_\n delete node.right_\n delete node.weight_\n }, null)\n\n var n = hierarchy.leaves().length\n var X = Array.from(new Array(n), _ => Array(3).fill(null));\n var S2I = {} //Array(n).fill(0)\n var I2S = Array(n).fill(null)\n var n_edges = 0\n\n var nzl = []\n traverse(hierarchy, null, function(node,children){nzl.push(node)})\n nzl.push(hierarchy)\n var nz = nzl.entries()\n\n var n1 = nz.next()\n var n2 = nz.next()\n var i = 0\n\n while (true) {\n\n var node = n1.value[1]\n var node2 = n2.value[1]\n var p = node.parent\n var ii;\n\n // Do work\n if (!(node.hasOwnProperty('children'))) {\n I2S[i] = node.data.name\n S2I[I2S[i]] = i\n node.weight_ = 0\n node.left_ = i\n node.right_ = i\n i += 1\n }\n\n // propagate up\n if (typeof p != \"undefined\"){\n p.left_ = p.hasOwnProperty('left_') ? Math.min(p.left_, node.left_) : node.left_\n p.right_ = p.hasOwnProperty('right_') ? Math.max(p.right_, node.right_) : node.right_\n if (p.hasOwnProperty('weight_')){ p.weight_ = p.weight_ + node.weight_ + 1} else {p.weight_ = node.weight_ +=1}\n }\n\n if (node.hasOwnProperty('children')) {\n\n if( node2.hasOwnProperty('weight_') && node2.weight_ > 0 ){ii = node.left_} else { ii = node.right_}\n X[ii][0] = node.left_\n X[ii][1] = node.right_\n if (node.data.hasOwnProperty('branch_length')){\n X[ii][2] = node.data.branch_length\n }\n else {\n X[ii][2] = 1\n }\n\n\n n_edges += 1\n\n }\n\n n1 = n2\n n2 = nz.next()\n\n if (n2.done){\n\n\n // process seed node, w=0\n ii = hierarchy.leaves().length-1\n X[ii][0] = n1.value[1].left_\n X[ii][1] = n1.value[1].right_\n X[ii][2] = n1.value[1].data.branch_length\n n_edges += 1\n\n break\n }\n\n }\n\n\n\n if (X[0][0] !== null){\n X[0] = Array(3).fill(null)\n\n }\n\n n_edges = 0\n for (const n2Key in X) {\n if (X[n2Key][0] !== null){\n n_edges++\n }\n\n }\n\n var leaf_to_dist = {}\n\n hierarchy.leaves().forEach( e=> { leaf_to_dist[e.data.name] = e.data.branch_length })\n\n\n return {'table': X, 'n_edges': n_edges, 'I2S': I2S, 'S2I': S2I, 'leaf_dict': leaf_to_dist}\n\n\n}\n\nfunction reverse_order(child,parent){\n\n child.children.push(parent)\n parent.parent =child\n\n const b = parent.children.indexOf(child);\n if (b > -1) {\n parent.children.splice(b, 1);\n }\n}\n\nfunction reroot_hierarchy(hierarchy, leaf_name){\n\n\n let leaf = hierarchy.leaves().find(element => element.data.name == leaf_name );\n\n // INVERT PATH TO ROOT\n var ancestors = leaf.ancestors()\n leaf.children = []\n leaf.root = true\n\n\n //leaf.branch_length_before_reverse = leaf.data.branch_length\n\n/*\n for (var j = 0; j < leaf.parent.children.length; j++) {\n\n if (leaf.parent.children[j] != leaf){\n\n leaf.data.branch_length = leaf.parent.children[j].data.branch_length\n break\n\n }\n\n }\n\n */\n\n\n var index\n for (index = 0; index < ancestors.length; index++) {\n\n let child = (index === 0) ? leaf : ancestors[index-1]\n let parent = ancestors[index]\n\n\n /*\n parent.branch_length_before_reverse = parent.data.branch_length\n if (child.branch_length_before_reverse){\n parent.data.branch_length = child.branch_length_before_reverse\n }\n else{\n parent.data.branch_length = child.data.branch_length\n }\n */\n\n\n reverse_order(child,parent)\n }\n\n //DESTROY ROOT\n var old_root_children = ancestors[ancestors.length-1].children\n\n var c = ancestors[ancestors.length-2].children.indexOf(ancestors[ancestors.length-1]);\n if (c > -1) {\n ancestors[ancestors.length-2].children.splice(c, 1);\n }\n for (var j = 0; j < old_root_children.length; j++) {\n\n let parent = old_root_children[j]\n let child = ancestors[ancestors.length-2]\n\n child.children.push(parent)\n parent.parent =child\n }\n\n leaf.parent = null\n leaf.data.branch_length = leaf.children[0].data.branch_length\n\n return leaf\n}\n\nfunction addLogo(svg) {\n // TODO load with ajax\n var logo_xml = '<svg id=\"exportLogo\" x=\"0\" y=\"0\"><g id=\"g4169\"> <path d=\"m 29.606259,23.679171 1.905511,0 c 0.193778,0.617882 0.290669,1.188505 0.290672,1.711869 0.466506,-0.545171 1.022728,-0.99222 1.668668,-1.341146 0.653108,-0.348904 1.295455,-0.523362 1.927043,-0.523373 0.976073,1.1e-5 1.86603,0.261698 2.669869,0.78506 0.810999,0.523383 1.442581,1.221215 1.894747,2.093495 0.459321,0.865028 0.688986,1.802739 0.688998,2.813134 -1.2e-5,1.010407 -0.229677,1.951752 -0.688998,2.824038 -0.452166,0.865023 -1.083748,1.559219 -1.894747,2.082592 -0.803839,0.516105 -1.693796,0.774156 -2.669869,0.774157 -0.638765,-1e-6 -1.284701,-0.163554 -1.937809,-0.490663 -0.653117,-0.334377 -1.20575,-0.770521 -1.657902,-1.308434 l 0,6.542172 -1.711731,0 0,-12.713622 c -2e-6,-0.552441 -0.04665,-1.170313 -0.139953,-1.853616 -0.08613,-0.683283 -0.20096,-1.148504 -0.344499,-1.395663 m 2.196183,5.539039 c -3e-6,1.133981 0.355261,2.093499 1.065795,2.878557 0.717702,0.777793 1.561006,1.166688 2.529916,1.166687 0.954543,10e-7 1.79067,-0.392528 2.508385,-1.177592 0.717697,-0.785056 1.07655,-1.740939 1.076561,-2.867652 -1.1e-5,-1.1267 -0.358864,-2.082583 -1.076561,-2.867652 -0.717715,-0.79232 -1.553842,-1.188485 -2.508385,-1.188495 -0.96891,10e-6 -1.812214,0.396175 -2.529916,1.188495 -0.710534,0.785069 -1.065798,1.740952 -1.065795,2.867652\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4145\" /> <path d=\"m 43.224746,34.75725 0,-16.279106 1.711731,0 0,7.152775 c 0.437798,-0.610593 0.94378,-1.112159 1.517951,-1.504699 0.581337,-0.399789 1.151913,-0.599688 1.71173,-0.599699 0.602867,1.1e-5 1.141147,0.123585 1.614841,0.370723 0.473678,0.23989 0.854062,0.570633 1.141153,0.99223 0.287074,0.421615 0.502386,0.897739 0.645937,1.428373 0.143531,0.523382 0.215302,1.083101 0.215312,1.679158 l 0,6.760245 -1.6902,0 0,-6.760245 c -8e-6,-0.33437 -0.0323,-0.65421 -0.09689,-0.959518 -0.05742,-0.305294 -0.154315,-0.603326 -0.290672,-0.894097 -0.136371,-0.298024 -0.337329,-0.534268 -0.602873,-0.708736 -0.265559,-0.181718 -0.584938,-0.272581 -0.958139,-0.272591 -0.473692,10e-6 -0.96891,0.243524 -1.485653,0.730544 -0.509576,0.487036 -0.925846,1.05039 -1.24881,1.69006 -0.315795,0.632417 -0.47369,1.177598 -0.473687,1.635543 l 0,5.53904 -1.711731,0\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4147\" /> <path d=\"m 53.581256,23.679171 1.776325,0 3.423461,8.472114 3.337338,-8.472114 1.797856,0 -6.4163,16.388142 -1.819387,0 2.22848,-5.658979 -4.327773,-10.729163\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4149\" /> <path d=\"m 67.415055,34.75725 -1.71173,0 0,-16.279106 1.71173,0 0,16.279106\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4151\" /> <path d=\"m 80.882824,26.361462 c 0.523914,0.872297 0.785877,1.824546 0.785889,2.856748 -1.2e-5,1.032215 -0.261975,1.984463 -0.785889,2.856749 -0.523937,0.872291 -1.234467,1.562854 -2.131589,2.071689 -0.897143,0.501566 -1.873223,0.752348 -2.928244,0.752349 -1.062213,-1e-6 -2.04547,-0.250783 -2.949776,-0.752349 -0.897136,-0.508835 -1.607665,-1.199398 -2.131589,-2.071689 -0.523928,-0.872286 -0.78589,-1.824534 -0.785889,-2.856749 -10e-7,-1.032202 0.261961,-1.984451 0.785889,-2.856748 0.523924,-0.87955 1.234453,-1.570111 2.131589,-2.071688 0.904306,-0.508825 1.887563,-0.763242 2.949776,-0.763253 1.055021,1.1e-5 2.031101,0.254428 2.928244,0.763253 0.897122,0.501577 1.607652,1.192138 2.131589,2.071688 m -9.20459,2.856748 c -3e-6,1.126713 0.405501,2.082596 1.216513,2.867652 0.811004,0.785064 1.794261,1.177593 2.949775,1.177592 1.1555,10e-7 2.142346,-0.392528 2.960541,-1.177592 0.818175,-0.792325 1.227268,-1.748208 1.227279,-2.867652 -1.1e-5,-1.112162 -0.409104,-2.060776 -1.227279,-2.845844 -0.818195,-0.792321 -1.805041,-1.188485 -2.960541,-1.188495 -1.155514,10e-6 -2.138771,0.396174 -2.949775,1.188495 -0.811012,0.785068 -1.216516,1.733682 -1.216513,2.845844\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee Bold\" id=\"path4153\" /> <path d=\"m 84.532366,34.0049 c -2e-6,-0.247148 0.08612,-0.457951 0.258374,-0.63241 0.172247,-0.181725 0.380382,-0.272588 0.624405,-0.27259 0.244018,2e-6 0.452152,0.09087 0.624405,0.27259 0.179424,0.174459 0.269137,0.385262 0.269141,0.63241 -4e-6,0.239881 -0.08972,0.454318 -0.269141,0.643314 -0.17943,0.181727 -0.387564,0.27259 -0.624405,0.27259 -0.236846,0 -0.444981,-0.09087 -0.624405,-0.27259 -0.172252,-0.188996 -0.258376,-0.403433 -0.258374,-0.643314\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee\" id=\"path4155\" /> <path d=\"m 89.527608,21.08411 c -10e-7,-0.239866 0.08253,-0.447035 0.247608,-0.621507 0.172248,-0.174444 0.380383,-0.261673 0.624406,-0.261687 0.23684,1.4e-5 0.437798,0.08724 0.602874,0.261687 0.172246,0.174472 0.258371,0.381641 0.258374,0.621507 -3e-6,0.247162 -0.08254,0.457964 -0.247609,0.632409 -0.165075,0.167203 -0.369621,0.250796 -0.613639,0.250783 -0.244023,1.3e-5 -0.452158,-0.08358 -0.624406,-0.250783 -0.165074,-0.174445 -0.247609,-0.385247 -0.247608,-0.632409 m 1.356465,13.67314 -0.968904,0 0,-11.056271 0.968904,0 0,11.056271\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee\" id=\"path4157\" /> <path d=\"m 99.593447,23.526521 c 0.753583,1.1e-5 1.474873,0.149027 2.163883,0.447048 0.68899,0.298043 1.28468,0.701476 1.78709,1.210302 0.50238,0.508844 0.90072,1.115812 1.19499,1.820905 0.29424,0.705108 0.44137,1.442918 0.44139,2.213434 -2e-5,0.777797 -0.14715,1.519242 -0.44139,2.224339 -0.29427,0.705104 -0.69261,1.312071 -1.19499,1.820905 -0.50241,0.501568 -1.0981,0.905001 -1.78709,1.210301 -0.68901,0.298033 -1.4103,0.447049 -2.163883,0.447049 -1.543077,0 -2.860068,-0.556084 -3.950979,-1.668254 -1.090916,-1.112166 -1.636373,-2.456945 -1.636372,-4.03434 -10e-7,-1.032202 0.247608,-1.984451 0.742827,-2.856748 0.502393,-0.87955 1.180625,-1.570111 2.0347,-2.071688 0.861243,-0.508825 1.797849,-0.763242 2.809824,-0.763253 m -4.629212,5.691689 c -2e-6,1.301171 0.452153,2.416973 1.356467,3.347412 0.911483,0.923175 2.009573,1.38476 3.294277,1.384759 1.284681,10e-7 2.379191,-0.461584 3.283511,-1.384759 0.91147,-0.930439 1.36721,-2.046241 1.36722,-3.347412 -1e-5,-1.293889 -0.45575,-2.402423 -1.36722,-3.325603 -0.90432,-0.923164 -1.99883,-1.38475 -3.283511,-1.38476 -1.284704,10e-6 -2.382794,0.461596 -3.294277,1.38476 -0.904314,0.92318 -1.356469,2.031714 -1.356467,3.325603\" style=\"font-size:22.18883514px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sawasdee;-inkscape-font-specification:Sawasdee\" id=\"path4159\" /> </g> <g id=\"g4014\" transform=\"translate(12.84,20.592727)\"> <g transform=\"translate(0,-0.065)\" id=\"g3992\"> <polygon style=\"fill:#939598\" id=\"polygon461\" points=\"5.7,0.23 11.86,0.23 11.86,1.65 7.12,1.65 7.12,6.04 11.86,6.04 11.86,7.46 11.86,7.46 5.7,7.46 \" class=\"cls-2\" /> <polygon style=\"fill:#939598\" id=\"polygon463\" points=\"0,7.08 3.51,7.08 3.51,8.49 1.43,8.49 1.45,15.84 12.68,15.84 12.68,17.26 12.68,17.26 0.04,17.26 \" class=\"cls-2\" /> <polygon style=\"fill:#939598\" id=\"polygon465\" points=\"10.49,11.02 10.49,12.44 10.49,12.44 2.84,12.44 2.84,7.79 4.26,7.79 4.26,11.02 \" class=\"cls-2\" transform=\"translate(0,-0.15225398)\" /> <polygon style=\"fill:#bcbec0\" id=\"polygon467\" points=\"4.26,4.55 4.26,7.79 4.26,7.79 2.84,7.79 2.84,3.13 6.41,3.13 6.41,4.55 \" class=\"cls-3\" transform=\"matrix(1,0,0,0.85463687,0,0.4549866)\" /> <rect style=\"fill:#939598;fill-opacity:1\" id=\"rect3926-3\" width=\"1.4240631\" height=\"1.7319686\" x=\"2.8396611\" y=\"7.0799503\" /> <rect style=\"fill:#939598;fill-opacity:1\" id=\"rect3926-6\" width=\"1.3864813\" height=\"1.6934805\" x=\"5.7012329\" y=\"2.9206221\" /> </g> <g id=\"g4005\"> <g id=\"g3984\"> <polygon class=\"cls-2\" points=\"94.93,12.33 94.93,10.91 99.87,10.91 99.87,6.46 94.93,6.46 94.93,5.04 101.29,5.04 101.29,12.33 101.29,12.33 \" id=\"polygon453\" style=\"fill:#939598\" /> <polygon class=\"cls-2\" points=\"94.72,17.36 94.72,15.94 104.87,15.94 104.9,5.41 102.74,5.41 102.74,3.99 106.32,3.99 106.29,17.36 106.29,17.36 \" id=\"polygon455\" style=\"fill:#939598\" /> <polygon class=\"cls-2\" points=\"95.51,1.42 95.51,0 103.45,0 103.45,4.7 103.45,4.7 102.03,4.7 102.03,1.42 \" id=\"polygon457\" style=\"fill:#939598\" /> <polygon class=\"cls-3\" points=\"102.03,7.97 102.03,4.7 103.45,4.7 103.45,9.39 103.45,9.39 100.65,9.39 100.65,7.97 \" id=\"polygon459\" style=\"fill:#bcbec0\" /> <rect y=\"3.9876499\" x=\"102.02941\" height=\"1.4238259\" width=\"1.4579451\" id=\"rect3926\" style=\"fill:#939598;fill-opacity:1\" /> <rect y=\"7.884686\" x=\"99.887817\" height=\"1.6934805\" width=\"1.397205\" id=\"rect3926-7\" style=\"fill:#939598;fill-opacity:1\" /> </g> </g> </g> </g> </svg>';\n\n svg.append(\"g\").html(logo_xml);\n\n}\n\nfunction getSVGString( svgNode ) {\n svgNode.setAttribute('xlink', 'http://www.w3.org/1999/xlink');\n var cssStyleText = getCSSStyles(svgNode);\n cssStyleText += \"* {font-family:Helvetica}\"\n appendCSS( cssStyleText, svgNode );\n\n var serializer = new XMLSerializer();\n var svgString = serializer.serializeToString(svgNode);\n svgString = svgString.replace(/(\\w+)?:?xlink=/g, 'xmlns:xlink='); // Fix root xlink without namespace\n svgString = svgString.replace(/NS\\d+:href/g, 'xlink:href'); // Safari NS namespace fix\n\n return svgString;\n\n function getCSSStyles( parentElement ) {\n var selectorTextArr = [];\n\n // Add Parent element Id and Classes to the list\n selectorTextArr.push( '#'+parentElement.id );\n for (var c = 0; c < parentElement.classList.length; c++)\n if ( !contains('.'+parentElement.classList[c], selectorTextArr) )\n selectorTextArr.push( '.'+parentElement.classList[c] );\n\n // Add Children element Ids and Classes to the list\n var nodes = parentElement.getElementsByTagName(\"*\");\n for (var i = 0; i < nodes.length; i++) {\n var id = nodes[i].id;\n if ( !contains('#'+id, selectorTextArr) )\n selectorTextArr.push( '#'+id );\n\n var classes = nodes[i].classList;\n for (var c = 0; c < classes.length; c++)\n if ( !contains('.'+classes[c], selectorTextArr) )\n selectorTextArr.push( '.'+classes[c] );\n }\n\n // Extract CSS Rules\n var extractedCSSText = \"\";\n for (var i = 0; i < document.styleSheets.length; i++) {\n var s = document.styleSheets[i];\n\n try {\n if(!s.cssRules) continue;\n } catch( e ) {\n if(e.name !== 'SecurityError') throw e; // for Firefox\n continue;\n }\n\n var cssRules = s.cssRules;\n for (var r = 0; r < cssRules.length; r++) {\n if ( contains( cssRules[r].selectorText, selectorTextArr ) )\n extractedCSSText += cssRules[r].cssText;\n }\n }\n\n\n return extractedCSSText;\n\n function contains(str,arr) {\n return arr.indexOf( str ) === -1 ? false : true;\n }\n\n }\n\n function appendCSS( cssText, element ) {\n var styleElement = document.createElement(\"style\");\n styleElement.setAttribute(\"type\",\"text/css\");\n styleElement.innerHTML = cssText;\n var refNode = element.hasChildNodes() ? element.children[0] : null;\n element.insertBefore( styleElement, refNode );\n }\n}\n\nfunction svgString2Image( svgString, width, height, format, callback ) {\n var format = format ? format : 'png';\n\n var imgsrc = 'data:image/svg+xml;base64,'+ btoa( unescape( encodeURIComponent( svgString ) ) ); // Convert SVG string to dataurl\n\n var canvas = document.createElement(\"canvas\");\n var context = canvas.getContext(\"2d\");\n\n canvas.width = width;\n canvas.height = height;\n\n var image = new Image;\n image.onload = function() {\n\n context.clearRect ( 0, 0, width, height );\n context.fillStyle = \"#ffffff\";\n context.fillRect(0, 0, width, height);\n context.drawImage(image, 0, 0, width, height);\n\n canvas.toBlob( function(blob) {\n var filesize = Math.round( blob.length/1024 ) + ' KB';\n if ( callback ) callback( blob, filesize );\n });\n };\n image.src = imgsrc;\n}\n\nfunction screen_shot({ svg1, svg2, format } = {}){\n\n addLogo(svg1);\n var name1 = svg1.attr(\"id\");\n var svgString1 = getSVGString(svg1.node());\n\n var t = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" version=\\\"1.1\\\">\\n\" +\n \"\\n\" +\n \" <g transform=\\\"translate(0,0)\\\">\\n\" +\n svgString1 +\n \" </g>\\n\"\n\n if(svg2){\n\n addLogo(svg2);\n var name2 = svg2.attr(\"id\");\n var svgString2 = getSVGString(svg2.node());\n\n var w = svg2.node().getBoundingClientRect().width\n var h = svg2.node().getBoundingClientRect().height\n\n t += '<line x1=\"' + (w + 5) +'\" y1=\"0\" x2=\"' + (w + 5) +'\" y2=\"' + h+'\" stroke=\"black\" />'\n\n t += \" <g transform=\\\"translate(\" + (w + 10) +\",0)\\\">\\n\" +\n svgString2 +\n \" </g>\\n\"\n\n }\n\n t += \"</svg> \"\n\n if(format === 'svg') {\n\n var blob = new Blob([t], {\"type\": \"image/svg+xml;base64,\"+ btoa(t)});\n fs.saveAs(blob, name1+\".svg\");\n svg1.select(\"#exportLogo\").remove();\n if(svg2){svg2.select(\"#exportLogo\").remove();}\n\n }\n\n else if (format === 'png'){\n\n\n\n var wi = svg1.node().getBoundingClientRect().width\n var he = svg1.node().getBoundingClientRect().height\n\n if(svg2){\n wi = wi*2;\n }\n\n svgString2Image(t, wi, he, 'png', save);\n\n svg1.select(\"#exportLogo\").remove();\n if(svg2){svg2.select(\"#exportLogo\").remove();}\n\n function save(dataBlob, filesize) {\n var filename = (name) ? name+\".\" : \"\";\n fs.saveAs(dataBlob, filename+'phylo.io.png'); // FileSaver.js function\n }\n\n }\n}\n\n//Adapted from Extended Newick format parser in JavaScript.\n//Copyright (c) Miguel Pignatelli 2014 based on Jason Davies\nfunction parse_nhx(s) {\n var ancestors = [];\n var tree = {'data_nhx' : {}};\n // var tokens = s.split(/\\s*(;|\\(|\\)|,|:)\\s*/);\n //[&&NHX:D=N:G=ENSG00000139618:T=9606]\n var tokens = s.split( /\\s*(;|\\(|\\)|\\[|\\]|,|:|=)\\s*/ );\n for (var i=0; i<tokens.length; i++) {\n var token = tokens[i];\n switch (token) {\n case '(': // new children\n var subtree = {'data_nhx' : {}};\n tree.children = [subtree];\n ancestors.push(tree);\n tree = subtree;\n break;\n case ',': // another branch\n var subtree = {'data_nhx' : {}};\n ancestors[ancestors.length-1].children.push(subtree);\n tree = subtree;\n break;\n case ')': // optional name next\n tree = ancestors.pop();\n break;\n case ':': // optional length next\n break;\n default:\n var x = tokens[i-1];\n // var x2 = tokens[i-2];\n if (x == ')' || x == '(' || x == ',') {\n tree.name = token;\n }\n else if (x == ':') {\n var test_type = typeof token;\n if(!isNaN(token)){\n tree.branch_length = parseFloat(token);\n }\n // tree.length = parseFloat(token);\n }\n else if (x == '='){\n tree['data_nhx'][tokens[i-2]] = token\n }\n else {\n var test;\n }\n }\n }\n return tree;\n};\n\nfunction save_file_as(filename, data) {\n const blob = new Blob([data], {type: 'text/csv'});\n if(window.navigator.msSaveOrOpenBlob) {\n window.navigator.msSaveBlob(blob, filename);\n }\n else{\n const elem = window.document.createElement('a');\n elem.href = window.URL.createObjectURL(blob);\n elem.download = filename;\n document.body.appendChild(elem);\n elem.click();\n document.body.removeChild(elem);\n }\n}\n\nfunction compute_RF_Euc(X1,X2){\n\n var n_good = 0\n var euclidian = 0.00\n\n var x2_processed = []\n\n for (var i = 0; i < X1.table.length; i++) {\n var s1 = X1.table[i][0]\n var e1 = X1.table[i][1]\n var w1 = Math.abs(e1-s1)\n\n if (w1 > 0){\n\n var species = X1.I2S.slice(s1,e1+1)\n var index = []\n\n for (const [name, idx] of Object.entries(X2.S2I)) {\n if (species.includes(name)) {index.push(idx)}\n }\n\n if (index.length <= 0) {\n continue\n }\n\n var s2 = Math.min.apply(null,index)\n var e2 = Math.max.apply(null,index)\n var w2 = Math.abs(e2-s2)\n\n if (w1 == w2) {\n\n\n if (X2.table[e2][0] == s2 && X2.table[e2][1] == e2) {\n n_good += 1\n euclidian += Math.abs(parseFloat(X1.table[i][2]) - parseFloat(X2.table[e2][2]) )\n x2_processed.push(e2)\n }\n else if (X2.table[s2][0] == s2 && X2.table[s2][1] == e2){\n\n n_good += 1\n euclidian += Math.abs(parseFloat(X1.table[i][2]) - parseFloat(X2.table[s2][2]) )\n x2_processed.push(s2)\n\n }\n else{\n euclidian += parseFloat(X1.table[i][2])\n\n }\n\n }\n\n\n else{\n euclidian += parseFloat(X1.table[i][2])\n }\n\n\n\n\n\n\n }\n\n }\n\n\n for (var k = 1; k < X2.table.length; k++) {\n if (!x2_processed.includes(k)){\n\n var d = parseFloat(X2.table[k][2])\n\n if(!isNaN(d)) {\n euclidian += d\n x2_processed.push(k)\n }\n\n }\n }\n\n var leaf_dist = 0.00\n for (var key of Object.keys(X1.leaf_dict)) {\n\n leaf_dist += Math.abs(X1.leaf_dict[key] - X2.leaf_dict[key])\n }\n\n var euc = euclidian + leaf_dist\n\n\n return {\n 'E':euc.toFixed(2),\n 'RF': (X1.n_edges + X2.n_edges -2*n_good),\n 'good':n_good,\n 'L':X1.n_edges,\n 'R':X2.n_edges,\n\n }\n}\n\nfunction get_intersection_leaves(h1, h2){\n\n var leaves1 = h1.leaves().map(x => x.data.name);\n var leaves2 = h2.leaves().map(x => x.data.name);\n return Array.from(new Set(leaves1.filter(value => leaves2.includes(value))))\n}\n\nfunction r_child(parent,child){\n let index = parent.children.indexOf(child);\n if (index > -1) {\n parent.children.splice(index, 1);\n }\n}\n\nfunction get_duplicated(array){\n return array.filter((e, i, a) => a.indexOf(e) !== i)\n}\n\nfunction remove_from_array(array, to_remove){\n\n return array.filter(element => !to_remove.includes(element));\n\n}\n\nfunction remove_duplicated_and_unnamed_leaves_hierarchy(h){\n\n var leaf_space = []\n\n h.eachAfter(d => {\n\n if (d.parent && !d.children){\n\n if (d.data.name.length === 0){\n r_child(d.parent,d)\n d= null;\n }\n else {\n leaf_space.push(d.data.name)\n }\n }\n\n\n });\n\n var dup = get_duplicated(leaf_space)\n\n\n var to_keep = remove_from_array(leaf_space, dup)\n\n return filter_leaves_hierarchy(h, to_keep)\n}\n\nfunction filter_leaves_hierarchy(h, leaves_to_keep){\n\n\n h.eachAfter(d => {\n\n if (d.children && d.parent){\n\n if (d.children.length === 0){\n r_child(d.parent, d)\n d = null\n }\n\n else if (d.children.length === 1){\n r_child(d.parent, d)\n d.parent.children.push(d.children[0])\n d.children[0].parent = d.parent\n d = null\n\n }\n }\n\n else if (d.parent){\n\n if (!leaves_to_keep.includes(d.data.name)){\n r_child(d.parent,d)\n d= null;\n }\n }\n\n\n });\n\n if (Array.from(new Set(h.leaves().map(x => x.data.name))).length == leaves_to_keep.length){\n return h\n }\n\n return false\n}\n\nfunction check_whole_hierarchy_labelled(hierarchy ){\n\n\n traverse(hierarchy, function(node,children){\n\n if (typeof node.data['duplication'] === 'undefined' ){\n node.data['duplication'] = false\n }\n\n\n }, null)\n\n return\n}\n\nfunction buildX(hierarchy){\n\n/*\n Define the table X according to (Day 1985) to have contiguous integers for\n each clade, and define a clade by the left-most and right-most identifiers,\n such as [4,7] for the clade [4,5,6,7].\n\n Note we extend the table to contain the following fields,\n which will be populated later in the algorithm:\n 3: node defining the clade in T1\n 4: node defining the clade in T2\n 5: size of the island rooted in the clade in T1\n 6: size of the island rooted in the clade in T2\n 7: labels in the island rooted in the clade in T1\n 8: labels in the island rooted in the clade in T2\n\n */\n\n var X = []\n var n = hierarchy.leaves().length\n var tax2id = {}\n var n2bip = new Map();\n\n function buildX_r(T){\n if (T.children == null && T._children == null){\n // left right id2taxon nodeT1 nodeT2 sizeIsland1 sizeIsland2 labels1 labels2\n X.push([0,0,T.data.name,0,0,0,0,new Set(),new Set()])\n i = X.length -1\n tax2id[T.data.name] = i\n return [i,i]\n }\n\n else{\n let min_l = n\n let max_r = 0\n\n for (var j = 0; j < T.children.length; j++) {\n var c = T.children[j]\n\n var [l,r] = buildX_r(c)\n min_l = Math.min(l,min_l)\n max_r = Math.max(r,max_r)\n\n }\n\n X[min_l][0]=X[max_r][0]=min_l\n X[min_l][1]=X[max_r][1]=max_r\n X[min_l][3]=X[max_r][3]=T\n n2bip.set(T, [min_l,max_r]);\n\n\n return [min_l,max_r]\n }\n\n }\n\n buildX_r(hierarchy)\n\n return [X, tax2id, n2bip]\n}\n\nfunction findgood(hierarchy,X,tax2id){\n\n\n function findgood_r(T){\n\n if (T.children == null && T._children == null){\n var i = tax2id[T.data.name]\n\n return [i,i,1]\n }\n else {\n var min_l = n\n var max_r=0\n var tot_w=0\n\n for (var j = 0; j < T.children.length; j++) {\n\n var c = T.children[j]\n\n var [l, r, w] = findgood_r(c)\n\n min_l = Math.min(l, min_l)\n max_r = Math.max(r, max_r)\n tot_w += w\n }\n\n if (max_r-min_l+1 == tot_w){\n\n if (X[min_l][0]==min_l && X[min_l][1]==max_r){\n X[min_l][4]= T\n n2bip.set(T, [min_l,max_r]);\n }\n else if (X[max_r][0]==min_l && X[max_r][1]==max_r) {\n X[max_r][4]=T\n n2bip.set(T, [min_l,max_r]);\n }\n }\n\n return [min_l,max_r,tot_w]\n\n\n }\n }\n\n var n2bip = new Map();\n var n = hierarchy.leaves().length\n\n findgood_r(hierarchy)\n\n return(n2bip)\n}\n\nfunction getIslandsDay(t,X,n2bip,isT1){\n\n /*\n An island is separated from the rest of the tree\n by good edges. In the traversal below, we do a preorder\n traversal and create a new island whenever we meet a clade\n defined in X\n ____\n /\n **** x6\n * \\___\n **** x3 ......\n * \\___ ______x7\n ----x1 / ...\n * **** x4 ____\n **** x2 ``-- /\n *********** x5\n \\_____\n\n */\n\n function mytraversal(t,parentIslandId=0){\n\n if (t.children == null && t._children == null){\n return\n }\n\n if (n2bip.has(t)){\n var [l,r] = n2bip.get(t)\n }\n else {\n var l = 0;\n var r = 0;\n }\n\n var row = -1\n\n if (X[l][0]===l && X[l][1]===r && X[l][4]!==0){\n row = l\n }\n\n else if (X[r][0]===l && X[r][1]===r && X[r][4]!==0){\n row = r\n }\n\n // CLADE IS COMMON\n if (row > -1){\n\n // end of previous island, so new island.\n islandId = row\n X[row][off+2].add(t.data.duplication)\n\n\n for (var j = 0; j < t.children.length; j++) {\n var c = t.children[j]\n mytraversal(c,islandId)\n\n }\n\n }\n else {\n // continue previous island\n var islandId = parentIslandId\n\n X[islandId][off+2].add(t.data.duplication)\n X[islandId][off] += 1\n\n for (var j = 0; j < t.children.length; j++) {\n var c = t.children[j]\n\n mytraversal(c,islandId)\n\n }\n\n }\n\n }\n\n\n var off;\n\n if (isT1){\n off = 5\n }\n else{\n off = 6\n }\n\n mytraversal(t)\n\n return\n\n}\n\n// ADAPTED FROM https://github.com/DessimozLab/pylabeledrf\nfunction compute_LRF(t1, t2){\n\n var [ X, tax2id, n12bip ] = buildX(t1)\n\n var n22bip = findgood(t2,X,tax2id)\n\n getIslandsDay(t1,X,n12bip,true)\n getIslandsDay(t2,X,n22bip,false)\n\n\n var rf = 0;\n var subs = 0;\n\n for (var i = 0; i < X.length; i++) {\n\n if (X[i][4] != 0){\n\n rf += X[i][5]+X[i][6]\n\n let intersection = new Set( [...X[i][7]].filter(x => X[i][8].has(x)));\n\n if ( intersection.size == 0){\n subs +=1\n }\n }\n }\n\n return rf+subs\n\n}\n\nfunction prepare_and_run_distance(m1,m2){\n\n var distance = {\n 'no_distance_message': true,\n 'clade': false,\n 'Cl_good': false,\n 'Cl_left': false,\n 'Cl_right': false,\n 'RF': false,\n 'RF_good': false,\n 'RF_left': false,\n 'RF_right': false,\n 'Euc': false,\n 'LRF':false\n }\n\n // CHECK INTERSECTING LEAVES\n var h1_raw = d3.hierarchy(m1.data, d => d.children );\n var h2_raw = d3.hierarchy(m2.data, d => d.children );\n\n var h1 = remove_duplicated_and_unnamed_leaves_hierarchy(h1_raw)\n var h2 = remove_duplicated_and_unnamed_leaves_hierarchy(h2_raw)\n\n var intersection = get_intersection_leaves(h1,h2)\n\n if (intersection.length == 0){\n distance.no_distance_message = 'No leaves in common to compute distance.'\n return distance\n }\n\n // FILTER TREE TO KEEP ONLY INTERSECTING LEAVES\n var hierachy1 = filter_leaves_hierarchy(h1, intersection )\n var table1 = build_table(hierachy1 )\n\n var hierachy2 = filter_leaves_hierarchy(h2, intersection )\n var table2 = build_table(hierachy2 )\n\n // CLADISTIC DISTANCE & EUCLIDIAN\n var r = compute_RF_Euc(table1,table2)\n distance.clade = r.RF\n distance.Cl_good = r.good\n distance.Cl_left = r.L\n distance.Cl_right = r.R\n distance.Euc = r.E\n\n // RF\n var hierarchy_mockup_rerooted1 = reroot_hierarchy(hierachy1, intersection[0])\n var hierarchy_mockup_rerooted2 = reroot_hierarchy(hierachy2, intersection[0])\n\n // build tables\n var X1 = build_table(hierarchy_mockup_rerooted1)\n var X2 = build_table(hierarchy_mockup_rerooted2)\n\n var r2 = compute_RF_Euc(X1,X2)\n distance.RF = r2.RF\n distance.RF_good = r2.good\n distance.RF_left = r2.L\n distance.RF_right = r2.R\n\n\n // LRF\n if ( m1.settings.has_duplications && m2.settings.has_duplications) {\n check_whole_hierarchy_labelled(hierarchy_mockup_rerooted1)\n check_whole_hierarchy_labelled(hierarchy_mockup_rerooted2)\n\n distance.LRF = compute_LRF(hierarchy_mockup_rerooted1, hierarchy_mockup_rerooted2,'duplication' )\n }\n\n return distance\n}\n\nfunction check_if_color(query){\n var accepted_spelling = ['color', 'colour'];\n\n if (accepted_spelling.includes(query.toLowerCase())){\n return true;\n }\n else {\n return false;\n }\n}\n\nfunction hexToRgb(hex) {\n const bigint = parseInt(hex.slice(1), 16);\n const r = (bigint >> 16) & 255;\n const g = (bigint >> 8) & 255;\n const b = bigint & 255;\n return { r, g, b };\n}\n\nfunction colorDifference(hex1, hex2) {\n const color1 = hexToRgb(hex1);\n const color2 = hexToRgb(hex2);\n const rDiff = color1.r - color2.r;\n const gDiff = color1.g - color2.g;\n const bDiff = color1.b - color2.b;\n const distance = Math.sqrt(rDiff * rDiff + gDiff * gDiff + bDiff * bDiff);\n const maxDistance = Math.sqrt(255 * 255 * 3);\n return (distance / maxDistance) * 100;\n}\n\nmodule.exports = {colorDifference, check_if_color, prepare_and_run_distance, build_table, reroot_hierarchy, screen_shot, parse_nhx, save_file_as, compute_RF_Euc, get_intersection_leaves, filter_leaves_hierarchy, remove_duplicated_and_unnamed_leaves_hierarchy};\n\n\n\n\n//# sourceURL=webpack://PhyloIO/./src/utils.js?");
8750
8648
 
8751
8649
  /***/ }),
8752
8650
 
@@ -8757,7 +8655,7 @@ eval("const fs = __webpack_require__(/*! file-saver */ \"./node_modules/file-sav
8757
8655
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8758
8656
 
8759
8657
  "use strict";
8760
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Viewer)\n/* harmony export */ });\n/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ \"./node_modules/d3/index.js\");\n/* harmony import */ var _interface_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./interface.js */ \"./src/interface.js\");\n/* harmony import */ var d3_v6_tip__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-v6-tip */ \"./node_modules/d3-v6-tip/build/d3-v6-tip.js\");\n/* harmony import */ var d3_v6_tip__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(d3_v6_tip__WEBPACK_IMPORTED_MODULE_2__);\n\n\n\n\nd3__WEBPACK_IMPORTED_MODULE_0__.selection.prototype.moveToFront = function() {\n return this.each(function() {\n this.parentNode.appendChild(this);\n });\n};\n\nvar uid_viewer = 0 // unique id generator is bound to a single Viewer()\nconst collapse_ratio_vertical = 0.2 // how much a triangle is vertically narrow\n\n// D3 viewer that render any model tree\nclass Viewer {\n\n constructor(container) {\n\n // General\n this.container_object = container // related Container()\n this.uid = uid_viewer ++; // unique viewer() id\n this.data; // current model.data used\n this.model = false; // current model\n\n // D3\n this.d3 = d3__WEBPACK_IMPORTED_MODULE_0__ // d3.js instance that contain information about zoom, etc..\n this.hierarchy; // converted model data into d3 comptabile data format\n this.d3_cluster; // d3 layout to compute 2D position for d3 hierarchy object\n this.d3_cluster_data; // d3 layout fed with d3 hierarchy data\n this.zoom;\n this.id_gen = 0; // unique id generator for d3 id\n this.max_length;\n this.scale_branch_length; // scale between branch length and x pos\n\n // DOM\n this.svg;\n this.svg_d3;\n this.G;\n this.G_d3;\n this.container = document.getElementById(this.container_object.div_id);\n this.container_d3 = d3__WEBPACK_IMPORTED_MODULE_0__.select(this.container);\n this.container_d3.style('font-family', 'monospace !important' )\n\n this.interface;\n\n // Settings\n this.settings = {\n 'duration' : 500,\n 'max_visible_leaves' : 30,\n 'style': {\n 'offset_top_fit': 140,\n 'translate_top_fit': 60,\n 'margin' : {top: 16, right: 16, bottom: 16, left: 96},\n\n },\n 'stack':{\n 'labels' : [\"Retained\", \"Duplicated\", \"Gained\", \"Lost\", \"Duplications\", \"Gains\", \"Losses\"],\n 'colors' : [\"#1f77b4\", \"#ff7f0e\", \"#2ca02c\", \"#d62728\", \"#ff7f0e\", \"#2ca02c\", \"#d62728\"],\n 'colorMap' : {},\n }\n\n }\n\n this.width = parseFloat(window.getComputedStyle(this.container).width) - this.settings.style.margin.left - 2*this.settings.style.margin.right;\n this.height = parseFloat(window.getComputedStyle(this.container).height) - 2*this.settings.style.margin.top - this.settings.style.margin.bottom;\n\n this.colorScale = {'leaf' : null, 'node':null}\n this.intercolor = {'leaf' : null, 'node': null}\n this.set_color_scale()\n\n // ZOOM\n this.force_zoom_rescaling = false\n this.zoom = d3__WEBPACK_IMPORTED_MODULE_0__.zoom().on(\"zoom\", (d, i) => { return this.zoomed(d,i)} )\n\n\n // SVG\n this.svg = this.container_d3.append(\"svg\")\n .attr(\"id\", \"svg\" + this.uid)\n .attr(\"width\", this.width + this.settings.style.margin.left + this.settings.style.margin.right )\n .attr(\"height\", this.height + this.settings.style.margin.top + this.settings.style.margin.bottom)\n .call(this.zoom)\n .on(\"dblclick.zoom\", null)\n .call(this.zoom.transform, d3__WEBPACK_IMPORTED_MODULE_0__.zoomIdentity.translate(this.settings.style.margin.left, (this.height/2 + this.settings.style.margin.top) ))\n\n\n this.svg_d3 = d3__WEBPACK_IMPORTED_MODULE_0__.select(this.svg)\n\n // G element for zoom/transform\n //this.G = this.svg.append(\"g\")\n // .attr(\"id\", \"master_g\" + this.uid)\n // .attr(\"transform\", \"translate(\"+ this.settings.style.margin.left + \",\" + (this.height/2 + this.settings.style.margin.top) + \")\")\n //this.G_d3 = d3.select(this.G);\n\n this.build_master_g()\n\n // D3 TREE LAYOUT\n this.d3_cluster = d3__WEBPACK_IMPORTED_MODULE_0__.cluster()\n .separation((a,b) => {return this.separate(a,b)})\n\n // MISC.\n this.settings.stack.colorMap = this.compute_color_map_stack()\n\n\n\n }\n\n // DATA\n set_data(model, refresh_interface = true){\n\n\n this.data = model.data;\n this.model = model;\n\n this.d3_cluster.nodeSize([this.model.settings.tree.node_vertical_size,this.model.settings.tree.node_horizontal_size])\n\n this.build_d3_data();\n\n this.set_color_scale()\n\n if (refresh_interface){\n this.interface = new _interface_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](this, this.container_object)\n }\n\n\n }\n\n remove_data(){\n\n this.data = null;\n this.model = null;\n this.destroy_master_g()\n this.build_master_g()\n\n }\n\n destroy_master_g(){\n this.svg.select(\"#master_g\" + this.uid).remove()\n this.G = null\n this.G_d3 = null\n }\n\n build_master_g(){\n this.G = this.svg.append(\"g\")\n .attr(\"id\", \"master_g\" + this.uid)\n .attr(\"transform\", \"translate(\"+ this.settings.style.margin.left + \",\" + (this.height/2 + this.settings.style.margin.top) + \")\")\n this.G_d3 = d3__WEBPACK_IMPORTED_MODULE_0__.select(this.G);\n\n\n }\n\n build_d3_data(){\n\n // Build d3 hierarchy\n this.hierarchy = d3__WEBPACK_IMPORTED_MODULE_0__.hierarchy(this.data, d => d.children );\n this.hierarchy.x0 = this.height / 2;\n this.hierarchy.y0 = 0;\n\n // Transfer \"collapse\" information from model data to d3 data\n this.hierarchy.each(d => {\n\n d.ID = null;\n\n if (d.data.collapse) {\n d._children = d.children;\n d.children = null;\n }\n else {\n d._children = null;\n }\n })\n\n this.build_d3_cluster()\n\n\n\n }\n\n build_d3_cluster(){\n\n // Build d3 layout\n this.d3_cluster_data = this.d3_cluster(this.hierarchy);\n\n // compute the branch length from the root till each nodes (d.branch_size)\n this.max_length = 0\n this.max_depth = 0\n this.hierarchy.eachBefore(d => {\n if (d.parent) {\n d.branch_size = d.parent.branch_size + d.data.branch_length\n if (d.branch_size > this.max_length) {\n this.max_length = d.branch_size\n }\n if (d.depth > this.max_depth) {\n this.max_depth = d.depth\n }\n\n } else {\n d.branch_size = 0\n }\n })\n\n this.compute_stack_data()\n\n this.build_scale_branch_length() // todo dont build scale on collapse\n\n //this.interface = new Interface(this, this.container_object)\n\n\n\n }\n\n compute_stack_data(){\n // store required data for stack on node\n if (this.model.settings.has_histogram_data){\n this.hierarchy.eachBefore((d, i, node) => {\n\n if( d.data.evolutionaryEvents) {\n\n let stackData = []\n stackData['genes'] = this.barStack(d, 'genes');\n stackData['events'] = this.barStack(d, 'events');\n\n d.stackData = stackData\n }\n\n if( this.model.settings.stack.has_support &&d.data.evolutionaryEvents_support) {\n\n let stackData_support = []\n stackData_support['genes'] = this.barStack(d, 'genes', true);\n stackData_support['events'] = this.barStack(d, 'events', true);\n\n d.stackData_support = stackData_support\n }\n\n })\n }\n }\n\n build_scale_branch_length(){\n\n var max_y = 0;\n this.d3_cluster_data.descendants().forEach(d => {\n if (d.y > max_y) {\n max_y = d.y\n }\n })\n\n\n\n\n this.scale_branch_length = d3__WEBPACK_IMPORTED_MODULE_0__.scaleLinear().domain([0, this.max_length]).range([this.d3_cluster_data.y, max_y])\n this.scale_branch_depth = d3__WEBPACK_IMPORTED_MODULE_0__.scaleLinear().domain([0, this.max_depth]).range([this.d3_cluster_data.y, max_y])\n }\n\n // RENDERING\n render(source){\n\n d3__WEBPACK_IMPORTED_MODULE_0__.selectAll(\"#menu-node\").remove()\n\n\n this.render_tooltip()\n\n // Get the nodes and edges\n this.nodes = this.d3_cluster_data.descendants();\n this.nodes = this.nodes.sort((a,b) => {return a.x - b.x})\n\n this.links = this.d3_cluster_data.descendants().slice(1);\n\n\n // And render them\n this.render_nodes(source)\n this.render_edges(source)\n\n\n if (this.model.settings.first_time_render) {\n this.model.settings.first_time_render = false\n\n if (this.container_object.api.settings.phylostratigraphy){\n\n\n source.children.forEach(element =>\n this.container_object.trigger_(\"collapseAll\", element.data, element));\n\n this.maximise_zoom()\n this.svg.call(this.zoom.scaleBy, 0.5)\n this.container_object.history_actions = []\n\n }\n\n else{\n this.fit_to_viewer_height()\n\n }\n\n }\n\n\n }\n\n render_tooltip(){\n\n var idd = \"tooltip\" + this.uid\n\n d3__WEBPACK_IMPORTED_MODULE_0__.selectAll(\".tooltip\").remove()\n\n this.tooltip = this.d3.select('body').append(\"div\")\n .style(\"opacity\", 0)\n .style(\"position\", 'absolute')\n .attr(\"class\", \"tooltip\")\n .attr(\"id\", idd)\n .style(\"background-color\", \"white\")\n .style(\"border\", \"solid\")\n .style(\"border-width\", \"1px\")\n .style(\"border-radius\", \"5px\")\n .style(\"padding\", \"10px\")\n\n\n }\n\n set_tooltip_text(node){\n\n var html = \"\";\n\n if (this.container_object.api.settings.phylostratigraphy){\n\n if (this.model.settings.stack.has_support && this.model.settings.stack.only_support){\n var datum = node.data.evolutionaryEvents_support\n }\n else {\n var datum = node.data.evolutionaryEvents\n }\n\n\n\n html += `<b># Events</b> <br>`\n html += `Gains: ${datum.gained} <br>`\n html += `Duplications: ${datum.duplications} <br>`\n html += `Losses: ${datum.lost} <br> <br>`\n\n html += `<b># Genes</b> <br>`\n html += `Gained: ${datum.gained} <br>`\n html += `Duplicated: ${datum.duplicated} <br>`\n html += `Retained: ${datum.retained} <br>`\n html += `Lost: ${datum.lost} <br>`\n }\n\n else {\n for (var [key, value] of Object.entries(node.data.extended_informations)) {\n\n if ((/^-?[\\d]*(\\.[\\d]+)?$/g).test(value)) {\n\n if (value % 1 === 0) {\n html += `${key}: ${value} <br>`\n }\n\n else{\n //console.log(value)\n html += `${key}: ${parseFloat(value).toFixed(3)} <br>`\n }\n }\n else{\n html += `${key}: ${value} <br>`\n }\n\n\n }\n }\n\n if (this.container_object.api.settings.phylostratigraphy) {\n html += `<br> <b>Click to open detail page</b> <br>`\n }\n\n this.tooltip.html(html);\n }\n\n render_nodes(source){\n\n var self_render = this;\n var on_screen_text_size = this.compute_node_font_size()\n var subsampling_index = -1\n var subsampling_module = 1 + Math.floor((on_screen_text_size)/this.model.settings.tree.node_vertical_size)\n var real_node_radius = this.compute_node_radius()\n var show_duplications = this.model.settings.display_duplication\n var mirror_factor = this.model.settings.mirror ? -1 : 1\n var deepest_tip = 0;\n\n // update x pos with branch length\n this.nodes.forEach(d => {\n if (this.model.settings.has_branch_lenght && this.model.settings.use_branch_lenght) {\n d.y = this.scale_branch_length(d.branch_size)\n }\n else{\n d.y = this.scale_branch_depth(d.depth)\n }\n\n if (!this.model.settings.display_leaves){\n d.subsampled = false;\n return\n }\n\n\n if (!this.model.settings.subsample_label){\n d.subsampled = true;\n return\n }\n\n if (!d.children ) {\n\n if (d.data.collapse && d.data.triangle_height >= on_screen_text_size){\n d.subsampled = true\n return\n }\n\n subsampling_index += 1;\n d.subsampled = (subsampling_index % subsampling_module === 0) ;\n }\n\n })\n\n // Update the nodes...\n var node = this.G.selectAll('g.node')\n .data(this.nodes, d => { return d.ID || (d.ID = ++this.id_gen); })\n\n // Enter any new modes at the parent's previous position.\n var nodeEnter = node.enter().append('g')\n .attr('class', 'node')\n .attr(\"id\", d => {return this.uid + \"_\" + d.ID})\n .attr(\"transform\", function(d) {\n return \"translate(\" + mirror_factor*source.y0 + \",\" + source.x0 + \")\";\n })\n .on(\"mousedown\", function(d,i) {\n d.stopPropagation();\n })\n .on('click', (d, i) => {\n if (i.children || i._children) {this.click_nodes(d,i)}\n })\n .on('mouseover', (d, i) => {\n if (this.model.settings.show_tooltips){\n\n var target = d.target || d.srcElement;\n\n if (this.container_object.api.settings.phylostratigraphy && target.nodeName != 'rect' ) {\n return\n }\n\n this.tooltip.transition().duration(50)\n .style('display', 'block')\n .style('opacity', 0.9)\n .style('left', (d.pageX + 12) + 'px')\n .style('top', d.pageY + 'px');\n\n this.set_tooltip_text(i);\n\n\n }\n\n })\n .on('mousemove', d => {\n if (this.model.settings.show_tooltips) {\n this.tooltip\n .style('left', (d.pageX + 12) + 'px')\n .style('top', d.pageY + 'px');\n }\n })\n .on('mouseout', () => {\n if (this.model.settings.show_tooltips) {\n this.tooltip\n .style('display', 'none');\n }\n });\n\n\n // Add Circle for the nodes\n nodeEnter.filter(function(d){\n return (d.children || d._children)\n })\n .append('circle')\n .attr('class', 'node')\n .attr('r', 1e-6)\n .style(\"stroke\", \"transparent\" )\n .style(\"stroke-width\", \"6px\" )\n .style(\"fill\", function(d) {\n return d.data.duplication && show_duplications ? 'red' : d._children ? \"lightsteelblue\" : \"#fff\";\n });\n\n\n this.node_face_enter(nodeEnter)\n\n // create null triangle\n nodeEnter.append(\"path\")\n .attr(\"class\", \"triangle\")\n .style(\"fill\", \"#666\")\n .attr(\"d\", function (d) {\n return \"M\" + 0 + \",\" + 0 + \"L\" + 0 + \",\" + 0 + \"L\" + 0 + \",\" + 0 + \"L\" + 0 + \",\" + 0;\n })\n\n if (this.model.settings.has_histogram_data && this.model.settings.show_histogram) {\n // create null stack\n nodeEnter.append(\"g\")\n .attr(\"class\", \"stackGroup\")\n }\n\n this.nodeUpdate = nodeEnter.merge(node);\n\n // Transition to the proper position for the node\n this.nodeUpdate.transition()\n .duration(this.settings.duration)\n .attr(\"transform\", (d) => {\n return \"translate(\" + mirror_factor*d.y + \",\" + d.x + \")\";\n });\n\n\n // Update the node attributes and style\n\n this.nodeUpdate.select('circle.node')\n .attr('r', d => d._children || (!this.model.rooted && d.data.root ) ? 1e-6 : real_node_radius )\n .style(\"fill\", function(d) {\n return d.data.duplication && show_duplications ? 'red' : d._children ? \"lightsteelblue\" : \"#666\";\n })\n .attr('cursor', 'pointer');\n\n this.node_face_update(this.nodeUpdate)\n\n // Remove any exiting nodes\n var nodeExit = node.exit().transition()\n .duration(this.settings.duration)\n .attr(\"transform\", function(d) {\n return \"translate(\" + source.y + \",\" + source.x + \")\";\n })\n .remove();\n\n\n // nullify the triangle\n nodeExit.select(\"path\")\n .attr(\"d\", function (d) {\n return \"M\" + 0 + \",\" + 0 + \"L\" + 0 + \",\" + 0 + \"L\" + 0 + \",\" + 0 + \"L\" + 0 + \",\" + 0;\n });\n\n if (this.model.settings.has_histogram_data && this.model.settings.show_histogram) {\n // create null stack\n nodeEnter.selectAll(\"g .stackGroup\").remove()\n }\n\n\n // On exit reduce the node circles size to 0\n nodeExit.select('circle')\n .attr('r', 1e-6);\n\n this.node_face_exit(nodeExit)\n\n // Add collapsed triangle\n this.nodeUpdate.each((d,i,nodes) => {\n\n if (d._children) {\n\n d3__WEBPACK_IMPORTED_MODULE_0__.select(nodes[i]).select(\"path\").transition().duration(self_render.settings.duration)\n .attr(\"d\", (d) => {\n\n const average = arr => arr.reduce( ( p, c ) => p + c.data.distance_to_root, 0 ) / arr.length;\n\n var y = average(self_render.getChildLeaves(d)) -d.data.distance_to_root\n\n var y_length = self_render.scale_branch_length(average(self_render.getChildLeaves(d))-d.data.distance_to_root)\n var x_length = self_render.model.settings.tree.node_vertical_size * Math.sqrt(self_render.getChildLeaves(d).length) * collapse_ratio_vertical\n\n\n d.data.triangle_height = 2*x_length\n d.data.triangle_width = y_length\n\n this.node_face_update(d3__WEBPACK_IMPORTED_MODULE_0__.select(nodes[i]) )\n\n\n\n\n return \"M\" + 0 + \",\" + 0 + \"L\" + mirror_factor*y_length + \",\" + (-x_length) + \"L\" + mirror_factor*y_length + \",\" + (x_length) + \"L\" + 0 + \",\" + 0;\n })\n\n }\n if (d.children) {\n d3__WEBPACK_IMPORTED_MODULE_0__.select(nodes[i]).select(\"path\").transition().duration(self_render.settings.duration)\n .attr(\"d\", function (d) {\n d.data.triangle_height = 0\n return \"M\" + 0 + \",\" + 0 + \"L\" + 0 + \",\" + 0 + \"L\" + 0 + \",\" + 0 + \"L\" + 0 + \",\" + 0;\n });\n }\n })\n\n // align to tip\n\n if (this.model.settings.align_tip){\n\n if (this.model.settings.has_branch_lenght && this.model.settings.use_branch_lenght) {\n\n // update y pos with branch length\n this.nodes.forEach(d => {\n\n var distance_root_to_tip = this.scale_branch_length(d.data.distance_to_root) + (d.data.triangle_width ? d.data.triangle_width : 0)\n\n if (deepest_tip <distance_root_to_tip ){\n deepest_tip = distance_root_to_tip\n }\n })\n\n // Transition to the proper position for the node\n this.nodeUpdate.transition()\n .duration(this.settings.duration)\n .attr(\"transform\", (d) => {\n\n if (d.children ){\n return \"translate(\" + (mirror_factor*d.y) + \",\" + d.x + \")\";\n }\n\n else if (d._children) {\n d.off_set_to_tip = deepest_tip - this.scale_branch_length(d.data.distance_to_root) - d.data.triangle_width\n return \"translate(\" + (mirror_factor*(d.y + d.off_set_to_tip)) + \",\" + d.x + \")\";\n }\n\n else {\n d.off_set_to_tip = deepest_tip - this.scale_branch_length(d.data.distance_to_root)\n return \"translate(\" + (mirror_factor* (d.y + d.off_set_to_tip)) + \",\" + d.x + \")\";\n }\n\n\n\n\n });\n }\n else{\n\n // update y pos with branch length\n this.nodes.forEach(d => {\n\n var distance_root_to_tip = this.scale_branch_depth(d.data.depth) + (d.data.triangle_width ? d.data.triangle_width : 0)\n\n if (deepest_tip <distance_root_to_tip ){\n deepest_tip = distance_root_to_tip\n }\n })\n\n // Transition to the proper position for the node\n this.nodeUpdate.transition()\n .duration(this.settings.duration)\n .attr(\"transform\", (d) => {\n\n if (d.children ){\n return \"translate(\" + (mirror_factor*d.y) + \",\" + d.x + \")\";\n }\n\n else if (d._children) {\n d.off_set_to_tip = deepest_tip - this.scale_branch_depth(d.data.depth) - d.data.triangle_width\n return \"translate(\" + (mirror_factor*(d.y + d.off_set_to_tip)) + \",\" + d.x + \")\";\n }\n\n else {\n d.off_set_to_tip = deepest_tip - this.scale_branch_depth(d.data.depth)\n return \"translate(\" + (mirror_factor* (d.y + d.off_set_to_tip)) + \",\" + d.x + \")\";\n }\n\n\n\n\n });\n }\n\n\n\n\n }\n\n\n // Add Stack\n if (this.model.settings.has_histogram_data && this.model.settings.show_histogram){\n\n this.nodeUpdate.filter(function(d){\n return d.stackData && d.data.depth > 0\n }).each((d, i, nodes) => {this.render_stack(nodes[i],d)});\n\n }\n\n\n // Store the old positions for transition.\n this.nodes.forEach(function(d){\n d.x0 = d.x;\n d.y0 = mirror_factor * d.y;\n });\n\n\n\n\n\n\n }\n\n render_edges(source){\n\n var self_render = this;\n var mirror_factor = this.model.settings.mirror ? -1 : 1\n var real_edges_width = this.compute_edge_width()\n\n // Update the links...\n var link = this.G.selectAll('path.link')\n .data(this.links, d => { return d.ID || (d.ID = ++this.id_gen); });\n\n // Enter any new links at the parent's previous position.\n var linkEnter = link.enter().insert('path', \"g\")\n .attr(\"class\", \"link\")\n .style(\"cursor\",\"pointer\")\n .style(\"fill\",\"none\")\n .style('stroke-width', real_edges_width + 'px' )\n .attr('d', d => this.square_edges(\n {x: source.x0, y: source.y0},{x: source.x0, y: source.y0}))\n\n var linkUpdate = linkEnter.merge(link);\n\n\n var compared_model = false\n if (this.container_object.api.settings.compareMode && this.container_object.api.bound_container.includes(this.container_object)){\n\n var con1 = this.container_object.api.bound_container[0]\n var con2 = this.container_object.api.bound_container[1]\n\n var other_container = con1 == this.container_object ? con2 : con1\n\n if (other_container.models.length > 0 && other_container.viewer.model && this.model.settings.similarity.includes(other_container.viewer.model.uid) ){\n\n compared_model = other_container.viewer.model.uid\n }\n\n }\n\n // Transition back to the parent element position\n linkUpdate.transition()\n .duration(this.settings.duration)\n .style('stroke', (d) => {return this.color_edge(d, compared_model);})\n .style('stroke-width', real_edges_width + 'px' )\n .attr('d', d => this.square_edges(d, d.parent))\n\n linkUpdate.on('click', (d,i) => {\n if (this.container_object.api.settings.phylostratigraphy){return}\n this.click_edges(d,i)})\n\n // Remove any exiting links\n var linkExit = link.exit().transition()\n .duration(this.settings.duration)\n .attr('d', d => this.square_edges({x: source.x, y: source.y}, {x: source.x, y: source.y}))\n .remove();\n\n }\n\n color_edge(edge, compared_model){\n\n if (edge.data.search_path){ return '#FF0000'}\n\n else if (this.model.settings.style.color_accessor['node'] === \"Topology\" && compared_model !== false && edge.data.elementS[compared_model] ) {\n\n return this.colorScale['node'](edge.data.elementS[compared_model])\n }\n\n else if (this.model.settings.style.color_accessor['node'] === 'color'){\n\n var h = edge.data.extended_informations[this.model.settings.style.color_accessor['node']];\n if (typeof h == \"undefined\" ) {return \"#555\"}\n else {return h}\n\n }\n\n else if (this.model.settings.style.color_accessor['node'] !== null){\n\n var v = edge.data.extended_informations[this.model.settings.style.color_accessor['node']];\n if (typeof v == \"undefined\" ) {return \"#555\"}\n else {return this.colorScale['node'](v)}\n\n }\n\n else {\n return \"#555\"\n }\n\n }\n\n set_color_scale(type){\n\n var type = (typeof type !== 'undefined') ? type : 'node';\n\n var colorScaleDomain = false;\n var colorScaleRange;\n var number;\n\n\n if (typeof this.model != \"undefined\" && this.model) {\n\n\n // If categorical do special\n var acc = this.model.settings.style.color_accessor[type]\n var type_acc = this.model.settings.extended_data_type[acc]\n\n\n if (type_acc == 'cat'){\n\n this.colorScale[type] = this.container_object.api.get_color_scale(acc)\n\n\n\n //var dom = this.model.settings.domain_extended_data[acc]\n //this.colorScale[type] = d3.scaleOrdinal().domain(dom).range(d3.schemePaired);\n return\n }\n\n else if (type_acc == 'color'){\n\n this.colorScale[type] = null\n return\n }\n\n\n\n number = this.model.settings.style.number_domain[type]\n\n\n\n if (this.model.settings.style.color_accessor[type] != null && this.model.settings.style.color_accessor[type] != 'Topology' ) {\n\n var ms = this.model.settings.style;\n\n var ca = ms.color_accessor[type];\n\n if (ms.color_extent_max[type][ca] == ms.color_extent_min[type][ca]){\n this.intercolor[type] = d3__WEBPACK_IMPORTED_MODULE_0__.interpolate( ms.color_extent_max[type][ca], ms.color_extent_max[type][ca]-1)\n }else{\n this.intercolor[type] = d3__WEBPACK_IMPORTED_MODULE_0__.interpolate( ms.color_extent_max[type][ca], ms.color_extent_min[type][ca])\n }\n\n\n colorScaleRange = this.model.settings.style.color_domain[type];\n\n }\n\n else {\n this.intercolor[type] = d3__WEBPACK_IMPORTED_MODULE_0__.interpolate(1,0)\n colorScaleRange = this.model.settings.style.color_domain[type];\n }\n\n\n\n }\n else {\n\n number = '5';\n colorScaleRange = ['#253494', '#2C7FB8', '#41B6C4', '#C7E9B4', '#FFFFCC']\n this.intercolor[type] = d3__WEBPACK_IMPORTED_MODULE_0__.interpolate(1, 0);\n }\n\n\n switch (number) {\n case '2':\n colorScaleDomain = [this.intercolor[type](0), this.intercolor[type](1)]\n break;\n case '3':\n colorScaleDomain = [this.intercolor[type](0), this.intercolor[type](0.5) , this.intercolor[type](1)]\n break;\n case '4':\n colorScaleDomain = [this.intercolor[type](0), this.intercolor[type](0.33), this.intercolor[type](0.66) , this.intercolor[type](1)]\n break;\n case '5':\n colorScaleDomain = [this.intercolor[type](0), this.intercolor[type](0.25) ,this.intercolor[type](0.5) ,this.intercolor[type](0.75) , this.intercolor[type](1)]\n\n }\n\n\n this.colorScale[type] = d3__WEBPACK_IMPORTED_MODULE_0__.scaleLinear()\n .domain(colorScaleDomain)\n .range(colorScaleRange);\n\n\n\n }\n\n separate(a, b) {\n\n var spacer = 1;\n\n spacer += a._children ? Math.sqrt(this.getChildLeaves(a).length) * collapse_ratio_vertical : 0\n spacer += b._children ? Math.sqrt(this.getChildLeaves(b).length) * collapse_ratio_vertical : 0\n\n return spacer;\n }\n\n zoomed({transform}) {\n\n var zooming = this.model.zoom ? transform.k != this.model.zoom.k : false;\n\n\n d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).attr(\"transform\", transform);\n\n if (this.interface && this.model.settings.use_branch_lenght) {\n this.interface.update_scale_value(transform.k);\n }\n\n if (typeof this.G != \"undefined\" && this.model != false ){\n\n if ((zooming && !this.model.big_tree) || this.force_zoom_rescaling) {\n\n var on_screen_text_size = this.compute_node_font_size()\n var subsampling_index = -1\n var subsampling_module = 1 + Math.floor((on_screen_text_size)/this.model.settings.tree.node_vertical_size)\n\n // update x pos with branch length\n this.nodes.forEach(d => {\n\n\n if (!this.model.settings.display_leaves ){\n d.subsampled = false;\n return\n }\n\n if (!this.model.settings.subsample_label){\n d.subsampled = true;\n return\n }\n\n\n\n if (!d.children ) {\n\n if (d.data.collapse && d.data.triangle_height >= on_screen_text_size){\n d.subsampled = true\n return\n }\n\n subsampling_index += 1;\n d.subsampled = (subsampling_index % subsampling_module === 0) ;\n }\n\n\n })\n\n\n var real_node_radius = this.compute_node_radius()\n this.G.selectAll('g.node').selectAll('circle').attr('r', (d) => {\n\n return d.data.collapse || (!this.model.rooted && d.data.root) ? 1e-6 : real_node_radius }\n )\n\n this.node_face_update(this.G.selectAll('g.node'))\n\n var real_edges_width = this.compute_edge_width()\n this.G.selectAll('path.link').style('stroke-width', real_edges_width + 'px')\n\n }\n\n\n\n this.model.store_zoomTransform(transform)\n\n\n\n\n // if lock zoom activate\n if (this.container_object.api.settings.compareMode && this.container_object.api.settings.sync_zoom && !this.container_object.api.settings.syncing_zoom){\n\n this.container_object.api.settings.syncing_zoom = true\n\n var other_container = this.container_object.api.bound_container[0] === this.container_object ? this.container_object.api.bound_container[1] : this.container_object.api.bound_container[0]\n\n if (other_container.models.length > 0 && other_container.viewer.model != false){\n\n var m1 = this.get_height_hierarchy().middle*transform.k\n var m2 = other_container.viewer.get_height_hierarchy().middle*transform.k\n\n other_container.viewer.set_zoom(transform.k,transform.x,transform.y -m2 + m1 )\n\n }\n this.container_object.api.settings.syncing_zoom = false\n\n\n\n }\n\n\n\n\n }\n\n\n }\n\n square_edges(s, d) {\n\n var mirror_factor = this.model.settings.mirror ? -1 : 1\n\n\n if (!this.model.settings.align_tip || isNaN(s.off_set_to_tip) ){\n return \"M\" + mirror_factor*s.y + \",\" + s.x + \"L\" + mirror_factor*d.y + \",\" + s.x + \"L\" + mirror_factor*d.y + \",\" + d.x;\n\n }\n else {\n return \"M\" + (mirror_factor * (s.y + s.off_set_to_tip)) + \",\" + s.x + \"L\" + mirror_factor * d.y + \",\" + s.x + \"L\" + mirror_factor * d.y + \",\" + d.x;\n }\n }\n\n click_nodes(event, node) {\n\n var menu = []\n\n // phylostratigraphy mode\n if (this.container_object.api.settings.phylostratigraphy && event.target.tagName === 'rect'){\n\n this.container_object.api.settings.callback_stack_redirection(node.data.taxid,node.parent.data.taxid);\n return\n\n }\n\n // Default mode\n else {\n if (node.parent != null){\n\n var menu = [\n {\n title: node.data.collapse ? 'Expand' : 'Collapse' ,\n action: () => {this.container_object.trigger_(\"collapse\", node.data, node)}\n },\n {\n title: 'Collapse All' ,\n action: () => {this.container_object.trigger_(\"collapseAll\", node.data, node)}\n },\n {\n title: 'Expand All' ,\n action: () => {this.container_object.trigger_(\"expandAll\", node.data, node)}\n },\n {\n title: 'Swap subtrees' ,\n action: () => {this.container_object.trigger_(\"swap\", node.data, node)}\n }\n ]\n }\n else { // root\n var menu = [\n {\n title: 'Expand All' ,\n action: () => {this.container_object.trigger_(\"expandAll\", node.data, node)}\n },\n {\n title: 'Swap subtrees' ,\n action: () => {this.container_object.trigger_(\"swap\", node.data, node)}\n },\n\n ]\n }\n\n if (this.container_object.api.settings.phylostratigraphy){\n\n menu.push({\n title: 'Open genome page' ,\n action: () => {this.container_object.api.settings.callback_ancestral_genome_redirection(node.data.taxid)}\n })\n\n }\n\n\n }\n\n\n menu.push({\n title: 'Close' ,\n action: () => {\n d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#menu-node\").remove()\n }\n })\n\n var t = this.d3.zoomTransform(this.svg.node())\n\n let div_i = this.container_object.div_id;\n\n let py = document.getElementById(div_i).offsetTop\n let px = document.getElementById(div_i).offsetLeft\n\n var xy = t.invert([event.pageX-px,event.pageY-py]);\n\n if(this.model.settings.mirror){\n var x= -xy[0]\n var y = xy[1]\n }\n else{\n var x= xy[0]\n var y = xy[1]\n }\n\n this.create_menu_click(menu, x,y,event,node)\n\n }\n\n click_edges(event,edge) {\n\n var t = this.d3.zoomTransform(this.svg.node())\n\n let div_i = this.container_object.div_id;\n\n let py = document.getElementById(div_i).offsetTop\n let px = document.getElementById(div_i).offsetLeft\n\n var xy = t.invert([event.pageX-px,event.pageY-py]);\n\n // because Chrome returns a MouseEvent for d3.event while Firefox returns a click. \\o/\n var node_from_event = event.path ? event.path[0].__data__ : event.target.__data__\n\n\n\n var menu = [{\n title: 'Reroot' ,\n action: () => {\n this.container_object.trigger_(\"reroot\", node_from_event.data)\n }\n }, {\n title: 'Trim subtree' ,\n action: () => {\n this.container_object.trigger_(\"trim\", node_from_event)\n }\n },{\n title: 'Open as new tree' ,\n action: () => {\n this.container_object.create_model_from_hierarchy_node(node_from_event)\n\n }\n },\n {\n title: 'Close' ,\n action: () => {\n d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#menu-node\").remove()\n }\n }]\n\n if(this.model.settings.mirror){\n var x= -xy[0]\n var y = xy[1]\n }\n else{\n var x= xy[0]\n var y = xy[1]\n }\n\n this.create_menu_click(menu,x,y, event, edge)\n }\n\n create_menu_click(menu, x ,y, event, e){\n\n if (this.model.settings.mirror){\n x=-x;\n }\n\n d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#menu-node\").remove()\n\n /* build context menu */\n var m = this.G.append(\"g\")\n m.style('display', 'none');\n m.attr('id', 'menu-node');\n\n\n var k = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node()).k\n\n var fs = 20/k // scaled font size\n var vps = 12/k // scaled vertical margin\n var hps = 10/k // scaled horizontal margin\n var rs = 8/k // scaled radius size\n\n var r = m.append('rect')\n .attr('height', menu.length * (fs+vps) + vps + 'px')\n .style('fill', \"#eee\")\n .attr('rx', rs)\n .attr('ry', rs)\n\n var gg = m.selectAll('menu_item')\n .data(menu)\n .enter()\n .append('g')\n gg.attr('cursor', 'pointer')\n .attr('transform', function(d, i) {\n return 'translate(' + hps + ',' + ((i + 1) * (fs+vps)) + ')';\n })\n .on('mouseover', function(d){\n d3__WEBPACK_IMPORTED_MODULE_0__.select(this).style('fill', 'steelblue');\n })\n .on('mouseout', function(d){\n d3__WEBPACK_IMPORTED_MODULE_0__.select(this).style('fill', 'black');\n })\n .on('click', function(d,i){\n i.action(d);\n })\n\n var close = null\n\n var t = gg.append('text')\n .attr('cursor', 'pointer')\n .attr(\"font-weight\", (d) => {\n return d.title === \"Close\" ? 900 : 400\n })\n .style('font-size', d => {\n return fs + 'px';\n })\n .text(function(d) {\n return d.title;\n })\n\n\n r.attr('width', 20 );\n m.attr('transform', 'translate(' + x + ',' + y + ')');\n m.style('display', 'block');\n m.datum(event);\n\n\n\n setTimeout(function(){\n\n var w = 0;\n var w_close = 0\n\n t.each(function(d){\n\n var l = d3__WEBPACK_IMPORTED_MODULE_0__.select(this).node().getComputedTextLength();\n if (l > w) w = l;\n\n if (d.title == \"Close\"){\n w_close = l;\n }\n\n })\n\n var w_menu = w + 2*hps\n r.attr('width', w_menu );\n\n t.each(function(d){\n if (d.title == \"Close\"){\n d3__WEBPACK_IMPORTED_MODULE_0__.select(this).attr('transform', 'translate(' + (w - w_close)/2 + ',' + 0 + ')');\n }\n })\n\n\n }, 50)\n\n\n\n\n\n }\n\n apply_collapse_from_data_to_d3(data, d){\n if (data.collapse && d.children != null ) {\n d._children = d.children;\n d.children = null;\n }\n else if (data.collapse == false && d._children != null) {\n d.children = d._children;\n d._children = null;\n\n }\n\n }\n\n apply_collapseAll_from_data_to_d3(data, root_node){\n\n var node = root_node , nodes = [node], children, i, index = -1;\n\n while (node = nodes.pop()) {\n\n\n this.apply_collapse_from_data_to_d3(node.data, node)\n\n\n if (children = node.children) {\n for (i = children.length - 1; i >= 0; --i) {\n nodes.push(children[i]);\n }\n }\n\n if (children = node._children) {\n for (i = children.length - 1; i >= 0; --i) {\n nodes.push(children[i]);\n }\n }\n\n }\n\n }\n\n apply_expandAll_from_data_to_d3(data, root_node){\n\n var node = root_node , nodes = [node], children, i, index = -1;\n\n while (node = nodes.pop()) {\n\n this.apply_collapse_from_data_to_d3(node.data, node)\n\n if (children = node.children) {\n for (i = children.length - 1; i >= 0; --i) {\n nodes.push(children[i]);\n }\n }\n\n if (children = node._children) {\n for (i = children.length - 1; i >= 0; --i) {\n nodes.push(children[i]);\n }\n }\n\n }\n\n }\n\n apply_swap_from_data_to_d3(data, d){\n\n var e = d.children.pop()\n d.children.unshift(e)\n\n }\n\n apply_unswap_from_data_to_d3(data, d){\n\n var e = d.children.shift()\n d.children.push(e)\n\n }\n\n set_zoom(k,x,y) {\n\n d3__WEBPACK_IMPORTED_MODULE_0__.select('#svg' + this.uid )\n .call(this.zoom.transform, d3__WEBPACK_IMPORTED_MODULE_0__.zoomIdentity.translate(x,y).scale(k) );\n }\n\n get_height_hierarchy(){\n\n\n var max_x = 0;\n var min_x = 9999999999;\n\n this.hierarchy.each(d => {\n\n if(d.x > max_x){max_x= d.x}\n if(d.x < min_x){min_x= d.x}\n }\n );\n\n\n return {\n 'h':max_x - min_x,\n 'max_x':max_x ,\n 'min_x': min_x,\n 'middle': max_x -(max_x - min_x)/2\n }\n\n }\n\n get_number_visible_tree_tips_at_depth(depth){\n\n var tips = 0;\n\n this.model.traverse(this.model.data, function(node,children){\n\n if (node.depth > depth) {return}\n\n if (children == null || node.collapse == true) {\n tips+=1\n }\n } )\n\n return tips\n\n }\n\n maximise_zoom(){\n\n var old_zoom = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node())\n this.container_object.add_action('Stretch tree', this, this.render_with_settings, [old_zoom.k, old_zoom.x,old_zoom.y,this.model.settings.tree.node_horizontal_size, []] )\n // Adjust Zoom-y to fit height\n var r = this.get_height_hierarchy()\n var vh = this.height - this.settings.style.offset_top_fit\n var th = (Math.abs(r.min_x)+Math.abs(r.max_x))\n var h_scale = vh/th // ratio\n\n\n\n if (this.model.settings.mirror){\n var x_tr = this.width - this.hierarchy.x + this.settings.style.translate_top_fit\n }\n else{\n var x_tr = - this.hierarchy.x + this.settings.style.translate_top_fit\n }\n\n var off_rooting = (Math.abs(r.min_x)-Math.abs(r.max_x))/2\n var y_tr = -this.hierarchy.y + this.height/2 + off_rooting*h_scale\n this.set_zoom(h_scale, x_tr, y_tr)\n\n\n var w = 0\n\n this.hierarchy.leaves().forEach((e) => {\n let posy = e.y\n if (e.data.collapse){\n posy += e.data.triangle_width\n }\n w = posy > w ? posy : w\n })\n\n var ns = this.model.settings.tree.node_horizontal_size\n var w_scale = (this.width - 80)/(w*h_scale)\n\n this.container_object.modify_node_size('horizontal', (ns * w_scale) - ns )\n\n var real_edges_width = this.compute_edge_width()\n this.G.selectAll('path.link').style('stroke-width', real_edges_width + 'px')\n\n }\n\n fit_to_viewer_height(){\n\n var collapsed = this.model.get_all_collapse(this.model.data)\n var old_zoom = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node())\n this.container_object.add_action('Compact tree', this, this.render_with_settings, [old_zoom.k, old_zoom.x,old_zoom.y,this.model.settings.tree.node_horizontal_size, collapsed] )\n\n // Increment Collapsed Depth until \"Visible leaf\" > \"Max visible leaves\"\n var depth;\n for (depth = 1; depth < this.model.settings.tree.max_depth; depth++) {\n\n var X = this.get_number_visible_tree_tips_at_depth(depth)\n if (X > this.settings.max_visible_leaves) {\n break\n }\n }\n\n this.update_collapse_level(depth, true)\n\n\n var r = this.get_height_hierarchy()\n var estimated_height = r.h\n\n // Adjust Zoom-y to fit height\n var vh = this.height - this.settings.style.offset_top_fit // MARGIN\n var th = (Math.abs(r.min_x)+Math.abs(r.max_x))\n //var th = estimated_height // this.G.node().getBBox().height\n var h_scale = vh/th\n\n\n if (this.model.settings.mirror){\n var x_tr = this.width - this.hierarchy.x + this.settings.style.translate_top_fit\n }\n else{\n var x_tr = - this.hierarchy.x + this.settings.style.translate_top_fit\n }\n\n var off_rooting = (Math.abs(r.min_x)-Math.abs(r.max_x))/2\n var y_tr = -this.hierarchy.y + this.height/2 + off_rooting*h_scale\n //var y_tr = (this.height/2) - this.hierarchy.y - (r.min_x + (r.max_x - r.min_x)/2)/2\n\n this.set_zoom(h_scale, x_tr, y_tr)\n\n\n var w = 0\n\n\n this.hierarchy.leaves().forEach((e) => {\n\n let posy = e.y\n\n if (e.data.collapse){\n posy += e.data.triangle_width\n }\n\n w = posy > w ? posy : w\n })\n\n\n var ns = this.model.settings.tree.node_horizontal_size\n var w_scale = (this.width - 80)/(w*h_scale)\n\n this.container_object.modify_node_size('horizontal', (ns * w_scale) - ns )\n\n var real_edges_width = this.compute_edge_width()\n this.G.selectAll('path.link').style('stroke-width', real_edges_width + 'px')\n\n\n\n\n\n }\n\n render_with_settings(scale, x,y,node_size, collapsed){\n\n if (collapsed.length > 0){\n this.model.apply_collapse_to_list(collapsed)\n this.set_data(this.model)\n this.render(this.hierarchy)\n }\n\n this.set_zoom(scale, x, y)\n\n var delta_node_size = -(this.model.settings.tree.node_horizontal_size - node_size)\n\n if (delta_node_size!=0){\n this.container.modify_node_size('horizontal', -(this.model.settings.tree.node_horizontal_size - node_size) )\n }\n\n var real_edges_width = this.compute_edge_width()\n this.G.selectAll('path.link').style('stroke-width', real_edges_width + 'px')\n\n }\n\n // TUNNING todo should be in Controller\n /*\n modify_node_size(axis, variation){\n\n if (axis === 'vertical') {\n if ((this.model.settings.tree.node_vertical_size + variation) <= 0){return}\n this.model.settings.tree.node_vertical_size += variation\n //this.interface.update_slider(this.interface.slider_v, this.model.settings.tree.node_vertical_size)\n }\n else if (axis === 'horizontal') {\n if ((this.model.settings.tree.node_horizontal_size + variation) <= 0){return}\n this.model.settings.tree.node_horizontal_size += variation\n //this.interface.update_slider(this.interface.slider_h, this.model.settings.tree.node_horizontal_size)\n }\n\n this.d3_cluster.nodeSize([ this.model.settings.tree.node_vertical_size,this.model.settings.tree.node_horizontal_size])\n this.build_d3_cluster()\n this.render(this.hierarchy)\n\n\n if (this.interface && this.model.settings.use_branch_lenght) {\n var k = this.d3.zoomTransform(d3.select(\"#master_g\" + this.uid).node()).k\n this.interface.update_scale_value(k);\n }\n\n }\n\n */\n\n toggle_use_length(){\n this.model.settings.use_branch_lenght = !this.model.settings.use_branch_lenght\n\n if (!this.model.settings.use_branch_lenght){this.interface.remove_scale()}\n else{this.interface.add_scale()}\n\n this.build_d3_data()\n this.render(this.hierarchy)\n\n this.maximise_zoom()\n }\n\n toggle_align_tip(){\n this.model.settings.align_tip = !this.model.settings.align_tip\n\n this.render(this.hierarchy)\n }\n\n toggle_mirror(){\n this.model.settings.mirror = !this.model.settings.mirror\n\n this.build_d3_data()\n this.render(this.hierarchy)\n\n var zoom = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node())\n this.set_zoom(zoom.k,this.width-zoom.x,zoom.y)\n\n\n }\n\n toggle_internal_label(){\n\n this.model.settings.display_internal_label = !this.model.settings.display_internal_label\n this.render(this.hierarchy)\n }\n\n toggle_duplication(){\n this.model.settings.display_duplication = !this.model.settings.display_duplication\n this.render(this.hierarchy)\n\n }\n\n toggle_leaves(){\n this.model.settings.display_leaves = !this.model.settings.display_leaves\n this.render(this.hierarchy)\n\n }\n\n toggle_tooltips(){\n this.model.settings.show_tooltips = !this.model.settings.show_tooltips\n this.render(this.hierarchy)\n\n }\n\n toggle_subsample(){\n this.model.settings.subsample_label = !this.model.settings.subsample_label\n var k = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node()).k\n\n if(this.model.settings.subsample_label){\n this.model.settings.tree.font_size = this.model.settings.tree.font_size*k\n }\n else{\n this.model.settings.tree.font_size = this.model.settings.tree.font_size/k\n }\n\n this.render(this.hierarchy)\n\n //this.interface.update_slider(this.interface.slider_t, this.model.settings.tree.font_size)\n\n }\n\n toggle_multiple_search(){\n this.model.settings.multiple_search = !this.model.settings.multiple_search\n }\n\n toggle_use_meta_for_leaf(){\n this.model.settings.use_meta_for_leaf = !this.model.settings.use_meta_for_leaf\n }\n\n toggle_use_meta_for_node(){\n this.model.settings.use_meta_for_node = !this.model.settings.use_meta_for_node\n }\n\n\n // stack\n\n toggle_only_support(){\n\n this.model.settings.stack.only_support = !this.model.settings.stack.only_support\n\n this.build_d3_data()\n this.render(this.hierarchy)\n }\n\n toggle_show_stack_number(){\n if (this.model.settings.stack.showHistogramValues){\n this.model.settings.stack.showHistogramValues = false\n }\n else{\n this.model.settings.stack.showHistogramValues = true\n }\n\n\n this.build_d3_data()\n this.render(this.hierarchy)\n }\n\n toggle_height_max_ratio(){\n if (this.model.settings.stack.maxStackHeight === 'max'){\n this.model.settings.stack.maxStackHeight = 'ratio'\n }\n else{\n this.model.settings.stack.maxStackHeight = 'max'\n }\n\n\n this.build_d3_data()\n this.render(this.hierarchy)\n\n }\n\n update_stack_height(val){\n this.model.settings.stack.stackHeight = val\n this.build_d3_data()\n this.render(this.hierarchy)\n }\n\n update_stack_width(val){\n this.model.settings.stack.stackWidth = val\n this.build_d3_data()\n this.render(this.hierarchy)\n }\n\n update_stack_font(val){\n this.model.settings.stack.legendTxtSize = val\n this.build_d3_data()\n this.render(this.hierarchy)\n }\n\n update_stack_type(val){\n this.model.settings.stack.type = val\n this.build_d3_data()\n this.render(this.hierarchy)\n }\n\n\n update_collapse_level(val, refresh_interface){\n\n var refresh_interface = (typeof refresh_interface !== 'undefined') ? refresh_interface : true;\n\n\n this.model.settings.collapse_level = val\n this.container_object.collapse_depth(this.model.settings.collapse_level, this.model.data)\n //this.set_data(this.model, refresh_interface)\n this.build_d3_cluster()\n this.render(this.hierarchy)\n\n if (refresh_interface){\n this.interface = new _interface_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](this, this.container_object)\n }\n else{\n var k = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node()).k\n if (this.interface && this.model.settings.use_branch_lenght){\n this.interface.update_scale_value(k);\n }\n\n }\n\n\n\n }\n\n\n\n toggle_dessimode(){\n this.model.settings.dessimode = !this.model.settings.dessimode\n\n if (this.model.settings.dessimode) {\n\n var r= Math.floor(Math.random() * 101);\n\n if (r > 50) {alert(\"[Common] If I may just give a little feedback... [ following 1200 lines truncated]\")}\n else if (r > 10) {alert(\"[Rare] If I may just give a little feedback... [ following 1200 lines truncated]\")}\n else{alert(\"[Lengendary] Have you heard about banana ?\")}\n\n\n }\n }\n\n // HELPER\n getChildren(d) {\n return d._children ? d._children : (d.children ? d.children : []);\n }\n\n getChildLeaves(d) {\n\n if (d.children || d._children) {\n var leaves = [];\n var children = this.getChildren(d);\n for (var i = 0; i < children.length; i++) {\n leaves = leaves.concat(this.getChildLeaves(children[i]));\n }\n return leaves;\n } else {\n return [d];\n }\n }\n\n get_random_node(){\n var ns = []\n this.hierarchy.each(d => ns.push(d));\n return ns[Math.floor(Math.random() * ns.length)];\n }\n\n // UTILS\n centerNode(source) {\n\n //this.svg.transition().call(this.zoom.translateTo, source.y0,source.x0)\n this.svg.transition().call(this.zoom.transform, d3__WEBPACK_IMPORTED_MODULE_0__.zoomIdentity.translate(this.width/2-source.y0,this.height/2-source.x0).scale(1) )\n\n }\n\n zoom_in(){\n this.svg.transition().call(this.zoom.scaleBy, 2)\n }\n\n zoom_out(){\n this.svg.transition().call(this.zoom.scaleBy, 0.5)\n }\n\n zoom_by(val){\n this.svg.transition().call(this.zoom.scaleBy, val)\n }\n\n // STACK\n render_stack(d,e){\n\n var ms = this.model.settings.stack\n\n var data = (ms.has_support && ms.only_support ) ? e.stackData_support[ms.type] : e.stackData[ms.type];\n\n\n var stackGroup = this.d3.select(d);\n\n\n\n var xDistanceFromNode = parseInt(ms.xInitialRightMargin) + parseInt(ms.stackWidth)\n var txtDistanceFromBar = parseInt(ms.stackWidth) + parseInt(ms.margin)\n\n if (ms.showHistogramValues) {\n\n var legends = stackGroup.selectAll(\".legendtxt\")\n .data(data)\n .enter()\n .append(\"text\")\n .classed(\"legendtxt\", true)\n .text(function (d) {\n return d[0].realsize !== 0 ? d[0].realsize : \"\";\n }).attr(\"x\", function () {\n return (0 - xDistanceFromNode) + txtDistanceFromBar;\n }).attr(\"y\", function (d) {\n // TODO adjust based on feedback\n if(d[0].y0 < 0){\n // legend below zero line\n return parseInt(ms.legendTxtSize)+2;\n }\n\n // if bar height smaller than text size, put text on bottom\n if(d[0].y < parseInt(ms.legendTxtSize) && d[0].y0 > 0) {\n return -(d[0].y0 - d[0].y);\n }\n\n // center legend text vertically with some extra padding\n return -(d[0].y0 - ((d[0].y + parseInt(ms.legendTxtSize))/2));\n }).attr(\"font-size\", parseInt(ms.legendTxtSize)).attr(\"stroke\", \"black\")\n\n }\n if (ms.showHistogramValues) { // todo shulld be showHistogramSummaryValue\n\n var summaryLegend = stackGroup.selectAll(\".stackGroup\")\n .data(function (d) {\n return [d];\n })\n .enter()\n .append(\"text\")\n .classed(\"legendsummarytxt\", true)\n .text(function (d) {\n if (ms.has_support && ms.only_support){\n var summary_number = ms.type === \"genes\" ? d.data.nr_hogs_support : d.numberEvents_; // todo add nr_proteins and numberEvents\n }\n else{\n var summary_number = ms.type === \"genes\" ? d.data.nr_hogs : d.numberEvents; // todo add nr_proteins and numberEvents\n }\n\n return summary_number > 0 && typeof summary_number == 'number' ? summary_number : \"\";\n }).attr(\"x\", function () {\n return 0 - (xDistanceFromNode + 30)\n }).attr(\"y\", function (d) {\n return 0 - ms.margin;\n }).attr(\"font-size\", parseInt(ms.legendTxtSize)).attr(\"stroke\", \"black\")\n\n }\n\n var stackSlices = stackGroup.selectAll(\"rect\")\n .data(data)\n .enter()\n .append(\"rect\");\n\n var slices = stackSlices\n .style(\"fill\", (d,i,node) => { return this.settings.stack.colorMap[d[0].sizelbl]\n })\n .style(\"opacity\", 0.8)\n .attr(\"y\", function (d) {\n return 0 - d[0].y0 - 0.5;\n })\n .attr(\"x\", function (d) {\n return 0 - xDistanceFromNode;\n })\n .attr(\"height\", function (d) {\n return d[0].size\n })\n .attr(\"width\", ms.stackWidth)\n\n d3__WEBPACK_IMPORTED_MODULE_0__.selectAll(\".stackGroup\").moveToFront();\n\n\n\n }\n\n compute_color_map_stack(){\n\n var l = this.settings.stack.labels\n var c = this.settings.stack.colors\n\n var colMap = c.reduce(function(colMap, col, index) {\n\n colMap[l[index]] = col;\n return colMap;\n }, {})\n\n return colMap\n\n }\n\n getStackNormalizer(d, type){\n\n var ms = this.model.settings.stack\n\n var max_genome = (ms.has_support && ms.only_support) ? this.model.largestGenome_support : this.model.largestGenome\n var max_event = (ms.has_support && ms.only_support) ? this.model.largestGenome_support : this.model.largestGenome\n\n\n if(type === 'genes' || !type){\n\n if(ms.maxStackHeight === \"max\" && max_genome > 0){\n var normalizer = ms.stackHeight / max_genome;\n } else if(Number.isInteger(ms.maxStackHeight)){\n var normalizer = ms.maxStackHeight / (d.retained + d.duplicated + d.gained + Math.abs(d.lost));\n } else {\n var normalizer = ms.stackHeight / (d.retained + d.duplicated + d.gained + Math.abs(d.lost));\n }\n\n } else {\n\n if(ms.maxStackHeight === \"max\" && max_event > 0){\n var normalizer = ms.stackHeight / max_event;\n } else if(Number.isInteger(ms.maxStackHeight)){\n var normalizer = m.maxStackHeight / (d.duplications + d.gained + Math.abs(d.lost));\n } else {\n var normalizer = ms.stackHeight / (d.duplications + d.gained + Math.abs(d.lost));\n }\n\n }\n\n return normalizer;\n\n }\n\n barStack(seriesDataAll, type, only_support = false) {\n\n var data;\n\n if(type === 'genes' || !type) {\n data = [[{}], [{}], [{}], [{}]];\n } else {\n data = [[{}], [{}], [{}]];\n }\n\n var size = 0;\n if (only_support){\n var d = seriesDataAll.data.evolutionaryEvents_support;\n }\n else{\n var d = seriesDataAll.data.evolutionaryEvents;\n }\n\n var posBase = 0; // positive base\n var stackIndex = 0;\n var seriesIndex = 0;\n\n var normalizer = this.getStackNormalizer(d, type);\n\n /* in case there's no eveolutionary events */\n normalizer = !isFinite(normalizer) ? 1 : normalizer;\n\n if (typeof d.gained == 'undefined'){\n d.gained = 0\n }\n\n if (typeof d.gained == 'undefined'){\n d.gained = 0\n }\n\n if (typeof d.retained == 'undefined'){\n d.retained = 0\n }\n\n if (typeof d.duplicated == 'undefined'){\n d.duplicated = 0\n }\n\n if (typeof d.duplications == 'undefined'){\n d.duplications = 0\n }\n\n if (typeof d.lost == 'undefined'){\n d.lost = 0\n }\n\n\n\n\n\n\n var realSize;\n var StackSizeretained = (d.retained) ? stackScale(d.retained, normalizer) : 0;\n var StackSizeDuplicated = (d.duplicated) ? stackScale(d.duplicated, normalizer) : 0;\n var StackSizeDuplication = (d.duplications) ? stackScale(d.duplications, normalizer) : 0;\n var StackSizeGained = (d.gained) ? stackScale(d.gained, normalizer) : 0;\n var StackSizeLost = (d.lost) ? stackScale(d.lost, normalizer) : 0;\n var posStackSize = StackSizeGained + StackSizeDuplicated + StackSizeretained;\n\n if(type === 'genes' || !type){\n\n realSize = Math.abs(d.retained) > 0 ? Math.abs(d.retained) : 0;\n var posBase = posBase + StackSizeretained;\n data[stackIndex][seriesIndex] = new seriesElement('Retained', realSize, StackSizeretained, posBase, posStackSize)\n stackIndex++;\n\n realSize = Math.abs(d.duplicated);\n var posBase = posBase + StackSizeDuplicated\n data[stackIndex][seriesIndex] = new seriesElement('Duplicated', realSize, StackSizeDuplicated, posBase, posStackSize)\n stackIndex++;\n } else {\n\n realSize = Math.abs(d.duplications);\n var posBase = posBase + StackSizeDuplication\n data[stackIndex][seriesIndex] = new seriesElement('Duplications', realSize, StackSizeDuplication, posBase, posStackSize)\n stackIndex++;\n }\n\n realSize = Math.abs(d.gained);\n var posBase = posBase + StackSizeGained\n data[stackIndex][seriesIndex] = new seriesElement('Gained', realSize, StackSizeGained, posBase, posStackSize)\n stackIndex++;\n realSize = Math.abs(d.lost);\n /* move lost down a little to make it easier to hover it and not the node line */\n data[stackIndex][seriesIndex] = new seriesElement('Lost', realSize, StackSizeLost, -1, posStackSize)\n\n function seriesElement(sizeLbl, realSize, size, y0, posStackSize){\n this.sizelbl = sizeLbl\n this.realsize = realSize\n this.size = Math.abs(size)\n this.y = size\n this.y0 = y0\n this.posStackSize = posStackSize;\n }\n\n function stackScale(val, normalizer){\n return val * normalizer;\n }\n\n data.extent = d3__WEBPACK_IMPORTED_MODULE_0__.extent(\n d3__WEBPACK_IMPORTED_MODULE_0__.merge(\n d3__WEBPACK_IMPORTED_MODULE_0__.merge(\n data.map(function(e) {\n return e.map(function(f) {\n return [f.y0, f.y0 - f.size]\n })\n })\n )\n )\n )\n\n return data;\n }\n\n isOdd(num) { return num % 2;}\n\n compute_node_font_size(){\n\n var k = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node()).k\n\n if (!this.model.settings.subsample_label){\n k=1\n }\n\n var fs = this.model.settings.tree.font_size/k ;\n\n return fs\n\n /*\n if (d._children && fs > d.data.triangle_height){\n fs = d.data.triangle_height\n }\n\n var max_leave = this.model.settings.tree.node_vertical_size*k\n\n if (!d.children && !d._children && fs > max_leave){\n fs = max_leave\n }\n\n return fs+ \"px\"\n\n\n */\n }\n\n compute_node_radius(){\n var k = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node()).k\n var nr = this.model.settings.tree.node_radius/k ;\n return (nr > this.model.settings.tree.node_vertical_size/2) ? this.model.settings.tree.node_vertical_size/2 : nr\n }\n\n compute_edge_width(){\n var k = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node()).k\n var ew = this.model.settings.tree.line_width/k;\n return (ew > this.model.settings.tree.node_vertical_size/2) ? this.model.settings.tree.node_vertical_size/2 : ew\n }\n\n get_label_extended_information(node, type){\n return (type == 'Name') ? node.data.name : node.data.extended_informations[type]\n }\n\n node_face_enter(nodeEnter){\n\n var k = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node()).k\n\n var on_screen_text_size = this.compute_node_font_size()\n var show_lt = this.model.settings.display_internal_label_left_top !== false\n var show_lb = this.model.settings.display_internal_label_left_bottom !== false\n var mirror_factor = this.model.settings.mirror ? true : false;\n\n // Add labels for the nodes\n nodeEnter.append('text')\n .attr(\"class\", \"right\")\n .attr(\"dy\", \".35em\")\n .style('font-size', d => {\n\n var collapse_text = false\n if (d.data.collapse){\n collapse_text = d.data.triangle_height >= on_screen_text_size + 'px' ? true : false\n }\n\n return d.subsampled || collapse_text ? on_screen_text_size : '0px' ;\n })\n .attr(\"font-weight\", (d) => {\n return 400\n //return d.children || d._children ? 900 : 400\n })\n .attr('fill', (d) => {\n return \"#212529\";\n })\n .attr(\"y\", (d) => {\n if (d.parent == null){return 0}\n else if (d.children || d._children){\n if (d.children && this.isOdd(d.children.length)){\n return 13\n }\n if (d._children && this.isOdd(d._children.length)){\n return 13 // todo internal name offsetted if collapse\n }\n return 0\n }\n return 0\n })\n .attr(\"x\", function(d) {\n var scale = (d.children || d._children) ? 1 : k\n return d.parent == null || mirror_factor ? -13/scale : 13/scale;\n })\n .attr(\"text-anchor\", function(d) {\n return d.parent == null || mirror_factor ? \"end\" : \"start\"; // todo better deal with internal name\n })\n .text(function(d) { return d.data.name; });\n\n\n nodeEnter.filter(function(d) { return (d.children || d._children); })\n .append('text')\n .attr(\"class\", \"left_top\")\n .attr(\"dy\", \".35em\")\n //.attr(\"alignment-baseline\", \"ideographic\" )\n .style('font-size', d => {\n return show_lt ? this.model.settings.style.font_size_internal + 'px' : '0px' ;\n })\n .attr(\"font-weight\", (d) => {\n return 400\n })\n .attr(\"y\", (d) => {\n return -13\n })\n .attr(\"x\", function(d) {\n return mirror_factor ? 8 : -8;\n })\n .attr(\"text-anchor\", function(d) {\n\n return mirror_factor ? \"start\" : \"end\"\n })\n .text( (d) => {\n return \"\";\n })\n\n nodeEnter.filter(function(d) { return (d.children || d._children); })\n .append('text')\n .attr(\"class\", \"left_bottom\")\n .attr(\"dy\", \".35em\")\n //.attr(\"alignment-baseline\", \"hanging\" )\n .style('font-size', d => {\n return show_lb ? this.model.settings.style.font_size_internal + 'px': '0px' ;\n })\n .attr(\"font-weight\", (d) => {\n return 400\n })\n .attr(\"y\", (d) => {\n return 13\n })\n .attr(\"x\", function (d) {\n return mirror_factor ? 8 : -8;\n })\n .attr(\"text-anchor\", function (d) {\n\n return mirror_factor ? \"start\" : \"end\"\n })\n .text( (d) => {\n return \"\";\n })\n }\n\n node_face_update(nodes){\n\n var on_screen_text_size = this.compute_node_font_size()\n var k = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node()).k\n var show_r = this.model.settings.display_internal_label !== false\n var show_lt = this.model.settings.display_internal_label_left_top !== false\n var show_lb = this.model.settings.display_internal_label_left_bottom !== false\n var mirror_factor = this.model.settings.mirror;\n\n nodes.select('text.right')\n .text((d) => {\n if (d.children || d._children){\n\n if (d.data.collapse){\n\n if (this.container_object.api.settings.phylostratigraphy){\n return d.data.name\n }\n\n let l = d.data.leaves\n\n if (l.length <= 0){\n d.data.leaves = this.model.get_leaves(d.data)\n }\n\n return '[' + l[0].name + ' ... ' + l[l.length-1].name + ']'\n }\n \n return show_r ? this.get_label_extended_information(d, this.model.settings.display_internal_label) : '';\n }\n return d.data.name;\n })\n .attr(\"x\", function(d) {\n let y_offset = (typeof d.data.triangle_width !== 'undefined') ? d.data.triangle_width : 0;\n\n var scale = (d.children || d._children) ? 1 : k\n\n if (mirror_factor){\n return -(y_offset + 13/scale);\n }\n\n return d.parent == null ? -13/scale : y_offset + 13/scale;\n })\n .attr(\"y\", 0)\n .attr('fill', (d) => {\n\n if (!(d.children || d._children)){\n\n\n var acc = this.model.settings.style.color_accessor['leaf']\n var type_acc = this.model.settings.extended_data_type[acc]\n\n\n\n if (type_acc === 'color'){\n\n var g = d.data.extended_informations[acc];\n\n if (typeof g !== \"undefined\" ) {\n return g\n }\n\n\n }\n\n else if (acc !== null){\n\n var v = d.data.extended_informations[acc];\n\n if (typeof v !== \"undefined\" ) {\n\n if (type_acc == 'cat'){\n\n var cs = this.container_object.api.get_color_scale(acc)\n return cs.get_color(v)\n\n }\n\n else{\n return this.colorScale['leaf'](v)\n }\n\n\n }\n\n\n }\n\n }\n\n let c = d.data.search_node ? \"#FF0000\" : \"#212529\";\n return c\n })\n .style('font-size', d => {\n\n if (d.children){\n return show_r ? this.model.settings.style.font_size_internal + 'px' : '0px';\n }\n\n return d.subsampled ? on_screen_text_size + 'px' : '0px' ;\n\n\n })\n\n nodes.select('text.left_top')\n .style('font-size', d => {\n return show_lt ? this.model.settings.style.font_size_internal+ 'px' : '0px';\n })\n .text( (d) => {\n return show_lt ? this.get_label_extended_information(d, this.model.settings.display_internal_label_left_top) : '';\n })\n\n nodes.select('text.left_bottom')\n .style('font-size', d => {\n return show_lb ? this.model.settings.style.font_size_internal + 'px' : '0px';\n })\n .text( (d) => {\n return show_lb ? this.get_label_extended_information(d, this.model.settings.display_internal_label_left_bottom): '';\n })\n }\n\n node_face_exit(nodeExit){\n\n // On exit reduce the opacity of text labels\n nodeExit.select('text')\n .style('fill-opacity', 1e-6);\n }\n\n};\n\n\n\n\n//# sourceURL=webpack://PhyloIO/./src/viewer.js?");
8658
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Viewer)\n/* harmony export */ });\n/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ \"./node_modules/d3/index.js\");\n/* harmony import */ var _interface_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./interface.js */ \"./src/interface.js\");\n/* harmony import */ var d3_v6_tip__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-v6-tip */ \"./node_modules/d3-v6-tip/build/d3-v6-tip.js\");\n/* harmony import */ var d3_v6_tip__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(d3_v6_tip__WEBPACK_IMPORTED_MODULE_2__);\n\n\n\n\nd3__WEBPACK_IMPORTED_MODULE_0__.selection.prototype.moveToFront = function() {\n return this.each(function() {\n this.parentNode.appendChild(this);\n });\n};\n\nvar uid_viewer = 0 // unique id generator is bound to a single Viewer()\nconst collapse_ratio_vertical = 0.2 // how much a triangle is vertically narrow\n\n// D3 viewer that render any model tree\nclass Viewer {\n\n constructor(container) {\n\n // General\n this.container_object = container // related Container()\n this.uid = uid_viewer ++; // unique viewer() id\n this.data; // current model.data used\n this.model = false; // current model\n\n // D3\n this.d3 = d3__WEBPACK_IMPORTED_MODULE_0__ // d3.js instance that contain information about zoom, etc..\n this.hierarchy; // converted model data into d3 comptabile data format\n this.d3_cluster; // d3 layout to compute 2D position for d3 hierarchy object\n this.d3_cluster_data; // d3 layout fed with d3 hierarchy data\n this.zoom;\n this.id_gen = 0; // unique id generator for d3 id\n this.max_length;\n this.scale_branch_length; // scale between branch length and x pos\n\n // DOM\n this.svg;\n this.svg_d3;\n this.G;\n this.G_d3;\n this.container = document.getElementById(this.container_object.div_id);\n this.container_d3 = d3__WEBPACK_IMPORTED_MODULE_0__.select(this.container);\n this.container_d3.style('font-family', 'monospace !important' )\n\n this.interface;\n this.blinking=0;\n\n // Settings\n this.settings = {\n 'duration' : 300,\n 'max_visible_leaves' : 30,\n 'style': {\n 'offset_top_fit': 140,\n 'translate_top_fit': 60,\n 'margin' : {top: 16, right: 16, bottom: 16, left: 96},\n\n },\n 'stack':{\n 'labels' : [\"Retained\", \"Duplicated\", \"Gained\", \"Lost\", \"Duplications\", \"Gains\", \"Losses\"],\n 'colors' : [\"#1f77b4\", \"#ff7f0e\", \"#2ca02c\", \"#d62728\", \"#ff7f0e\", \"#2ca02c\", \"#d62728\"],\n 'colorMap' : {},\n }\n\n }\n\n this.width = parseFloat(window.getComputedStyle(this.container).width) - this.settings.style.margin.left - 2*this.settings.style.margin.right;\n this.height = parseFloat(window.getComputedStyle(this.container).height) - 2*this.settings.style.margin.top - this.settings.style.margin.bottom;\n\n if (this.model){\n this.model.set_color_scale(undefined,this.container_object.api)\n }\n\n // ZOOM\n this.force_zoom_rescaling = false\n this.zoom = d3__WEBPACK_IMPORTED_MODULE_0__.zoom().on(\"zoom\", (d, i) => { return this.zoomed(d,i)} )\n\n\n // SVG\n this.svg = this.container_d3.append(\"svg\")\n .attr(\"id\", \"svg\" + this.uid)\n .attr(\"width\", this.width + this.settings.style.margin.left + this.settings.style.margin.right )\n .attr(\"height\", this.height + this.settings.style.margin.top + this.settings.style.margin.bottom)\n .call(this.zoom)\n .on(\"dblclick.zoom\", null)\n .call(this.zoom.transform, d3__WEBPACK_IMPORTED_MODULE_0__.zoomIdentity.translate(this.settings.style.margin.left, (this.height/2 + this.settings.style.margin.top) ))\n\n\n this.svg_d3 = d3__WEBPACK_IMPORTED_MODULE_0__.select(this.svg)\n\n // G element for zoom/transform\n //this.G = this.svg.append(\"g\")\n // .attr(\"id\", \"master_g\" + this.uid)\n // .attr(\"transform\", \"translate(\"+ this.settings.style.margin.left + \",\" + (this.height/2 + this.settings.style.margin.top) + \")\")\n //this.G_d3 = d3.select(this.G);\n\n this.build_master_g()\n\n // D3 TREE LAYOUT\n this.d3_cluster = d3__WEBPACK_IMPORTED_MODULE_0__.cluster()\n .separation((a,b) => {return this.separate(a,b)})\n\n // MISC.\n this.settings.stack.colorMap = this.compute_color_map_stack()\n\n // close setting if click outside on svg\n\n\n d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#svg\" + this.uid).on(\"click\", (d,i) => {\n this.interface.menu_settings.style(\"display\", 'none');\n this.interface.menu_export.style(\"display\", 'none')\n })\n\n\n }\n\n // DATA\n set_data(model, refresh_interface = true){\n\n\n this.data = model.data;\n this.model = model;\n\n this.d3_cluster.nodeSize([this.model.settings.tree.node_vertical_size,this.model.settings.tree.node_horizontal_size])\n\n this.build_d3_data();\n\n if (this.model){\n this.model.set_color_scale(undefined, this.container_object.api)\n }\n\n if (refresh_interface){\n this.interface = new _interface_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](this, this.container_object)\n }\n\n\n }\n\n remove_data(){\n\n this.data = null;\n this.model = null;\n this.destroy_master_g()\n this.build_master_g()\n\n }\n\n destroy_master_g(){\n this.svg.select(\"#master_g\" + this.uid).remove()\n this.G = null\n this.G_d3 = null\n }\n\n build_master_g(){\n this.G = this.svg.append(\"g\")\n .attr(\"id\", \"master_g\" + this.uid)\n .attr(\"transform\", \"translate(\"+ this.settings.style.margin.left + \",\" + (this.height/2 + this.settings.style.margin.top) + \")\")\n this.G_d3 = d3__WEBPACK_IMPORTED_MODULE_0__.select(this.G);\n\n\n }\n\n build_d3_data(){\n\n // Build d3 hierarchy\n this.hierarchy = d3__WEBPACK_IMPORTED_MODULE_0__.hierarchy(this.data, d => d.children );\n this.hierarchy.x0 = this.height / 2;\n this.hierarchy.y0 = 0;\n\n // Transfer \"collapse\" information from model data to d3 data\n this.hierarchy.each(d => {\n\n d.ID = null;\n\n if (d.data.collapse) {\n d._children = d.children;\n d.children = null;\n }\n else {\n d._children = null;\n }\n })\n\n this.build_d3_cluster()\n\n\n\n }\n\n build_d3_cluster(){\n\n // Build d3 layout\n this.d3_cluster_data = this.d3_cluster(this.hierarchy);\n\n // compute the branch length from the root till each nodes (d.branch_size)\n this.max_length = 0\n this.max_depth = 0\n this.hierarchy.eachBefore(d => {\n if (d.parent) {\n d.branch_size = d.parent.branch_size + d.data.branch_length\n if (d.branch_size > this.max_length) {\n this.max_length = d.branch_size\n }\n if (d.depth > this.max_depth) {\n this.max_depth = d.depth\n }\n\n } else {\n d.branch_size = 0\n }\n })\n\n this.compute_stack_data()\n\n this.build_scale_branch_length() // todo dont build scale on collapse\n\n //this.interface = new Interface(this, this.container_object)\n\n\n\n }\n\n compute_stack_data(){\n // store required data for stack on node\n if (this.model.settings.has_histogram_data){\n this.hierarchy.eachBefore((d, i, node) => {\n\n if( d.data.evolutionaryEvents) {\n\n let stackData = []\n stackData['genes'] = this.barStack(d, 'genes');\n stackData['events'] = this.barStack(d, 'events');\n\n d.stackData = stackData\n }\n\n if( this.model.settings.stack.has_support &&d.data.evolutionaryEvents_support) {\n\n let stackData_support = []\n stackData_support['genes'] = this.barStack(d, 'genes', true);\n stackData_support['events'] = this.barStack(d, 'events', true);\n\n d.stackData_support = stackData_support\n }\n\n })\n }\n }\n\n build_scale_branch_length(){\n\n var max_y = 0;\n this.d3_cluster_data.descendants().forEach(d => {\n if (d.y > max_y) {\n max_y = d.y\n }\n })\n\n\n\n\n this.scale_branch_length = d3__WEBPACK_IMPORTED_MODULE_0__.scaleLinear().domain([0, this.max_length]).range([this.d3_cluster_data.y, max_y])\n this.scale_branch_depth = d3__WEBPACK_IMPORTED_MODULE_0__.scaleLinear().domain([0, this.max_depth]).range([this.d3_cluster_data.y, max_y])\n }\n\n // RENDERING\n render(source, duration){\n\n var duration;\n\n if (typeof duration !== 'undefined') {\n duration = duration;\n }\n else {\n duration = this.settings.duration;\n }\n\n d3__WEBPACK_IMPORTED_MODULE_0__.selectAll(\"#menu-node\").remove()\n\n\n this.render_tooltip()\n\n // Get the nodes and edges\n this.nodes = this.d3_cluster_data.descendants();\n this.nodes = this.nodes.sort((a,b) => {return a.x - b.x})\n\n this.links = this.d3_cluster_data.descendants().slice(1);\n\n\n // And render them\n this.render_nodes(source, duration)\n this.render_edges(source, duration)\n\n\n if (this.model.settings.first_time_render) {\n this.model.settings.first_time_render = false\n\n if (this.container_object.api.settings.phylostratigraphy){\n\n\n source.children.forEach(element =>\n this.container_object.trigger_(\"collapseAll\", element.data, element));\n\n this.maximise_zoom()\n this.svg.call(this.zoom.scaleBy, 0.5)\n this.container_object.history_actions = []\n this.container_object.undone_actions = []\n\n }\n\n else{\n this.fit_to_viewer_height()\n\n }\n\n }\n\n\n }\n\n render_tooltip(){\n\n var idd = \"tooltip\" + this.uid\n\n d3__WEBPACK_IMPORTED_MODULE_0__.selectAll(\".tooltip\").remove()\n\n this.tooltip = this.d3.select('body').append(\"div\")\n .style(\"opacity\", 0)\n .style(\"position\", 'absolute')\n .attr(\"class\", \"tooltip\")\n .attr(\"id\", idd)\n .style(\"background-color\", \"white\")\n .style(\"border\", \"solid\")\n .style(\"border-width\", \"1px\")\n .style(\"border-radius\", \"5px\")\n .style(\"padding\", \"10px\")\n\n\n }\n\n set_tooltip_text(node){\n\n var html = \"\";\n\n if (this.container_object.api.settings.phylostratigraphy){\n\n if (this.model.settings.stack.has_support && this.model.settings.stack.only_support){\n var datum = node.data.evolutionaryEvents_support\n }\n else {\n var datum = node.data.evolutionaryEvents\n }\n\n\n\n html += `<b># Events</b> <br>`\n html += `Gains: ${datum.gained} <br>`\n html += `Duplications: ${datum.duplications} <br>`\n html += `Losses: ${datum.lost} <br> <br>`\n\n html += `<b># Genes</b> <br>`\n html += `Gained: ${datum.gained} <br>`\n html += `Duplicated: ${datum.duplicated} <br>`\n html += `Retained: ${datum.retained} <br>`\n html += `Lost: ${datum.lost} <br>`\n }\n\n else {\n for (var [key, value] of Object.entries(node.data.extended_informations)) {\n\n if ((/^-?[\\d]*(\\.[\\d]+)?$/g).test(value)) {\n\n if (value % 1 === 0) {\n html += `${key}: ${value} <br>`\n }\n\n else{\n //console.log(value)\n html += `${key}: ${parseFloat(value).toFixed(3)} <br>`\n }\n }\n else{\n html += `${key}: ${value} <br>`\n }\n\n\n }\n }\n\n if (this.container_object.api.settings.phylostratigraphy) {\n html += `<br> <b>Click to open detail page</b> <br>`\n }\n\n this.tooltip.html(html);\n }\n\n render_nodes(source, duration){\n\n var self_render = this;\n var on_screen_text_size = this.compute_node_font_size()\n var subsampling_index = -1\n var subsampling_module = 1 + Math.floor((on_screen_text_size)/this.model.settings.tree.node_vertical_size)\n var real_node_radius = this.compute_node_radius()\n var show_duplications = this.model.settings.display_duplication\n var mirror_factor = this.model.settings.mirror ? -1 : 1\n var deepest_tip = 0;\n var k = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node()).k\n\n // update x pos with branch length\n this.nodes.forEach(d => {\n if (this.model.settings.has_branch_lenght && this.model.settings.use_branch_lenght) {\n d.y = this.scale_branch_length(d.branch_size)\n }\n else{\n d.y = this.scale_branch_depth(d.depth)\n }\n\n if (!this.model.settings.display_leaves){\n d.subsampled = false;\n return\n }\n\n\n if (!this.model.settings.subsample_label){\n d.subsampled = true;\n return\n }\n\n if (!d.children ) {\n\n if (d.data.collapse && d.data.triangle_height >= on_screen_text_size){\n d.subsampled = true\n return\n }\n\n subsampling_index += 1;\n d.subsampled = (subsampling_index % subsampling_module === 0) ;\n }\n\n })\n\n // Update the nodes...\n var node = this.G.selectAll('g.node')\n .data(this.nodes, d => { return d.ID || (d.ID = ++this.id_gen); })\n\n // Enter any new modes at the parent's previous position.\n var nodeEnter = node.enter().append('g')\n .attr('class', 'node')\n .attr(\"id\", d => {return this.uid + \"_\" + d.ID})\n .attr(\"transform\", function(d) {\n return \"translate(\" + mirror_factor*source.y0 + \",\" + source.x0 + \")\";\n })\n .on(\"mousedown\", function(d,i) {\n d.stopPropagation();\n })\n .on('mouseover', (d, i) => {\n if (this.model.settings.show_tooltips){\n\n var target = d.target || d.srcElement;\n\n if (this.container_object.api.settings.phylostratigraphy && target.nodeName != 'rect' ) {\n return\n }\n\n this.tooltip.transition().duration(50)\n .style('display', 'block')\n .style('opacity', 0.9)\n .style('left', (d.pageX + 12) + 'px')\n .style('top', d.pageY + 'px');\n\n this.set_tooltip_text(i);\n\n\n }\n\n })\n .on('mousemove', d => {\n if (this.model.settings.show_tooltips) {\n this.tooltip\n .style('left', (d.pageX + 12) + 'px')\n .style('top', d.pageY + 'px');\n }\n })\n .on('mouseout', () => {\n if (this.model.settings.show_tooltips) {\n this.tooltip\n .style('display', 'none');\n }\n });\n\n\n // Add Circle for the nodes\n nodeEnter.filter(function(d){\n return (d.children || d._children)\n })\n .append('circle')\n .attr('class', 'node')\n .attr('r', 1e-6)\n .style(\"stroke\", \"transparent\" )\n .style(\"stroke-width\", \"6px\" )\n .style(\"fill\", function(d) {\n return d.data.duplication && show_duplications ? 'red' : d._children ? \"lightsteelblue\" : \"#fff\";\n })\n .on('click', (d, i) => {\n if (i.children || i._children) {this.click_nodes(d,i)}\n })\n\n\n this.node_face_enter(nodeEnter)\n\n // create null triangle\n nodeEnter.append(\"path\")\n .attr(\"class\", \"triangle\")\n .style(\"fill\", \"#666\")\n .attr(\"d\", function (d) {\n return \"M\" + 0 + \",\" + 0 + \"L\" + 0 + \",\" + 0 + \"L\" + 0 + \",\" + 0 + \"L\" + 0 + \",\" + 0;\n })\n .on('click', (d, i) => {\n if (i.children || i._children) {this.click_nodes(d,i)}\n })\n\n if (this.model.settings.has_histogram_data && this.model.settings.show_histogram) {\n // create null stack\n nodeEnter.append(\"g\")\n .attr(\"class\", \"stackGroup\")\n }\n\n this.nodeUpdate = nodeEnter.merge(node);\n\n // Transition to the proper position for the node\n this.nodeUpdate.transition()\n .duration(duration)\n .attr(\"transform\", (d) => {\n return \"translate(\" + mirror_factor*d.y + \",\" + d.x + \")\";\n });\n\n\n // Update the node attributes and style\n\n this.nodeUpdate.select('circle.node')\n .attr('r', d => d._children || (!this.model.rooted && d.data.root ) ? 1e-6 : real_node_radius )\n .style(\"fill\", (d) => {\n if ( (d.data.duplication && show_duplications)){\n return 'red'\n }\n\n else if (this.model.settings.style.color_accessor['circle'] !== null) {\n\n\n var acc = this.model.settings.style.color_accessor['circle']\n var type_acc = this.model.settings.extended_data_type[acc]\n var g = d.data.extended_informations[acc]\n\n if (type_acc == 'cat'){\n\n var cs = this.container_object.api.get_color_scale(acc)\n return cs.get_color(g)\n\n }\n\n else{\n return this.model.settings.colorScale['circle'](g)\n }\n\n\n\n\n }\n\n else {\n return '#666'\n }\n\n\n })\n .attr('cursor', 'pointer');\n\n if (this.blinking > 0) {\n\n var BCN_nodes = node.select('circle.node').filter(d => d.data._show_BCN);\n\n BCN_nodes.style('stroke', 'red')\n .style('stroke-width', (d) => { return (2/k) + 'px'})\n\n // Blinking effect\n let isVisible = true;\n const interval = setInterval(() => {\n isVisible = !isVisible;\n BCN_nodes.style(\"stroke-opacity\", isVisible ? 1 : 0);\n this.blinking -= 1;\n\n\n if (this.blinking <= 0) {\n clearInterval(interval); // Stop the interval when blinking reaches 0\n BCN_nodes.style(\"stroke-opacity\", 0); // Ensure stroke is visible after stopping\n }\n\n }, 750); // Blink every 500ms\n\n\n }\n\n this.node_face_update(this.nodeUpdate)\n\n // Remove any exiting nodes\n var nodeExit = node.exit().transition()\n .duration(duration)\n .attr(\"transform\", function(d) {\n return \"translate(\" + source.y + \",\" + source.x + \")\";\n })\n .remove();\n\n\n // nullify the triangle\n nodeExit.select(\"path\")\n .attr(\"d\", function (d) {\n return \"M\" + 0 + \",\" + 0 + \"L\" + 0 + \",\" + 0 + \"L\" + 0 + \",\" + 0 + \"L\" + 0 + \",\" + 0;\n });\n\n if (this.model.settings.has_histogram_data && this.model.settings.show_histogram) {\n // create null stack\n nodeEnter.selectAll(\"g .stackGroup\").remove()\n }\n\n\n // On exit reduce the node circles size to 0\n nodeExit.select('circle')\n .attr('r', 1e-6);\n\n this.node_face_exit(nodeExit)\n\n // Add collapsed triangle\n this.nodeUpdate.each((d,i,nodes) => {\n\n if (d._children) {\n\n d3__WEBPACK_IMPORTED_MODULE_0__.select(nodes[i]).select(\"path\").transition().duration(duration)\n .attr(\"d\", (d) => {\n\n const average = arr => arr.reduce( ( p, c ) => p + c.data.distance_to_root, 0 ) / arr.length;\n\n var y = average(self_render.getChildLeaves(d)) -d.data.distance_to_root\n\n var y_length = self_render.scale_branch_length(average(self_render.getChildLeaves(d))-d.data.distance_to_root)\n var x_length = self_render.model.settings.tree.node_vertical_size * Math.sqrt(self_render.getChildLeaves(d).length) * collapse_ratio_vertical\n\n\n d.data.triangle_height = 2*x_length\n d.data.triangle_width = y_length\n\n this.node_face_update(d3__WEBPACK_IMPORTED_MODULE_0__.select(nodes[i]) )\n\n\n\n\n return \"M\" + 0 + \",\" + 0 + \"L\" + mirror_factor*y_length + \",\" + (-x_length) + \"L\" + mirror_factor*y_length + \",\" + (x_length) + \"L\" + 0 + \",\" + 0;\n })\n .style('fill', (d) => this.color_triangle(d))\n\n }\n if (d.children) {\n d3__WEBPACK_IMPORTED_MODULE_0__.select(nodes[i]).select(\"path\").transition().duration(duration)\n .attr(\"d\", function (d) {\n d.data.triangle_height = 0\n return \"M\" + 0 + \",\" + 0 + \"L\" + 0 + \",\" + 0 + \"L\" + 0 + \",\" + 0 + \"L\" + 0 + \",\" + 0;\n });\n }\n })\n\n // align to tip\n this.G.selectAll(\"line.dashed_line\").remove()\n if (this.model.settings.align_tip) {\n\n var update_dashed = (d) => {\n\n this.G.append(\"line\")\n .attr(\"class\", \"dashed_line\")\n .attr(\"x1\", mirror_factor * d.y)\n .attr(\"y1\", d.x)\n .attr(\"x2\", mirror_factor * (d.y + d.off_set_to_tip))\n .attr(\"y2\", d.x)\n .style(\"stroke\", \"white\")\n .style(\"stroke-dasharray\", this.compute_edge_width() + ', ' + this.compute_edge_width())\n }\n\n\n\n if (this.model.settings.has_branch_lenght && this.model.settings.use_branch_lenght) {\n\n // update y pos with branch length\n this.nodes.forEach(d => {\n\n var distance_root_to_tip = this.scale_branch_length(d.data.distance_to_root) + (d.data.triangle_width ? d.data.triangle_width : 0);\n\n if (deepest_tip < distance_root_to_tip) {\n deepest_tip = distance_root_to_tip;\n }\n });\n\n // Transition to the proper position for the node\n this.nodeUpdate.transition()\n .duration(duration)\n .attr(\"transform\", (d) => {\n\n if (d.children) {\n d.off_set_to_tip = 0;\n return \"translate(\" + (mirror_factor * d.y) + \",\" + d.x + \")\";\n } else if (d._children) {\n d.off_set_to_tip = deepest_tip - this.scale_branch_length(d.data.distance_to_root) - d.data.triangle_width;\n\n update_dashed(d)\n\n return \"translate(\" + (mirror_factor * (d.y + d.off_set_to_tip)) + \",\" + d.x + \")\";\n } else {\n d.off_set_to_tip = deepest_tip - this.scale_branch_length(d.data.distance_to_root);\n\n update_dashed(d)\n\n return \"translate(\" + (mirror_factor * (d.y + d.off_set_to_tip)) + \",\" + d.x + \")\";\n }\n });\n }\n else {\n\n // update y pos with branch length\n this.nodes.forEach(d => {\n\n var distance_root_to_tip = this.scale_branch_depth(d.data.depth) + (d.data.triangle_width ? d.data.triangle_width : 0);\n\n if (deepest_tip < distance_root_to_tip) {\n deepest_tip = distance_root_to_tip;\n }\n });\n\n // Transition to the proper position for the node\n this.nodeUpdate.transition()\n .duration(duration)\n .attr(\"transform\", (d) => {\n\n if (d.children) {\n d.off_set_to_tip = 0;\n return \"translate(\" + (mirror_factor * d.y) + \",\" + d.x + \")\";\n } else if (d._children) {\n d.off_set_to_tip = deepest_tip - this.scale_branch_depth(d.data.depth) - d.data.triangle_width;\n\n update_dashed(d)\n\n return \"translate(\" + (mirror_factor * (d.y + d.off_set_to_tip)) + \",\" + d.x + \")\";\n } else {\n d.off_set_to_tip = deepest_tip - this.scale_branch_depth(d.data.depth);\n\n update_dashed(d)\n\n return \"translate(\" + (mirror_factor * (d.y + d.off_set_to_tip)) + \",\" + d.x + \")\";\n }\n });\n }\n }\n\n\n // Add Stack\n if (this.model.settings.has_histogram_data && this.model.settings.show_histogram){\n\n this.nodeUpdate.filter(function(d){\n return d.stackData && d.data.depth > 0\n }).each((d, i, nodes) => {this.render_stack(nodes[i],d)});\n\n }\n\n\n // Store the old positions for transition.\n this.nodes.forEach(function(d){\n d.x0 = d.x;\n d.y0 = mirror_factor * d.y;\n });\n\n\n\n\n\n\n }\n\n color_triangle(node_){\n\n var mean = array => array.reduce((a, b) => a + b) / array.length;\n\n function mostFrequentElement(array) {\n var frequencyMap = {};\n var maxCount = 0;\n var mostFrequentElement;\n\n for (var i = 0; i < array.length; i++) {\n var element = array[i];\n if (frequencyMap[element] === undefined) {\n frequencyMap[element] = 1;\n } else {\n frequencyMap[element]++;\n }\n\n if (frequencyMap[element] > maxCount) {\n maxCount = frequencyMap[element];\n mostFrequentElement = element;\n }\n }\n\n return mostFrequentElement;\n }\n\n function removeFalsyValues(array) {\n return array.filter(Boolean);\n }\n\n switch (this.model.settings.selected_triangle_coloring) {\n case 'Leaves':\n var acc_l = this.model.settings.style.color_accessor['leaf']\n\n if (acc_l){\n\n var metrics = []\n\n this.model.traverse_hierarchy(node_, function(node,children){\n if (node.children == null && node._children == null){\n metrics.push(node.data.extended_informations[acc_l])\n }\n })\n\n metrics = removeFalsyValues(metrics)\n\n var type_l = this.model.settings.extended_data_type[acc_l]\n\n switch (type_l){\n case 'color':\n return mostFrequentElement(metrics)\n case 'cat':\n return this.model.settings.colorScale['leaf'].get_color(mostFrequentElement(metrics))\n case 'num':\n return this.model.settings.colorScale['leaf'](mean(metrics.map(Number.parseFloat)))\n }\n\n }\n\n break;\n\n case 'Branches':\n var acc_l = this.model.settings.style.color_accessor['node']\n\n if (acc_l){\n\n var metrics = []\n\n this.model.traverse_hierarchy(node_, function(node,children){\n if (children){\n metrics.push(node.data.extended_informations[acc_l])\n }\n })\n\n metrics = removeFalsyValues(metrics)\n\n var type_l = this.model.settings.extended_data_type[acc_l]\n\n switch (type_l){\n case 'color':\n return mostFrequentElement(metrics)\n case 'cat':\n return this.model.settings.colorScale['node'].get_color(mostFrequentElement(metrics))\n case 'num':\n return this.model.settings.colorScale['node'](mean(metrics.map(Number.parseFloat)))\n }\n\n }\n\n break\n }\n\n return '#666'\n }\n\n render_edges(source, duration){\n\n var self_render = this;\n var mirror_factor = this.model.settings.mirror ? -1 : 1\n var real_edges_width = this.compute_edge_width()\n\n // Update the links...\n var link = this.G.selectAll('path.link')\n .data(this.links, d => { return d.ID || (d.ID = ++this.id_gen); });\n\n // Enter any new links at the parent's previous position.\n var linkEnter = link.enter().insert('path', \"g\")\n .attr(\"class\", \"link\")\n .style(\"cursor\",\"pointer\")\n .style(\"fill\",\"none\")\n .style('stroke-width', real_edges_width + 'px' )\n .attr('d', d => this.square_edges(\n {x: source.x0, y: source.y0},{x: source.x0, y: source.y0}))\n\n var linkUpdate = linkEnter.merge(link);\n\n var compared_model = this.get_compared_model()\n\n\n // Transition back to the parent element position\n linkUpdate.transition()\n .duration(duration)\n .style('stroke', (d) => {return this.color_edge(d, compared_model);})\n .style('stroke-width', real_edges_width + 'px' )\n .attr('d', d => this.square_edges(d, d.parent))\n\n linkUpdate.on('click', (d,i) => {\n if (this.container_object.api.settings.phylostratigraphy){return}\n this.click_edges(d,i)})\n\n // Remove any exiting links\n var linkExit = link.exit().transition()\n .duration(duration)\n .attr('d', d => this.square_edges({x: source.x, y: source.y}, {x: source.x, y: source.y}))\n .remove();\n\n var real_edges_width = this.compute_edge_width()\n this.G.selectAll('.dashed_line').style('stroke-width', real_edges_width + 'px')\n\n }\n\n get_compared_model(){\n\n var compared_model = false\n\n if (this.container_object.api.settings.compareMode && this.container_object.api.bound_container.includes(this.container_object)){\n\n var con1 = this.container_object.api.bound_container[0]\n var con2 = this.container_object.api.bound_container[1]\n\n var other_container = con1 == this.container_object ? con2 : con1\n\n if (other_container.models.length > 0 && other_container.viewer.model && this.model.settings.similarity.includes(other_container.viewer.model.uid) ){\n\n compared_model = other_container.viewer.model.uid\n }\n\n }\n\n return compared_model\n\n }\n\n color_edge(edge, compared_model){\n\n if (edge.data.search_path){ return '#FF0000'}\n\n else if (this.model.settings.style.color_accessor['node'] === \"Topology\" && compared_model !== false && edge.data.elementS[compared_model] ) {\n\n return this.model.settings.colorScale['node'](edge.data.elementS[compared_model])\n }\n\n else if (this.model.settings.style.color_accessor['node'] === 'color'){\n\n var h = edge.data.extended_informations[this.model.settings.style.color_accessor['node']];\n if (typeof h == \"undefined\" ) {return \"#555\"}\n else {return h}\n\n }\n\n else if (this.model.settings.style.color_accessor['node'] !== null){\n\n var acc = this.model.settings.style.color_accessor['node']\n\n var v = edge.data.extended_informations[acc];\n\n\n\n // check if v is undefined or empty\n if (typeof v == \"undefined\" || !v ) {return \"#555\"}\n else {\n if (this.model.settings.extended_data_type[acc] == 'cat') {\n return this.model.settings.colorScale['node'].get_color(v)\n }\n else if (this.model.settings.extended_data_type[acc] == 'color') {\n return v\n }\n else {\n return this.model.settings.colorScale['node'](v)\n }\n }\n\n }\n\n else {\n return \"#555\"\n }\n\n }\n\n\n\n separate(a, b) {\n\n var spacer = 1;\n\n spacer += a._children ? Math.sqrt(this.getChildLeaves(a).length) * collapse_ratio_vertical : 0\n spacer += b._children ? Math.sqrt(this.getChildLeaves(b).length) * collapse_ratio_vertical : 0\n\n return spacer;\n }\n\n zoomed({transform}) {\n\n var zooming = this.model.zoom ? transform.k != this.model.zoom.k : false;\n\n\n d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).attr(\"transform\", transform);\n\n if (this.interface && this.model.settings.use_branch_lenght) {\n this.interface.update_scale_value(transform.k);\n }\n\n if (typeof this.G != \"undefined\" && this.model != false ){\n\n if ((zooming && !this.model.big_tree) || this.force_zoom_rescaling) {\n\n var on_screen_text_size = this.compute_node_font_size()\n var subsampling_index = -1\n var subsampling_module = 1 + Math.floor((on_screen_text_size)/this.model.settings.tree.node_vertical_size)\n\n // update x pos with branch length\n this.nodes.forEach(d => {\n\n\n if (!this.model.settings.display_leaves ){\n d.subsampled = false;\n return\n }\n\n if (!this.model.settings.subsample_label){\n d.subsampled = true;\n return\n }\n\n\n\n if (!d.children ) {\n\n if (d.data.collapse && d.data.triangle_height >= on_screen_text_size){\n d.subsampled = true\n return\n }\n\n subsampling_index += 1;\n d.subsampled = (subsampling_index % subsampling_module === 0) ;\n }\n\n\n })\n\n\n var real_node_radius = this.compute_node_radius()\n this.G.selectAll('g.node').selectAll('circle').attr('r', (d) => {\n\n return d.data.collapse || (!this.model.rooted && d.data.root) ? 1e-6 : real_node_radius }\n )\n\n this.node_face_update(this.G.selectAll('g.node'))\n\n var real_edges_width = this.compute_edge_width()\n this.G.selectAll('path.link').style('stroke-width', real_edges_width + 'px')\n this.G.selectAll('.dashed_line').style('stroke-width', real_edges_width + 'px')\n\n\n\n }\n\n this.model.store_zoomTransform(transform)\n\n\n\n\n // if lock zoom activate\n if (this.container_object.api.settings.compareMode && this.container_object.api.settings.sync_zoom && !this.container_object.api.settings.syncing_zoom){\n\n this.container_object.api.settings.syncing_zoom = true\n\n var other_container = this.container_object.api.bound_container[0] === this.container_object ? this.container_object.api.bound_container[1] : this.container_object.api.bound_container[0]\n\n if (other_container.models.length > 0 && other_container.viewer.model != false){\n\n var m1 = this.get_height_hierarchy().middle*transform.k\n var m2 = other_container.viewer.get_height_hierarchy().middle*transform.k\n\n other_container.viewer.set_zoom(transform.k,transform.x,transform.y -m2 + m1 )\n\n }\n this.container_object.api.settings.syncing_zoom = false\n\n\n\n }\n\n\n\n\n }\n\n\n }\n\n square_edges(s, d) {\n\n var mirror_factor = this.model.settings.mirror ? -1 : 1\n\n\n if (!this.model.settings.align_tip || isNaN(s.off_set_to_tip) ){\n return \"M\" + mirror_factor*s.y + \",\" + s.x + \"L\" + mirror_factor*d.y + \",\" + s.x + \"L\" + mirror_factor*d.y + \",\" + d.x;\n\n }\n else {\n return \"M\" + (mirror_factor * (s.y + s.off_set_to_tip)) + \",\" + s.x + \"L\" + mirror_factor * d.y + \",\" + s.x + \"L\" + mirror_factor * d.y + \",\" + d.x;\n }\n }\n\n click_nodes(event, node) {\n\n var menu = []\n\n // phylostratigraphy mode\n if (this.container_object.api.settings.phylostratigraphy && event.target.tagName === 'rect'){\n\n this.container_object.api.settings.callback_stack_redirection(node.data.taxid,node.parent.data.taxid);\n return\n\n }\n\n // Default mode\n else {\n if (node.parent != null){\n\n var menu = [\n {\n title: node.data.collapse ? 'Expand' : 'Collapse node' ,\n action: () => {this.container_object.trigger_(\"collapse\", node.data, node)}\n },\n {\n title: 'Collapse All' ,\n action: () => {this.container_object.trigger_(\"collapseAll\", node.data, node)}\n },\n {\n title: 'Expand All' ,\n action: () => {this.container_object.trigger_(\"expandAll\", node.data, node)}\n },\n {\n title: 'Swap subtrees' ,\n action: () => {this.container_object.trigger_(\"swap\", node.data, node)}\n },\n {\n title: node.data.force_label_show == null || node.data.force_label_show ? 'Hide label' : 'Show label' ,\n action: () => {this.container_object.trigger_(\"force_show_label\", node.data, node)}\n }\n ]\n }\n else { // root\n var menu = [\n {\n title: 'Expand All' ,\n action: () => {this.container_object.trigger_(\"expandAll\", node.data, node)}\n },\n {\n title: 'Swap subtrees' ,\n action: () => {this.container_object.trigger_(\"swap\", node.data, node)}\n },\n\n ]\n }\n\n if (this.container_object.api.settings.compareMode && this.container_object.api.bound_container.includes(this.container_object)){\n\n menu.push({\n title: 'Highlight BCN' ,\n action: () => {this.container_object.trigger_(\"BCN\", node.data, node)}\n })\n\n }\n\n if (this.container_object.api.settings.phylostratigraphy){\n\n menu.push({\n title: 'Open genome page' ,\n action: () => {this.container_object.api.settings.callback_ancestral_genome_redirection(node.data.taxid)}\n })\n\n }\n\n\n }\n\n\n\n\n menu.push({\n title: 'Close' ,\n action: () => {\n d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#menu-node\").remove()\n }\n })\n\n var t = this.d3.zoomTransform(this.svg.node())\n\n let div_i = this.container_object.div_id;\n\n let py = document.getElementById(div_i).offsetTop\n let px = document.getElementById(div_i).offsetLeft\n\n var xy = t.invert([event.pageX-px,event.pageY-py]);\n\n if(this.model.settings.mirror){\n var x= -xy[0]\n var y = xy[1]\n }\n else{\n var x= xy[0]\n var y = xy[1]\n }\n\n this.create_menu_click(menu, x,y,event,node)\n\n }\n\n click_edges(event,edge) {\n\n var t = this.d3.zoomTransform(this.svg.node())\n\n let div_i = this.container_object.div_id;\n\n let py = document.getElementById(div_i).offsetTop\n let px = document.getElementById(div_i).offsetLeft\n\n var xy = t.invert([event.pageX-px,event.pageY-py]);\n\n // because Chrome returns a MouseEvent for d3.event while Firefox returns a click. \\o/\n var node_from_event = event.path ? event.path[0].__data__ : event.target.__data__\n\n\n\n var menu = [{\n title: 'Reroot' ,\n action: () => {\n this.container_object.trigger_(\"reroot\", node_from_event.data)\n }\n }, {\n title: 'Trim subtree' ,\n action: () => {\n this.container_object.trigger_(\"trim\", node_from_event)\n }\n },{\n title: 'Open as new tree' ,\n action: () => {\n this.container_object.create_model_from_hierarchy_node(node_from_event);\n this.container_object.shift_model(this.container_object.models.length - 1 - this.container_object.current_model);\n this.fit_to_viewer_height()\n\n }\n },\n {\n title: 'Close' ,\n action: () => {\n d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#menu-node\").remove()\n }\n }]\n\n if(this.model.settings.mirror){\n var x= -xy[0]\n var y = xy[1]\n }\n else{\n var x= xy[0]\n var y = xy[1]\n }\n\n this.create_menu_click(menu,x,y, event, edge)\n }\n\n create_menu_click(menu, x ,y, event, e){\n\n if (this.model.settings.mirror){\n x=-x;\n }\n\n d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#menu-node\").remove()\n\n /* build context menu */\n var m = this.G.append(\"g\")\n m.style('display', 'none');\n m.attr('id', 'menu-node');\n\n\n var k = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node()).k\n\n var fs = 14/k // scaled font size\n var vps = 12/k // scaled vertical margin\n var hps = 10/k // scaled horizontal margin\n var rs = 8/k // scaled radius size\n\n var r = m.append('rect')\n .attr('height', menu.length * (fs+vps) + vps + 'px')\n .style('fill', \"#eee\")\n .attr('rx', rs)\n .attr('ry', rs)\n\n var gg = m.selectAll('menu_item')\n .data(menu)\n .enter()\n .append('g')\n gg.attr('cursor', 'pointer')\n .attr('transform', function(d, i) {\n return 'translate(' + hps + ',' + ((i + 1) * (fs+vps)) + ')';\n })\n .on('mouseover', function(d){\n d3__WEBPACK_IMPORTED_MODULE_0__.select(this).style('fill', 'steelblue');\n })\n .on('mouseout', function(d){\n d3__WEBPACK_IMPORTED_MODULE_0__.select(this).style('fill', 'black');\n })\n .on('click', function(d,i){\n i.action(d);\n })\n\n var close = null\n\n var t = gg.append('text')\n .attr('cursor', 'pointer')\n .attr(\"font-weight\", (d) => {\n return d.title === \"Close\" ? 900 : 400\n })\n .style('font-size', d => {\n return fs + 'px';\n })\n .text(function(d) {\n return d.title;\n })\n\n\n r.attr('width', 20 );\n m.attr('transform', 'translate(' + x + ',' + y + ')');\n m.style('display', 'block');\n m.datum(event);\n\n\n\n setTimeout(function(){\n\n var w = 0;\n var w_close = 0\n\n t.each(function(d){\n\n var l = d3__WEBPACK_IMPORTED_MODULE_0__.select(this).node().getComputedTextLength();\n if (l > w) w = l;\n\n if (d.title == \"Close\"){\n w_close = l;\n }\n\n })\n\n var w_menu = w + 2*hps\n r.attr('width', w_menu );\n\n t.each(function(d){\n if (d.title == \"Close\"){\n d3__WEBPACK_IMPORTED_MODULE_0__.select(this).attr('transform', 'translate(' + (w - w_close)/2 + ',' + 0 + ')');\n }\n })\n\n\n }, 50)\n\n\n\n\n\n }\n\n apply_show_label_from_data_to_d3(data, d){\n d.force_label_show = data.force_label_show\n }\n\n apply_collapse_from_data_to_d3(data, d){\n if (data.collapse && d.children != null ) {\n d._children = d.children;\n d.children = null;\n }\n else if (data.collapse == false && d._children != null) {\n d.children = d._children;\n d._children = null;\n\n }\n\n }\n\n apply_collapseAll_from_data_to_d3(data, root_node){\n\n var node = root_node , nodes = [node], children, i, index = -1;\n\n while (node = nodes.pop()) {\n\n\n this.apply_collapse_from_data_to_d3(node.data, node)\n\n\n if (children = node.children) {\n for (i = children.length - 1; i >= 0; --i) {\n nodes.push(children[i]);\n }\n }\n\n if (children = node._children) {\n for (i = children.length - 1; i >= 0; --i) {\n nodes.push(children[i]);\n }\n }\n\n }\n\n }\n\n apply_expandAll_from_data_to_d3(data, root_node){\n\n var node = root_node , nodes = [node], children, i, index = -1;\n\n while (node = nodes.pop()) {\n\n this.apply_collapse_from_data_to_d3(node.data, node)\n\n if (children = node.children) {\n for (i = children.length - 1; i >= 0; --i) {\n nodes.push(children[i]);\n }\n }\n\n if (children = node._children) {\n for (i = children.length - 1; i >= 0; --i) {\n nodes.push(children[i]);\n }\n }\n\n }\n\n }\n\n apply_swap_from_data_to_d3(data, d){\n\n var e = d.children.pop()\n d.children.unshift(e)\n\n }\n\n apply_unswap_from_data_to_d3(data, d){\n\n var e = d.children.shift()\n d.children.push(e)\n\n }\n\n set_zoom(k,x,y) {\n\n d3__WEBPACK_IMPORTED_MODULE_0__.select('#svg' + this.uid )\n .call(this.zoom.transform, d3__WEBPACK_IMPORTED_MODULE_0__.zoomIdentity.translate(x,y).scale(k) );\n }\n\n get_height_hierarchy(){\n\n\n var max_x = 0;\n var min_x = 9999999999;\n\n this.hierarchy.each(d => {\n\n if(d.x > max_x){max_x= d.x}\n if(d.x < min_x){min_x= d.x}\n }\n );\n\n\n return {\n 'h':max_x - min_x,\n 'max_x':max_x ,\n 'min_x': min_x,\n 'middle': max_x -(max_x - min_x)/2\n }\n\n }\n\n get_number_visible_tree_tips_at_depth(depth){\n\n var tips = 0;\n\n this.model.traverse(this.model.data, function(node,children){\n\n if (node.depth > depth) {return}\n\n if (children == null || node.collapse == true) {\n tips+=1\n }\n } )\n\n return tips\n\n }\n\n maximise_zoom(){\n\n var old_zoom = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node())\n\n\n\n // Adjust Zoom-y to fit height\n var r = this.get_height_hierarchy()\n var vh = this.height - this.settings.style.offset_top_fit\n var th = (Math.abs(r.min_x)+Math.abs(r.max_x))\n var h_scale = vh/th // ratio\n\n\n\n if (this.model.settings.mirror){\n var x_tr = this.width - this.hierarchy.x + this.settings.style.translate_top_fit\n }\n else{\n var x_tr = - this.hierarchy.x + this.settings.style.translate_top_fit\n }\n\n var off_rooting = (Math.abs(r.min_x)-Math.abs(r.max_x))/2\n var y_tr = -this.hierarchy.y + this.height/2 + off_rooting*h_scale\n this.set_zoom(h_scale, x_tr, y_tr)\n\n\n var w = 0\n\n this.hierarchy.leaves().forEach((e) => {\n let posy = e.y\n if (e.data.collapse){\n posy += e.data.triangle_width\n }\n w = posy > w ? posy : w\n })\n\n var ns = this.model.settings.tree.node_horizontal_size\n var w_scale = (this.width - 80)/(w*h_scale)\n\n this.container_object.modify_node_size('horizontal', (ns * w_scale) - ns )\n\n var real_edges_width = this.compute_edge_width()\n this.G.selectAll('path.link').style('stroke-width', real_edges_width + 'px')\n this.G.selectAll('.dashed_line').style('stroke-width', real_edges_width + 'px')\n\n var undo = {'name': 'Revert Zoom', 'fonction_obj': this, 'fonct': this.render_with_settings, 'argu': [old_zoom.k, old_zoom.x,old_zoom.y,this.model.settings.tree.node_horizontal_size, []]}\n var redo = {'name': 'Stretch tree', 'fonction_obj': this, 'fonct': this.render_with_settings, 'argu': [h_scale, x_tr, y_tr,ns, []] }\n this.container_object.add_action(undo, redo, true)\n\n }\n\n fit_to_viewer_height(){\n\n var collapsed = this.model.get_all_collapse(this.model.data)\n var old_zoom = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node())\n\n\n\n\n // Increment Collapsed Depth until \"Visible leaf\" > \"Max visible leaves\"\n var depth;\n for (depth = 1; depth < this.model.settings.tree.max_depth; depth++) {\n\n var X = this.get_number_visible_tree_tips_at_depth(depth)\n if (X > this.settings.max_visible_leaves) {\n break\n }\n }\n\n this.update_collapse_level(depth, true)\n\n\n var r = this.get_height_hierarchy()\n var estimated_height = r.h\n\n // Adjust Zoom-y to fit height\n var vh = this.height - this.settings.style.offset_top_fit // MARGIN\n var th = (Math.abs(r.min_x)+Math.abs(r.max_x))\n //var th = estimated_height // this.G.node().getBBox().height\n var h_scale = vh/th\n\n\n if (this.model.settings.mirror){\n var x_tr = this.width - this.hierarchy.x + this.settings.style.translate_top_fit\n }\n else{\n var x_tr = - this.hierarchy.x + this.settings.style.translate_top_fit\n }\n\n var off_rooting = (Math.abs(r.min_x)-Math.abs(r.max_x))/2\n var y_tr = -this.hierarchy.y + this.height/2 + off_rooting*h_scale\n //var y_tr = (this.height/2) - this.hierarchy.y - (r.min_x + (r.max_x - r.min_x)/2)/2\n\n this.set_zoom(h_scale, x_tr, y_tr)\n\n\n var w = 0\n\n\n this.hierarchy.leaves().forEach((e) => {\n\n let posy = e.y\n\n if (e.data.collapse){\n posy += e.data.triangle_width\n }\n\n w = posy > w ? posy : w\n })\n\n\n var ns = this.model.settings.tree.node_horizontal_size\n var w_scale = (this.width - 80)/(w*h_scale)\n\n this.container_object.modify_node_size('horizontal', (ns * w_scale) - ns )\n\n var real_edges_width = this.compute_edge_width()\n this.G.selectAll('path.link').style('stroke-width', real_edges_width + 'px')\n this.G.selectAll('.dashed_line').style('stroke-width', real_edges_width + 'px')\n\n var undo = {'name': 'Uncompact tree', 'fonction_obj': this, 'fonct': this.render_with_settings, 'argu': [old_zoom.k, old_zoom.x,old_zoom.y,this.model.settings.tree.node_horizontal_size, collapsed]}\n var redo = {'name': 'Compact tree', 'fonction_obj': this, 'fonct': this.fit_to_viewer_height, 'argu': [] }\n this.container_object.add_action(undo, redo, true)\n\n\n\n\n\n }\n\n render_with_settings(scale, x,y,node_size, collapsed){\n\n if (collapsed.length > 0){\n this.model.apply_collapse_to_list(collapsed)\n this.set_data(this.model)\n this.render(this.hierarchy)\n }\n\n this.set_zoom(scale, x, y)\n\n var delta_node_size = -(this.model.settings.tree.node_horizontal_size - node_size)\n\n if (delta_node_size!=0){\n this.container.modify_node_size('horizontal', -(this.model.settings.tree.node_horizontal_size - node_size) )\n }\n\n var real_edges_width = this.compute_edge_width()\n this.G.selectAll('path.link').style('stroke-width', real_edges_width + 'px')\n this.G.selectAll('.dashed_line').style('stroke-width', real_edges_width + 'px')\n\n }\n\n // TUNNING todo should be in Controller\n /*\n modify_node_size(axis, variation){\n\n if (axis === 'vertical') {\n if ((this.model.settings.tree.node_vertical_size + variation) <= 0){return}\n this.model.settings.tree.node_vertical_size += variation\n //this.interface.update_slider(this.interface.slider_v, this.model.settings.tree.node_vertical_size)\n }\n else if (axis === 'horizontal') {\n if ((this.model.settings.tree.node_horizontal_size + variation) <= 0){return}\n this.model.settings.tree.node_horizontal_size += variation\n //this.interface.update_slider(this.interface.slider_h, this.model.settings.tree.node_horizontal_size)\n }\n\n this.d3_cluster.nodeSize([ this.model.settings.tree.node_vertical_size,this.model.settings.tree.node_horizontal_size])\n this.build_d3_cluster()\n this.render(this.hierarchy)\n\n\n if (this.interface && this.model.settings.use_branch_lenght) {\n var k = this.d3.zoomTransform(d3.select(\"#master_g\" + this.uid).node()).k\n this.interface.update_scale_value(k);\n }\n\n }\n\n */\n\n toggle_use_length(){\n this.model.settings.use_branch_lenght = !this.model.settings.use_branch_lenght\n\n if (!this.model.settings.use_branch_lenght){this.interface.remove_scale()}\n else{this.interface.add_scale()}\n\n this.build_d3_data()\n this.render(this.hierarchy)\n\n this.maximise_zoom()\n }\n\n toggle_align_tip(){\n this.model.settings.align_tip = !this.model.settings.align_tip\n this.render(this.hierarchy)\n\n }\n\n toggle_mirror(){\n this.model.settings.mirror = !this.model.settings.mirror\n\n this.build_d3_data()\n this.render(this.hierarchy)\n\n var zoom = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node())\n this.set_zoom(zoom.k,this.width-zoom.x,zoom.y)\n\n\n }\n\n toggle_internal_label(){\n\n this.model.settings.display_internal_label = !this.model.settings.display_internal_label\n this.render(this.hierarchy)\n }\n\n toggle_duplication(){\n this.model.settings.display_duplication = !this.model.settings.display_duplication\n this.render(this.hierarchy)\n\n }\n\n toggle_leaves(){\n this.model.settings.display_leaves = !this.model.settings.display_leaves\n this.render(this.hierarchy)\n\n }\n\n toggle_node_labels(){\n this.model.settings.display_nodes_labels = !this.model.settings.display_nodes_labels\n this.render(this.hierarchy)\n\n }\n\n\n\n toggle_tooltips(){\n this.model.settings.show_tooltips = !this.model.settings.show_tooltips\n this.render(this.hierarchy)\n\n }\n\n toggle_triangle_name(){\n this.model.settings.use_internal_node_name_for_triangles = !this.model.settings.use_internal_node_name_for_triangles\n this.render(this.hierarchy)\n\n }\n\n\n\n toggle_subsample(){\n this.model.settings.subsample_label = !this.model.settings.subsample_label\n var k = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node()).k\n\n if(this.model.settings.subsample_label){\n this.model.settings.tree.font_size = this.model.settings.tree.font_size*k\n }\n else{\n this.model.settings.tree.font_size = this.model.settings.tree.font_size/k\n }\n\n this.render(this.hierarchy)\n\n //this.interface.update_slider(this.interface.slider_t, this.model.settings.tree.font_size)\n\n }\n\n toggle_multiple_search(){\n this.model.settings.multiple_search = !this.model.settings.multiple_search\n }\n\n toggle_sync_coloring(){\n this.model.settings.sync_coloring = !this.model.settings.sync_coloring;\n\n var acc = this.model.settings.style.color_accessor['node']\n this.model.settings.style.color_accessor['leaf'] = acc\n\n if (this.model.settings.style.color_extent_min['node'][acc] !=100000){\n this.model.settings.style.color_extent_max['leaf'][acc] = this.model.settings.style.color_extent_max['node'][acc]\n this.model.settings.style.color_extent_min['leaf'][acc] = this.model.settings.style.color_extent_min['node'][acc]\n }\n\n else {\n this.model.settings.style.color_extent_max['node'][acc] = this.model.settings.style.color_extent_max['leaf'][acc]\n this.model.settings.style.color_extent_min['node'][acc] = this.model.settings.style.color_extent_min['leaf'][acc]\n\n }\n\n this.container_object.interface = new _interface_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](this, this.container_object)\n this.interface.open_color_settings()\n\n\n }\n\n toggle_use_meta_for_leaf(){\n this.model.settings.use_meta_for_leaf = !this.model.settings.use_meta_for_leaf\n }\n\n toggle_use_meta_for_node(){\n this.model.settings.use_meta_for_node = !this.model.settings.use_meta_for_node\n }\n\n\n // stack\n\n toggle_only_support(){\n\n this.model.settings.stack.only_support = !this.model.settings.stack.only_support\n\n this.build_d3_data()\n this.render(this.hierarchy)\n }\n\n toggle_show_stack_number(){\n if (this.model.settings.stack.showHistogramValues){\n this.model.settings.stack.showHistogramValues = false\n }\n else{\n this.model.settings.stack.showHistogramValues = true\n }\n\n\n this.build_d3_data()\n this.render(this.hierarchy)\n }\n\n toggle_height_max_ratio(){\n if (this.model.settings.stack.maxStackHeight === 'max'){\n this.model.settings.stack.maxStackHeight = 'ratio'\n }\n else{\n this.model.settings.stack.maxStackHeight = 'max'\n }\n\n\n this.build_d3_data()\n this.render(this.hierarchy)\n\n }\n\n update_stack_height(val){\n this.model.settings.stack.stackHeight = val\n this.build_d3_data()\n this.render(this.hierarchy)\n }\n\n update_stack_width(val){\n this.model.settings.stack.stackWidth = val\n this.build_d3_data()\n this.render(this.hierarchy)\n }\n\n update_stack_font(val){\n this.model.settings.stack.legendTxtSize = val\n this.build_d3_data()\n this.render(this.hierarchy)\n }\n\n update_stack_type(val){\n this.model.settings.stack.type = val\n this.build_d3_data()\n this.render(this.hierarchy)\n }\n\n\n update_collapse_level(val, refresh_interface){\n\n var refresh_interface = (typeof refresh_interface !== 'undefined') ? refresh_interface : true;\n\n\n this.model.settings.collapse_level = val\n this.container_object.collapse_depth(this.model.settings.collapse_level, this.model.data)\n //this.set_data(this.model, refresh_interface)\n this.build_d3_cluster()\n this.render(this.hierarchy)\n\n if (refresh_interface){\n this.interface = new _interface_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](this, this.container_object)\n }\n else{\n var k = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node()).k\n if (this.interface && this.model.settings.use_branch_lenght){\n this.interface.update_scale_value(k);\n }\n\n }\n\n\n\n }\n\n\n\n toggle_dessimode(){\n this.model.settings.dessimode = !this.model.settings.dessimode\n\n if (this.model.settings.dessimode) {\n\n var r= Math.floor(Math.random() * 101);\n\n if (r > 50) {alert(\"[Common] If I may just give a little feedback... [ following 1200 lines truncated]\")}\n else if (r > 10) {alert(\"[Rare] If I may just give a little feedback... [ following 6800 lines truncated]\")}\n else{alert(\"[Lengendary] Have you heard about banana and human genome similarity,?\")}\n\n\n }\n }\n\n // HELPER\n getChildren(d) {\n return d._children ? d._children : (d.children ? d.children : []);\n }\n\n getChildLeaves(d) {\n\n if (d.children || d._children) {\n var leaves = [];\n var children = this.getChildren(d);\n for (var i = 0; i < children.length; i++) {\n leaves = leaves.concat(this.getChildLeaves(children[i]));\n }\n return leaves;\n } else {\n return [d];\n }\n }\n\n get_random_node(){\n var ns = []\n this.hierarchy.each(d => ns.push(d));\n return ns[Math.floor(Math.random() * ns.length)];\n }\n\n // UTILS\n centerNode(source) {\n\n //this.svg.transition().call(this.zoom.translateTo, source.y0,source.x0)\n this.svg.transition().call(this.zoom.transform, d3__WEBPACK_IMPORTED_MODULE_0__.zoomIdentity.translate(this.width/2-source.y0,this.height/2-source.x0).scale(1) )\n\n }\n\n zoom_in(){\n this.svg.transition().call(this.zoom.scaleBy, 2)\n }\n\n zoom_out(){\n this.svg.transition().call(this.zoom.scaleBy, 0.5)\n }\n\n zoom_by(val){\n this.svg.transition().call(this.zoom.scaleBy, val)\n }\n\n // STACK\n render_stack(d,e){\n\n var ms = this.model.settings.stack\n\n var data = (ms.has_support && ms.only_support ) ? e.stackData_support[ms.type] : e.stackData[ms.type];\n\n\n var stackGroup = this.d3.select(d);\n\n\n\n var xDistanceFromNode = parseInt(ms.xInitialRightMargin) + parseInt(ms.stackWidth)\n var txtDistanceFromBar = parseInt(ms.stackWidth) + parseInt(ms.margin)\n\n if (ms.showHistogramValues) {\n\n var legends = stackGroup.selectAll(\".legendtxt\")\n .data(data)\n .enter()\n .append(\"text\")\n .classed(\"legendtxt\", true)\n .text(function (d) {\n return d[0].realsize !== 0 ? d[0].realsize : \"\";\n }).attr(\"x\", function () {\n return (0 - xDistanceFromNode) + txtDistanceFromBar;\n }).attr(\"y\", function (d) {\n // TODO adjust based on feedback\n if(d[0].y0 < 0){\n // legend below zero line\n return parseInt(ms.legendTxtSize)+2;\n }\n\n // if bar height smaller than text size, put text on bottom\n if(d[0].y < parseInt(ms.legendTxtSize) && d[0].y0 > 0) {\n return -(d[0].y0 - d[0].y);\n }\n\n // center legend text vertically with some extra padding\n return -(d[0].y0 - ((d[0].y + parseInt(ms.legendTxtSize))/2));\n }).attr(\"font-size\", parseInt(ms.legendTxtSize)).attr(\"stroke\", \"black\")\n\n }\n if (ms.showHistogramValues) { // todo shulld be showHistogramSummaryValue\n\n var summaryLegend = stackGroup.selectAll(\".stackGroup\")\n .data(function (d) {\n return [d];\n })\n .enter()\n .append(\"text\")\n .classed(\"legendsummarytxt\", true)\n .text(function (d) {\n if (ms.has_support && ms.only_support){\n var summary_number = ms.type === \"genes\" ? d.data.nr_hogs_support : d.numberEvents_; // todo add nr_proteins and numberEvents\n }\n else{\n var summary_number = ms.type === \"genes\" ? d.data.nr_hogs : d.numberEvents; // todo add nr_proteins and numberEvents\n }\n\n return summary_number > 0 && typeof summary_number == 'number' ? summary_number : \"\";\n }).attr(\"x\", function () {\n return 0 - (xDistanceFromNode + 30)\n }).attr(\"y\", function (d) {\n return 0 - ms.margin;\n }).attr(\"font-size\", parseInt(ms.legendTxtSize)).attr(\"stroke\", \"black\")\n\n }\n\n var stackSlices = stackGroup.selectAll(\"rect\")\n .data(data)\n .enter()\n .append(\"rect\");\n\n var slices = stackSlices\n .style(\"fill\", (d,i,node) => { return this.settings.stack.colorMap[d[0].sizelbl]\n })\n .style(\"opacity\", 0.8)\n .attr(\"y\", function (d) {\n return 0 - d[0].y0 - 0.5;\n })\n .attr(\"x\", function (d) {\n return 0 - xDistanceFromNode;\n })\n .attr(\"height\", function (d) {\n return d[0].size\n })\n .attr(\"width\", ms.stackWidth)\n\n d3__WEBPACK_IMPORTED_MODULE_0__.selectAll(\".stackGroup\").moveToFront();\n\n\n\n }\n\n compute_color_map_stack(){\n\n var l = this.settings.stack.labels\n var c = this.settings.stack.colors\n\n var colMap = c.reduce(function(colMap, col, index) {\n\n colMap[l[index]] = col;\n return colMap;\n }, {})\n\n return colMap\n\n }\n\n getStackNormalizer(d, type){\n\n var ms = this.model.settings.stack\n\n var max_genome = (ms.has_support && ms.only_support) ? this.model.largestGenome_support : this.model.largestGenome\n var max_event = (ms.has_support && ms.only_support) ? this.model.largestGenome_support : this.model.largestGenome\n\n\n if(type === 'genes' || !type){\n\n if(ms.maxStackHeight === \"max\" && max_genome > 0){\n var normalizer = ms.stackHeight / max_genome;\n } else if(Number.isInteger(ms.maxStackHeight)){\n var normalizer = ms.maxStackHeight / (d.retained + d.duplicated + d.gained + Math.abs(d.lost));\n } else {\n var normalizer = ms.stackHeight / (d.retained + d.duplicated + d.gained + Math.abs(d.lost));\n }\n\n } else {\n\n if(ms.maxStackHeight === \"max\" && max_event > 0){\n var normalizer = ms.stackHeight / max_event;\n } else if(Number.isInteger(ms.maxStackHeight)){\n var normalizer = m.maxStackHeight / (d.duplications + d.gained + Math.abs(d.lost));\n } else {\n var normalizer = ms.stackHeight / (d.duplications + d.gained + Math.abs(d.lost));\n }\n\n }\n\n return normalizer;\n\n }\n\n barStack(seriesDataAll, type, only_support = false) {\n\n var data;\n\n if(type === 'genes' || !type) {\n data = [[{}], [{}], [{}], [{}]];\n } else {\n data = [[{}], [{}], [{}]];\n }\n\n var size = 0;\n if (only_support){\n var d = seriesDataAll.data.evolutionaryEvents_support;\n }\n else{\n var d = seriesDataAll.data.evolutionaryEvents;\n }\n\n var posBase = 0; // positive base\n var stackIndex = 0;\n var seriesIndex = 0;\n\n var normalizer = this.getStackNormalizer(d, type);\n\n /* in case there's no eveolutionary events */\n normalizer = !isFinite(normalizer) ? 1 : normalizer;\n\n if (typeof d.gained == 'undefined'){\n d.gained = 0\n }\n\n if (typeof d.gained == 'undefined'){\n d.gained = 0\n }\n\n if (typeof d.retained == 'undefined'){\n d.retained = 0\n }\n\n if (typeof d.duplicated == 'undefined'){\n d.duplicated = 0\n }\n\n if (typeof d.duplications == 'undefined'){\n d.duplications = 0\n }\n\n if (typeof d.lost == 'undefined'){\n d.lost = 0\n }\n\n\n\n\n\n\n var realSize;\n var StackSizeretained = (d.retained) ? stackScale(d.retained, normalizer) : 0;\n var StackSizeDuplicated = (d.duplicated) ? stackScale(d.duplicated, normalizer) : 0;\n var StackSizeDuplication = (d.duplications) ? stackScale(d.duplications, normalizer) : 0;\n var StackSizeGained = (d.gained) ? stackScale(d.gained, normalizer) : 0;\n var StackSizeLost = (d.lost) ? stackScale(d.lost, normalizer) : 0;\n var posStackSize = StackSizeGained + StackSizeDuplicated + StackSizeretained;\n\n if(type === 'genes' || !type){\n\n realSize = Math.abs(d.retained) > 0 ? Math.abs(d.retained) : 0;\n var posBase = posBase + StackSizeretained;\n data[stackIndex][seriesIndex] = new seriesElement('Retained', realSize, StackSizeretained, posBase, posStackSize)\n stackIndex++;\n\n realSize = Math.abs(d.duplicated);\n var posBase = posBase + StackSizeDuplicated\n data[stackIndex][seriesIndex] = new seriesElement('Duplicated', realSize, StackSizeDuplicated, posBase, posStackSize)\n stackIndex++;\n } else {\n\n realSize = Math.abs(d.duplications);\n var posBase = posBase + StackSizeDuplication\n data[stackIndex][seriesIndex] = new seriesElement('Duplications', realSize, StackSizeDuplication, posBase, posStackSize)\n stackIndex++;\n }\n\n realSize = Math.abs(d.gained);\n var posBase = posBase + StackSizeGained\n data[stackIndex][seriesIndex] = new seriesElement('Gained', realSize, StackSizeGained, posBase, posStackSize)\n stackIndex++;\n realSize = Math.abs(d.lost);\n /* move lost down a little to make it easier to hover it and not the node line */\n data[stackIndex][seriesIndex] = new seriesElement('Lost', realSize, StackSizeLost, -1, posStackSize)\n\n function seriesElement(sizeLbl, realSize, size, y0, posStackSize){\n this.sizelbl = sizeLbl\n this.realsize = realSize\n this.size = Math.abs(size)\n this.y = size\n this.y0 = y0\n this.posStackSize = posStackSize;\n }\n\n function stackScale(val, normalizer){\n return val * normalizer;\n }\n\n data.extent = d3__WEBPACK_IMPORTED_MODULE_0__.extent(\n d3__WEBPACK_IMPORTED_MODULE_0__.merge(\n d3__WEBPACK_IMPORTED_MODULE_0__.merge(\n data.map(function(e) {\n return e.map(function(f) {\n return [f.y0, f.y0 - f.size]\n })\n })\n )\n )\n )\n\n return data;\n }\n\n isOdd(num) { return num % 2;}\n\n compute_node_font_size(internal=false){\n\n var k = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node()).k\n\n if (!this.model.settings.subsample_label && !internal){\n k=1\n }\n\n if (internal){\n var fs = this.model.settings.style.font_size_internal/k ;\n }\n else {\n var fs = this.model.settings.tree.font_size/k ;\n }\n\n return fs\n\n /*\n if (d._children && fs > d.data.triangle_height){\n fs = d.data.triangle_height\n }\n\n var max_leave = this.model.settings.tree.node_vertical_size*k\n\n if (!d.children && !d._children && fs > max_leave){\n fs = max_leave\n }\n\n return fs+ \"px\"\n\n\n */\n }\n\n compute_node_radius(){\n var k = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node()).k\n var nr = this.model.settings.tree.node_radius/k ;\n return (nr > this.model.settings.tree.node_vertical_size/2) ? this.model.settings.tree.node_vertical_size/2 : nr\n }\n\n compute_edge_width(){\n var k = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node()).k\n var ew = this.model.settings.tree.line_width/k;\n return (ew > this.model.settings.tree.node_vertical_size/2) ? this.model.settings.tree.node_vertical_size/2 : ew\n }\n\n get_label_extended_information(node, type){\n\n\n if (type == 'Topology'){\n\n var topo = node.data.elementS[this.get_compared_model()]\n\n return topo ? topo.toFixed(2) : ''\n\n }\n\n return (type == 'Name') ? node.data.name : node.data.extended_informations[type]\n }\n\n node_face_enter(nodeEnter){\n\n var k = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node()).k\n\n var on_screen_text_size = this.compute_node_font_size()\n var show_node_face = this.model.settings.display_nodes_labels !== false\n var show_lt = show_node_face ? this.model.settings.display_internal_label_left_top !== false: false\n var show_lb = show_node_face ? this.model.settings.display_internal_label_left_bottom !== false : false\n var mirror_factor = this.model.settings.mirror ? true : false;\n\n\n var show_ltl = this.model.settings.display_leaf_label_left_top !== false\n var show_lbl = this.model.settings.display_leaf_label_left_bottom !== false\n\n\n\n // Add labels for the nodes\n nodeEnter.append('text')\n .attr(\"class\", \"right\")\n .attr(\"dy\", \".35em\")\n .style('cursor', 'pointer')\n .style('font-size', d => {\n\n var collapse_text = false\n if (d.data.collapse){\n collapse_text = d.data.triangle_height >= on_screen_text_size + 'px' ? true : false\n }\n\n return d.subsampled || collapse_text ? on_screen_text_size : '0px' ;\n })\n .attr(\"font-weight\", (d) => {\n return 400\n //return d.children || d._children ? 900 : 400\n })\n .attr('fill', (d) => {\n return \"#212529\";\n })\n .attr(\"y\", (d) => {\n if (d.parent == null){return 0}\n else if (d.children || d._children){\n if (d.children && this.isOdd(d.children.length)){\n return 13\n }\n if (d._children && this.isOdd(d._children.length)){\n return 13 // todo internal name offsetted if collapse\n }\n return 0\n }\n return 0\n })\n .attr(\"x\", function(d) {\n var scale = (d.children || d._children) ? 1 : k\n return d.parent == null || mirror_factor ? -13/scale : 13/scale;\n })\n .attr(\"text-anchor\", function(d) {\n return d.parent == null || mirror_factor ? \"end\" : \"start\"; // todo better deal with internal name\n })\n .text(function(d) { return d.data.name; })\n .on('click', (d,i) => {\n if (i.children == null && i._children == null){\n\n this.interface.add_modal_edit_label(i, 'Default');\n $('#exampleModal_edit').modal('show');\n\n }\n\n });\n\n\n // INTERNAL LABELS\n\n nodeEnter.filter(function(d) { return (d.children || d._children); })\n .append('text')\n .attr(\"class\", \"left_top\")\n .attr(\"dy\", \".35em\")\n //.attr(\"alignment-baseline\", \"ideographic\" )\n .style('font-size', d => {\n return show_lt ? this.model.settings.style.font_size_internal + 'px' : '0px' ;\n })\n .attr(\"font-weight\", (d) => {\n return 400\n })\n .attr(\"y\", (d) => {\n return -13\n })\n .attr(\"x\", function(d) {\n return mirror_factor ? 8 : -8;\n })\n .attr(\"text-anchor\", function(d) {\n\n return mirror_factor ? \"start\" : \"end\"\n })\n .text( (d) => {\n return \"\";\n })\n\n nodeEnter.filter(function(d) { return (d.children || d._children); })\n .append('text')\n .attr(\"class\", \"left_bottom\")\n .attr(\"dy\", \".35em\")\n //.attr(\"alignment-baseline\", \"hanging\" )\n .style('font-size', d => {\n return show_lb ? this.model.settings.style.font_size_internal + 'px': '0px' ;\n })\n .attr(\"font-weight\", (d) => {\n return 400\n })\n .attr(\"y\", (d) => {\n return 13\n })\n .attr(\"x\", function (d) {\n return mirror_factor ? 8 : -8;\n })\n .attr(\"text-anchor\", function (d) {\n\n return mirror_factor ? \"start\" : \"end\"\n })\n .text( (d) => {\n return \"\";\n })\n\n\n\n // LEAVES LABELS\n\n nodeEnter.filter(function(d) { return !(d.children || d._children); })\n .append('text')\n .attr(\"class\", \"left_top_leaf\")\n .attr(\"dy\", \".35em\")\n .style('font-size', d => {\n return show_ltl ? this.model.settings.style.font_size_internal + 'px' : '0px' ;\n })\n .attr(\"font-weight\", (d) => {\n return 400\n })\n .attr(\"y\", (d) => {\n return -13\n })\n .attr(\"x\", function(d) {\n return mirror_factor ? 8 : -8;\n })\n .attr(\"text-anchor\", function(d) {\n\n return mirror_factor ? \"start\" : \"end\"\n })\n .text( (d) => {\n return \"\";\n })\n\n nodeEnter.filter(function(d) { return !(d.children || d._children); })\n .append('text')\n .attr(\"class\", \"left_bottom_leaf\")\n .attr(\"dy\", \".35em\")\n //.attr(\"alignment-baseline\", \"hanging\" )\n .style('font-size', d => {\n return show_lbl ? this.model.settings.style.font_size_internal + 'px': '0px' ;\n })\n .attr(\"font-weight\", (d) => {\n return 400\n })\n .attr(\"y\", (d) => {\n return 13\n })\n .attr(\"x\", function (d) {\n return mirror_factor ? 8 : -8;\n })\n .attr(\"text-anchor\", function (d) {\n\n return mirror_factor ? \"start\" : \"end\"\n })\n .text( (d) => {\n return \"\";\n })\n }\n\n get_color_label(d){\n\n var acc = this.model.settings.style.color_accessor['leaf']\n var type_acc = this.model.settings.extended_data_type[acc]\n\n\n if (type_acc === 'color'){\n\n var g = d.data.extended_informations[acc];\n\n if (typeof g !== \"undefined\" ) {\n return g\n }\n\n\n }\n\n else if (acc !== null){\n\n var v = d.data.extended_informations[acc];\n\n if (typeof v !== \"undefined\" ) {\n\n if (type_acc == 'cat'){\n\n var cs = this.container_object.api.get_color_scale(acc)\n return cs.get_color(v)\n\n }\n\n else{\n return this.model.settings.colorScale['leaf'](v)\n }\n\n\n }\n\n\n }\n\n }\n\n node_face_update(nodes){\n\n var on_screen_text_size = this.compute_node_font_size()\n var on_screen_text_size_int = this.compute_node_font_size(true)\n var k = this.d3.zoomTransform(d3__WEBPACK_IMPORTED_MODULE_0__.select(\"#master_g\" + this.uid).node()).k\n\n\n var show_node_face = this.model.settings.display_nodes_labels !== false\n var show_r = show_node_face ? this.model.settings.display_internal_label !== false : false\n var show_lt = show_node_face ? this.model.settings.display_internal_label_left_top !== false: false\n var show_lb = show_node_face ? this.model.settings.display_internal_label_left_bottom !== false : false\n\n var mirror_factor = this.model.settings.mirror;\n\n\n var show_rl = this.model.settings.display_leaf_label !== false\n var show_ltl = this.model.settings.display_leaf_label_left_top !== false\n var show_lbl = this.model.settings.display_leaf_label_left_bottom !== false\n\n\n nodes.select('text.right')\n .text((d) => {\n if (d.children || d._children){\n\n if (d.data.collapse){\n\n if (this.container_object.api.settings.phylostratigraphy){\n return d.data.name\n }\n\n if (this.model.settings.use_internal_node_name_for_triangles && d.data.name != ''){\n return d.data.name\n }\n\n let l = d.data.leaves\n\n if (l.length <= 0){\n d.data.leaves = this.model.get_leaves(d.data)\n }\n\n return '[' + l[0].name + ' ... ' + l[l.length-1].name + ']'\n }\n\n\n if (d.data.force_label_show == false){\n return '';\n }\n \n return show_r || d.data.force_label_show ? this.get_label_extended_information(d, this.model.settings.display_internal_label) : '';\n }\n\n if (show_rl && this.model.settings.display_leaf_label !== 'Default'){\n return this.get_label_extended_information(d, this.model.settings.display_leaf_label)\n }\n return d.data.name;\n })\n .attr(\"x\", function(d) {\n let y_offset = (typeof d.data.triangle_width !== 'undefined') ? d.data.triangle_width : 0;\n\n var scale = k //(d.children || d._children) ? 1 : k\n\n if (mirror_factor){\n return -(y_offset + 13/scale);\n }\n\n return d.parent == null ? -13/scale : y_offset + 13/scale;\n })\n .attr(\"y\", 0)\n .attr('fill', (d) => {\n\n if (!(d.children || d._children)){\n\n return this.get_color_label(d)\n\n }\n\n let c = d.data.search_node ? \"#FF0000\" : \"#212529\";\n\n if (d.data.collapse){\n return this.color_triangle(d)\n }\n\n\n\n return c\n })\n .style('font-size', d => {if (d.children){\n if (d.data.force_label_show == false){\n return '0px';\n }\n return show_r || d.data.force_label_show ? on_screen_text_size_int + 'px' : '0px';\n } return d.subsampled ? on_screen_text_size + 'px' : '0px' ;}\n )\n .on('click', (d,i) => {\n if (i.children == null && i._children == null){\n\n this.interface.add_modal_edit_label(i, this.model.settings.display_leaf_label);\n $('#exampleModal_edit').modal('show');\n\n }\n\n else {\n this.interface.add_modal_edit_label(i, this.model.settings.display_internal_label);\n $('#exampleModal_edit').modal('show');\n }\n\n });\n\n\n\n\n // INTERNAL LABELS\n\n nodes.select('text.left_top')\n .style('font-size', d => {\n if (d.data.force_label_show == false){\n return '0px';\n }\n return show_lt || d.data.force_label_show ? on_screen_text_size_int+ 'px' : '0px';\n })\n .text( (d) => {\n if (d.data.force_label_show == false){\n return '';\n }\n return show_lt || d.data.force_label_show ? this.get_label_extended_information(d, this.model.settings.display_internal_label_left_top) : '';\n })\n .attr(\"y\", (d) => {\n return -13 /k\n })\n .attr(\"x\", function (d) {\n return mirror_factor ? 8/k : -8/k;\n })\n .on('click', (d,i) => {\n\n\n this.interface.add_modal_edit_label(i, this.model.settings.display_internal_label_left_top);\n $('#exampleModal_edit').modal('show');\n\n\n });\n\n nodes.select('text.left_bottom')\n .style('font-size', d => {\n if (d.data.force_label_show == false){\n return '0px';\n }\n return show_lb || d.data.force_label_show ? on_screen_text_size_int + 'px' : '0px';\n })\n .text( (d) => {\n if (d.data.force_label_show == false){\n return '';\n }\n return show_lb || d.data.force_label_show ? this.get_label_extended_information(d, this.model.settings.display_internal_label_left_bottom): '';\n })\n .attr(\"y\", (d) => {\n return 13 /k\n })\n .attr(\"x\", function (d) {\n return mirror_factor ? 8/k : -8/k;\n })\n .on('click', (d,i) => {\n\n\n this.interface.add_modal_edit_label(i, this.model.settings.display_internal_label_left_bottom);\n $('#exampleModal_edit').modal('show');\n\n\n\n });\n\n // LEAVES LABELS\n\n nodes.select('text.left_top_leaf')\n .style('font-size', d => {\n return show_ltl ? on_screen_text_size_int+ 'px' : '0px';\n })\n .text( (d) => {\n return show_ltl ? this.get_label_extended_information(d, this.model.settings.display_leaf_label_left_top) : '';\n })\n .attr(\"y\", (d) => {\n return -13 /k\n })\n .attr(\"x\", function (d) {\n return mirror_factor ? 8/k : -8/k;\n })\n .on('click', (d,i) => {\n\n this.interface.add_modal_edit_label(i, this.model.settings.display_leaf_label_left_top);\n $('#exampleModal_edit').modal('show');\n\n\n\n });\n\n nodes.select('text.left_bottom_leaf')\n .style('font-size', d => {\n return show_lbl ? on_screen_text_size_int + 'px' : '0px';\n })\n .text( (d) => {\n return show_lbl ? this.get_label_extended_information(d, this.model.settings.display_leaf_label_left_bottom): '';\n })\n .attr(\"y\", (d) => {\n return 13 /k\n })\n .attr(\"x\", function (d) {\n return mirror_factor ? 8/k : -8/k;\n })\n .on('click', (d,i) => {\n\n\n this.interface.add_modal_edit_label(i, this.model.settings.display_leaf_label_left_bottom);\n $('#exampleModal_edit').modal('show');\n\n\n\n });\n }\n\n node_face_exit(nodeExit){\n\n // On exit reduce the opacity of text labels\n nodeExit.select('text')\n .style('fill-opacity', 1e-6);\n }\n\n\n\n};\n\n\n\n\n//# sourceURL=webpack://PhyloIO/./src/viewer.js?");
8761
8659
 
8762
8660
  /***/ }),
8763
8661
 
@@ -8956,6 +8854,9 @@ eval("module.exports = JSON.parse('{\"2.16.840.1.101.3.4.1.1\":\"aes-128-ecb\",\
8956
8854
  /******/ return module.exports;
8957
8855
  /******/ }
8958
8856
  /******/
8857
+ /******/ // expose the modules object (__webpack_modules__)
8858
+ /******/ __webpack_require__.m = __webpack_modules__;
8859
+ /******/
8959
8860
  /************************************************************************/
8960
8861
  /******/ /* webpack/runtime/compat get default export */
8961
8862
  /******/ (() => {
@@ -8981,6 +8882,15 @@ eval("module.exports = JSON.parse('{\"2.16.840.1.101.3.4.1.1\":\"aes-128-ecb\",\
8981
8882
  /******/ };
8982
8883
  /******/ })();
8983
8884
  /******/
8885
+ /******/ /* webpack/runtime/get javascript chunk filename */
8886
+ /******/ (() => {
8887
+ /******/ // This function allow to reference async chunks
8888
+ /******/ __webpack_require__.u = (chunkId) => {
8889
+ /******/ // return url for filenames based on template
8890
+ /******/ return "" + chunkId + ".phylo.js";
8891
+ /******/ };
8892
+ /******/ })();
8893
+ /******/
8984
8894
  /******/ /* webpack/runtime/global */
8985
8895
  /******/ (() => {
8986
8896
  /******/ __webpack_require__.g = (function() {
@@ -9023,6 +8933,32 @@ eval("module.exports = JSON.parse('{\"2.16.840.1.101.3.4.1.1\":\"aes-128-ecb\",\
9023
8933
  /******/ __webpack_require__.p = "";
9024
8934
  /******/ })();
9025
8935
  /******/
8936
+ /******/ /* webpack/runtime/jsonp chunk loading */
8937
+ /******/ (() => {
8938
+ /******/ __webpack_require__.b = document.baseURI || self.location.href;
8939
+ /******/
8940
+ /******/ // object to store loaded and loading chunks
8941
+ /******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
8942
+ /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
8943
+ /******/ var installedChunks = {
8944
+ /******/ "main": 0
8945
+ /******/ };
8946
+ /******/
8947
+ /******/ // no chunk on demand loading
8948
+ /******/
8949
+ /******/ // no prefetching
8950
+ /******/
8951
+ /******/ // no preloaded
8952
+ /******/
8953
+ /******/ // no HMR
8954
+ /******/
8955
+ /******/ // no HMR manifest
8956
+ /******/
8957
+ /******/ // no on chunks loaded
8958
+ /******/
8959
+ /******/ // no jsonp function
8960
+ /******/ })();
8961
+ /******/
9026
8962
  /******/ /* webpack/runtime/nonce */
9027
8963
  /******/ (() => {
9028
8964
  /******/ __webpack_require__.nc = undefined;
@@ -9034,7 +8970,7 @@ eval("module.exports = JSON.parse('{\"2.16.840.1.101.3.4.1.1\":\"aes-128-ecb\",\
9034
8970
  /******/ // Load entry module and return exports
9035
8971
  /******/ // This entry module can't be inlined because the eval devtool is used.
9036
8972
  /******/ var __webpack_exports__ = __webpack_require__("./src/index.js");
9037
- /******/ PhyloIO = __webpack_exports__;
8973
+ /******/ module.exports.PhyloIO = __webpack_exports__;
9038
8974
  /******/
9039
8975
  /******/ })()
9040
8976
  ;