diff --git a/assets/js/app.js b/assets/js/app.js
index b0dd45c9..1cfd61ce 100644
--- a/assets/js/app.js
+++ b/assets/js/app.js
@@ -21,7 +21,7 @@ let Hooks = {
let socketPath = document.querySelector("html").getAttribute("phx-socket") || "/live"
let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content")
let liveSocket = new LiveView.LiveSocket(socketPath, Phoenix.Socket, {
- hooks: Hooks,
+ hooks: { ...Hooks, ...window.LiveDashboard.customHooks },
params: (liveViewName) => {
return {
_csrf_token: csrfToken,
diff --git a/dist/css/app.css b/dist/css/app.css
index 00594d7c..c638f54f 100644
--- a/dist/css/app.css
+++ b/dist/css/app.css
@@ -1,11914 +1,11 @@
-@charset "UTF-8";
-/* Make clicks pass-through */
-#nprogress {
- pointer-events: none;
-}
-
-#nprogress .bar {
- background: #29d;
- position: fixed;
- z-index: 1031;
- top: 0;
- left: 0;
- width: 100%;
- height: 2px;
-}
-
-/* Fancy blur effect */
-#nprogress .peg {
- display: block;
- position: absolute;
- right: 0px;
- width: 100px;
- height: 100%;
- box-shadow: 0 0 10px #29d, 0 0 5px #29d;
- opacity: 1;
- -webkit-transform: rotate(3deg) translate(0px, -4px);
- -ms-transform: rotate(3deg) translate(0px, -4px);
- transform: rotate(3deg) translate(0px, -4px);
-}
-
-/* Remove these to get rid of the spinner */
-#nprogress .spinner {
- display: block;
- position: fixed;
- z-index: 1031;
- top: 15px;
- right: 15px;
-}
-
-#nprogress .spinner-icon {
- width: 18px;
- height: 18px;
- box-sizing: border-box;
- border: solid 2px transparent;
- border-top-color: #29d;
- border-left-color: #29d;
- border-radius: 50%;
- -webkit-animation: nprogress-spinner 400ms linear infinite;
- animation: nprogress-spinner 400ms linear infinite;
-}
-
-.nprogress-custom-parent {
- overflow: hidden;
- position: relative;
-}
-
-.nprogress-custom-parent #nprogress .spinner,
-.nprogress-custom-parent #nprogress .bar {
- position: absolute;
-}
-
-@-webkit-keyframes nprogress-spinner {
- 0% {
- -webkit-transform: rotate(0deg);
- }
- 100% {
- -webkit-transform: rotate(360deg);
- }
-}
-@keyframes nprogress-spinner {
- 0% {
- transform: rotate(0deg);
- }
- 100% {
- transform: rotate(360deg);
- }
-}
-.uplot, .uplot *, .uplot *::before, .uplot *::after {
- box-sizing: border-box;
-}
-
-.uplot {
- font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- line-height: 1.5;
- width: min-content;
-}
-
-.u-title {
- text-align: center;
- font-size: 18px;
- font-weight: bold;
-}
-
-.u-wrap {
- position: relative;
- user-select: none;
-}
-
-.u-over, .u-under {
- position: absolute;
-}
-
-.u-under {
- overflow: hidden;
-}
-
-.uplot canvas {
- display: block;
- position: relative;
- width: 100%;
- height: 100%;
-}
-
-.u-axis {
- position: absolute;
-}
-
-.u-legend {
- font-size: 14px;
- margin: auto;
- text-align: center;
-}
-
-.u-inline {
- display: block;
-}
-
-.u-inline * {
- display: inline-block;
-}
-
-.u-inline tr {
- margin-right: 16px;
-}
-
-.u-legend th {
- font-weight: 600;
-}
-
-.u-legend th > * {
- vertical-align: middle;
- display: inline-block;
-}
-
-.u-legend .u-marker {
- width: 1em;
- height: 1em;
- margin-right: 4px;
- background-clip: padding-box !important;
-}
-
-.u-inline.u-live th::after {
- content: ":";
- vertical-align: middle;
-}
-
-.u-inline:not(.u-live) .u-value {
- display: none;
-}
-
-.u-series > * {
- padding: 4px;
-}
-
-.u-series th {
- cursor: pointer;
-}
-
-.u-legend .u-off > * {
- opacity: 0.3;
-}
-
-.u-select {
- background: rgba(0, 0, 0, 0.07);
- position: absolute;
- pointer-events: none;
-}
-
-.u-cursor-x, .u-cursor-y {
- position: absolute;
- left: 0;
- top: 0;
- pointer-events: none;
- will-change: transform;
- z-index: 100;
-}
-
-.u-hz .u-cursor-x, .u-vt .u-cursor-y {
- height: 100%;
- border-right: 1px dashed #607D8B;
-}
-
-.u-hz .u-cursor-y, .u-vt .u-cursor-x {
- width: 100%;
- border-bottom: 1px dashed #607D8B;
-}
-
-.u-cursor-pt {
- position: absolute;
- top: 0;
- left: 0;
- border-radius: 50%;
- border: 0 solid;
- pointer-events: none;
- will-change: transform;
- z-index: 100; /*this has to be !important since we set inline "background" shorthand */
- background-clip: padding-box !important;
-}
-
-.u-axis.u-off, .u-select.u-off, .u-cursor-x.u-off, .u-cursor-y.u-off, .u-cursor-pt.u-off {
- display: none;
-} /*!
+#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0px;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;-webkit-transform:rotate(3deg) translate(0px, -4px);-ms-transform:rotate(3deg) translate(0px, -4px);transform:rotate(3deg) translate(0px, -4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:solid 2px transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:nprogress-spinner 400ms linear infinite;animation:nprogress-spinner 400ms linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .spinner,.nprogress-custom-parent #nprogress .bar{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.uplot,.uplot *,.uplot *::before,.uplot *::after{box-sizing:border-box}.uplot{font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";line-height:1.5;width:min-content}.u-title{text-align:center;font-size:18px;font-weight:bold}.u-wrap{position:relative;user-select:none}.u-over,.u-under{position:absolute}.u-under{overflow:hidden}.uplot canvas{display:block;position:relative;width:100%;height:100%}.u-axis{position:absolute}.u-legend{font-size:14px;margin:auto;text-align:center}.u-inline{display:block}.u-inline *{display:inline-block}.u-inline tr{margin-right:16px}.u-legend th{font-weight:600}.u-legend th>*{vertical-align:middle;display:inline-block}.u-legend .u-marker{width:1em;height:1em;margin-right:4px;background-clip:padding-box !important}.u-inline.u-live th::after{content:":";vertical-align:middle}.u-inline:not(.u-live) .u-value{display:none}.u-series>*{padding:4px}.u-series th{cursor:pointer}.u-legend .u-off>*{opacity:.3}.u-select{background:rgba(0, 0, 0, 0.07);position:absolute;pointer-events:none}.u-cursor-x,.u-cursor-y{position:absolute;left:0;top:0;pointer-events:none;will-change:transform;z-index:100}.u-hz .u-cursor-x,.u-vt .u-cursor-y{height:100%;border-right:1px dashed #607d8b}.u-hz .u-cursor-y,.u-vt .u-cursor-x{width:100%;border-bottom:1px dashed #607d8b}.u-cursor-pt{position:absolute;top:0;left:0;border-radius:50%;border:0 solid;pointer-events:none;will-change:transform;z-index:100;background-clip:padding-box !important}.u-axis.u-off,.u-select.u-off,.u-cursor-x.u-off,.u-cursor-y.u-off,.u-cursor-pt.u-off{display:none}/*!
* Fonts are (c) 2011 by vernon adams (see below). LiveDashboardFont changes are in public domain.
* Copyright (c) 2011 by vernon adams (vern@newtypography.co.uk),
* with Reserved Font Name “Muli”.
* Licensed under SIL Open Font License: https://www.fontsquirrel.com/license/muli
-*/
-@font-face {
- font-family: "LiveDashboardFont";
- font-style: normal;
- font-display: swap;
- src: url("data:font/woff2;base64,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") format("woff2");
- unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
-}
-/*!
+*/@font-face{font-family:"LiveDashboardFont";font-style:normal;font-display:swap;src:url("data:font/woff2;base64,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") format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}/*!
* Bootstrap v4.6.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors
* Copyright 2011-2022 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
- */
-:root {
- --blue: #007bff;
- --indigo: #6610f2;
- --purple: #6f42c1;
- --pink: #e83e8c;
- --red: #dc3545;
- --orange: #fd7e14;
- --yellow: #ffc107;
- --green: #28a745;
- --teal: #20c997;
- --cyan: #17a2b8;
- --white: #fff;
- --gray: #6c757d;
- --gray-dark: #343a40;
- --primary: #4575cf;
- --secondary: #6c757d;
- --success: #28a745;
- --info: #17a2b8;
- --warning: #ffc107;
- --danger: #dc3545;
- --light: #f8f9fa;
- --dark: #343a40;
- --breakpoint-xs: 0;
- --breakpoint-sm: 576px;
- --breakpoint-md: 768px;
- --breakpoint-lg: 992px;
- --breakpoint-xl: 1200px;
- --breakpoint-xxl: 1600px;
- --breakpoint-xxxl: 2600px;
- --font-family-sans-serif: "LiveDashboardFont", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
-}
-
-*,
-*::before,
-*::after {
- box-sizing: border-box;
-}
-
-html {
- font-family: sans-serif;
- line-height: 1.15;
- -webkit-text-size-adjust: 100%;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-}
-
-article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
- display: block;
-}
-
-body {
- margin: 0;
- font-family: "LiveDashboardFont", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- font-size: 1rem;
- font-weight: 400;
- line-height: 1.5;
- color: #212529;
- text-align: left;
- background-color: #fff;
-}
-
-[tabindex="-1"]:focus:not(:focus-visible) {
- outline: 0 !important;
-}
-
-hr {
- box-sizing: content-box;
- height: 0;
- overflow: visible;
-}
-
-h1, h2, h3, h4, h5, h6 {
- margin-top: 0;
- margin-bottom: 0.5rem;
-}
-
-p {
- margin-top: 0;
- margin-bottom: 1rem;
-}
-
-abbr[title],
-abbr[data-original-title] {
- text-decoration: underline;
- text-decoration: underline dotted;
- cursor: help;
- border-bottom: 0;
- text-decoration-skip-ink: none;
-}
-
-address {
- margin-bottom: 1rem;
- font-style: normal;
- line-height: inherit;
-}
-
-ol,
-ul,
-dl {
- margin-top: 0;
- margin-bottom: 1rem;
-}
-
-ol ol,
-ul ul,
-ol ul,
-ul ol {
- margin-bottom: 0;
-}
-
-dt {
- font-weight: 700;
-}
-
-dd {
- margin-bottom: 0.5rem;
- margin-left: 0;
-}
-
-blockquote {
- margin: 0 0 1rem;
-}
-
-b,
-strong {
- font-weight: bolder;
-}
-
-small {
- font-size: 80%;
-}
-
-sub,
-sup {
- position: relative;
- font-size: 75%;
- line-height: 0;
- vertical-align: baseline;
-}
-
-sub {
- bottom: -0.25em;
-}
-
-sup {
- top: -0.5em;
-}
-
-a {
- color: #4575cf;
- text-decoration: none;
- background-color: transparent;
-}
-a:hover {
- color: #29529f;
- text-decoration: underline;
-}
-
-a:not([href]):not([class]) {
- color: inherit;
- text-decoration: none;
-}
-a:not([href]):not([class]):hover {
- color: inherit;
- text-decoration: none;
-}
-
-pre,
-code,
-kbd,
-samp {
- font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
- font-size: 1em;
-}
-
-pre {
- margin-top: 0;
- margin-bottom: 1rem;
- overflow: auto;
- -ms-overflow-style: scrollbar;
-}
-
-figure {
- margin: 0 0 1rem;
-}
-
-img {
- vertical-align: middle;
- border-style: none;
-}
-
-svg {
- overflow: hidden;
- vertical-align: middle;
-}
-
-table {
- border-collapse: collapse;
-}
-
-caption {
- padding-top: 0.75rem;
- padding-bottom: 0.75rem;
- color: rgba(85, 91, 104, 0.5);
- text-align: left;
- caption-side: bottom;
-}
-
-th {
- text-align: inherit;
- text-align: -webkit-match-parent;
-}
-
-label {
- display: inline-block;
- margin-bottom: 0.5rem;
-}
-
-button {
- border-radius: 0;
-}
-
-button:focus:not(:focus-visible) {
- outline: 0;
-}
-
-input,
-button,
-select,
-optgroup,
-textarea {
- margin: 0;
- font-family: inherit;
- font-size: inherit;
- line-height: inherit;
-}
-
-button,
-input {
- overflow: visible;
-}
-
-button,
-select {
- text-transform: none;
-}
-
-[role=button] {
- cursor: pointer;
-}
-
-select {
- word-wrap: normal;
-}
-
-button,
-[type=button],
-[type=reset],
-[type=submit] {
- -webkit-appearance: button;
-}
-
-button:not(:disabled),
-[type=button]:not(:disabled),
-[type=reset]:not(:disabled),
-[type=submit]:not(:disabled) {
- cursor: pointer;
-}
-
-button::-moz-focus-inner,
-[type=button]::-moz-focus-inner,
-[type=reset]::-moz-focus-inner,
-[type=submit]::-moz-focus-inner {
- padding: 0;
- border-style: none;
-}
-
-input[type=radio],
-input[type=checkbox] {
- box-sizing: border-box;
- padding: 0;
-}
-
-textarea {
- overflow: auto;
- resize: vertical;
-}
-
-fieldset {
- min-width: 0;
- padding: 0;
- margin: 0;
- border: 0;
-}
-
-legend {
- display: block;
- width: 100%;
- max-width: 100%;
- padding: 0;
- margin-bottom: 0.5rem;
- font-size: 1.5rem;
- line-height: inherit;
- color: inherit;
- white-space: normal;
-}
-
-progress {
- vertical-align: baseline;
-}
-
-[type=number]::-webkit-inner-spin-button,
-[type=number]::-webkit-outer-spin-button {
- height: auto;
-}
-
-[type=search] {
- outline-offset: -2px;
- -webkit-appearance: none;
-}
-
-[type=search]::-webkit-search-decoration {
- -webkit-appearance: none;
-}
-
-::-webkit-file-upload-button {
- font: inherit;
- -webkit-appearance: button;
-}
-
-output {
- display: inline-block;
-}
-
-summary {
- display: list-item;
- cursor: pointer;
-}
-
-template {
- display: none;
-}
-
-[hidden] {
- display: none !important;
-}
-
-h1, h2, h3, h4, h5, h6,
-.h1, .h2, .h3, .h4, .h5, .h6 {
- margin-bottom: 0.5rem;
- font-weight: 500;
- line-height: 1.2;
-}
-
-h1, .h1 {
- font-size: 2.5rem;
-}
-
-h2, .h2 {
- font-size: 2rem;
-}
-
-h3, .h3 {
- font-size: 1.75rem;
-}
-
-h4, .h4 {
- font-size: 1.5rem;
-}
-
-h5, .h5 {
- font-size: 1.25rem;
-}
-
-h6, .h6 {
- font-size: 1rem;
-}
-
-.lead {
- font-size: 1.25rem;
- font-weight: 300;
-}
-
-.display-1 {
- font-size: 6rem;
- font-weight: 300;
- line-height: 1.2;
-}
-
-.display-2 {
- font-size: 5.5rem;
- font-weight: 300;
- line-height: 1.2;
-}
-
-.display-3 {
- font-size: 4.5rem;
- font-weight: 300;
- line-height: 1.2;
-}
-
-.display-4 {
- font-size: 3.5rem;
- font-weight: 300;
- line-height: 1.2;
-}
-
-hr {
- margin-top: 1rem;
- margin-bottom: 1rem;
- border: 0;
- border-top: 1px solid rgba(0, 0, 0, 0.1);
-}
-
-small,
-.small {
- font-size: 0.875em;
- font-weight: 400;
-}
-
-mark,
-.mark {
- padding: 0.2em;
- background-color: #fcf8e3;
-}
-
-.list-unstyled {
- padding-left: 0;
- list-style: none;
-}
-
-.list-inline {
- padding-left: 0;
- list-style: none;
-}
-
-.list-inline-item {
- display: inline-block;
-}
-.list-inline-item:not(:last-child) {
- margin-right: 0.5rem;
-}
-
-.initialism {
- font-size: 90%;
- text-transform: uppercase;
-}
-
-.blockquote {
- margin-bottom: 1rem;
- font-size: 1.25rem;
-}
-
-.blockquote-footer {
- display: block;
- font-size: 0.875em;
- color: #6c757d;
-}
-.blockquote-footer::before {
- content: "— ";
-}
-
-.img-fluid {
- max-width: 100%;
- height: auto;
-}
-
-.img-thumbnail {
- padding: 0.25rem;
- background-color: #fff;
- border: 1px solid #dee2e6;
- border-radius: 6px;
- max-width: 100%;
- height: auto;
-}
-
-.figure {
- display: inline-block;
-}
-
-.figure-img {
- margin-bottom: 0.5rem;
- line-height: 1;
-}
-
-.figure-caption {
- font-size: 90%;
- color: #6c757d;
-}
-
-code {
- font-size: 87.5%;
- color: #e83e8c;
- word-wrap: break-word;
-}
-a > code {
- color: inherit;
-}
-
-kbd {
- padding: 0.2rem 0.4rem;
- font-size: 87.5%;
- color: #fff;
- background-color: #212529;
- border-radius: 0.2rem;
-}
-kbd kbd {
- padding: 0;
- font-size: 100%;
- font-weight: 700;
-}
-
-pre {
- display: block;
- font-size: 87.5%;
- color: #212529;
-}
-pre code {
- font-size: inherit;
- color: inherit;
- word-break: normal;
-}
-
-.pre-scrollable {
- max-height: 340px;
- overflow-y: scroll;
-}
-
-.container,
-.container-fluid,
-.container-xxxl,
-.container-xxl,
-.container-xl,
-.container-lg,
-.container-md,
-.container-sm {
- width: 100%;
- padding-right: 12px;
- padding-left: 12px;
- margin-right: auto;
- margin-left: auto;
-}
-
-@media (min-width: 576px) {
- .container-sm, .container {
- max-width: 540px;
- }
-}
-@media (min-width: 768px) {
- .container-md, .container-sm, .container {
- max-width: 720px;
- }
-}
-@media (min-width: 992px) {
- .container-lg, .container-md, .container-sm, .container {
- max-width: 960px;
- }
-}
-@media (min-width: 1200px) {
- .container-xl, .container-lg, .container-md, .container-sm, .container {
- max-width: 1140px;
- }
-}
-@media (min-width: 1600px) {
- .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {
- max-width: 1300px;
- }
-}
-@media (min-width: 2600px) {
- .container-xxxl, .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {
- max-width: 1500px;
- }
-}
-.row {
- display: flex;
- flex-wrap: wrap;
- margin-right: -12px;
- margin-left: -12px;
-}
-
-.no-gutters {
- margin-right: 0;
- margin-left: 0;
-}
-.no-gutters > .col,
-.no-gutters > [class*=col-] {
- padding-right: 0;
- padding-left: 0;
-}
-
-.col-xxxl,
-.col-xxxl-auto, .col-xxxl-12, .col-xxxl-11, .col-xxxl-10, .col-xxxl-9, .col-xxxl-8, .col-xxxl-7, .col-xxxl-6, .col-xxxl-5, .col-xxxl-4, .col-xxxl-3, .col-xxxl-2, .col-xxxl-1, .col-xxl,
-.col-xxl-auto, .col-xxl-12, .col-xxl-11, .col-xxl-10, .col-xxl-9, .col-xxl-8, .col-xxl-7, .col-xxl-6, .col-xxl-5, .col-xxl-4, .col-xxl-3, .col-xxl-2, .col-xxl-1, .col-xl,
-.col-xl-auto, .col-xl-12, .col-xl-11, .col-xl-10, .col-xl-9, .col-xl-8, .col-xl-7, .col-xl-6, .col-xl-5, .col-xl-4, .col-xl-3, .col-xl-2, .col-xl-1, .col-lg,
-.col-lg-auto, .col-lg-12, .col-lg-11, .col-lg-10, .col-lg-9, .col-lg-8, .col-lg-7, .col-lg-6, .col-lg-5, .col-lg-4, .col-lg-3, .col-lg-2, .col-lg-1, .col-md,
-.col-md-auto, .col-md-12, .col-md-11, .col-md-10, .col-md-9, .col-md-8, .col-md-7, .col-md-6, .col-md-5, .col-md-4, .col-md-3, .col-md-2, .col-md-1, .col-sm,
-.col-sm-auto, .col-sm-12, .col-sm-11, .col-sm-10, .col-sm-9, .col-sm-8, .col-sm-7, .col-sm-6, .col-sm-5, .col-sm-4, .col-sm-3, .col-sm-2, .col-sm-1, .col,
-.col-auto, .col-12, .col-11, .col-10, .col-9, .col-8, .col-7, .col-6, .col-5, .col-4, .col-3, .col-2, .col-1 {
- position: relative;
- width: 100%;
- padding-right: 12px;
- padding-left: 12px;
-}
-
-.col {
- flex-basis: 0;
- flex-grow: 1;
- max-width: 100%;
-}
-
-.row-cols-1 > * {
- flex: 0 0 100%;
- max-width: 100%;
-}
-
-.row-cols-2 > * {
- flex: 0 0 50%;
- max-width: 50%;
-}
-
-.row-cols-3 > * {
- flex: 0 0 33.3333333333%;
- max-width: 33.3333333333%;
-}
-
-.row-cols-4 > * {
- flex: 0 0 25%;
- max-width: 25%;
-}
-
-.row-cols-5 > * {
- flex: 0 0 20%;
- max-width: 20%;
-}
-
-.row-cols-6 > * {
- flex: 0 0 16.6666666667%;
- max-width: 16.6666666667%;
-}
-
-.col-auto {
- flex: 0 0 auto;
- width: auto;
- max-width: 100%;
-}
-
-.col-1 {
- flex: 0 0 8.33333333%;
- max-width: 8.33333333%;
-}
-
-.col-2 {
- flex: 0 0 16.66666667%;
- max-width: 16.66666667%;
-}
-
-.col-3 {
- flex: 0 0 25%;
- max-width: 25%;
-}
-
-.col-4 {
- flex: 0 0 33.33333333%;
- max-width: 33.33333333%;
-}
-
-.col-5 {
- flex: 0 0 41.66666667%;
- max-width: 41.66666667%;
-}
-
-.col-6 {
- flex: 0 0 50%;
- max-width: 50%;
-}
-
-.col-7 {
- flex: 0 0 58.33333333%;
- max-width: 58.33333333%;
-}
-
-.col-8 {
- flex: 0 0 66.66666667%;
- max-width: 66.66666667%;
-}
-
-.col-9 {
- flex: 0 0 75%;
- max-width: 75%;
-}
-
-.col-10 {
- flex: 0 0 83.33333333%;
- max-width: 83.33333333%;
-}
-
-.col-11 {
- flex: 0 0 91.66666667%;
- max-width: 91.66666667%;
-}
-
-.col-12 {
- flex: 0 0 100%;
- max-width: 100%;
-}
-
-.order-first {
- order: -1;
-}
-
-.order-last {
- order: 13;
-}
-
-.order-0 {
- order: 0;
-}
-
-.order-1 {
- order: 1;
-}
-
-.order-2 {
- order: 2;
-}
-
-.order-3 {
- order: 3;
-}
-
-.order-4 {
- order: 4;
-}
-
-.order-5 {
- order: 5;
-}
-
-.order-6 {
- order: 6;
-}
-
-.order-7 {
- order: 7;
-}
-
-.order-8 {
- order: 8;
-}
-
-.order-9 {
- order: 9;
-}
-
-.order-10 {
- order: 10;
-}
-
-.order-11 {
- order: 11;
-}
-
-.order-12 {
- order: 12;
-}
-
-.offset-1 {
- margin-left: 8.33333333%;
-}
-
-.offset-2 {
- margin-left: 16.66666667%;
-}
-
-.offset-3 {
- margin-left: 25%;
-}
-
-.offset-4 {
- margin-left: 33.33333333%;
-}
-
-.offset-5 {
- margin-left: 41.66666667%;
-}
-
-.offset-6 {
- margin-left: 50%;
-}
-
-.offset-7 {
- margin-left: 58.33333333%;
-}
-
-.offset-8 {
- margin-left: 66.66666667%;
-}
-
-.offset-9 {
- margin-left: 75%;
-}
-
-.offset-10 {
- margin-left: 83.33333333%;
-}
-
-.offset-11 {
- margin-left: 91.66666667%;
-}
-
-@media (min-width: 576px) {
- .col-sm {
- flex-basis: 0;
- flex-grow: 1;
- max-width: 100%;
- }
- .row-cols-sm-1 > * {
- flex: 0 0 100%;
- max-width: 100%;
- }
- .row-cols-sm-2 > * {
- flex: 0 0 50%;
- max-width: 50%;
- }
- .row-cols-sm-3 > * {
- flex: 0 0 33.3333333333%;
- max-width: 33.3333333333%;
- }
- .row-cols-sm-4 > * {
- flex: 0 0 25%;
- max-width: 25%;
- }
- .row-cols-sm-5 > * {
- flex: 0 0 20%;
- max-width: 20%;
- }
- .row-cols-sm-6 > * {
- flex: 0 0 16.6666666667%;
- max-width: 16.6666666667%;
- }
- .col-sm-auto {
- flex: 0 0 auto;
- width: auto;
- max-width: 100%;
- }
- .col-sm-1 {
- flex: 0 0 8.33333333%;
- max-width: 8.33333333%;
- }
- .col-sm-2 {
- flex: 0 0 16.66666667%;
- max-width: 16.66666667%;
- }
- .col-sm-3 {
- flex: 0 0 25%;
- max-width: 25%;
- }
- .col-sm-4 {
- flex: 0 0 33.33333333%;
- max-width: 33.33333333%;
- }
- .col-sm-5 {
- flex: 0 0 41.66666667%;
- max-width: 41.66666667%;
- }
- .col-sm-6 {
- flex: 0 0 50%;
- max-width: 50%;
- }
- .col-sm-7 {
- flex: 0 0 58.33333333%;
- max-width: 58.33333333%;
- }
- .col-sm-8 {
- flex: 0 0 66.66666667%;
- max-width: 66.66666667%;
- }
- .col-sm-9 {
- flex: 0 0 75%;
- max-width: 75%;
- }
- .col-sm-10 {
- flex: 0 0 83.33333333%;
- max-width: 83.33333333%;
- }
- .col-sm-11 {
- flex: 0 0 91.66666667%;
- max-width: 91.66666667%;
- }
- .col-sm-12 {
- flex: 0 0 100%;
- max-width: 100%;
- }
- .order-sm-first {
- order: -1;
- }
- .order-sm-last {
- order: 13;
- }
- .order-sm-0 {
- order: 0;
- }
- .order-sm-1 {
- order: 1;
- }
- .order-sm-2 {
- order: 2;
- }
- .order-sm-3 {
- order: 3;
- }
- .order-sm-4 {
- order: 4;
- }
- .order-sm-5 {
- order: 5;
- }
- .order-sm-6 {
- order: 6;
- }
- .order-sm-7 {
- order: 7;
- }
- .order-sm-8 {
- order: 8;
- }
- .order-sm-9 {
- order: 9;
- }
- .order-sm-10 {
- order: 10;
- }
- .order-sm-11 {
- order: 11;
- }
- .order-sm-12 {
- order: 12;
- }
- .offset-sm-0 {
- margin-left: 0;
- }
- .offset-sm-1 {
- margin-left: 8.33333333%;
- }
- .offset-sm-2 {
- margin-left: 16.66666667%;
- }
- .offset-sm-3 {
- margin-left: 25%;
- }
- .offset-sm-4 {
- margin-left: 33.33333333%;
- }
- .offset-sm-5 {
- margin-left: 41.66666667%;
- }
- .offset-sm-6 {
- margin-left: 50%;
- }
- .offset-sm-7 {
- margin-left: 58.33333333%;
- }
- .offset-sm-8 {
- margin-left: 66.66666667%;
- }
- .offset-sm-9 {
- margin-left: 75%;
- }
- .offset-sm-10 {
- margin-left: 83.33333333%;
- }
- .offset-sm-11 {
- margin-left: 91.66666667%;
- }
-}
-@media (min-width: 768px) {
- .col-md {
- flex-basis: 0;
- flex-grow: 1;
- max-width: 100%;
- }
- .row-cols-md-1 > * {
- flex: 0 0 100%;
- max-width: 100%;
- }
- .row-cols-md-2 > * {
- flex: 0 0 50%;
- max-width: 50%;
- }
- .row-cols-md-3 > * {
- flex: 0 0 33.3333333333%;
- max-width: 33.3333333333%;
- }
- .row-cols-md-4 > * {
- flex: 0 0 25%;
- max-width: 25%;
- }
- .row-cols-md-5 > * {
- flex: 0 0 20%;
- max-width: 20%;
- }
- .row-cols-md-6 > * {
- flex: 0 0 16.6666666667%;
- max-width: 16.6666666667%;
- }
- .col-md-auto {
- flex: 0 0 auto;
- width: auto;
- max-width: 100%;
- }
- .col-md-1 {
- flex: 0 0 8.33333333%;
- max-width: 8.33333333%;
- }
- .col-md-2 {
- flex: 0 0 16.66666667%;
- max-width: 16.66666667%;
- }
- .col-md-3 {
- flex: 0 0 25%;
- max-width: 25%;
- }
- .col-md-4 {
- flex: 0 0 33.33333333%;
- max-width: 33.33333333%;
- }
- .col-md-5 {
- flex: 0 0 41.66666667%;
- max-width: 41.66666667%;
- }
- .col-md-6 {
- flex: 0 0 50%;
- max-width: 50%;
- }
- .col-md-7 {
- flex: 0 0 58.33333333%;
- max-width: 58.33333333%;
- }
- .col-md-8 {
- flex: 0 0 66.66666667%;
- max-width: 66.66666667%;
- }
- .col-md-9 {
- flex: 0 0 75%;
- max-width: 75%;
- }
- .col-md-10 {
- flex: 0 0 83.33333333%;
- max-width: 83.33333333%;
- }
- .col-md-11 {
- flex: 0 0 91.66666667%;
- max-width: 91.66666667%;
- }
- .col-md-12 {
- flex: 0 0 100%;
- max-width: 100%;
- }
- .order-md-first {
- order: -1;
- }
- .order-md-last {
- order: 13;
- }
- .order-md-0 {
- order: 0;
- }
- .order-md-1 {
- order: 1;
- }
- .order-md-2 {
- order: 2;
- }
- .order-md-3 {
- order: 3;
- }
- .order-md-4 {
- order: 4;
- }
- .order-md-5 {
- order: 5;
- }
- .order-md-6 {
- order: 6;
- }
- .order-md-7 {
- order: 7;
- }
- .order-md-8 {
- order: 8;
- }
- .order-md-9 {
- order: 9;
- }
- .order-md-10 {
- order: 10;
- }
- .order-md-11 {
- order: 11;
- }
- .order-md-12 {
- order: 12;
- }
- .offset-md-0 {
- margin-left: 0;
- }
- .offset-md-1 {
- margin-left: 8.33333333%;
- }
- .offset-md-2 {
- margin-left: 16.66666667%;
- }
- .offset-md-3 {
- margin-left: 25%;
- }
- .offset-md-4 {
- margin-left: 33.33333333%;
- }
- .offset-md-5 {
- margin-left: 41.66666667%;
- }
- .offset-md-6 {
- margin-left: 50%;
- }
- .offset-md-7 {
- margin-left: 58.33333333%;
- }
- .offset-md-8 {
- margin-left: 66.66666667%;
- }
- .offset-md-9 {
- margin-left: 75%;
- }
- .offset-md-10 {
- margin-left: 83.33333333%;
- }
- .offset-md-11 {
- margin-left: 91.66666667%;
- }
-}
-@media (min-width: 992px) {
- .col-lg {
- flex-basis: 0;
- flex-grow: 1;
- max-width: 100%;
- }
- .row-cols-lg-1 > * {
- flex: 0 0 100%;
- max-width: 100%;
- }
- .row-cols-lg-2 > * {
- flex: 0 0 50%;
- max-width: 50%;
- }
- .row-cols-lg-3 > * {
- flex: 0 0 33.3333333333%;
- max-width: 33.3333333333%;
- }
- .row-cols-lg-4 > * {
- flex: 0 0 25%;
- max-width: 25%;
- }
- .row-cols-lg-5 > * {
- flex: 0 0 20%;
- max-width: 20%;
- }
- .row-cols-lg-6 > * {
- flex: 0 0 16.6666666667%;
- max-width: 16.6666666667%;
- }
- .col-lg-auto {
- flex: 0 0 auto;
- width: auto;
- max-width: 100%;
- }
- .col-lg-1 {
- flex: 0 0 8.33333333%;
- max-width: 8.33333333%;
- }
- .col-lg-2 {
- flex: 0 0 16.66666667%;
- max-width: 16.66666667%;
- }
- .col-lg-3 {
- flex: 0 0 25%;
- max-width: 25%;
- }
- .col-lg-4 {
- flex: 0 0 33.33333333%;
- max-width: 33.33333333%;
- }
- .col-lg-5 {
- flex: 0 0 41.66666667%;
- max-width: 41.66666667%;
- }
- .col-lg-6 {
- flex: 0 0 50%;
- max-width: 50%;
- }
- .col-lg-7 {
- flex: 0 0 58.33333333%;
- max-width: 58.33333333%;
- }
- .col-lg-8 {
- flex: 0 0 66.66666667%;
- max-width: 66.66666667%;
- }
- .col-lg-9 {
- flex: 0 0 75%;
- max-width: 75%;
- }
- .col-lg-10 {
- flex: 0 0 83.33333333%;
- max-width: 83.33333333%;
- }
- .col-lg-11 {
- flex: 0 0 91.66666667%;
- max-width: 91.66666667%;
- }
- .col-lg-12 {
- flex: 0 0 100%;
- max-width: 100%;
- }
- .order-lg-first {
- order: -1;
- }
- .order-lg-last {
- order: 13;
- }
- .order-lg-0 {
- order: 0;
- }
- .order-lg-1 {
- order: 1;
- }
- .order-lg-2 {
- order: 2;
- }
- .order-lg-3 {
- order: 3;
- }
- .order-lg-4 {
- order: 4;
- }
- .order-lg-5 {
- order: 5;
- }
- .order-lg-6 {
- order: 6;
- }
- .order-lg-7 {
- order: 7;
- }
- .order-lg-8 {
- order: 8;
- }
- .order-lg-9 {
- order: 9;
- }
- .order-lg-10 {
- order: 10;
- }
- .order-lg-11 {
- order: 11;
- }
- .order-lg-12 {
- order: 12;
- }
- .offset-lg-0 {
- margin-left: 0;
- }
- .offset-lg-1 {
- margin-left: 8.33333333%;
- }
- .offset-lg-2 {
- margin-left: 16.66666667%;
- }
- .offset-lg-3 {
- margin-left: 25%;
- }
- .offset-lg-4 {
- margin-left: 33.33333333%;
- }
- .offset-lg-5 {
- margin-left: 41.66666667%;
- }
- .offset-lg-6 {
- margin-left: 50%;
- }
- .offset-lg-7 {
- margin-left: 58.33333333%;
- }
- .offset-lg-8 {
- margin-left: 66.66666667%;
- }
- .offset-lg-9 {
- margin-left: 75%;
- }
- .offset-lg-10 {
- margin-left: 83.33333333%;
- }
- .offset-lg-11 {
- margin-left: 91.66666667%;
- }
-}
-@media (min-width: 1200px) {
- .col-xl {
- flex-basis: 0;
- flex-grow: 1;
- max-width: 100%;
- }
- .row-cols-xl-1 > * {
- flex: 0 0 100%;
- max-width: 100%;
- }
- .row-cols-xl-2 > * {
- flex: 0 0 50%;
- max-width: 50%;
- }
- .row-cols-xl-3 > * {
- flex: 0 0 33.3333333333%;
- max-width: 33.3333333333%;
- }
- .row-cols-xl-4 > * {
- flex: 0 0 25%;
- max-width: 25%;
- }
- .row-cols-xl-5 > * {
- flex: 0 0 20%;
- max-width: 20%;
- }
- .row-cols-xl-6 > * {
- flex: 0 0 16.6666666667%;
- max-width: 16.6666666667%;
- }
- .col-xl-auto {
- flex: 0 0 auto;
- width: auto;
- max-width: 100%;
- }
- .col-xl-1 {
- flex: 0 0 8.33333333%;
- max-width: 8.33333333%;
- }
- .col-xl-2 {
- flex: 0 0 16.66666667%;
- max-width: 16.66666667%;
- }
- .col-xl-3 {
- flex: 0 0 25%;
- max-width: 25%;
- }
- .col-xl-4 {
- flex: 0 0 33.33333333%;
- max-width: 33.33333333%;
- }
- .col-xl-5 {
- flex: 0 0 41.66666667%;
- max-width: 41.66666667%;
- }
- .col-xl-6 {
- flex: 0 0 50%;
- max-width: 50%;
- }
- .col-xl-7 {
- flex: 0 0 58.33333333%;
- max-width: 58.33333333%;
- }
- .col-xl-8 {
- flex: 0 0 66.66666667%;
- max-width: 66.66666667%;
- }
- .col-xl-9 {
- flex: 0 0 75%;
- max-width: 75%;
- }
- .col-xl-10 {
- flex: 0 0 83.33333333%;
- max-width: 83.33333333%;
- }
- .col-xl-11 {
- flex: 0 0 91.66666667%;
- max-width: 91.66666667%;
- }
- .col-xl-12 {
- flex: 0 0 100%;
- max-width: 100%;
- }
- .order-xl-first {
- order: -1;
- }
- .order-xl-last {
- order: 13;
- }
- .order-xl-0 {
- order: 0;
- }
- .order-xl-1 {
- order: 1;
- }
- .order-xl-2 {
- order: 2;
- }
- .order-xl-3 {
- order: 3;
- }
- .order-xl-4 {
- order: 4;
- }
- .order-xl-5 {
- order: 5;
- }
- .order-xl-6 {
- order: 6;
- }
- .order-xl-7 {
- order: 7;
- }
- .order-xl-8 {
- order: 8;
- }
- .order-xl-9 {
- order: 9;
- }
- .order-xl-10 {
- order: 10;
- }
- .order-xl-11 {
- order: 11;
- }
- .order-xl-12 {
- order: 12;
- }
- .offset-xl-0 {
- margin-left: 0;
- }
- .offset-xl-1 {
- margin-left: 8.33333333%;
- }
- .offset-xl-2 {
- margin-left: 16.66666667%;
- }
- .offset-xl-3 {
- margin-left: 25%;
- }
- .offset-xl-4 {
- margin-left: 33.33333333%;
- }
- .offset-xl-5 {
- margin-left: 41.66666667%;
- }
- .offset-xl-6 {
- margin-left: 50%;
- }
- .offset-xl-7 {
- margin-left: 58.33333333%;
- }
- .offset-xl-8 {
- margin-left: 66.66666667%;
- }
- .offset-xl-9 {
- margin-left: 75%;
- }
- .offset-xl-10 {
- margin-left: 83.33333333%;
- }
- .offset-xl-11 {
- margin-left: 91.66666667%;
- }
-}
-@media (min-width: 1600px) {
- .col-xxl {
- flex-basis: 0;
- flex-grow: 1;
- max-width: 100%;
- }
- .row-cols-xxl-1 > * {
- flex: 0 0 100%;
- max-width: 100%;
- }
- .row-cols-xxl-2 > * {
- flex: 0 0 50%;
- max-width: 50%;
- }
- .row-cols-xxl-3 > * {
- flex: 0 0 33.3333333333%;
- max-width: 33.3333333333%;
- }
- .row-cols-xxl-4 > * {
- flex: 0 0 25%;
- max-width: 25%;
- }
- .row-cols-xxl-5 > * {
- flex: 0 0 20%;
- max-width: 20%;
- }
- .row-cols-xxl-6 > * {
- flex: 0 0 16.6666666667%;
- max-width: 16.6666666667%;
- }
- .col-xxl-auto {
- flex: 0 0 auto;
- width: auto;
- max-width: 100%;
- }
- .col-xxl-1 {
- flex: 0 0 8.33333333%;
- max-width: 8.33333333%;
- }
- .col-xxl-2 {
- flex: 0 0 16.66666667%;
- max-width: 16.66666667%;
- }
- .col-xxl-3 {
- flex: 0 0 25%;
- max-width: 25%;
- }
- .col-xxl-4 {
- flex: 0 0 33.33333333%;
- max-width: 33.33333333%;
- }
- .col-xxl-5 {
- flex: 0 0 41.66666667%;
- max-width: 41.66666667%;
- }
- .col-xxl-6 {
- flex: 0 0 50%;
- max-width: 50%;
- }
- .col-xxl-7 {
- flex: 0 0 58.33333333%;
- max-width: 58.33333333%;
- }
- .col-xxl-8 {
- flex: 0 0 66.66666667%;
- max-width: 66.66666667%;
- }
- .col-xxl-9 {
- flex: 0 0 75%;
- max-width: 75%;
- }
- .col-xxl-10 {
- flex: 0 0 83.33333333%;
- max-width: 83.33333333%;
- }
- .col-xxl-11 {
- flex: 0 0 91.66666667%;
- max-width: 91.66666667%;
- }
- .col-xxl-12 {
- flex: 0 0 100%;
- max-width: 100%;
- }
- .order-xxl-first {
- order: -1;
- }
- .order-xxl-last {
- order: 13;
- }
- .order-xxl-0 {
- order: 0;
- }
- .order-xxl-1 {
- order: 1;
- }
- .order-xxl-2 {
- order: 2;
- }
- .order-xxl-3 {
- order: 3;
- }
- .order-xxl-4 {
- order: 4;
- }
- .order-xxl-5 {
- order: 5;
- }
- .order-xxl-6 {
- order: 6;
- }
- .order-xxl-7 {
- order: 7;
- }
- .order-xxl-8 {
- order: 8;
- }
- .order-xxl-9 {
- order: 9;
- }
- .order-xxl-10 {
- order: 10;
- }
- .order-xxl-11 {
- order: 11;
- }
- .order-xxl-12 {
- order: 12;
- }
- .offset-xxl-0 {
- margin-left: 0;
- }
- .offset-xxl-1 {
- margin-left: 8.33333333%;
- }
- .offset-xxl-2 {
- margin-left: 16.66666667%;
- }
- .offset-xxl-3 {
- margin-left: 25%;
- }
- .offset-xxl-4 {
- margin-left: 33.33333333%;
- }
- .offset-xxl-5 {
- margin-left: 41.66666667%;
- }
- .offset-xxl-6 {
- margin-left: 50%;
- }
- .offset-xxl-7 {
- margin-left: 58.33333333%;
- }
- .offset-xxl-8 {
- margin-left: 66.66666667%;
- }
- .offset-xxl-9 {
- margin-left: 75%;
- }
- .offset-xxl-10 {
- margin-left: 83.33333333%;
- }
- .offset-xxl-11 {
- margin-left: 91.66666667%;
- }
-}
-@media (min-width: 2600px) {
- .col-xxxl {
- flex-basis: 0;
- flex-grow: 1;
- max-width: 100%;
- }
- .row-cols-xxxl-1 > * {
- flex: 0 0 100%;
- max-width: 100%;
- }
- .row-cols-xxxl-2 > * {
- flex: 0 0 50%;
- max-width: 50%;
- }
- .row-cols-xxxl-3 > * {
- flex: 0 0 33.3333333333%;
- max-width: 33.3333333333%;
- }
- .row-cols-xxxl-4 > * {
- flex: 0 0 25%;
- max-width: 25%;
- }
- .row-cols-xxxl-5 > * {
- flex: 0 0 20%;
- max-width: 20%;
- }
- .row-cols-xxxl-6 > * {
- flex: 0 0 16.6666666667%;
- max-width: 16.6666666667%;
- }
- .col-xxxl-auto {
- flex: 0 0 auto;
- width: auto;
- max-width: 100%;
- }
- .col-xxxl-1 {
- flex: 0 0 8.33333333%;
- max-width: 8.33333333%;
- }
- .col-xxxl-2 {
- flex: 0 0 16.66666667%;
- max-width: 16.66666667%;
- }
- .col-xxxl-3 {
- flex: 0 0 25%;
- max-width: 25%;
- }
- .col-xxxl-4 {
- flex: 0 0 33.33333333%;
- max-width: 33.33333333%;
- }
- .col-xxxl-5 {
- flex: 0 0 41.66666667%;
- max-width: 41.66666667%;
- }
- .col-xxxl-6 {
- flex: 0 0 50%;
- max-width: 50%;
- }
- .col-xxxl-7 {
- flex: 0 0 58.33333333%;
- max-width: 58.33333333%;
- }
- .col-xxxl-8 {
- flex: 0 0 66.66666667%;
- max-width: 66.66666667%;
- }
- .col-xxxl-9 {
- flex: 0 0 75%;
- max-width: 75%;
- }
- .col-xxxl-10 {
- flex: 0 0 83.33333333%;
- max-width: 83.33333333%;
- }
- .col-xxxl-11 {
- flex: 0 0 91.66666667%;
- max-width: 91.66666667%;
- }
- .col-xxxl-12 {
- flex: 0 0 100%;
- max-width: 100%;
- }
- .order-xxxl-first {
- order: -1;
- }
- .order-xxxl-last {
- order: 13;
- }
- .order-xxxl-0 {
- order: 0;
- }
- .order-xxxl-1 {
- order: 1;
- }
- .order-xxxl-2 {
- order: 2;
- }
- .order-xxxl-3 {
- order: 3;
- }
- .order-xxxl-4 {
- order: 4;
- }
- .order-xxxl-5 {
- order: 5;
- }
- .order-xxxl-6 {
- order: 6;
- }
- .order-xxxl-7 {
- order: 7;
- }
- .order-xxxl-8 {
- order: 8;
- }
- .order-xxxl-9 {
- order: 9;
- }
- .order-xxxl-10 {
- order: 10;
- }
- .order-xxxl-11 {
- order: 11;
- }
- .order-xxxl-12 {
- order: 12;
- }
- .offset-xxxl-0 {
- margin-left: 0;
- }
- .offset-xxxl-1 {
- margin-left: 8.33333333%;
- }
- .offset-xxxl-2 {
- margin-left: 16.66666667%;
- }
- .offset-xxxl-3 {
- margin-left: 25%;
- }
- .offset-xxxl-4 {
- margin-left: 33.33333333%;
- }
- .offset-xxxl-5 {
- margin-left: 41.66666667%;
- }
- .offset-xxxl-6 {
- margin-left: 50%;
- }
- .offset-xxxl-7 {
- margin-left: 58.33333333%;
- }
- .offset-xxxl-8 {
- margin-left: 66.66666667%;
- }
- .offset-xxxl-9 {
- margin-left: 75%;
- }
- .offset-xxxl-10 {
- margin-left: 83.33333333%;
- }
- .offset-xxxl-11 {
- margin-left: 91.66666667%;
- }
-}
-.table {
- width: 100%;
- margin-bottom: 1rem;
- color: #212529;
-}
-.table th,
-.table td {
- padding: 0.75rem;
- vertical-align: top;
- border-top: 1px solid #dee2e6;
-}
-.table thead th {
- vertical-align: bottom;
- border-bottom: 2px solid #dee2e6;
-}
-.table tbody + tbody {
- border-top: 2px solid #dee2e6;
-}
-
-.table-sm th,
-.table-sm td {
- padding: 0.3rem;
-}
-
-.table-bordered {
- border: 1px solid #dee2e6;
-}
-.table-bordered th,
-.table-bordered td {
- border: 1px solid #dee2e6;
-}
-.table-bordered thead th,
-.table-bordered thead td {
- border-bottom-width: 2px;
-}
-
-.table-borderless th,
-.table-borderless td,
-.table-borderless thead th,
-.table-borderless tbody + tbody {
- border: 0;
-}
-
-.table-striped tbody tr:nth-of-type(odd) {
- background-color: rgba(0, 0, 0, 0.05);
-}
-
-.table-hover tbody tr:hover {
- color: #212529;
- background-color: rgba(0, 0, 0, 0.075);
-}
-
-.table-primary,
-.table-primary > th,
-.table-primary > td {
- background-color: #cbd8f2;
-}
-.table-primary th,
-.table-primary td,
-.table-primary thead th,
-.table-primary tbody + tbody {
- border-color: #9eb7e6;
-}
-
-.table-hover .table-primary:hover {
- background-color: #b7c9ed;
-}
-.table-hover .table-primary:hover > td,
-.table-hover .table-primary:hover > th {
- background-color: #b7c9ed;
-}
-
-.table-secondary,
-.table-secondary > th,
-.table-secondary > td {
- background-color: #d6d8db;
-}
-.table-secondary th,
-.table-secondary td,
-.table-secondary thead th,
-.table-secondary tbody + tbody {
- border-color: #b3b7bb;
-}
-
-.table-hover .table-secondary:hover {
- background-color: #c8cbcf;
-}
-.table-hover .table-secondary:hover > td,
-.table-hover .table-secondary:hover > th {
- background-color: #c8cbcf;
-}
-
-.table-success,
-.table-success > th,
-.table-success > td {
- background-color: #c3e6cb;
-}
-.table-success th,
-.table-success td,
-.table-success thead th,
-.table-success tbody + tbody {
- border-color: #8fd19e;
-}
-
-.table-hover .table-success:hover {
- background-color: #b1dfbb;
-}
-.table-hover .table-success:hover > td,
-.table-hover .table-success:hover > th {
- background-color: #b1dfbb;
-}
-
-.table-info,
-.table-info > th,
-.table-info > td {
- background-color: #bee5eb;
-}
-.table-info th,
-.table-info td,
-.table-info thead th,
-.table-info tbody + tbody {
- border-color: #86cfda;
-}
-
-.table-hover .table-info:hover {
- background-color: #abdde5;
-}
-.table-hover .table-info:hover > td,
-.table-hover .table-info:hover > th {
- background-color: #abdde5;
-}
-
-.table-warning,
-.table-warning > th,
-.table-warning > td {
- background-color: #ffeeba;
-}
-.table-warning th,
-.table-warning td,
-.table-warning thead th,
-.table-warning tbody + tbody {
- border-color: #ffdf7e;
-}
-
-.table-hover .table-warning:hover {
- background-color: #ffe8a1;
-}
-.table-hover .table-warning:hover > td,
-.table-hover .table-warning:hover > th {
- background-color: #ffe8a1;
-}
-
-.table-danger,
-.table-danger > th,
-.table-danger > td {
- background-color: #f5c6cb;
-}
-.table-danger th,
-.table-danger td,
-.table-danger thead th,
-.table-danger tbody + tbody {
- border-color: #ed969e;
-}
-
-.table-hover .table-danger:hover {
- background-color: #f1b0b7;
-}
-.table-hover .table-danger:hover > td,
-.table-hover .table-danger:hover > th {
- background-color: #f1b0b7;
-}
-
-.table-light,
-.table-light > th,
-.table-light > td {
- background-color: #fdfdfe;
-}
-.table-light th,
-.table-light td,
-.table-light thead th,
-.table-light tbody + tbody {
- border-color: #fbfcfc;
-}
-
-.table-hover .table-light:hover {
- background-color: #ececf6;
-}
-.table-hover .table-light:hover > td,
-.table-hover .table-light:hover > th {
- background-color: #ececf6;
-}
-
-.table-dark,
-.table-dark > th,
-.table-dark > td {
- background-color: #c6c8ca;
-}
-.table-dark th,
-.table-dark td,
-.table-dark thead th,
-.table-dark tbody + tbody {
- border-color: #95999c;
-}
-
-.table-hover .table-dark:hover {
- background-color: #b9bbbe;
-}
-.table-hover .table-dark:hover > td,
-.table-hover .table-dark:hover > th {
- background-color: #b9bbbe;
-}
-
-.table-active,
-.table-active > th,
-.table-active > td {
- background-color: rgba(0, 0, 0, 0.075);
-}
-
-.table-hover .table-active:hover {
- background-color: rgba(0, 0, 0, 0.075);
-}
-.table-hover .table-active:hover > td,
-.table-hover .table-active:hover > th {
- background-color: rgba(0, 0, 0, 0.075);
-}
-
-.table .thead-dark th {
- color: #fff;
- background-color: #343a40;
- border-color: #454d55;
-}
-.table .thead-light th {
- color: #495057;
- background-color: #e9ecef;
- border-color: #dee2e6;
-}
-
-.table-dark {
- color: #fff;
- background-color: #343a40;
-}
-.table-dark th,
-.table-dark td,
-.table-dark thead th {
- border-color: #454d55;
-}
-.table-dark.table-bordered {
- border: 0;
-}
-.table-dark.table-striped tbody tr:nth-of-type(odd) {
- background-color: rgba(255, 255, 255, 0.05);
-}
-.table-dark.table-hover tbody tr:hover {
- color: #fff;
- background-color: rgba(255, 255, 255, 0.075);
-}
-
-@media (max-width: 575.98px) {
- .table-responsive-sm {
- display: block;
- width: 100%;
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
- }
- .table-responsive-sm > .table-bordered {
- border: 0;
- }
-}
-@media (max-width: 767.98px) {
- .table-responsive-md {
- display: block;
- width: 100%;
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
- }
- .table-responsive-md > .table-bordered {
- border: 0;
- }
-}
-@media (max-width: 991.98px) {
- .table-responsive-lg {
- display: block;
- width: 100%;
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
- }
- .table-responsive-lg > .table-bordered {
- border: 0;
- }
-}
-@media (max-width: 1199.98px) {
- .table-responsive-xl {
- display: block;
- width: 100%;
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
- }
- .table-responsive-xl > .table-bordered {
- border: 0;
- }
-}
-@media (max-width: 1599.98px) {
- .table-responsive-xxl {
- display: block;
- width: 100%;
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
- }
- .table-responsive-xxl > .table-bordered {
- border: 0;
- }
-}
-@media (max-width: 2599.98px) {
- .table-responsive-xxxl {
- display: block;
- width: 100%;
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
- }
- .table-responsive-xxxl > .table-bordered {
- border: 0;
- }
-}
-.table-responsive {
- display: block;
- width: 100%;
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
-}
-.table-responsive > .table-bordered {
- border: 0;
-}
-
-.form-control {
- display: block;
- width: 100%;
- height: calc(1.5em + 0.75rem + 2px);
- padding: 0.375rem 0.75rem;
- font-size: 1rem;
- font-weight: 400;
- line-height: 1.5;
- color: #495057;
- background-color: #fff;
- background-clip: padding-box;
- border: 1px solid #ced4da;
- border-radius: 6px;
- transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-}
-@media (prefers-reduced-motion: reduce) {
- .form-control {
- transition: none;
- }
-}
-.form-control::-ms-expand {
- background-color: transparent;
- border: 0;
-}
-.form-control:focus {
- color: #495057;
- background-color: #fff;
- border-color: #aac0e9;
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(69, 117, 207, 0.25);
-}
-.form-control::placeholder {
- color: #6c757d;
- opacity: 1;
-}
-.form-control:disabled, .form-control[readonly] {
- background-color: #e9ecef;
- opacity: 1;
-}
-
-input[type=date].form-control,
-input[type=time].form-control,
-input[type=datetime-local].form-control,
-input[type=month].form-control {
- appearance: none;
-}
-
-select.form-control:-moz-focusring {
- color: transparent;
- text-shadow: 0 0 0 #495057;
-}
-select.form-control:focus::-ms-value {
- color: #495057;
- background-color: #fff;
-}
-
-.form-control-file,
-.form-control-range {
- display: block;
- width: 100%;
-}
-
-.col-form-label {
- padding-top: calc(0.375rem + 1px);
- padding-bottom: calc(0.375rem + 1px);
- margin-bottom: 0;
- font-size: inherit;
- line-height: 1.5;
-}
-
-.col-form-label-lg {
- padding-top: calc(0.5rem + 1px);
- padding-bottom: calc(0.5rem + 1px);
- font-size: 1.25rem;
- line-height: 1.5;
-}
-
-.col-form-label-sm {
- padding-top: calc(0.25rem + 1px);
- padding-bottom: calc(0.25rem + 1px);
- font-size: 0.875rem;
- line-height: 1.5;
-}
-
-.form-control-plaintext {
- display: block;
- width: 100%;
- padding: 0.375rem 0;
- margin-bottom: 0;
- font-size: 1rem;
- line-height: 1.5;
- color: #212529;
- background-color: transparent;
- border: solid transparent;
- border-width: 1px 0;
-}
-.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {
- padding-right: 0;
- padding-left: 0;
-}
-
-.form-control-sm {
- height: calc(1.5em + 0.5rem + 2px);
- padding: 0.25rem 0.5rem;
- font-size: 0.875rem;
- line-height: 1.5;
- border-radius: 0.2rem;
-}
-
-.form-control-lg {
- height: calc(1.5em + 1rem + 2px);
- padding: 0.5rem 1rem;
- font-size: 1.25rem;
- line-height: 1.5;
- border-radius: 0.3rem;
-}
-
-select.form-control[size], select.form-control[multiple] {
- height: auto;
-}
-
-textarea.form-control {
- height: auto;
-}
-
-.form-group {
- margin-bottom: 1rem;
-}
-
-.form-text {
- display: block;
- margin-top: 0.25rem;
-}
-
-.form-row {
- display: flex;
- flex-wrap: wrap;
- margin-right: -5px;
- margin-left: -5px;
-}
-.form-row > .col,
-.form-row > [class*=col-] {
- padding-right: 5px;
- padding-left: 5px;
-}
-
-.form-check {
- position: relative;
- display: block;
- padding-left: 1.25rem;
-}
-
-.form-check-input {
- position: absolute;
- margin-top: 0.3rem;
- margin-left: -1.25rem;
-}
-.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label {
- color: rgba(85, 91, 104, 0.5);
-}
-
-.form-check-label {
- margin-bottom: 0;
-}
-
-.form-check-inline {
- display: inline-flex;
- align-items: center;
- padding-left: 0;
- margin-right: 0.75rem;
-}
-.form-check-inline .form-check-input {
- position: static;
- margin-top: 0;
- margin-right: 0.3125rem;
- margin-left: 0;
-}
-
-.valid-feedback {
- display: none;
- width: 100%;
- margin-top: 0.25rem;
- font-size: 0.875em;
- color: #28a745;
-}
-
-.valid-tooltip {
- position: absolute;
- top: 100%;
- left: 0;
- z-index: 5;
- display: none;
- max-width: 100%;
- padding: 0.25rem 0.5rem;
- margin-top: 0.1rem;
- font-size: 0.875rem;
- line-height: 1.5;
- color: #fff;
- background-color: rgba(40, 167, 69, 0.9);
- border-radius: 6px;
-}
-.form-row > .col > .valid-tooltip, .form-row > [class*=col-] > .valid-tooltip {
- left: 5px;
-}
-
-.was-validated :valid ~ .valid-feedback,
-.was-validated :valid ~ .valid-tooltip,
-.is-valid ~ .valid-feedback,
-.is-valid ~ .valid-tooltip {
- display: block;
-}
-
-.was-validated .form-control:valid, .form-control.is-valid {
- border-color: #28a745;
- padding-right: calc(1.5em + 0.75rem) !important;
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
- background-repeat: no-repeat;
- background-position: right calc(0.375em + 0.1875rem) center;
- background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
-}
-.was-validated .form-control:valid:focus, .form-control.is-valid:focus {
- border-color: #28a745;
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
-}
-
-.was-validated select.form-control:valid, select.form-control.is-valid {
- padding-right: 3rem !important;
- background-position: right 1.5rem center;
-}
-
-.was-validated textarea.form-control:valid, textarea.form-control.is-valid {
- padding-right: calc(1.5em + 0.75rem);
- background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
-}
-
-.was-validated .custom-select:valid, .custom-select.is-valid {
- border-color: #28a745;
- padding-right: calc(0.75em + 2.3125rem) !important;
- background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 0.75rem center/8px 10px no-repeat, #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat;
-}
-.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {
- border-color: #28a745;
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
-}
-
-.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {
- color: #28a745;
-}
-.was-validated .form-check-input:valid ~ .valid-feedback,
-.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,
-.form-check-input.is-valid ~ .valid-tooltip {
- display: block;
-}
-
-.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {
- color: #28a745;
-}
-.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {
- border-color: #28a745;
-}
-.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {
- border-color: #34ce57;
- background-color: #34ce57;
-}
-.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
-}
-.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {
- border-color: #28a745;
-}
-
-.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {
- border-color: #28a745;
-}
-.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {
- border-color: #28a745;
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
-}
-
-.invalid-feedback {
- display: none;
- width: 100%;
- margin-top: 0.25rem;
- font-size: 0.875em;
- color: #dc3545;
-}
-
-.invalid-tooltip {
- position: absolute;
- top: 100%;
- left: 0;
- z-index: 5;
- display: none;
- max-width: 100%;
- padding: 0.25rem 0.5rem;
- margin-top: 0.1rem;
- font-size: 0.875rem;
- line-height: 1.5;
- color: #fff;
- background-color: rgba(220, 53, 69, 0.9);
- border-radius: 6px;
-}
-.form-row > .col > .invalid-tooltip, .form-row > [class*=col-] > .invalid-tooltip {
- left: 5px;
-}
-
-.was-validated :invalid ~ .invalid-feedback,
-.was-validated :invalid ~ .invalid-tooltip,
-.is-invalid ~ .invalid-feedback,
-.is-invalid ~ .invalid-tooltip {
- display: block;
-}
-
-.was-validated .form-control:invalid, .form-control.is-invalid {
- border-color: #dc3545;
- padding-right: calc(1.5em + 0.75rem) !important;
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
- background-repeat: no-repeat;
- background-position: right calc(0.375em + 0.1875rem) center;
- background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
-}
-.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {
- border-color: #dc3545;
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
-}
-
-.was-validated select.form-control:invalid, select.form-control.is-invalid {
- padding-right: 3rem !important;
- background-position: right 1.5rem center;
-}
-
-.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {
- padding-right: calc(1.5em + 0.75rem);
- background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
-}
-
-.was-validated .custom-select:invalid, .custom-select.is-invalid {
- border-color: #dc3545;
- padding-right: calc(0.75em + 2.3125rem) !important;
- background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 0.75rem center/8px 10px no-repeat, #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat;
-}
-.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {
- border-color: #dc3545;
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
-}
-
-.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {
- color: #dc3545;
-}
-.was-validated .form-check-input:invalid ~ .invalid-feedback,
-.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,
-.form-check-input.is-invalid ~ .invalid-tooltip {
- display: block;
-}
-
-.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {
- color: #dc3545;
-}
-.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {
- border-color: #dc3545;
-}
-.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {
- border-color: #e4606d;
- background-color: #e4606d;
-}
-.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
-}
-.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {
- border-color: #dc3545;
-}
-
-.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {
- border-color: #dc3545;
-}
-.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {
- border-color: #dc3545;
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
-}
-
-.form-inline {
- display: flex;
- flex-flow: row wrap;
- align-items: center;
-}
-.form-inline .form-check {
- width: 100%;
-}
-@media (min-width: 576px) {
- .form-inline label {
- display: flex;
- align-items: center;
- justify-content: center;
- margin-bottom: 0;
- }
- .form-inline .form-group {
- display: flex;
- flex: 0 0 auto;
- flex-flow: row wrap;
- align-items: center;
- margin-bottom: 0;
- }
- .form-inline .form-control {
- display: inline-block;
- width: auto;
- vertical-align: middle;
- }
- .form-inline .form-control-plaintext {
- display: inline-block;
- }
- .form-inline .input-group,
- .form-inline .custom-select {
- width: auto;
- }
- .form-inline .form-check {
- display: flex;
- align-items: center;
- justify-content: center;
- width: auto;
- padding-left: 0;
- }
- .form-inline .form-check-input {
- position: relative;
- flex-shrink: 0;
- margin-top: 0;
- margin-right: 0.25rem;
- margin-left: 0;
- }
- .form-inline .custom-control {
- align-items: center;
- justify-content: center;
- }
- .form-inline .custom-control-label {
- margin-bottom: 0;
- }
-}
-
-.btn {
- display: inline-block;
- font-weight: 400;
- color: #212529;
- text-align: center;
- vertical-align: middle;
- user-select: none;
- background-color: transparent;
- border: 1px solid transparent;
- padding: 0.375rem 0.75rem;
- font-size: 1rem;
- line-height: 1.5;
- border-radius: 3px;
- transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-}
-@media (prefers-reduced-motion: reduce) {
- .btn {
- transition: none;
- }
-}
-.btn:hover {
- color: #212529;
- text-decoration: none;
-}
-.btn:focus, .btn.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(69, 117, 207, 0.25);
-}
-.btn.disabled, .btn:disabled {
- opacity: 0.65;
-}
-.btn:not(:disabled):not(.disabled) {
- cursor: pointer;
-}
-a.btn.disabled,
-fieldset:disabled a.btn {
- pointer-events: none;
-}
-
-.btn-primary {
- color: #fff;
- background-color: #4575cf;
- border-color: #4575cf;
-}
-.btn-primary:hover {
- color: #fff;
- background-color: #3162bd;
- border-color: #2e5cb3;
-}
-.btn-primary:focus, .btn-primary.focus {
- color: #fff;
- background-color: #3162bd;
- border-color: #2e5cb3;
- box-shadow: 0 0 0 0.2rem rgba(97, 138, 214, 0.5);
-}
-.btn-primary.disabled, .btn-primary:disabled {
- color: #fff;
- background-color: #4575cf;
- border-color: #4575cf;
-}
-.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, .show > .btn-primary.dropdown-toggle {
- color: #fff;
- background-color: #2e5cb3;
- border-color: #2c57a9;
-}
-.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-primary.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(97, 138, 214, 0.5);
-}
-
-.btn-secondary {
- color: #fff;
- background-color: #6c757d;
- border-color: #6c757d;
-}
-.btn-secondary:hover {
- color: #fff;
- background-color: #5a6268;
- border-color: #545b62;
-}
-.btn-secondary:focus, .btn-secondary.focus {
- color: #fff;
- background-color: #5a6268;
- border-color: #545b62;
- box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);
-}
-.btn-secondary.disabled, .btn-secondary:disabled {
- color: #fff;
- background-color: #6c757d;
- border-color: #6c757d;
-}
-.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, .show > .btn-secondary.dropdown-toggle {
- color: #fff;
- background-color: #545b62;
- border-color: #4e555b;
-}
-.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-secondary.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);
-}
-
-.btn-success {
- color: #fff;
- background-color: #28a745;
- border-color: #28a745;
-}
-.btn-success:hover {
- color: #fff;
- background-color: #218838;
- border-color: #1e7e34;
-}
-.btn-success:focus, .btn-success.focus {
- color: #fff;
- background-color: #218838;
- border-color: #1e7e34;
- box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);
-}
-.btn-success.disabled, .btn-success:disabled {
- color: #fff;
- background-color: #28a745;
- border-color: #28a745;
-}
-.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, .show > .btn-success.dropdown-toggle {
- color: #fff;
- background-color: #1e7e34;
- border-color: #1c7430;
-}
-.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, .show > .btn-success.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);
-}
-
-.btn-info {
- color: #fff;
- background-color: #17a2b8;
- border-color: #17a2b8;
-}
-.btn-info:hover {
- color: #fff;
- background-color: #138496;
- border-color: #117a8b;
-}
-.btn-info:focus, .btn-info.focus {
- color: #fff;
- background-color: #138496;
- border-color: #117a8b;
- box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);
-}
-.btn-info.disabled, .btn-info:disabled {
- color: #fff;
- background-color: #17a2b8;
- border-color: #17a2b8;
-}
-.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, .show > .btn-info.dropdown-toggle {
- color: #fff;
- background-color: #117a8b;
- border-color: #10707f;
-}
-.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, .show > .btn-info.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);
-}
-
-.btn-warning {
- color: #212529;
- background-color: #ffc107;
- border-color: #ffc107;
-}
-.btn-warning:hover {
- color: #212529;
- background-color: #e0a800;
- border-color: #d39e00;
-}
-.btn-warning:focus, .btn-warning.focus {
- color: #212529;
- background-color: #e0a800;
- border-color: #d39e00;
- box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);
-}
-.btn-warning.disabled, .btn-warning:disabled {
- color: #212529;
- background-color: #ffc107;
- border-color: #ffc107;
-}
-.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, .show > .btn-warning.dropdown-toggle {
- color: #212529;
- background-color: #d39e00;
- border-color: #c69500;
-}
-.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-warning.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);
-}
-
-.btn-danger {
- color: #fff;
- background-color: #dc3545;
- border-color: #dc3545;
-}
-.btn-danger:hover {
- color: #fff;
- background-color: #c82333;
- border-color: #bd2130;
-}
-.btn-danger:focus, .btn-danger.focus {
- color: #fff;
- background-color: #c82333;
- border-color: #bd2130;
- box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);
-}
-.btn-danger.disabled, .btn-danger:disabled {
- color: #fff;
- background-color: #dc3545;
- border-color: #dc3545;
-}
-.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, .show > .btn-danger.dropdown-toggle {
- color: #fff;
- background-color: #bd2130;
- border-color: #b21f2d;
-}
-.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-danger.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);
-}
-
-.btn-light {
- color: #212529;
- background-color: #f8f9fa;
- border-color: #f8f9fa;
-}
-.btn-light:hover {
- color: #212529;
- background-color: #e2e6ea;
- border-color: #dae0e5;
-}
-.btn-light:focus, .btn-light.focus {
- color: #212529;
- background-color: #e2e6ea;
- border-color: #dae0e5;
- box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);
-}
-.btn-light.disabled, .btn-light:disabled {
- color: #212529;
- background-color: #f8f9fa;
- border-color: #f8f9fa;
-}
-.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, .show > .btn-light.dropdown-toggle {
- color: #212529;
- background-color: #dae0e5;
- border-color: #d3d9df;
-}
-.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, .show > .btn-light.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);
-}
-
-.btn-dark {
- color: #fff;
- background-color: #343a40;
- border-color: #343a40;
-}
-.btn-dark:hover {
- color: #fff;
- background-color: #23272b;
- border-color: #1d2124;
-}
-.btn-dark:focus, .btn-dark.focus {
- color: #fff;
- background-color: #23272b;
- border-color: #1d2124;
- box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);
-}
-.btn-dark.disabled, .btn-dark:disabled {
- color: #fff;
- background-color: #343a40;
- border-color: #343a40;
-}
-.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, .show > .btn-dark.dropdown-toggle {
- color: #fff;
- background-color: #1d2124;
- border-color: #171a1d;
-}
-.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-dark.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);
-}
-
-.btn-outline-primary {
- color: #4575cf;
- border-color: #4575cf;
-}
-.btn-outline-primary:hover {
- color: #fff;
- background-color: #4575cf;
- border-color: #4575cf;
-}
-.btn-outline-primary:focus, .btn-outline-primary.focus {
- box-shadow: 0 0 0 0.2rem rgba(69, 117, 207, 0.5);
-}
-.btn-outline-primary.disabled, .btn-outline-primary:disabled {
- color: #4575cf;
- background-color: transparent;
-}
-.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, .show > .btn-outline-primary.dropdown-toggle {
- color: #fff;
- background-color: #4575cf;
- border-color: #4575cf;
-}
-.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-primary.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(69, 117, 207, 0.5);
-}
-
-.btn-outline-secondary {
- color: #6c757d;
- border-color: #6c757d;
-}
-.btn-outline-secondary:hover {
- color: #fff;
- background-color: #6c757d;
- border-color: #6c757d;
-}
-.btn-outline-secondary:focus, .btn-outline-secondary.focus {
- box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
-}
-.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {
- color: #6c757d;
- background-color: transparent;
-}
-.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, .show > .btn-outline-secondary.dropdown-toggle {
- color: #fff;
- background-color: #6c757d;
- border-color: #6c757d;
-}
-.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-secondary.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
-}
-
-.btn-outline-success {
- color: #28a745;
- border-color: #28a745;
-}
-.btn-outline-success:hover {
- color: #fff;
- background-color: #28a745;
- border-color: #28a745;
-}
-.btn-outline-success:focus, .btn-outline-success.focus {
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
-}
-.btn-outline-success.disabled, .btn-outline-success:disabled {
- color: #28a745;
- background-color: transparent;
-}
-.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, .show > .btn-outline-success.dropdown-toggle {
- color: #fff;
- background-color: #28a745;
- border-color: #28a745;
-}
-.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-success.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
-}
-
-.btn-outline-info {
- color: #17a2b8;
- border-color: #17a2b8;
-}
-.btn-outline-info:hover {
- color: #fff;
- background-color: #17a2b8;
- border-color: #17a2b8;
-}
-.btn-outline-info:focus, .btn-outline-info.focus {
- box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
-}
-.btn-outline-info.disabled, .btn-outline-info:disabled {
- color: #17a2b8;
- background-color: transparent;
-}
-.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, .show > .btn-outline-info.dropdown-toggle {
- color: #fff;
- background-color: #17a2b8;
- border-color: #17a2b8;
-}
-.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-info.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
-}
-
-.btn-outline-warning {
- color: #ffc107;
- border-color: #ffc107;
-}
-.btn-outline-warning:hover {
- color: #212529;
- background-color: #ffc107;
- border-color: #ffc107;
-}
-.btn-outline-warning:focus, .btn-outline-warning.focus {
- box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
-}
-.btn-outline-warning.disabled, .btn-outline-warning:disabled {
- color: #ffc107;
- background-color: transparent;
-}
-.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, .show > .btn-outline-warning.dropdown-toggle {
- color: #212529;
- background-color: #ffc107;
- border-color: #ffc107;
-}
-.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-warning.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
-}
-
-.btn-outline-danger {
- color: #dc3545;
- border-color: #dc3545;
-}
-.btn-outline-danger:hover {
- color: #fff;
- background-color: #dc3545;
- border-color: #dc3545;
-}
-.btn-outline-danger:focus, .btn-outline-danger.focus {
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
-}
-.btn-outline-danger.disabled, .btn-outline-danger:disabled {
- color: #dc3545;
- background-color: transparent;
-}
-.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, .show > .btn-outline-danger.dropdown-toggle {
- color: #fff;
- background-color: #dc3545;
- border-color: #dc3545;
-}
-.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-danger.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
-}
-
-.btn-outline-light {
- color: #f8f9fa;
- border-color: #f8f9fa;
-}
-.btn-outline-light:hover {
- color: #212529;
- background-color: #f8f9fa;
- border-color: #f8f9fa;
-}
-.btn-outline-light:focus, .btn-outline-light.focus {
- box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
-}
-.btn-outline-light.disabled, .btn-outline-light:disabled {
- color: #f8f9fa;
- background-color: transparent;
-}
-.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, .show > .btn-outline-light.dropdown-toggle {
- color: #212529;
- background-color: #f8f9fa;
- border-color: #f8f9fa;
-}
-.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-light.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
-}
-
-.btn-outline-dark {
- color: #343a40;
- border-color: #343a40;
-}
-.btn-outline-dark:hover {
- color: #fff;
- background-color: #343a40;
- border-color: #343a40;
-}
-.btn-outline-dark:focus, .btn-outline-dark.focus {
- box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
-}
-.btn-outline-dark.disabled, .btn-outline-dark:disabled {
- color: #343a40;
- background-color: transparent;
-}
-.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, .show > .btn-outline-dark.dropdown-toggle {
- color: #fff;
- background-color: #343a40;
- border-color: #343a40;
-}
-.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-dark.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
-}
-
-.btn-link {
- font-weight: 400;
- color: #4575cf;
- text-decoration: none;
-}
-.btn-link:hover {
- color: #29529f;
- text-decoration: underline;
-}
-.btn-link:focus, .btn-link.focus {
- text-decoration: underline;
-}
-.btn-link:disabled, .btn-link.disabled {
- color: #6c757d;
- pointer-events: none;
-}
-
-.btn-lg, .btn-group-lg > .btn {
- padding: 0.5rem 1rem;
- font-size: 1.25rem;
- line-height: 1.5;
- border-radius: 0.3rem;
-}
-
-.btn-sm, .btn-group-sm > .btn {
- padding: 0.25rem 0.5rem;
- font-size: 0.875rem;
- line-height: 1.5;
- border-radius: 0.2rem;
-}
-
-.btn-block {
- display: block;
- width: 100%;
-}
-.btn-block + .btn-block {
- margin-top: 0.5rem;
-}
-
-input[type=submit].btn-block,
-input[type=reset].btn-block,
-input[type=button].btn-block {
- width: 100%;
-}
-
-.fade {
- transition: opacity 0.15s linear;
-}
-@media (prefers-reduced-motion: reduce) {
- .fade {
- transition: none;
- }
-}
-.fade:not(.show) {
- opacity: 0;
-}
-
-.collapse:not(.show) {
- display: none;
-}
-
-.collapsing {
- position: relative;
- height: 0;
- overflow: hidden;
- transition: height 0.35s ease;
-}
-@media (prefers-reduced-motion: reduce) {
- .collapsing {
- transition: none;
- }
-}
-.collapsing.width {
- width: 0;
- height: auto;
- transition: width 0.35s ease;
-}
-@media (prefers-reduced-motion: reduce) {
- .collapsing.width {
- transition: none;
- }
-}
-
-.dropup,
-.dropright,
-.dropdown,
-.dropleft {
- position: relative;
-}
-
-.dropdown-toggle {
- white-space: nowrap;
-}
-.dropdown-toggle::after {
- display: inline-block;
- margin-left: 0.255em;
- vertical-align: 0.255em;
- content: "";
- border-top: 0.3em solid;
- border-right: 0.3em solid transparent;
- border-bottom: 0;
- border-left: 0.3em solid transparent;
-}
-.dropdown-toggle:empty::after {
- margin-left: 0;
-}
-
-.dropdown-menu {
- position: absolute;
- top: 100%;
- left: 0;
- z-index: 1000;
- display: none;
- float: left;
- min-width: 10rem;
- padding: 0.5rem 0;
- margin: 0.125rem 0 0;
- font-size: 1rem;
- color: #212529;
- text-align: left;
- list-style: none;
- background-color: #fff;
- background-clip: padding-box;
- border: 1px solid rgba(0, 0, 0, 0.15);
- border-radius: 6px;
-}
-
-.dropdown-menu-left {
- right: auto;
- left: 0;
-}
-
-.dropdown-menu-right {
- right: 0;
- left: auto;
-}
-
-@media (min-width: 576px) {
- .dropdown-menu-sm-left {
- right: auto;
- left: 0;
- }
- .dropdown-menu-sm-right {
- right: 0;
- left: auto;
- }
-}
-@media (min-width: 768px) {
- .dropdown-menu-md-left {
- right: auto;
- left: 0;
- }
- .dropdown-menu-md-right {
- right: 0;
- left: auto;
- }
-}
-@media (min-width: 992px) {
- .dropdown-menu-lg-left {
- right: auto;
- left: 0;
- }
- .dropdown-menu-lg-right {
- right: 0;
- left: auto;
- }
-}
-@media (min-width: 1200px) {
- .dropdown-menu-xl-left {
- right: auto;
- left: 0;
- }
- .dropdown-menu-xl-right {
- right: 0;
- left: auto;
- }
-}
-@media (min-width: 1600px) {
- .dropdown-menu-xxl-left {
- right: auto;
- left: 0;
- }
- .dropdown-menu-xxl-right {
- right: 0;
- left: auto;
- }
-}
-@media (min-width: 2600px) {
- .dropdown-menu-xxxl-left {
- right: auto;
- left: 0;
- }
- .dropdown-menu-xxxl-right {
- right: 0;
- left: auto;
- }
-}
-.dropup .dropdown-menu {
- top: auto;
- bottom: 100%;
- margin-top: 0;
- margin-bottom: 0.125rem;
-}
-.dropup .dropdown-toggle::after {
- display: inline-block;
- margin-left: 0.255em;
- vertical-align: 0.255em;
- content: "";
- border-top: 0;
- border-right: 0.3em solid transparent;
- border-bottom: 0.3em solid;
- border-left: 0.3em solid transparent;
-}
-.dropup .dropdown-toggle:empty::after {
- margin-left: 0;
-}
-
-.dropright .dropdown-menu {
- top: 0;
- right: auto;
- left: 100%;
- margin-top: 0;
- margin-left: 0.125rem;
-}
-.dropright .dropdown-toggle::after {
- display: inline-block;
- margin-left: 0.255em;
- vertical-align: 0.255em;
- content: "";
- border-top: 0.3em solid transparent;
- border-right: 0;
- border-bottom: 0.3em solid transparent;
- border-left: 0.3em solid;
-}
-.dropright .dropdown-toggle:empty::after {
- margin-left: 0;
-}
-.dropright .dropdown-toggle::after {
- vertical-align: 0;
-}
-
-.dropleft .dropdown-menu {
- top: 0;
- right: 100%;
- left: auto;
- margin-top: 0;
- margin-right: 0.125rem;
-}
-.dropleft .dropdown-toggle::after {
- display: inline-block;
- margin-left: 0.255em;
- vertical-align: 0.255em;
- content: "";
-}
-.dropleft .dropdown-toggle::after {
- display: none;
-}
-.dropleft .dropdown-toggle::before {
- display: inline-block;
- margin-right: 0.255em;
- vertical-align: 0.255em;
- content: "";
- border-top: 0.3em solid transparent;
- border-right: 0.3em solid;
- border-bottom: 0.3em solid transparent;
-}
-.dropleft .dropdown-toggle:empty::after {
- margin-left: 0;
-}
-.dropleft .dropdown-toggle::before {
- vertical-align: 0;
-}
-
-.dropdown-menu[x-placement^=top], .dropdown-menu[x-placement^=right], .dropdown-menu[x-placement^=bottom], .dropdown-menu[x-placement^=left] {
- right: auto;
- bottom: auto;
-}
-
-.dropdown-divider {
- height: 0;
- margin: 0.5rem 0;
- overflow: hidden;
- border-top: 1px solid #e9ecef;
-}
-
-.dropdown-item {
- display: block;
- width: 100%;
- padding: 0.25rem 1.5rem;
- clear: both;
- font-weight: 400;
- color: #212529;
- text-align: inherit;
- white-space: nowrap;
- background-color: transparent;
- border: 0;
-}
-.dropdown-item:hover, .dropdown-item:focus {
- color: #16181b;
- text-decoration: none;
- background-color: #e9ecef;
-}
-.dropdown-item.active, .dropdown-item:active {
- color: #fff;
- text-decoration: none;
- background-color: #4575cf;
-}
-.dropdown-item.disabled, .dropdown-item:disabled {
- color: #adb5bd;
- pointer-events: none;
- background-color: transparent;
-}
-
-.dropdown-menu.show {
- display: block;
-}
-
-.dropdown-header {
- display: block;
- padding: 0.5rem 1.5rem;
- margin-bottom: 0;
- font-size: 0.875rem;
- color: #6c757d;
- white-space: nowrap;
-}
-
-.dropdown-item-text {
- display: block;
- padding: 0.25rem 1.5rem;
- color: #212529;
-}
-
-.btn-group,
-.btn-group-vertical {
- position: relative;
- display: inline-flex;
- vertical-align: middle;
-}
-.btn-group > .btn,
-.btn-group-vertical > .btn {
- position: relative;
- flex: 1 1 auto;
-}
-.btn-group > .btn:hover,
-.btn-group-vertical > .btn:hover {
- z-index: 1;
-}
-.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
-.btn-group-vertical > .btn:focus,
-.btn-group-vertical > .btn:active,
-.btn-group-vertical > .btn.active {
- z-index: 1;
-}
-
-.btn-toolbar {
- display: flex;
- flex-wrap: wrap;
- justify-content: flex-start;
-}
-.btn-toolbar .input-group {
- width: auto;
-}
-
-.btn-group > .btn:not(:first-child),
-.btn-group > .btn-group:not(:first-child) {
- margin-left: -1px;
-}
-.btn-group > .btn:not(:last-child):not(.dropdown-toggle),
-.btn-group > .btn-group:not(:last-child) > .btn {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-.btn-group > .btn:not(:first-child),
-.btn-group > .btn-group:not(:first-child) > .btn {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-
-.dropdown-toggle-split {
- padding-right: 0.5625rem;
- padding-left: 0.5625rem;
-}
-.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropright .dropdown-toggle-split::after {
- margin-left: 0;
-}
-.dropleft .dropdown-toggle-split::before {
- margin-right: 0;
-}
-
-.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {
- padding-right: 0.375rem;
- padding-left: 0.375rem;
-}
-
-.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {
- padding-right: 0.75rem;
- padding-left: 0.75rem;
-}
-
-.btn-group-vertical {
- flex-direction: column;
- align-items: flex-start;
- justify-content: center;
-}
-.btn-group-vertical > .btn,
-.btn-group-vertical > .btn-group {
- width: 100%;
-}
-.btn-group-vertical > .btn:not(:first-child),
-.btn-group-vertical > .btn-group:not(:first-child) {
- margin-top: -1px;
-}
-.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),
-.btn-group-vertical > .btn-group:not(:last-child) > .btn {
- border-bottom-right-radius: 0;
- border-bottom-left-radius: 0;
-}
-.btn-group-vertical > .btn:not(:first-child),
-.btn-group-vertical > .btn-group:not(:first-child) > .btn {
- border-top-left-radius: 0;
- border-top-right-radius: 0;
-}
-
-.btn-group-toggle > .btn,
-.btn-group-toggle > .btn-group > .btn {
- margin-bottom: 0;
-}
-.btn-group-toggle > .btn input[type=radio],
-.btn-group-toggle > .btn input[type=checkbox],
-.btn-group-toggle > .btn-group > .btn input[type=radio],
-.btn-group-toggle > .btn-group > .btn input[type=checkbox] {
- position: absolute;
- clip: rect(0, 0, 0, 0);
- pointer-events: none;
-}
-
-.input-group {
- position: relative;
- display: flex;
- flex-wrap: wrap;
- align-items: stretch;
- width: 100%;
-}
-.input-group > .form-control,
-.input-group > .form-control-plaintext,
-.input-group > .custom-select,
-.input-group > .custom-file {
- position: relative;
- flex: 1 1 auto;
- width: 1%;
- min-width: 0;
- margin-bottom: 0;
-}
-.input-group > .form-control + .form-control,
-.input-group > .form-control + .custom-select,
-.input-group > .form-control + .custom-file,
-.input-group > .form-control-plaintext + .form-control,
-.input-group > .form-control-plaintext + .custom-select,
-.input-group > .form-control-plaintext + .custom-file,
-.input-group > .custom-select + .form-control,
-.input-group > .custom-select + .custom-select,
-.input-group > .custom-select + .custom-file,
-.input-group > .custom-file + .form-control,
-.input-group > .custom-file + .custom-select,
-.input-group > .custom-file + .custom-file {
- margin-left: -1px;
-}
-.input-group > .form-control:focus,
-.input-group > .custom-select:focus,
-.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {
- z-index: 3;
-}
-.input-group > .custom-file .custom-file-input:focus {
- z-index: 4;
-}
-.input-group > .form-control:not(:first-child),
-.input-group > .custom-select:not(:first-child) {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-.input-group > .custom-file {
- display: flex;
- align-items: center;
-}
-.input-group > .custom-file:not(:last-child) .custom-file-label, .input-group > .custom-file:not(:last-child) .custom-file-label::after {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-.input-group > .custom-file:not(:first-child) .custom-file-label {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-.input-group:not(.has-validation) > .form-control:not(:last-child),
-.input-group:not(.has-validation) > .custom-select:not(:last-child),
-.input-group:not(.has-validation) > .custom-file:not(:last-child) .custom-file-label,
-.input-group:not(.has-validation) > .custom-file:not(:last-child) .custom-file-label::after {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-.input-group.has-validation > .form-control:nth-last-child(n+3),
-.input-group.has-validation > .custom-select:nth-last-child(n+3),
-.input-group.has-validation > .custom-file:nth-last-child(n+3) .custom-file-label,
-.input-group.has-validation > .custom-file:nth-last-child(n+3) .custom-file-label::after {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-
-.input-group-prepend,
-.input-group-append {
- display: flex;
-}
-.input-group-prepend .btn,
-.input-group-append .btn {
- position: relative;
- z-index: 2;
-}
-.input-group-prepend .btn:focus,
-.input-group-append .btn:focus {
- z-index: 3;
-}
-.input-group-prepend .btn + .btn,
-.input-group-prepend .btn + .input-group-text,
-.input-group-prepend .input-group-text + .input-group-text,
-.input-group-prepend .input-group-text + .btn,
-.input-group-append .btn + .btn,
-.input-group-append .btn + .input-group-text,
-.input-group-append .input-group-text + .input-group-text,
-.input-group-append .input-group-text + .btn {
- margin-left: -1px;
-}
-
-.input-group-prepend {
- margin-right: -1px;
-}
-
-.input-group-append {
- margin-left: -1px;
-}
-
-.input-group-text {
- display: flex;
- align-items: center;
- padding: 0.375rem 0.75rem;
- margin-bottom: 0;
- font-size: 1rem;
- font-weight: 400;
- line-height: 1.5;
- color: #495057;
- text-align: center;
- white-space: nowrap;
- background-color: #e9ecef;
- border: 1px solid #ced4da;
- border-radius: 6px;
-}
-.input-group-text input[type=radio],
-.input-group-text input[type=checkbox] {
- margin-top: 0;
-}
-
-.input-group-lg > .form-control:not(textarea),
-.input-group-lg > .custom-select {
- height: calc(1.5em + 1rem + 2px);
-}
-
-.input-group-lg > .form-control,
-.input-group-lg > .custom-select,
-.input-group-lg > .input-group-prepend > .input-group-text,
-.input-group-lg > .input-group-append > .input-group-text,
-.input-group-lg > .input-group-prepend > .btn,
-.input-group-lg > .input-group-append > .btn {
- padding: 0.5rem 1rem;
- font-size: 1.25rem;
- line-height: 1.5;
- border-radius: 0.3rem;
-}
-
-.input-group-sm > .form-control:not(textarea),
-.input-group-sm > .custom-select {
- height: calc(1.5em + 0.5rem + 2px);
-}
-
-.input-group-sm > .form-control,
-.input-group-sm > .custom-select,
-.input-group-sm > .input-group-prepend > .input-group-text,
-.input-group-sm > .input-group-append > .input-group-text,
-.input-group-sm > .input-group-prepend > .btn,
-.input-group-sm > .input-group-append > .btn {
- padding: 0.25rem 0.5rem;
- font-size: 0.875rem;
- line-height: 1.5;
- border-radius: 0.2rem;
-}
-
-.input-group-lg > .custom-select,
-.input-group-sm > .custom-select {
- padding-right: 1.75rem;
-}
-
-.input-group > .input-group-prepend > .btn,
-.input-group > .input-group-prepend > .input-group-text,
-.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .btn,
-.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .input-group-text,
-.input-group.has-validation > .input-group-append:nth-last-child(n+3) > .btn,
-.input-group.has-validation > .input-group-append:nth-last-child(n+3) > .input-group-text,
-.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),
-.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-
-.input-group > .input-group-append > .btn,
-.input-group > .input-group-append > .input-group-text,
-.input-group > .input-group-prepend:not(:first-child) > .btn,
-.input-group > .input-group-prepend:not(:first-child) > .input-group-text,
-.input-group > .input-group-prepend:first-child > .btn:not(:first-child),
-.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-
-.custom-control {
- position: relative;
- z-index: 1;
- display: block;
- min-height: 1.5rem;
- padding-left: 1.5rem;
- print-color-adjust: exact;
-}
-
-.custom-control-inline {
- display: inline-flex;
- margin-right: 1rem;
-}
-
-.custom-control-input {
- position: absolute;
- left: 0;
- z-index: -1;
- width: 1rem;
- height: 1.25rem;
- opacity: 0;
-}
-.custom-control-input:checked ~ .custom-control-label::before {
- color: #fff;
- border-color: #4575cf;
- background-color: #4575cf;
-}
-.custom-control-input:focus ~ .custom-control-label::before {
- box-shadow: 0 0 0 0.2rem rgba(69, 117, 207, 0.25);
-}
-.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {
- border-color: #aac0e9;
-}
-.custom-control-input:not(:disabled):active ~ .custom-control-label::before {
- color: #fff;
- background-color: #d3def4;
- border-color: #d3def4;
-}
-.custom-control-input[disabled] ~ .custom-control-label, .custom-control-input:disabled ~ .custom-control-label {
- color: #6c757d;
-}
-.custom-control-input[disabled] ~ .custom-control-label::before, .custom-control-input:disabled ~ .custom-control-label::before {
- background-color: #e9ecef;
-}
-
-.custom-control-label {
- position: relative;
- margin-bottom: 0;
- vertical-align: top;
-}
-.custom-control-label::before {
- position: absolute;
- top: 0.25rem;
- left: -1.5rem;
- display: block;
- width: 1rem;
- height: 1rem;
- pointer-events: none;
- content: "";
- background-color: #fff;
- border: 1px solid #adb5bd;
-}
-.custom-control-label::after {
- position: absolute;
- top: 0.25rem;
- left: -1.5rem;
- display: block;
- width: 1rem;
- height: 1rem;
- content: "";
- background: 50%/50% 50% no-repeat;
-}
-
-.custom-checkbox .custom-control-label::before {
- border-radius: 6px;
-}
-.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e");
-}
-.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {
- border-color: #4575cf;
- background-color: #4575cf;
-}
-.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e");
-}
-.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {
- background-color: rgba(69, 117, 207, 0.5);
-}
-.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {
- background-color: rgba(69, 117, 207, 0.5);
-}
-
-.custom-radio .custom-control-label::before {
- border-radius: 50%;
-}
-.custom-radio .custom-control-input:checked ~ .custom-control-label::after {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e");
-}
-.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {
- background-color: rgba(69, 117, 207, 0.5);
-}
-
-.custom-switch {
- padding-left: 2.25rem;
-}
-.custom-switch .custom-control-label::before {
- left: -2.25rem;
- width: 1.75rem;
- pointer-events: all;
- border-radius: 0.5rem;
-}
-.custom-switch .custom-control-label::after {
- top: calc(0.25rem + 2px);
- left: calc(-2.25rem + 2px);
- width: calc(1rem - 4px);
- height: calc(1rem - 4px);
- background-color: #adb5bd;
- border-radius: 0.5rem;
- transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-}
-@media (prefers-reduced-motion: reduce) {
- .custom-switch .custom-control-label::after {
- transition: none;
- }
-}
-.custom-switch .custom-control-input:checked ~ .custom-control-label::after {
- background-color: #fff;
- transform: translateX(0.75rem);
-}
-.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {
- background-color: rgba(69, 117, 207, 0.5);
-}
-
-.custom-select {
- display: inline-block;
- width: 100%;
- height: calc(1.5em + 0.75rem + 2px);
- padding: 0.375rem 1.75rem 0.375rem 0.75rem;
- font-size: 1rem;
- font-weight: 400;
- line-height: 1.5;
- color: #495057;
- vertical-align: middle;
- background: #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 0.75rem center/8px 10px no-repeat;
- border: 1px solid #ced4da;
- border-radius: 6px;
- appearance: none;
-}
-.custom-select:focus {
- border-color: #aac0e9;
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(69, 117, 207, 0.25);
-}
-.custom-select:focus::-ms-value {
- color: #495057;
- background-color: #fff;
-}
-.custom-select[multiple], .custom-select[size]:not([size="1"]) {
- height: auto;
- padding-right: 0.75rem;
- background-image: none;
-}
-.custom-select:disabled {
- color: #6c757d;
- background-color: #e9ecef;
-}
-.custom-select::-ms-expand {
- display: none;
-}
-.custom-select:-moz-focusring {
- color: transparent;
- text-shadow: 0 0 0 #495057;
-}
-
-.custom-select-sm {
- height: calc(1.5em + 0.5rem + 2px);
- padding-top: 0.25rem;
- padding-bottom: 0.25rem;
- padding-left: 0.5rem;
- font-size: 0.875rem;
-}
-
-.custom-select-lg {
- height: calc(1.5em + 1rem + 2px);
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
- padding-left: 1rem;
- font-size: 1.25rem;
-}
-
-.custom-file {
- position: relative;
- display: inline-block;
- width: 100%;
- height: calc(1.5em + 0.75rem + 2px);
- margin-bottom: 0;
-}
-
-.custom-file-input {
- position: relative;
- z-index: 2;
- width: 100%;
- height: calc(1.5em + 0.75rem + 2px);
- margin: 0;
- overflow: hidden;
- opacity: 0;
-}
-.custom-file-input:focus ~ .custom-file-label {
- border-color: #aac0e9;
- box-shadow: 0 0 0 0.2rem rgba(69, 117, 207, 0.25);
-}
-.custom-file-input[disabled] ~ .custom-file-label, .custom-file-input:disabled ~ .custom-file-label {
- background-color: #e9ecef;
-}
-.custom-file-input:lang(en) ~ .custom-file-label::after {
- content: "Browse";
-}
-.custom-file-input ~ .custom-file-label[data-browse]::after {
- content: attr(data-browse);
-}
-
-.custom-file-label {
- position: absolute;
- top: 0;
- right: 0;
- left: 0;
- z-index: 1;
- height: calc(1.5em + 0.75rem + 2px);
- padding: 0.375rem 0.75rem;
- overflow: hidden;
- font-weight: 400;
- line-height: 1.5;
- color: #495057;
- background-color: #fff;
- border: 1px solid #ced4da;
- border-radius: 6px;
-}
-.custom-file-label::after {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- z-index: 3;
- display: block;
- height: calc(1.5em + 0.75rem);
- padding: 0.375rem 0.75rem;
- line-height: 1.5;
- color: #495057;
- content: "Browse";
- background-color: #e9ecef;
- border-left: inherit;
- border-radius: 0 6px 6px 0;
-}
-
-.custom-range {
- width: 100%;
- height: 1.4rem;
- padding: 0;
- background-color: transparent;
- appearance: none;
-}
-.custom-range:focus {
- outline: 0;
-}
-.custom-range:focus::-webkit-slider-thumb {
- box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(69, 117, 207, 0.25);
-}
-.custom-range:focus::-moz-range-thumb {
- box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(69, 117, 207, 0.25);
-}
-.custom-range:focus::-ms-thumb {
- box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(69, 117, 207, 0.25);
-}
-.custom-range::-moz-focus-outer {
- border: 0;
-}
-.custom-range::-webkit-slider-thumb {
- width: 1rem;
- height: 1rem;
- margin-top: -0.25rem;
- background-color: #4575cf;
- border: 0;
- border-radius: 1rem;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
- appearance: none;
-}
-@media (prefers-reduced-motion: reduce) {
- .custom-range::-webkit-slider-thumb {
- transition: none;
- }
-}
-.custom-range::-webkit-slider-thumb:active {
- background-color: #d3def4;
-}
-.custom-range::-webkit-slider-runnable-track {
- width: 100%;
- height: 0.5rem;
- color: transparent;
- cursor: pointer;
- background-color: #dee2e6;
- border-color: transparent;
- border-radius: 1rem;
-}
-.custom-range::-moz-range-thumb {
- width: 1rem;
- height: 1rem;
- background-color: #4575cf;
- border: 0;
- border-radius: 1rem;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
- appearance: none;
-}
-@media (prefers-reduced-motion: reduce) {
- .custom-range::-moz-range-thumb {
- transition: none;
- }
-}
-.custom-range::-moz-range-thumb:active {
- background-color: #d3def4;
-}
-.custom-range::-moz-range-track {
- width: 100%;
- height: 0.5rem;
- color: transparent;
- cursor: pointer;
- background-color: #dee2e6;
- border-color: transparent;
- border-radius: 1rem;
-}
-.custom-range::-ms-thumb {
- width: 1rem;
- height: 1rem;
- margin-top: 0;
- margin-right: 0.2rem;
- margin-left: 0.2rem;
- background-color: #4575cf;
- border: 0;
- border-radius: 1rem;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
- appearance: none;
-}
-@media (prefers-reduced-motion: reduce) {
- .custom-range::-ms-thumb {
- transition: none;
- }
-}
-.custom-range::-ms-thumb:active {
- background-color: #d3def4;
-}
-.custom-range::-ms-track {
- width: 100%;
- height: 0.5rem;
- color: transparent;
- cursor: pointer;
- background-color: transparent;
- border-color: transparent;
- border-width: 0.5rem;
-}
-.custom-range::-ms-fill-lower {
- background-color: #dee2e6;
- border-radius: 1rem;
-}
-.custom-range::-ms-fill-upper {
- margin-right: 15px;
- background-color: #dee2e6;
- border-radius: 1rem;
-}
-.custom-range:disabled::-webkit-slider-thumb {
- background-color: #adb5bd;
-}
-.custom-range:disabled::-webkit-slider-runnable-track {
- cursor: default;
-}
-.custom-range:disabled::-moz-range-thumb {
- background-color: #adb5bd;
-}
-.custom-range:disabled::-moz-range-track {
- cursor: default;
-}
-.custom-range:disabled::-ms-thumb {
- background-color: #adb5bd;
-}
-
-.custom-control-label::before,
-.custom-file-label,
-.custom-select {
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-}
-@media (prefers-reduced-motion: reduce) {
- .custom-control-label::before,
- .custom-file-label,
- .custom-select {
- transition: none;
- }
-}
-
-.nav {
- display: flex;
- flex-wrap: wrap;
- padding-left: 0;
- margin-bottom: 0;
- list-style: none;
-}
-
-.nav-link {
- display: block;
- padding: 0.5rem 1rem;
-}
-.nav-link:hover, .nav-link:focus {
- text-decoration: none;
-}
-.nav-link.disabled {
- color: #6c757d;
- pointer-events: none;
- cursor: default;
-}
-
-.nav-tabs {
- border-bottom: 1px solid #dee2e6;
-}
-.nav-tabs .nav-link {
- margin-bottom: -1px;
- background-color: transparent;
- border: 1px solid transparent;
- border-top-left-radius: 6px;
- border-top-right-radius: 6px;
-}
-.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {
- isolation: isolate;
- border-color: #e9ecef #e9ecef #dee2e6;
-}
-.nav-tabs .nav-link.disabled {
- color: #6c757d;
- background-color: transparent;
- border-color: transparent;
-}
-.nav-tabs .nav-link.active,
-.nav-tabs .nav-item.show .nav-link {
- color: #495057;
- background-color: #fff;
- border-color: #dee2e6 #dee2e6 #fff;
-}
-.nav-tabs .dropdown-menu {
- margin-top: -1px;
- border-top-left-radius: 0;
- border-top-right-radius: 0;
-}
-
-.nav-pills .nav-link {
- background: none;
- border: 0;
- border-radius: 6px;
-}
-.nav-pills .nav-link.active,
-.nav-pills .show > .nav-link {
- color: #fff;
- background-color: #756f9a;
-}
-
-.nav-fill > .nav-link,
-.nav-fill .nav-item {
- flex: 1 1 auto;
- text-align: center;
-}
-
-.nav-justified > .nav-link,
-.nav-justified .nav-item {
- flex-basis: 0;
- flex-grow: 1;
- text-align: center;
-}
-
-.tab-content > .tab-pane {
- display: none;
-}
-.tab-content > .active {
- display: block;
-}
-
-.navbar {
- position: relative;
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- justify-content: space-between;
- padding: 0.5rem 1rem;
-}
-.navbar .container,
-.navbar .container-fluid,
-.navbar .container-sm,
-.navbar .container-md,
-.navbar .container-lg,
-.navbar .container-xl,
-.navbar .container-xxl,
-.navbar .container-xxxl {
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- justify-content: space-between;
-}
-.navbar-brand {
- display: inline-block;
- padding-top: 0.3125rem;
- padding-bottom: 0.3125rem;
- margin-right: 1rem;
- font-size: 1.25rem;
- line-height: inherit;
- white-space: nowrap;
-}
-.navbar-brand:hover, .navbar-brand:focus {
- text-decoration: none;
-}
-
-.navbar-nav {
- display: flex;
- flex-direction: column;
- padding-left: 0;
- margin-bottom: 0;
- list-style: none;
-}
-.navbar-nav .nav-link {
- padding-right: 0;
- padding-left: 0;
-}
-.navbar-nav .dropdown-menu {
- position: static;
- float: none;
-}
-
-.navbar-text {
- display: inline-block;
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
-}
-
-.navbar-collapse {
- flex-basis: 100%;
- flex-grow: 1;
- align-items: center;
-}
-
-.navbar-toggler {
- padding: 0.25rem 0.75rem;
- font-size: 1.25rem;
- line-height: 1;
- background-color: transparent;
- border: 1px solid transparent;
- border-radius: 3px;
-}
-.navbar-toggler:hover, .navbar-toggler:focus {
- text-decoration: none;
-}
-
-.navbar-toggler-icon {
- display: inline-block;
- width: 1.5em;
- height: 1.5em;
- vertical-align: middle;
- content: "";
- background: 50%/100% 100% no-repeat;
-}
-
-.navbar-nav-scroll {
- max-height: 75vh;
- overflow-y: auto;
-}
-
-@media (max-width: 575.98px) {
- .navbar-expand-sm > .container,
- .navbar-expand-sm > .container-fluid,
- .navbar-expand-sm > .container-sm,
- .navbar-expand-sm > .container-md,
- .navbar-expand-sm > .container-lg,
- .navbar-expand-sm > .container-xl,
- .navbar-expand-sm > .container-xxl,
- .navbar-expand-sm > .container-xxxl {
- padding-right: 0;
- padding-left: 0;
- }
-}
-@media (min-width: 576px) {
- .navbar-expand-sm {
- flex-flow: row nowrap;
- justify-content: flex-start;
- }
- .navbar-expand-sm .navbar-nav {
- flex-direction: row;
- }
- .navbar-expand-sm .navbar-nav .dropdown-menu {
- position: absolute;
- }
- .navbar-expand-sm .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
- }
- .navbar-expand-sm > .container,
- .navbar-expand-sm > .container-fluid,
- .navbar-expand-sm > .container-sm,
- .navbar-expand-sm > .container-md,
- .navbar-expand-sm > .container-lg,
- .navbar-expand-sm > .container-xl,
- .navbar-expand-sm > .container-xxl,
- .navbar-expand-sm > .container-xxxl {
- flex-wrap: nowrap;
- }
- .navbar-expand-sm .navbar-nav-scroll {
- overflow: visible;
- }
- .navbar-expand-sm .navbar-collapse {
- display: flex !important;
- flex-basis: auto;
- }
- .navbar-expand-sm .navbar-toggler {
- display: none;
- }
-}
-@media (max-width: 767.98px) {
- .navbar-expand-md > .container,
- .navbar-expand-md > .container-fluid,
- .navbar-expand-md > .container-sm,
- .navbar-expand-md > .container-md,
- .navbar-expand-md > .container-lg,
- .navbar-expand-md > .container-xl,
- .navbar-expand-md > .container-xxl,
- .navbar-expand-md > .container-xxxl {
- padding-right: 0;
- padding-left: 0;
- }
-}
-@media (min-width: 768px) {
- .navbar-expand-md {
- flex-flow: row nowrap;
- justify-content: flex-start;
- }
- .navbar-expand-md .navbar-nav {
- flex-direction: row;
- }
- .navbar-expand-md .navbar-nav .dropdown-menu {
- position: absolute;
- }
- .navbar-expand-md .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
- }
- .navbar-expand-md > .container,
- .navbar-expand-md > .container-fluid,
- .navbar-expand-md > .container-sm,
- .navbar-expand-md > .container-md,
- .navbar-expand-md > .container-lg,
- .navbar-expand-md > .container-xl,
- .navbar-expand-md > .container-xxl,
- .navbar-expand-md > .container-xxxl {
- flex-wrap: nowrap;
- }
- .navbar-expand-md .navbar-nav-scroll {
- overflow: visible;
- }
- .navbar-expand-md .navbar-collapse {
- display: flex !important;
- flex-basis: auto;
- }
- .navbar-expand-md .navbar-toggler {
- display: none;
- }
-}
-@media (max-width: 991.98px) {
- .navbar-expand-lg > .container,
- .navbar-expand-lg > .container-fluid,
- .navbar-expand-lg > .container-sm,
- .navbar-expand-lg > .container-md,
- .navbar-expand-lg > .container-lg,
- .navbar-expand-lg > .container-xl,
- .navbar-expand-lg > .container-xxl,
- .navbar-expand-lg > .container-xxxl {
- padding-right: 0;
- padding-left: 0;
- }
-}
-@media (min-width: 992px) {
- .navbar-expand-lg {
- flex-flow: row nowrap;
- justify-content: flex-start;
- }
- .navbar-expand-lg .navbar-nav {
- flex-direction: row;
- }
- .navbar-expand-lg .navbar-nav .dropdown-menu {
- position: absolute;
- }
- .navbar-expand-lg .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
- }
- .navbar-expand-lg > .container,
- .navbar-expand-lg > .container-fluid,
- .navbar-expand-lg > .container-sm,
- .navbar-expand-lg > .container-md,
- .navbar-expand-lg > .container-lg,
- .navbar-expand-lg > .container-xl,
- .navbar-expand-lg > .container-xxl,
- .navbar-expand-lg > .container-xxxl {
- flex-wrap: nowrap;
- }
- .navbar-expand-lg .navbar-nav-scroll {
- overflow: visible;
- }
- .navbar-expand-lg .navbar-collapse {
- display: flex !important;
- flex-basis: auto;
- }
- .navbar-expand-lg .navbar-toggler {
- display: none;
- }
-}
-@media (max-width: 1199.98px) {
- .navbar-expand-xl > .container,
- .navbar-expand-xl > .container-fluid,
- .navbar-expand-xl > .container-sm,
- .navbar-expand-xl > .container-md,
- .navbar-expand-xl > .container-lg,
- .navbar-expand-xl > .container-xl,
- .navbar-expand-xl > .container-xxl,
- .navbar-expand-xl > .container-xxxl {
- padding-right: 0;
- padding-left: 0;
- }
-}
-@media (min-width: 1200px) {
- .navbar-expand-xl {
- flex-flow: row nowrap;
- justify-content: flex-start;
- }
- .navbar-expand-xl .navbar-nav {
- flex-direction: row;
- }
- .navbar-expand-xl .navbar-nav .dropdown-menu {
- position: absolute;
- }
- .navbar-expand-xl .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
- }
- .navbar-expand-xl > .container,
- .navbar-expand-xl > .container-fluid,
- .navbar-expand-xl > .container-sm,
- .navbar-expand-xl > .container-md,
- .navbar-expand-xl > .container-lg,
- .navbar-expand-xl > .container-xl,
- .navbar-expand-xl > .container-xxl,
- .navbar-expand-xl > .container-xxxl {
- flex-wrap: nowrap;
- }
- .navbar-expand-xl .navbar-nav-scroll {
- overflow: visible;
- }
- .navbar-expand-xl .navbar-collapse {
- display: flex !important;
- flex-basis: auto;
- }
- .navbar-expand-xl .navbar-toggler {
- display: none;
- }
-}
-@media (max-width: 1599.98px) {
- .navbar-expand-xxl > .container,
- .navbar-expand-xxl > .container-fluid,
- .navbar-expand-xxl > .container-sm,
- .navbar-expand-xxl > .container-md,
- .navbar-expand-xxl > .container-lg,
- .navbar-expand-xxl > .container-xl,
- .navbar-expand-xxl > .container-xxl,
- .navbar-expand-xxl > .container-xxxl {
- padding-right: 0;
- padding-left: 0;
- }
-}
-@media (min-width: 1600px) {
- .navbar-expand-xxl {
- flex-flow: row nowrap;
- justify-content: flex-start;
- }
- .navbar-expand-xxl .navbar-nav {
- flex-direction: row;
- }
- .navbar-expand-xxl .navbar-nav .dropdown-menu {
- position: absolute;
- }
- .navbar-expand-xxl .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
- }
- .navbar-expand-xxl > .container,
- .navbar-expand-xxl > .container-fluid,
- .navbar-expand-xxl > .container-sm,
- .navbar-expand-xxl > .container-md,
- .navbar-expand-xxl > .container-lg,
- .navbar-expand-xxl > .container-xl,
- .navbar-expand-xxl > .container-xxl,
- .navbar-expand-xxl > .container-xxxl {
- flex-wrap: nowrap;
- }
- .navbar-expand-xxl .navbar-nav-scroll {
- overflow: visible;
- }
- .navbar-expand-xxl .navbar-collapse {
- display: flex !important;
- flex-basis: auto;
- }
- .navbar-expand-xxl .navbar-toggler {
- display: none;
- }
-}
-@media (max-width: 2599.98px) {
- .navbar-expand-xxxl > .container,
- .navbar-expand-xxxl > .container-fluid,
- .navbar-expand-xxxl > .container-sm,
- .navbar-expand-xxxl > .container-md,
- .navbar-expand-xxxl > .container-lg,
- .navbar-expand-xxxl > .container-xl,
- .navbar-expand-xxxl > .container-xxl,
- .navbar-expand-xxxl > .container-xxxl {
- padding-right: 0;
- padding-left: 0;
- }
-}
-@media (min-width: 2600px) {
- .navbar-expand-xxxl {
- flex-flow: row nowrap;
- justify-content: flex-start;
- }
- .navbar-expand-xxxl .navbar-nav {
- flex-direction: row;
- }
- .navbar-expand-xxxl .navbar-nav .dropdown-menu {
- position: absolute;
- }
- .navbar-expand-xxxl .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
- }
- .navbar-expand-xxxl > .container,
- .navbar-expand-xxxl > .container-fluid,
- .navbar-expand-xxxl > .container-sm,
- .navbar-expand-xxxl > .container-md,
- .navbar-expand-xxxl > .container-lg,
- .navbar-expand-xxxl > .container-xl,
- .navbar-expand-xxxl > .container-xxl,
- .navbar-expand-xxxl > .container-xxxl {
- flex-wrap: nowrap;
- }
- .navbar-expand-xxxl .navbar-nav-scroll {
- overflow: visible;
- }
- .navbar-expand-xxxl .navbar-collapse {
- display: flex !important;
- flex-basis: auto;
- }
- .navbar-expand-xxxl .navbar-toggler {
- display: none;
- }
-}
-.navbar-expand {
- flex-flow: row nowrap;
- justify-content: flex-start;
-}
-.navbar-expand > .container,
-.navbar-expand > .container-fluid,
-.navbar-expand > .container-sm,
-.navbar-expand > .container-md,
-.navbar-expand > .container-lg,
-.navbar-expand > .container-xl,
-.navbar-expand > .container-xxl,
-.navbar-expand > .container-xxxl {
- padding-right: 0;
- padding-left: 0;
-}
-.navbar-expand .navbar-nav {
- flex-direction: row;
-}
-.navbar-expand .navbar-nav .dropdown-menu {
- position: absolute;
-}
-.navbar-expand .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
-}
-.navbar-expand > .container,
-.navbar-expand > .container-fluid,
-.navbar-expand > .container-sm,
-.navbar-expand > .container-md,
-.navbar-expand > .container-lg,
-.navbar-expand > .container-xl,
-.navbar-expand > .container-xxl,
-.navbar-expand > .container-xxxl {
- flex-wrap: nowrap;
-}
-.navbar-expand .navbar-nav-scroll {
- overflow: visible;
-}
-.navbar-expand .navbar-collapse {
- display: flex !important;
- flex-basis: auto;
-}
-.navbar-expand .navbar-toggler {
- display: none;
-}
-
-.navbar-light .navbar-brand {
- color: rgba(0, 0, 0, 0.9);
-}
-.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {
- color: rgba(0, 0, 0, 0.9);
-}
-.navbar-light .navbar-nav .nav-link {
- color: rgba(0, 0, 0, 0.5);
-}
-.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {
- color: rgba(0, 0, 0, 0.7);
-}
-.navbar-light .navbar-nav .nav-link.disabled {
- color: rgba(0, 0, 0, 0.3);
-}
-.navbar-light .navbar-nav .show > .nav-link,
-.navbar-light .navbar-nav .active > .nav-link,
-.navbar-light .navbar-nav .nav-link.show,
-.navbar-light .navbar-nav .nav-link.active {
- color: rgba(0, 0, 0, 0.9);
-}
-.navbar-light .navbar-toggler {
- color: rgba(0, 0, 0, 0.5);
- border-color: rgba(0, 0, 0, 0.1);
-}
-.navbar-light .navbar-toggler-icon {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
-}
-.navbar-light .navbar-text {
- color: rgba(0, 0, 0, 0.5);
-}
-.navbar-light .navbar-text a {
- color: rgba(0, 0, 0, 0.9);
-}
-.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {
- color: rgba(0, 0, 0, 0.9);
-}
-
-.navbar-dark .navbar-brand {
- color: #fff;
-}
-.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {
- color: #fff;
-}
-.navbar-dark .navbar-nav .nav-link {
- color: rgba(255, 255, 255, 0.5);
-}
-.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {
- color: rgba(255, 255, 255, 0.75);
-}
-.navbar-dark .navbar-nav .nav-link.disabled {
- color: rgba(255, 255, 255, 0.25);
-}
-.navbar-dark .navbar-nav .show > .nav-link,
-.navbar-dark .navbar-nav .active > .nav-link,
-.navbar-dark .navbar-nav .nav-link.show,
-.navbar-dark .navbar-nav .nav-link.active {
- color: #fff;
-}
-.navbar-dark .navbar-toggler {
- color: rgba(255, 255, 255, 0.5);
- border-color: rgba(255, 255, 255, 0.1);
-}
-.navbar-dark .navbar-toggler-icon {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
-}
-.navbar-dark .navbar-text {
- color: rgba(255, 255, 255, 0.5);
-}
-.navbar-dark .navbar-text a {
- color: #fff;
-}
-.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {
- color: #fff;
-}
-
-.card {
- position: relative;
- display: flex;
- flex-direction: column;
- min-width: 0;
- word-wrap: break-word;
- background-color: #fff;
- background-clip: border-box;
- border: 1px solid rgba(0, 0, 0, 0.125);
- border-radius: 6px;
-}
-.card > hr {
- margin-right: 0;
- margin-left: 0;
-}
-.card > .list-group {
- border-top: inherit;
- border-bottom: inherit;
-}
-.card > .list-group:first-child {
- border-top-width: 0;
- border-top-left-radius: 5px;
- border-top-right-radius: 5px;
-}
-.card > .list-group:last-child {
- border-bottom-width: 0;
- border-bottom-right-radius: 5px;
- border-bottom-left-radius: 5px;
-}
-.card > .card-header + .list-group,
-.card > .list-group + .card-footer {
- border-top: 0;
-}
-
-.card-body {
- flex: 1 1 auto;
- min-height: 1px;
- padding: 1.25rem;
-}
-
-.card-title {
- margin-bottom: 0.75rem;
-}
-
-.card-subtitle {
- margin-top: -0.375rem;
- margin-bottom: 0;
-}
-
-.card-text:last-child {
- margin-bottom: 0;
-}
-
-.card-link:hover {
- text-decoration: none;
-}
-.card-link + .card-link {
- margin-left: 1.25rem;
-}
-
-.card-header {
- padding: 0.75rem 1.25rem;
- margin-bottom: 0;
- background-color: rgba(0, 0, 0, 0.03);
- border-bottom: 1px solid rgba(0, 0, 0, 0.125);
-}
-.card-header:first-child {
- border-radius: 5px 5px 0 0;
-}
-
-.card-footer {
- padding: 0.75rem 1.25rem;
- background-color: rgba(0, 0, 0, 0.03);
- border-top: 1px solid rgba(0, 0, 0, 0.125);
-}
-.card-footer:last-child {
- border-radius: 0 0 5px 5px;
-}
-
-.card-header-tabs {
- margin-right: -0.625rem;
- margin-bottom: -0.75rem;
- margin-left: -0.625rem;
- border-bottom: 0;
-}
-
-.card-header-pills {
- margin-right: -0.625rem;
- margin-left: -0.625rem;
-}
-
-.card-img-overlay {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- padding: 1.25rem;
- border-radius: 5px;
-}
-
-.card-img,
-.card-img-top,
-.card-img-bottom {
- flex-shrink: 0;
- width: 100%;
-}
-
-.card-img,
-.card-img-top {
- border-top-left-radius: 5px;
- border-top-right-radius: 5px;
-}
-
-.card-img,
-.card-img-bottom {
- border-bottom-right-radius: 5px;
- border-bottom-left-radius: 5px;
-}
-
-.card-deck .card {
- margin-bottom: 12px;
-}
-@media (min-width: 576px) {
- .card-deck {
- display: flex;
- flex-flow: row wrap;
- margin-right: -12px;
- margin-left: -12px;
- }
- .card-deck .card {
- flex: 1 0 0%;
- margin-right: 12px;
- margin-bottom: 0;
- margin-left: 12px;
- }
-}
-
-.card-group > .card {
- margin-bottom: 12px;
-}
-@media (min-width: 576px) {
- .card-group {
- display: flex;
- flex-flow: row wrap;
- }
- .card-group > .card {
- flex: 1 0 0%;
- margin-bottom: 0;
- }
- .card-group > .card + .card {
- margin-left: 0;
- border-left: 0;
- }
- .card-group > .card:not(:last-child) {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
- }
- .card-group > .card:not(:last-child) .card-img-top,
- .card-group > .card:not(:last-child) .card-header {
- border-top-right-radius: 0;
- }
- .card-group > .card:not(:last-child) .card-img-bottom,
- .card-group > .card:not(:last-child) .card-footer {
- border-bottom-right-radius: 0;
- }
- .card-group > .card:not(:first-child) {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
- }
- .card-group > .card:not(:first-child) .card-img-top,
- .card-group > .card:not(:first-child) .card-header {
- border-top-left-radius: 0;
- }
- .card-group > .card:not(:first-child) .card-img-bottom,
- .card-group > .card:not(:first-child) .card-footer {
- border-bottom-left-radius: 0;
- }
-}
-
-.card-columns .card {
- margin-bottom: 0.75rem;
-}
-@media (min-width: 576px) {
- .card-columns {
- column-count: 3;
- column-gap: 1.25rem;
- orphans: 1;
- widows: 1;
- }
- .card-columns .card {
- display: inline-block;
- width: 100%;
- }
-}
-
-.accordion {
- overflow-anchor: none;
-}
-.accordion > .card {
- overflow: hidden;
-}
-.accordion > .card:not(:last-of-type) {
- border-bottom: 0;
- border-bottom-right-radius: 0;
- border-bottom-left-radius: 0;
-}
-.accordion > .card:not(:first-of-type) {
- border-top-left-radius: 0;
- border-top-right-radius: 0;
-}
-.accordion > .card > .card-header {
- border-radius: 0;
- margin-bottom: -1px;
-}
-
-.breadcrumb {
- display: flex;
- flex-wrap: wrap;
- padding: 0.75rem 1rem;
- margin-bottom: 1rem;
- list-style: none;
- background-color: #e9ecef;
- border-radius: 6px;
-}
-
-.breadcrumb-item + .breadcrumb-item {
- padding-left: 0.5rem;
-}
-.breadcrumb-item + .breadcrumb-item::before {
- float: left;
- padding-right: 0.5rem;
- color: #6c757d;
- content: "/";
-}
-.breadcrumb-item + .breadcrumb-item:hover::before {
- text-decoration: underline;
-}
-.breadcrumb-item + .breadcrumb-item:hover::before {
- text-decoration: none;
-}
-.breadcrumb-item.active {
- color: #6c757d;
-}
-
-.pagination {
- display: flex;
- padding-left: 0;
- list-style: none;
- border-radius: 6px;
-}
-
-.page-link {
- position: relative;
- display: block;
- padding: 0.5rem 0.75rem;
- margin-left: -1px;
- line-height: 1.25;
- color: #4575cf;
- background-color: #fff;
- border: 1px solid #dee2e6;
-}
-.page-link:hover {
- z-index: 2;
- color: #29529f;
- text-decoration: none;
- background-color: #e9ecef;
- border-color: #dee2e6;
-}
-.page-link:focus {
- z-index: 3;
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(69, 117, 207, 0.25);
-}
-
-.page-item:first-child .page-link {
- margin-left: 0;
- border-top-left-radius: 6px;
- border-bottom-left-radius: 6px;
-}
-.page-item:last-child .page-link {
- border-top-right-radius: 6px;
- border-bottom-right-radius: 6px;
-}
-.page-item.active .page-link {
- z-index: 3;
- color: #fff;
- background-color: #4575cf;
- border-color: #4575cf;
-}
-.page-item.disabled .page-link {
- color: #6c757d;
- pointer-events: none;
- cursor: auto;
- background-color: #fff;
- border-color: #dee2e6;
-}
-
-.pagination-lg .page-link {
- padding: 0.75rem 1.5rem;
- font-size: 1.25rem;
- line-height: 1.5;
-}
-.pagination-lg .page-item:first-child .page-link {
- border-top-left-radius: 0.3rem;
- border-bottom-left-radius: 0.3rem;
-}
-.pagination-lg .page-item:last-child .page-link {
- border-top-right-radius: 0.3rem;
- border-bottom-right-radius: 0.3rem;
-}
-
-.pagination-sm .page-link {
- padding: 0.25rem 0.5rem;
- font-size: 0.875rem;
- line-height: 1.5;
-}
-.pagination-sm .page-item:first-child .page-link {
- border-top-left-radius: 0.2rem;
- border-bottom-left-radius: 0.2rem;
-}
-.pagination-sm .page-item:last-child .page-link {
- border-top-right-radius: 0.2rem;
- border-bottom-right-radius: 0.2rem;
-}
-
-.badge {
- display: inline-block;
- padding: 0.25em 0.4em;
- font-size: 75%;
- font-weight: 700;
- line-height: 1;
- text-align: center;
- white-space: nowrap;
- vertical-align: baseline;
- border-radius: 3px;
- transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-}
-@media (prefers-reduced-motion: reduce) {
- .badge {
- transition: none;
- }
-}
-a.badge:hover, a.badge:focus {
- text-decoration: none;
-}
-
-.badge:empty {
- display: none;
-}
-
-.btn .badge {
- position: relative;
- top: -1px;
-}
-
-.badge-pill {
- padding-right: 0.6em;
- padding-left: 0.6em;
- border-radius: 10rem;
-}
-
-.badge-primary {
- color: #fff;
- background-color: #4575cf;
-}
-a.badge-primary:hover, a.badge-primary:focus {
- color: #fff;
- background-color: #2e5cb3;
-}
-a.badge-primary:focus, a.badge-primary.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(69, 117, 207, 0.5);
-}
-
-.badge-secondary {
- color: #fff;
- background-color: #6c757d;
-}
-a.badge-secondary:hover, a.badge-secondary:focus {
- color: #fff;
- background-color: #545b62;
-}
-a.badge-secondary:focus, a.badge-secondary.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
-}
-
-.badge-success {
- color: #fff;
- background-color: #28a745;
-}
-a.badge-success:hover, a.badge-success:focus {
- color: #fff;
- background-color: #1e7e34;
-}
-a.badge-success:focus, a.badge-success.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
-}
-
-.badge-info {
- color: #fff;
- background-color: #17a2b8;
-}
-a.badge-info:hover, a.badge-info:focus {
- color: #fff;
- background-color: #117a8b;
-}
-a.badge-info:focus, a.badge-info.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
-}
-
-.badge-warning {
- color: #212529;
- background-color: #ffc107;
-}
-a.badge-warning:hover, a.badge-warning:focus {
- color: #212529;
- background-color: #d39e00;
-}
-a.badge-warning:focus, a.badge-warning.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
-}
-
-.badge-danger {
- color: #fff;
- background-color: #dc3545;
-}
-a.badge-danger:hover, a.badge-danger:focus {
- color: #fff;
- background-color: #bd2130;
-}
-a.badge-danger:focus, a.badge-danger.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
-}
-
-.badge-light {
- color: #212529;
- background-color: #f8f9fa;
-}
-a.badge-light:hover, a.badge-light:focus {
- color: #212529;
- background-color: #dae0e5;
-}
-a.badge-light:focus, a.badge-light.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
-}
-
-.badge-dark {
- color: #fff;
- background-color: #343a40;
-}
-a.badge-dark:hover, a.badge-dark:focus {
- color: #fff;
- background-color: #1d2124;
-}
-a.badge-dark:focus, a.badge-dark.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
-}
-
-.jumbotron {
- padding: 2rem 1rem;
- margin-bottom: 2rem;
- background-color: #e9ecef;
- border-radius: 0.3rem;
-}
-@media (min-width: 576px) {
- .jumbotron {
- padding: 4rem 2rem;
- }
-}
-
-.jumbotron-fluid {
- padding-right: 0;
- padding-left: 0;
- border-radius: 0;
-}
-
-.alert {
- position: relative;
- padding: 0.75rem 1.25rem;
- margin-bottom: 1rem;
- border: 1px solid transparent;
- border-radius: 6px;
-}
-
-.alert-heading {
- color: inherit;
-}
-
-.alert-link {
- font-weight: 700;
-}
-
-.alert-dismissible {
- padding-right: 4rem;
-}
-.alert-dismissible .close {
- position: absolute;
- top: 0;
- right: 0;
- z-index: 2;
- padding: 0.75rem 1.25rem;
- color: inherit;
-}
-
-.alert-primary {
- color: #243d6c;
- background-color: #dae3f5;
- border-color: #cbd8f2;
-}
-.alert-primary hr {
- border-top-color: #b7c9ed;
-}
-.alert-primary .alert-link {
- color: #172746;
-}
-
-.alert-secondary {
- color: #383d41;
- background-color: #e2e3e5;
- border-color: #d6d8db;
-}
-.alert-secondary hr {
- border-top-color: #c8cbcf;
-}
-.alert-secondary .alert-link {
- color: #202326;
-}
-
-.alert-success {
- color: #155724;
- background-color: #d4edda;
- border-color: #c3e6cb;
-}
-.alert-success hr {
- border-top-color: #b1dfbb;
-}
-.alert-success .alert-link {
- color: #0b2e13;
-}
-
-.alert-info {
- color: #0c5460;
- background-color: #d1ecf1;
- border-color: #bee5eb;
-}
-.alert-info hr {
- border-top-color: #abdde5;
-}
-.alert-info .alert-link {
- color: #062c33;
-}
-
-.alert-warning {
- color: #856404;
- background-color: #fff3cd;
- border-color: #ffeeba;
-}
-.alert-warning hr {
- border-top-color: #ffe8a1;
-}
-.alert-warning .alert-link {
- color: #533f03;
-}
-
-.alert-danger {
- color: #721c24;
- background-color: #f8d7da;
- border-color: #f5c6cb;
-}
-.alert-danger hr {
- border-top-color: #f1b0b7;
-}
-.alert-danger .alert-link {
- color: #491217;
-}
-
-.alert-light {
- color: #818182;
- background-color: #fefefe;
- border-color: #fdfdfe;
-}
-.alert-light hr {
- border-top-color: #ececf6;
-}
-.alert-light .alert-link {
- color: #686868;
-}
-
-.alert-dark {
- color: #1b1e21;
- background-color: #d6d8d9;
- border-color: #c6c8ca;
-}
-.alert-dark hr {
- border-top-color: #b9bbbe;
-}
-.alert-dark .alert-link {
- color: #040505;
-}
-
-@keyframes progress-bar-stripes {
- from {
- background-position: 1rem 0;
- }
- to {
- background-position: 0 0;
- }
-}
-.progress {
- display: flex;
- height: 1rem;
- overflow: hidden;
- line-height: 0;
- font-size: 0.75rem;
- background-color: #e9ecef;
- border-radius: 6px;
-}
-
-.progress-bar {
- display: flex;
- flex-direction: column;
- justify-content: center;
- overflow: hidden;
- color: #fff;
- text-align: center;
- white-space: nowrap;
- background-color: #4575cf;
- transition: width 0.6s ease;
-}
-@media (prefers-reduced-motion: reduce) {
- .progress-bar {
- transition: none;
- }
-}
-
-.progress-bar-striped {
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-size: 1rem 1rem;
-}
-
-.progress-bar-animated {
- animation: 1s linear infinite progress-bar-stripes;
-}
-@media (prefers-reduced-motion: reduce) {
- .progress-bar-animated {
- animation: none;
- }
-}
-
-.media {
- display: flex;
- align-items: flex-start;
-}
-
-.media-body {
- flex: 1;
-}
-
-.list-group {
- display: flex;
- flex-direction: column;
- padding-left: 0;
- margin-bottom: 0;
- border-radius: 6px;
-}
-
-.list-group-item-action {
- width: 100%;
- color: #495057;
- text-align: inherit;
-}
-.list-group-item-action:hover, .list-group-item-action:focus {
- z-index: 1;
- color: #495057;
- text-decoration: none;
- background-color: #f8f9fa;
-}
-.list-group-item-action:active {
- color: #212529;
- background-color: #e9ecef;
-}
-
-.list-group-item {
- position: relative;
- display: block;
- padding: 0.75rem 1.25rem;
- background-color: #fff;
- border: 1px solid rgba(0, 0, 0, 0.125);
-}
-.list-group-item:first-child {
- border-top-left-radius: inherit;
- border-top-right-radius: inherit;
-}
-.list-group-item:last-child {
- border-bottom-right-radius: inherit;
- border-bottom-left-radius: inherit;
-}
-.list-group-item.disabled, .list-group-item:disabled {
- color: #6c757d;
- pointer-events: none;
- background-color: #fff;
-}
-.list-group-item.active {
- z-index: 2;
- color: #fff;
- background-color: #4575cf;
- border-color: #4575cf;
-}
-.list-group-item + .list-group-item {
- border-top-width: 0;
-}
-.list-group-item + .list-group-item.active {
- margin-top: -1px;
- border-top-width: 1px;
-}
-
-.list-group-horizontal {
- flex-direction: row;
-}
-.list-group-horizontal > .list-group-item:first-child {
- border-bottom-left-radius: 6px;
- border-top-right-radius: 0;
-}
-.list-group-horizontal > .list-group-item:last-child {
- border-top-right-radius: 6px;
- border-bottom-left-radius: 0;
-}
-.list-group-horizontal > .list-group-item.active {
- margin-top: 0;
-}
-.list-group-horizontal > .list-group-item + .list-group-item {
- border-top-width: 1px;
- border-left-width: 0;
-}
-.list-group-horizontal > .list-group-item + .list-group-item.active {
- margin-left: -1px;
- border-left-width: 1px;
-}
-
-@media (min-width: 576px) {
- .list-group-horizontal-sm {
- flex-direction: row;
- }
- .list-group-horizontal-sm > .list-group-item:first-child {
- border-bottom-left-radius: 6px;
- border-top-right-radius: 0;
- }
- .list-group-horizontal-sm > .list-group-item:last-child {
- border-top-right-radius: 6px;
- border-bottom-left-radius: 0;
- }
- .list-group-horizontal-sm > .list-group-item.active {
- margin-top: 0;
- }
- .list-group-horizontal-sm > .list-group-item + .list-group-item {
- border-top-width: 1px;
- border-left-width: 0;
- }
- .list-group-horizontal-sm > .list-group-item + .list-group-item.active {
- margin-left: -1px;
- border-left-width: 1px;
- }
-}
-@media (min-width: 768px) {
- .list-group-horizontal-md {
- flex-direction: row;
- }
- .list-group-horizontal-md > .list-group-item:first-child {
- border-bottom-left-radius: 6px;
- border-top-right-radius: 0;
- }
- .list-group-horizontal-md > .list-group-item:last-child {
- border-top-right-radius: 6px;
- border-bottom-left-radius: 0;
- }
- .list-group-horizontal-md > .list-group-item.active {
- margin-top: 0;
- }
- .list-group-horizontal-md > .list-group-item + .list-group-item {
- border-top-width: 1px;
- border-left-width: 0;
- }
- .list-group-horizontal-md > .list-group-item + .list-group-item.active {
- margin-left: -1px;
- border-left-width: 1px;
- }
-}
-@media (min-width: 992px) {
- .list-group-horizontal-lg {
- flex-direction: row;
- }
- .list-group-horizontal-lg > .list-group-item:first-child {
- border-bottom-left-radius: 6px;
- border-top-right-radius: 0;
- }
- .list-group-horizontal-lg > .list-group-item:last-child {
- border-top-right-radius: 6px;
- border-bottom-left-radius: 0;
- }
- .list-group-horizontal-lg > .list-group-item.active {
- margin-top: 0;
- }
- .list-group-horizontal-lg > .list-group-item + .list-group-item {
- border-top-width: 1px;
- border-left-width: 0;
- }
- .list-group-horizontal-lg > .list-group-item + .list-group-item.active {
- margin-left: -1px;
- border-left-width: 1px;
- }
-}
-@media (min-width: 1200px) {
- .list-group-horizontal-xl {
- flex-direction: row;
- }
- .list-group-horizontal-xl > .list-group-item:first-child {
- border-bottom-left-radius: 6px;
- border-top-right-radius: 0;
- }
- .list-group-horizontal-xl > .list-group-item:last-child {
- border-top-right-radius: 6px;
- border-bottom-left-radius: 0;
- }
- .list-group-horizontal-xl > .list-group-item.active {
- margin-top: 0;
- }
- .list-group-horizontal-xl > .list-group-item + .list-group-item {
- border-top-width: 1px;
- border-left-width: 0;
- }
- .list-group-horizontal-xl > .list-group-item + .list-group-item.active {
- margin-left: -1px;
- border-left-width: 1px;
- }
-}
-@media (min-width: 1600px) {
- .list-group-horizontal-xxl {
- flex-direction: row;
- }
- .list-group-horizontal-xxl > .list-group-item:first-child {
- border-bottom-left-radius: 6px;
- border-top-right-radius: 0;
- }
- .list-group-horizontal-xxl > .list-group-item:last-child {
- border-top-right-radius: 6px;
- border-bottom-left-radius: 0;
- }
- .list-group-horizontal-xxl > .list-group-item.active {
- margin-top: 0;
- }
- .list-group-horizontal-xxl > .list-group-item + .list-group-item {
- border-top-width: 1px;
- border-left-width: 0;
- }
- .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {
- margin-left: -1px;
- border-left-width: 1px;
- }
-}
-@media (min-width: 2600px) {
- .list-group-horizontal-xxxl {
- flex-direction: row;
- }
- .list-group-horizontal-xxxl > .list-group-item:first-child {
- border-bottom-left-radius: 6px;
- border-top-right-radius: 0;
- }
- .list-group-horizontal-xxxl > .list-group-item:last-child {
- border-top-right-radius: 6px;
- border-bottom-left-radius: 0;
- }
- .list-group-horizontal-xxxl > .list-group-item.active {
- margin-top: 0;
- }
- .list-group-horizontal-xxxl > .list-group-item + .list-group-item {
- border-top-width: 1px;
- border-left-width: 0;
- }
- .list-group-horizontal-xxxl > .list-group-item + .list-group-item.active {
- margin-left: -1px;
- border-left-width: 1px;
- }
-}
-.list-group-flush {
- border-radius: 0;
-}
-.list-group-flush > .list-group-item {
- border-width: 0 0 1px;
-}
-.list-group-flush > .list-group-item:last-child {
- border-bottom-width: 0;
-}
-
-.list-group-item-primary {
- color: #243d6c;
- background-color: #cbd8f2;
-}
-.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {
- color: #243d6c;
- background-color: #b7c9ed;
-}
-.list-group-item-primary.list-group-item-action.active {
- color: #fff;
- background-color: #243d6c;
- border-color: #243d6c;
-}
-
-.list-group-item-secondary {
- color: #383d41;
- background-color: #d6d8db;
-}
-.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {
- color: #383d41;
- background-color: #c8cbcf;
-}
-.list-group-item-secondary.list-group-item-action.active {
- color: #fff;
- background-color: #383d41;
- border-color: #383d41;
-}
-
-.list-group-item-success {
- color: #155724;
- background-color: #c3e6cb;
-}
-.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {
- color: #155724;
- background-color: #b1dfbb;
-}
-.list-group-item-success.list-group-item-action.active {
- color: #fff;
- background-color: #155724;
- border-color: #155724;
-}
-
-.list-group-item-info {
- color: #0c5460;
- background-color: #bee5eb;
-}
-.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {
- color: #0c5460;
- background-color: #abdde5;
-}
-.list-group-item-info.list-group-item-action.active {
- color: #fff;
- background-color: #0c5460;
- border-color: #0c5460;
-}
-
-.list-group-item-warning {
- color: #856404;
- background-color: #ffeeba;
-}
-.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {
- color: #856404;
- background-color: #ffe8a1;
-}
-.list-group-item-warning.list-group-item-action.active {
- color: #fff;
- background-color: #856404;
- border-color: #856404;
-}
-
-.list-group-item-danger {
- color: #721c24;
- background-color: #f5c6cb;
-}
-.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {
- color: #721c24;
- background-color: #f1b0b7;
-}
-.list-group-item-danger.list-group-item-action.active {
- color: #fff;
- background-color: #721c24;
- border-color: #721c24;
-}
-
-.list-group-item-light {
- color: #818182;
- background-color: #fdfdfe;
-}
-.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {
- color: #818182;
- background-color: #ececf6;
-}
-.list-group-item-light.list-group-item-action.active {
- color: #fff;
- background-color: #818182;
- border-color: #818182;
-}
-
-.list-group-item-dark {
- color: #1b1e21;
- background-color: #c6c8ca;
-}
-.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {
- color: #1b1e21;
- background-color: #b9bbbe;
-}
-.list-group-item-dark.list-group-item-action.active {
- color: #fff;
- background-color: #1b1e21;
- border-color: #1b1e21;
-}
-
-.close {
- float: right;
- font-size: 1.5rem;
- font-weight: 700;
- line-height: 1;
- color: #000;
- text-shadow: 0 1px 0 #fff;
- opacity: 0.5;
-}
-.close:hover {
- color: #000;
- text-decoration: none;
-}
-.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {
- opacity: 0.75;
-}
-
-button.close {
- padding: 0;
- background-color: transparent;
- border: 0;
-}
-
-a.close.disabled {
- pointer-events: none;
-}
-
-.toast {
- flex-basis: 350px;
- max-width: 350px;
- font-size: 0.875rem;
- background-color: rgba(255, 255, 255, 0.85);
- background-clip: padding-box;
- border: 1px solid rgba(0, 0, 0, 0.1);
- box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);
- opacity: 0;
- border-radius: 0.25rem;
-}
-.toast:not(:last-child) {
- margin-bottom: 0.75rem;
-}
-.toast.showing {
- opacity: 1;
-}
-.toast.show {
- display: block;
- opacity: 1;
-}
-.toast.hide {
- display: none;
-}
-
-.toast-header {
- display: flex;
- align-items: center;
- padding: 0.25rem 0.75rem;
- color: #6c757d;
- background-color: rgba(255, 255, 255, 0.85);
- background-clip: padding-box;
- border-bottom: 1px solid rgba(0, 0, 0, 0.05);
- border-top-left-radius: calc(0.25rem - 1px);
- border-top-right-radius: calc(0.25rem - 1px);
-}
-
-.toast-body {
- padding: 0.75rem;
-}
-
-.modal-open {
- overflow: hidden;
-}
-.modal-open .modal {
- overflow-x: hidden;
- overflow-y: auto;
-}
-
-.modal {
- position: fixed;
- top: 0;
- left: 0;
- z-index: 1050;
- display: none;
- width: 100%;
- height: 100%;
- overflow: hidden;
- outline: 0;
-}
-
-.modal-dialog {
- position: relative;
- width: auto;
- margin: 0.5rem;
- pointer-events: none;
-}
-.modal.fade .modal-dialog {
- transition: transform 0.3s ease-out;
- transform: translate(0, -50px);
-}
-@media (prefers-reduced-motion: reduce) {
- .modal.fade .modal-dialog {
- transition: none;
- }
-}
-.modal.show .modal-dialog {
- transform: none;
-}
-.modal.modal-static .modal-dialog {
- transform: scale(1.02);
-}
-
-.modal-dialog-scrollable {
- display: flex;
- max-height: calc(100% - 1rem);
-}
-.modal-dialog-scrollable .modal-content {
- max-height: calc(100vh - 1rem);
- overflow: hidden;
-}
-.modal-dialog-scrollable .modal-header,
-.modal-dialog-scrollable .modal-footer {
- flex-shrink: 0;
-}
-.modal-dialog-scrollable .modal-body {
- overflow-y: auto;
-}
-
-.modal-dialog-centered {
- display: flex;
- align-items: center;
- min-height: calc(100% - 1rem);
-}
-.modal-dialog-centered::before {
- display: block;
- height: calc(100vh - 1rem);
- height: min-content;
- content: "";
-}
-.modal-dialog-centered.modal-dialog-scrollable {
- flex-direction: column;
- justify-content: center;
- height: 100%;
-}
-.modal-dialog-centered.modal-dialog-scrollable .modal-content {
- max-height: none;
-}
-.modal-dialog-centered.modal-dialog-scrollable::before {
- content: none;
-}
-
-.modal-content {
- position: relative;
- display: flex;
- flex-direction: column;
- width: 100%;
- pointer-events: auto;
- background-color: #fff;
- background-clip: padding-box;
- border: 1px solid rgba(0, 0, 0, 0.2);
- border-radius: 0.3rem;
- outline: 0;
-}
-
-.modal-backdrop {
- position: fixed;
- top: 0;
- left: 0;
- z-index: 1040;
- width: 100vw;
- height: 100vh;
- background-color: #000;
-}
-.modal-backdrop.fade {
- opacity: 0;
-}
-.modal-backdrop.show {
- opacity: 0.5;
-}
-
-.modal-header {
- display: flex;
- align-items: flex-start;
- justify-content: space-between;
- padding: 1rem 1rem;
- border-bottom: 1px solid #dee2e6;
- border-top-left-radius: calc(0.3rem - 1px);
- border-top-right-radius: calc(0.3rem - 1px);
-}
-.modal-header .close {
- padding: 1rem 1rem;
- margin: -1rem -1rem -1rem auto;
-}
-
-.modal-title {
- margin-bottom: 0;
- line-height: 1.5;
-}
-
-.modal-body {
- position: relative;
- flex: 1 1 auto;
- padding: 1rem;
-}
-
-.modal-footer {
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- justify-content: flex-end;
- padding: 0.75rem;
- border-top: 1px solid #dee2e6;
- border-bottom-right-radius: calc(0.3rem - 1px);
- border-bottom-left-radius: calc(0.3rem - 1px);
-}
-.modal-footer > * {
- margin: 0.25rem;
-}
-
-.modal-scrollbar-measure {
- position: absolute;
- top: -9999px;
- width: 50px;
- height: 50px;
- overflow: scroll;
-}
-
-@media (min-width: 576px) {
- .modal-dialog {
- max-width: 500px;
- margin: 1.75rem auto;
- }
- .modal-dialog-scrollable {
- max-height: calc(100% - 3.5rem);
- }
- .modal-dialog-scrollable .modal-content {
- max-height: calc(100vh - 3.5rem);
- }
- .modal-dialog-centered {
- min-height: calc(100% - 3.5rem);
- }
- .modal-dialog-centered::before {
- height: calc(100vh - 3.5rem);
- height: min-content;
- }
- .modal-sm {
- max-width: 300px;
- }
-}
-@media (min-width: 992px) {
- .modal-lg,
- .modal-xl {
- max-width: 800px;
- }
-}
-@media (min-width: 1200px) {
- .modal-xl {
- max-width: 1140px;
- }
-}
-.tooltip {
- position: absolute;
- z-index: 1070;
- display: block;
- margin: 0;
- font-family: "LiveDashboardFont", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- font-style: normal;
- font-weight: 400;
- line-height: 1.5;
- text-align: left;
- text-align: start;
- text-decoration: none;
- text-shadow: none;
- text-transform: none;
- letter-spacing: normal;
- word-break: normal;
- white-space: normal;
- word-spacing: normal;
- line-break: auto;
- font-size: 0.875rem;
- word-wrap: break-word;
- opacity: 0;
-}
-.tooltip.show {
- opacity: 0.9;
-}
-.tooltip .arrow {
- position: absolute;
- display: block;
- width: 0.8rem;
- height: 0.4rem;
-}
-.tooltip .arrow::before {
- position: absolute;
- content: "";
- border-color: transparent;
- border-style: solid;
-}
-
-.bs-tooltip-top, .bs-tooltip-auto[x-placement^=top] {
- padding: 0.4rem 0;
-}
-.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=top] .arrow {
- bottom: 0;
-}
-.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=top] .arrow::before {
- top: 0;
- border-width: 0.4rem 0.4rem 0;
- border-top-color: #000;
-}
-
-.bs-tooltip-right, .bs-tooltip-auto[x-placement^=right] {
- padding: 0 0.4rem;
-}
-.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=right] .arrow {
- left: 0;
- width: 0.4rem;
- height: 0.8rem;
-}
-.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=right] .arrow::before {
- right: 0;
- border-width: 0.4rem 0.4rem 0.4rem 0;
- border-right-color: #000;
-}
-
-.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=bottom] {
- padding: 0.4rem 0;
-}
-.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=bottom] .arrow {
- top: 0;
-}
-.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=bottom] .arrow::before {
- bottom: 0;
- border-width: 0 0.4rem 0.4rem;
- border-bottom-color: #000;
-}
-
-.bs-tooltip-left, .bs-tooltip-auto[x-placement^=left] {
- padding: 0 0.4rem;
-}
-.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=left] .arrow {
- right: 0;
- width: 0.4rem;
- height: 0.8rem;
-}
-.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=left] .arrow::before {
- left: 0;
- border-width: 0.4rem 0 0.4rem 0.4rem;
- border-left-color: #000;
-}
-
-.tooltip-inner {
- max-width: 200px;
- padding: 0.25rem 0.5rem;
- color: #fff;
- text-align: center;
- background-color: #000;
- border-radius: 6px;
-}
-
-.popover {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 1060;
- display: block;
- max-width: 276px;
- font-family: "LiveDashboardFont", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- font-style: normal;
- font-weight: 400;
- line-height: 1.5;
- text-align: left;
- text-align: start;
- text-decoration: none;
- text-shadow: none;
- text-transform: none;
- letter-spacing: normal;
- word-break: normal;
- white-space: normal;
- word-spacing: normal;
- line-break: auto;
- font-size: 0.875rem;
- word-wrap: break-word;
- background-color: #fff;
- background-clip: padding-box;
- border: 1px solid rgba(0, 0, 0, 0.2);
- border-radius: 0.3rem;
-}
-.popover .arrow {
- position: absolute;
- display: block;
- width: 1rem;
- height: 0.5rem;
- margin: 0 0.3rem;
-}
-.popover .arrow::before, .popover .arrow::after {
- position: absolute;
- display: block;
- content: "";
- border-color: transparent;
- border-style: solid;
-}
-
-.bs-popover-top, .bs-popover-auto[x-placement^=top] {
- margin-bottom: 0.5rem;
-}
-.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=top] > .arrow {
- bottom: calc(-0.5rem - 1px);
-}
-.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=top] > .arrow::before {
- bottom: 0;
- border-width: 0.5rem 0.5rem 0;
- border-top-color: rgba(0, 0, 0, 0.25);
-}
-.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=top] > .arrow::after {
- bottom: 1px;
- border-width: 0.5rem 0.5rem 0;
- border-top-color: #fff;
-}
-
-.bs-popover-right, .bs-popover-auto[x-placement^=right] {
- margin-left: 0.5rem;
-}
-.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=right] > .arrow {
- left: calc(-0.5rem - 1px);
- width: 0.5rem;
- height: 1rem;
- margin: 0.3rem 0;
-}
-.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=right] > .arrow::before {
- left: 0;
- border-width: 0.5rem 0.5rem 0.5rem 0;
- border-right-color: rgba(0, 0, 0, 0.25);
-}
-.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=right] > .arrow::after {
- left: 1px;
- border-width: 0.5rem 0.5rem 0.5rem 0;
- border-right-color: #fff;
-}
-
-.bs-popover-bottom, .bs-popover-auto[x-placement^=bottom] {
- margin-top: 0.5rem;
-}
-.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=bottom] > .arrow {
- top: calc(-0.5rem - 1px);
-}
-.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=bottom] > .arrow::before {
- top: 0;
- border-width: 0 0.5rem 0.5rem 0.5rem;
- border-bottom-color: rgba(0, 0, 0, 0.25);
-}
-.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=bottom] > .arrow::after {
- top: 1px;
- border-width: 0 0.5rem 0.5rem 0.5rem;
- border-bottom-color: #fff;
-}
-.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=bottom] .popover-header::before {
- position: absolute;
- top: 0;
- left: 50%;
- display: block;
- width: 1rem;
- margin-left: -0.5rem;
- content: "";
- border-bottom: 1px solid #f7f7f7;
-}
-
-.bs-popover-left, .bs-popover-auto[x-placement^=left] {
- margin-right: 0.5rem;
-}
-.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=left] > .arrow {
- right: calc(-0.5rem - 1px);
- width: 0.5rem;
- height: 1rem;
- margin: 0.3rem 0;
-}
-.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=left] > .arrow::before {
- right: 0;
- border-width: 0.5rem 0 0.5rem 0.5rem;
- border-left-color: rgba(0, 0, 0, 0.25);
-}
-.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=left] > .arrow::after {
- right: 1px;
- border-width: 0.5rem 0 0.5rem 0.5rem;
- border-left-color: #fff;
-}
-
-.popover-header {
- padding: 0.5rem 0.75rem;
- margin-bottom: 0;
- font-size: 1rem;
- background-color: #f7f7f7;
- border-bottom: 1px solid #ebebeb;
- border-top-left-radius: calc(0.3rem - 1px);
- border-top-right-radius: calc(0.3rem - 1px);
-}
-.popover-header:empty {
- display: none;
-}
-
-.popover-body {
- padding: 0.5rem 0.75rem;
- color: #212529;
-}
-
-.carousel {
- position: relative;
-}
-
-.carousel.pointer-event {
- touch-action: pan-y;
-}
-
-.carousel-inner {
- position: relative;
- width: 100%;
- overflow: hidden;
-}
-.carousel-inner::after {
- display: block;
- clear: both;
- content: "";
-}
-
-.carousel-item {
- position: relative;
- display: none;
- float: left;
- width: 100%;
- margin-right: -100%;
- backface-visibility: hidden;
- transition: transform 0.6s ease-in-out;
-}
-@media (prefers-reduced-motion: reduce) {
- .carousel-item {
- transition: none;
- }
-}
-
-.carousel-item.active,
-.carousel-item-next,
-.carousel-item-prev {
- display: block;
-}
-
-.carousel-item-next:not(.carousel-item-left),
-.active.carousel-item-right {
- transform: translateX(100%);
-}
-
-.carousel-item-prev:not(.carousel-item-right),
-.active.carousel-item-left {
- transform: translateX(-100%);
-}
-
-.carousel-fade .carousel-item {
- opacity: 0;
- transition-property: opacity;
- transform: none;
-}
-.carousel-fade .carousel-item.active,
-.carousel-fade .carousel-item-next.carousel-item-left,
-.carousel-fade .carousel-item-prev.carousel-item-right {
- z-index: 1;
- opacity: 1;
-}
-.carousel-fade .active.carousel-item-left,
-.carousel-fade .active.carousel-item-right {
- z-index: 0;
- opacity: 0;
- transition: opacity 0s 0.6s;
-}
-@media (prefers-reduced-motion: reduce) {
- .carousel-fade .active.carousel-item-left,
- .carousel-fade .active.carousel-item-right {
- transition: none;
- }
-}
-
-.carousel-control-prev,
-.carousel-control-next {
- position: absolute;
- top: 0;
- bottom: 0;
- z-index: 1;
- display: flex;
- align-items: center;
- justify-content: center;
- width: 15%;
- padding: 0;
- color: #fff;
- text-align: center;
- background: none;
- border: 0;
- opacity: 0.5;
- transition: opacity 0.15s ease;
-}
-@media (prefers-reduced-motion: reduce) {
- .carousel-control-prev,
- .carousel-control-next {
- transition: none;
- }
-}
-.carousel-control-prev:hover, .carousel-control-prev:focus,
-.carousel-control-next:hover,
-.carousel-control-next:focus {
- color: #fff;
- text-decoration: none;
- outline: 0;
- opacity: 0.9;
-}
-
-.carousel-control-prev {
- left: 0;
-}
-
-.carousel-control-next {
- right: 0;
-}
-
-.carousel-control-prev-icon,
-.carousel-control-next-icon {
- display: inline-block;
- width: 20px;
- height: 20px;
- background: 50%/100% 100% no-repeat;
-}
-
-.carousel-control-prev-icon {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e");
-}
-
-.carousel-control-next-icon {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e");
-}
-
-.carousel-indicators {
- position: absolute;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 15;
- display: flex;
- justify-content: center;
- padding-left: 0;
- margin-right: 15%;
- margin-left: 15%;
- list-style: none;
-}
-.carousel-indicators li {
- box-sizing: content-box;
- flex: 0 1 auto;
- width: 30px;
- height: 3px;
- margin-right: 3px;
- margin-left: 3px;
- text-indent: -999px;
- cursor: pointer;
- background-color: #fff;
- background-clip: padding-box;
- border-top: 10px solid transparent;
- border-bottom: 10px solid transparent;
- opacity: 0.5;
- transition: opacity 0.6s ease;
-}
-@media (prefers-reduced-motion: reduce) {
- .carousel-indicators li {
- transition: none;
- }
-}
-.carousel-indicators .active {
- opacity: 1;
-}
-
-.carousel-caption {
- position: absolute;
- right: 15%;
- bottom: 20px;
- left: 15%;
- z-index: 10;
- padding-top: 20px;
- padding-bottom: 20px;
- color: #fff;
- text-align: center;
-}
-
-@keyframes spinner-border {
- to {
- transform: rotate(360deg);
- }
-}
-.spinner-border {
- display: inline-block;
- width: 2rem;
- height: 2rem;
- vertical-align: -0.125em;
- border: 0.25em solid currentcolor;
- border-right-color: transparent;
- border-radius: 50%;
- animation: 0.75s linear infinite spinner-border;
-}
-
-.spinner-border-sm {
- width: 1rem;
- height: 1rem;
- border-width: 0.2em;
-}
-
-@keyframes spinner-grow {
- 0% {
- transform: scale(0);
- }
- 50% {
- opacity: 1;
- transform: none;
- }
-}
-.spinner-grow {
- display: inline-block;
- width: 2rem;
- height: 2rem;
- vertical-align: -0.125em;
- background-color: currentcolor;
- border-radius: 50%;
- opacity: 0;
- animation: 0.75s linear infinite spinner-grow;
-}
-
-.spinner-grow-sm {
- width: 1rem;
- height: 1rem;
-}
-
-@media (prefers-reduced-motion: reduce) {
- .spinner-border,
- .spinner-grow {
- animation-duration: 1.5s;
- }
-}
-.align-baseline {
- vertical-align: baseline !important;
-}
-
-.align-top {
- vertical-align: top !important;
-}
-
-.align-middle {
- vertical-align: middle !important;
-}
-
-.align-bottom {
- vertical-align: bottom !important;
-}
-
-.align-text-bottom {
- vertical-align: text-bottom !important;
-}
-
-.align-text-top {
- vertical-align: text-top !important;
-}
-
-.bg-primary {
- background-color: #4575cf !important;
-}
-
-a.bg-primary:hover, a.bg-primary:focus,
-button.bg-primary:hover,
-button.bg-primary:focus {
- background-color: #2e5cb3 !important;
-}
-
-.bg-secondary {
- background-color: #6c757d !important;
-}
-
-a.bg-secondary:hover, a.bg-secondary:focus,
-button.bg-secondary:hover,
-button.bg-secondary:focus {
- background-color: #545b62 !important;
-}
-
-.bg-success {
- background-color: #28a745 !important;
-}
-
-a.bg-success:hover, a.bg-success:focus,
-button.bg-success:hover,
-button.bg-success:focus {
- background-color: #1e7e34 !important;
-}
-
-.bg-info {
- background-color: #17a2b8 !important;
-}
-
-a.bg-info:hover, a.bg-info:focus,
-button.bg-info:hover,
-button.bg-info:focus {
- background-color: #117a8b !important;
-}
-
-.bg-warning {
- background-color: #ffc107 !important;
-}
-
-a.bg-warning:hover, a.bg-warning:focus,
-button.bg-warning:hover,
-button.bg-warning:focus {
- background-color: #d39e00 !important;
-}
-
-.bg-danger {
- background-color: #dc3545 !important;
-}
-
-a.bg-danger:hover, a.bg-danger:focus,
-button.bg-danger:hover,
-button.bg-danger:focus {
- background-color: #bd2130 !important;
-}
-
-.bg-light {
- background-color: #f8f9fa !important;
-}
-
-a.bg-light:hover, a.bg-light:focus,
-button.bg-light:hover,
-button.bg-light:focus {
- background-color: #dae0e5 !important;
-}
-
-.bg-dark {
- background-color: #343a40 !important;
-}
-
-a.bg-dark:hover, a.bg-dark:focus,
-button.bg-dark:hover,
-button.bg-dark:focus {
- background-color: #1d2124 !important;
-}
-
-.bg-white {
- background-color: #fff !important;
-}
-
-.bg-transparent {
- background-color: transparent !important;
-}
-
-.border {
- border: 1px solid #dee2e6 !important;
-}
-
-.border-top {
- border-top: 1px solid #dee2e6 !important;
-}
-
-.border-right {
- border-right: 1px solid #dee2e6 !important;
-}
-
-.border-bottom {
- border-bottom: 1px solid #dee2e6 !important;
-}
-
-.border-left {
- border-left: 1px solid #dee2e6 !important;
-}
-
-.border-0 {
- border: 0 !important;
-}
-
-.border-top-0 {
- border-top: 0 !important;
-}
-
-.border-right-0 {
- border-right: 0 !important;
-}
-
-.border-bottom-0 {
- border-bottom: 0 !important;
-}
-
-.border-left-0 {
- border-left: 0 !important;
-}
-
-.border-primary {
- border-color: #4575cf !important;
-}
-
-.border-secondary {
- border-color: #6c757d !important;
-}
-
-.border-success {
- border-color: #28a745 !important;
-}
-
-.border-info {
- border-color: #17a2b8 !important;
-}
-
-.border-warning {
- border-color: #ffc107 !important;
-}
-
-.border-danger {
- border-color: #dc3545 !important;
-}
-
-.border-light {
- border-color: #f8f9fa !important;
-}
-
-.border-dark {
- border-color: #343a40 !important;
-}
-
-.border-white {
- border-color: #fff !important;
-}
-
-.rounded-sm {
- border-radius: 0.2rem !important;
-}
-
-.rounded {
- border-radius: 6px !important;
-}
-
-.rounded-top {
- border-top-left-radius: 6px !important;
- border-top-right-radius: 6px !important;
-}
-
-.rounded-right {
- border-top-right-radius: 6px !important;
- border-bottom-right-radius: 6px !important;
-}
-
-.rounded-bottom {
- border-bottom-right-radius: 6px !important;
- border-bottom-left-radius: 6px !important;
-}
-
-.rounded-left {
- border-top-left-radius: 6px !important;
- border-bottom-left-radius: 6px !important;
-}
-
-.rounded-lg {
- border-radius: 0.3rem !important;
-}
-
-.rounded-circle {
- border-radius: 50% !important;
-}
-
-.rounded-pill {
- border-radius: 50rem !important;
-}
-
-.rounded-0 {
- border-radius: 0 !important;
-}
-
-.clearfix::after {
- display: block;
- clear: both;
- content: "";
-}
-
-.d-none {
- display: none !important;
-}
-
-.d-inline {
- display: inline !important;
-}
-
-.d-inline-block {
- display: inline-block !important;
-}
-
-.d-block {
- display: block !important;
-}
-
-.d-table {
- display: table !important;
-}
-
-.d-table-row {
- display: table-row !important;
-}
-
-.d-table-cell {
- display: table-cell !important;
-}
-
-.d-flex {
- display: flex !important;
-}
-
-.d-inline-flex {
- display: inline-flex !important;
-}
-
-@media (min-width: 576px) {
- .d-sm-none {
- display: none !important;
- }
- .d-sm-inline {
- display: inline !important;
- }
- .d-sm-inline-block {
- display: inline-block !important;
- }
- .d-sm-block {
- display: block !important;
- }
- .d-sm-table {
- display: table !important;
- }
- .d-sm-table-row {
- display: table-row !important;
- }
- .d-sm-table-cell {
- display: table-cell !important;
- }
- .d-sm-flex {
- display: flex !important;
- }
- .d-sm-inline-flex {
- display: inline-flex !important;
- }
-}
-@media (min-width: 768px) {
- .d-md-none {
- display: none !important;
- }
- .d-md-inline {
- display: inline !important;
- }
- .d-md-inline-block {
- display: inline-block !important;
- }
- .d-md-block {
- display: block !important;
- }
- .d-md-table {
- display: table !important;
- }
- .d-md-table-row {
- display: table-row !important;
- }
- .d-md-table-cell {
- display: table-cell !important;
- }
- .d-md-flex {
- display: flex !important;
- }
- .d-md-inline-flex {
- display: inline-flex !important;
- }
-}
-@media (min-width: 992px) {
- .d-lg-none {
- display: none !important;
- }
- .d-lg-inline {
- display: inline !important;
- }
- .d-lg-inline-block {
- display: inline-block !important;
- }
- .d-lg-block {
- display: block !important;
- }
- .d-lg-table {
- display: table !important;
- }
- .d-lg-table-row {
- display: table-row !important;
- }
- .d-lg-table-cell {
- display: table-cell !important;
- }
- .d-lg-flex {
- display: flex !important;
- }
- .d-lg-inline-flex {
- display: inline-flex !important;
- }
-}
-@media (min-width: 1200px) {
- .d-xl-none {
- display: none !important;
- }
- .d-xl-inline {
- display: inline !important;
- }
- .d-xl-inline-block {
- display: inline-block !important;
- }
- .d-xl-block {
- display: block !important;
- }
- .d-xl-table {
- display: table !important;
- }
- .d-xl-table-row {
- display: table-row !important;
- }
- .d-xl-table-cell {
- display: table-cell !important;
- }
- .d-xl-flex {
- display: flex !important;
- }
- .d-xl-inline-flex {
- display: inline-flex !important;
- }
-}
-@media (min-width: 1600px) {
- .d-xxl-none {
- display: none !important;
- }
- .d-xxl-inline {
- display: inline !important;
- }
- .d-xxl-inline-block {
- display: inline-block !important;
- }
- .d-xxl-block {
- display: block !important;
- }
- .d-xxl-table {
- display: table !important;
- }
- .d-xxl-table-row {
- display: table-row !important;
- }
- .d-xxl-table-cell {
- display: table-cell !important;
- }
- .d-xxl-flex {
- display: flex !important;
- }
- .d-xxl-inline-flex {
- display: inline-flex !important;
- }
-}
-@media (min-width: 2600px) {
- .d-xxxl-none {
- display: none !important;
- }
- .d-xxxl-inline {
- display: inline !important;
- }
- .d-xxxl-inline-block {
- display: inline-block !important;
- }
- .d-xxxl-block {
- display: block !important;
- }
- .d-xxxl-table {
- display: table !important;
- }
- .d-xxxl-table-row {
- display: table-row !important;
- }
- .d-xxxl-table-cell {
- display: table-cell !important;
- }
- .d-xxxl-flex {
- display: flex !important;
- }
- .d-xxxl-inline-flex {
- display: inline-flex !important;
- }
-}
-@media print {
- .d-print-none {
- display: none !important;
- }
- .d-print-inline {
- display: inline !important;
- }
- .d-print-inline-block {
- display: inline-block !important;
- }
- .d-print-block {
- display: block !important;
- }
- .d-print-table {
- display: table !important;
- }
- .d-print-table-row {
- display: table-row !important;
- }
- .d-print-table-cell {
- display: table-cell !important;
- }
- .d-print-flex {
- display: flex !important;
- }
- .d-print-inline-flex {
- display: inline-flex !important;
- }
-}
-.embed-responsive {
- position: relative;
- display: block;
- width: 100%;
- padding: 0;
- overflow: hidden;
-}
-.embed-responsive::before {
- display: block;
- content: "";
-}
-.embed-responsive .embed-responsive-item,
-.embed-responsive iframe,
-.embed-responsive embed,
-.embed-responsive object,
-.embed-responsive video {
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- width: 100%;
- height: 100%;
- border: 0;
-}
-
-.embed-responsive-21by9::before {
- padding-top: 42.85714286%;
-}
-
-.embed-responsive-16by9::before {
- padding-top: 56.25%;
-}
-
-.embed-responsive-4by3::before {
- padding-top: 75%;
-}
-
-.embed-responsive-1by1::before {
- padding-top: 100%;
-}
-
-.flex-row {
- flex-direction: row !important;
-}
-
-.flex-column {
- flex-direction: column !important;
-}
-
-.flex-row-reverse {
- flex-direction: row-reverse !important;
-}
-
-.flex-column-reverse {
- flex-direction: column-reverse !important;
-}
-
-.flex-wrap {
- flex-wrap: wrap !important;
-}
-
-.flex-nowrap {
- flex-wrap: nowrap !important;
-}
-
-.flex-wrap-reverse {
- flex-wrap: wrap-reverse !important;
-}
-
-.flex-fill {
- flex: 1 1 auto !important;
-}
-
-.flex-grow-0 {
- flex-grow: 0 !important;
-}
-
-.flex-grow-1 {
- flex-grow: 1 !important;
-}
-
-.flex-shrink-0 {
- flex-shrink: 0 !important;
-}
-
-.flex-shrink-1 {
- flex-shrink: 1 !important;
-}
-
-.justify-content-start {
- justify-content: flex-start !important;
-}
-
-.justify-content-end {
- justify-content: flex-end !important;
-}
-
-.justify-content-center {
- justify-content: center !important;
-}
-
-.justify-content-between {
- justify-content: space-between !important;
-}
-
-.justify-content-around {
- justify-content: space-around !important;
-}
-
-.align-items-start {
- align-items: flex-start !important;
-}
-
-.align-items-end {
- align-items: flex-end !important;
-}
-
-.align-items-center {
- align-items: center !important;
-}
-
-.align-items-baseline {
- align-items: baseline !important;
-}
-
-.align-items-stretch {
- align-items: stretch !important;
-}
-
-.align-content-start {
- align-content: flex-start !important;
-}
-
-.align-content-end {
- align-content: flex-end !important;
-}
-
-.align-content-center {
- align-content: center !important;
-}
-
-.align-content-between {
- align-content: space-between !important;
-}
-
-.align-content-around {
- align-content: space-around !important;
-}
-
-.align-content-stretch {
- align-content: stretch !important;
-}
-
-.align-self-auto {
- align-self: auto !important;
-}
-
-.align-self-start {
- align-self: flex-start !important;
-}
-
-.align-self-end {
- align-self: flex-end !important;
-}
-
-.align-self-center {
- align-self: center !important;
-}
-
-.align-self-baseline {
- align-self: baseline !important;
-}
-
-.align-self-stretch {
- align-self: stretch !important;
-}
-
-@media (min-width: 576px) {
- .flex-sm-row {
- flex-direction: row !important;
- }
- .flex-sm-column {
- flex-direction: column !important;
- }
- .flex-sm-row-reverse {
- flex-direction: row-reverse !important;
- }
- .flex-sm-column-reverse {
- flex-direction: column-reverse !important;
- }
- .flex-sm-wrap {
- flex-wrap: wrap !important;
- }
- .flex-sm-nowrap {
- flex-wrap: nowrap !important;
- }
- .flex-sm-wrap-reverse {
- flex-wrap: wrap-reverse !important;
- }
- .flex-sm-fill {
- flex: 1 1 auto !important;
- }
- .flex-sm-grow-0 {
- flex-grow: 0 !important;
- }
- .flex-sm-grow-1 {
- flex-grow: 1 !important;
- }
- .flex-sm-shrink-0 {
- flex-shrink: 0 !important;
- }
- .flex-sm-shrink-1 {
- flex-shrink: 1 !important;
- }
- .justify-content-sm-start {
- justify-content: flex-start !important;
- }
- .justify-content-sm-end {
- justify-content: flex-end !important;
- }
- .justify-content-sm-center {
- justify-content: center !important;
- }
- .justify-content-sm-between {
- justify-content: space-between !important;
- }
- .justify-content-sm-around {
- justify-content: space-around !important;
- }
- .align-items-sm-start {
- align-items: flex-start !important;
- }
- .align-items-sm-end {
- align-items: flex-end !important;
- }
- .align-items-sm-center {
- align-items: center !important;
- }
- .align-items-sm-baseline {
- align-items: baseline !important;
- }
- .align-items-sm-stretch {
- align-items: stretch !important;
- }
- .align-content-sm-start {
- align-content: flex-start !important;
- }
- .align-content-sm-end {
- align-content: flex-end !important;
- }
- .align-content-sm-center {
- align-content: center !important;
- }
- .align-content-sm-between {
- align-content: space-between !important;
- }
- .align-content-sm-around {
- align-content: space-around !important;
- }
- .align-content-sm-stretch {
- align-content: stretch !important;
- }
- .align-self-sm-auto {
- align-self: auto !important;
- }
- .align-self-sm-start {
- align-self: flex-start !important;
- }
- .align-self-sm-end {
- align-self: flex-end !important;
- }
- .align-self-sm-center {
- align-self: center !important;
- }
- .align-self-sm-baseline {
- align-self: baseline !important;
- }
- .align-self-sm-stretch {
- align-self: stretch !important;
- }
-}
-@media (min-width: 768px) {
- .flex-md-row {
- flex-direction: row !important;
- }
- .flex-md-column {
- flex-direction: column !important;
- }
- .flex-md-row-reverse {
- flex-direction: row-reverse !important;
- }
- .flex-md-column-reverse {
- flex-direction: column-reverse !important;
- }
- .flex-md-wrap {
- flex-wrap: wrap !important;
- }
- .flex-md-nowrap {
- flex-wrap: nowrap !important;
- }
- .flex-md-wrap-reverse {
- flex-wrap: wrap-reverse !important;
- }
- .flex-md-fill {
- flex: 1 1 auto !important;
- }
- .flex-md-grow-0 {
- flex-grow: 0 !important;
- }
- .flex-md-grow-1 {
- flex-grow: 1 !important;
- }
- .flex-md-shrink-0 {
- flex-shrink: 0 !important;
- }
- .flex-md-shrink-1 {
- flex-shrink: 1 !important;
- }
- .justify-content-md-start {
- justify-content: flex-start !important;
- }
- .justify-content-md-end {
- justify-content: flex-end !important;
- }
- .justify-content-md-center {
- justify-content: center !important;
- }
- .justify-content-md-between {
- justify-content: space-between !important;
- }
- .justify-content-md-around {
- justify-content: space-around !important;
- }
- .align-items-md-start {
- align-items: flex-start !important;
- }
- .align-items-md-end {
- align-items: flex-end !important;
- }
- .align-items-md-center {
- align-items: center !important;
- }
- .align-items-md-baseline {
- align-items: baseline !important;
- }
- .align-items-md-stretch {
- align-items: stretch !important;
- }
- .align-content-md-start {
- align-content: flex-start !important;
- }
- .align-content-md-end {
- align-content: flex-end !important;
- }
- .align-content-md-center {
- align-content: center !important;
- }
- .align-content-md-between {
- align-content: space-between !important;
- }
- .align-content-md-around {
- align-content: space-around !important;
- }
- .align-content-md-stretch {
- align-content: stretch !important;
- }
- .align-self-md-auto {
- align-self: auto !important;
- }
- .align-self-md-start {
- align-self: flex-start !important;
- }
- .align-self-md-end {
- align-self: flex-end !important;
- }
- .align-self-md-center {
- align-self: center !important;
- }
- .align-self-md-baseline {
- align-self: baseline !important;
- }
- .align-self-md-stretch {
- align-self: stretch !important;
- }
-}
-@media (min-width: 992px) {
- .flex-lg-row {
- flex-direction: row !important;
- }
- .flex-lg-column {
- flex-direction: column !important;
- }
- .flex-lg-row-reverse {
- flex-direction: row-reverse !important;
- }
- .flex-lg-column-reverse {
- flex-direction: column-reverse !important;
- }
- .flex-lg-wrap {
- flex-wrap: wrap !important;
- }
- .flex-lg-nowrap {
- flex-wrap: nowrap !important;
- }
- .flex-lg-wrap-reverse {
- flex-wrap: wrap-reverse !important;
- }
- .flex-lg-fill {
- flex: 1 1 auto !important;
- }
- .flex-lg-grow-0 {
- flex-grow: 0 !important;
- }
- .flex-lg-grow-1 {
- flex-grow: 1 !important;
- }
- .flex-lg-shrink-0 {
- flex-shrink: 0 !important;
- }
- .flex-lg-shrink-1 {
- flex-shrink: 1 !important;
- }
- .justify-content-lg-start {
- justify-content: flex-start !important;
- }
- .justify-content-lg-end {
- justify-content: flex-end !important;
- }
- .justify-content-lg-center {
- justify-content: center !important;
- }
- .justify-content-lg-between {
- justify-content: space-between !important;
- }
- .justify-content-lg-around {
- justify-content: space-around !important;
- }
- .align-items-lg-start {
- align-items: flex-start !important;
- }
- .align-items-lg-end {
- align-items: flex-end !important;
- }
- .align-items-lg-center {
- align-items: center !important;
- }
- .align-items-lg-baseline {
- align-items: baseline !important;
- }
- .align-items-lg-stretch {
- align-items: stretch !important;
- }
- .align-content-lg-start {
- align-content: flex-start !important;
- }
- .align-content-lg-end {
- align-content: flex-end !important;
- }
- .align-content-lg-center {
- align-content: center !important;
- }
- .align-content-lg-between {
- align-content: space-between !important;
- }
- .align-content-lg-around {
- align-content: space-around !important;
- }
- .align-content-lg-stretch {
- align-content: stretch !important;
- }
- .align-self-lg-auto {
- align-self: auto !important;
- }
- .align-self-lg-start {
- align-self: flex-start !important;
- }
- .align-self-lg-end {
- align-self: flex-end !important;
- }
- .align-self-lg-center {
- align-self: center !important;
- }
- .align-self-lg-baseline {
- align-self: baseline !important;
- }
- .align-self-lg-stretch {
- align-self: stretch !important;
- }
-}
-@media (min-width: 1200px) {
- .flex-xl-row {
- flex-direction: row !important;
- }
- .flex-xl-column {
- flex-direction: column !important;
- }
- .flex-xl-row-reverse {
- flex-direction: row-reverse !important;
- }
- .flex-xl-column-reverse {
- flex-direction: column-reverse !important;
- }
- .flex-xl-wrap {
- flex-wrap: wrap !important;
- }
- .flex-xl-nowrap {
- flex-wrap: nowrap !important;
- }
- .flex-xl-wrap-reverse {
- flex-wrap: wrap-reverse !important;
- }
- .flex-xl-fill {
- flex: 1 1 auto !important;
- }
- .flex-xl-grow-0 {
- flex-grow: 0 !important;
- }
- .flex-xl-grow-1 {
- flex-grow: 1 !important;
- }
- .flex-xl-shrink-0 {
- flex-shrink: 0 !important;
- }
- .flex-xl-shrink-1 {
- flex-shrink: 1 !important;
- }
- .justify-content-xl-start {
- justify-content: flex-start !important;
- }
- .justify-content-xl-end {
- justify-content: flex-end !important;
- }
- .justify-content-xl-center {
- justify-content: center !important;
- }
- .justify-content-xl-between {
- justify-content: space-between !important;
- }
- .justify-content-xl-around {
- justify-content: space-around !important;
- }
- .align-items-xl-start {
- align-items: flex-start !important;
- }
- .align-items-xl-end {
- align-items: flex-end !important;
- }
- .align-items-xl-center {
- align-items: center !important;
- }
- .align-items-xl-baseline {
- align-items: baseline !important;
- }
- .align-items-xl-stretch {
- align-items: stretch !important;
- }
- .align-content-xl-start {
- align-content: flex-start !important;
- }
- .align-content-xl-end {
- align-content: flex-end !important;
- }
- .align-content-xl-center {
- align-content: center !important;
- }
- .align-content-xl-between {
- align-content: space-between !important;
- }
- .align-content-xl-around {
- align-content: space-around !important;
- }
- .align-content-xl-stretch {
- align-content: stretch !important;
- }
- .align-self-xl-auto {
- align-self: auto !important;
- }
- .align-self-xl-start {
- align-self: flex-start !important;
- }
- .align-self-xl-end {
- align-self: flex-end !important;
- }
- .align-self-xl-center {
- align-self: center !important;
- }
- .align-self-xl-baseline {
- align-self: baseline !important;
- }
- .align-self-xl-stretch {
- align-self: stretch !important;
- }
-}
-@media (min-width: 1600px) {
- .flex-xxl-row {
- flex-direction: row !important;
- }
- .flex-xxl-column {
- flex-direction: column !important;
- }
- .flex-xxl-row-reverse {
- flex-direction: row-reverse !important;
- }
- .flex-xxl-column-reverse {
- flex-direction: column-reverse !important;
- }
- .flex-xxl-wrap {
- flex-wrap: wrap !important;
- }
- .flex-xxl-nowrap {
- flex-wrap: nowrap !important;
- }
- .flex-xxl-wrap-reverse {
- flex-wrap: wrap-reverse !important;
- }
- .flex-xxl-fill {
- flex: 1 1 auto !important;
- }
- .flex-xxl-grow-0 {
- flex-grow: 0 !important;
- }
- .flex-xxl-grow-1 {
- flex-grow: 1 !important;
- }
- .flex-xxl-shrink-0 {
- flex-shrink: 0 !important;
- }
- .flex-xxl-shrink-1 {
- flex-shrink: 1 !important;
- }
- .justify-content-xxl-start {
- justify-content: flex-start !important;
- }
- .justify-content-xxl-end {
- justify-content: flex-end !important;
- }
- .justify-content-xxl-center {
- justify-content: center !important;
- }
- .justify-content-xxl-between {
- justify-content: space-between !important;
- }
- .justify-content-xxl-around {
- justify-content: space-around !important;
- }
- .align-items-xxl-start {
- align-items: flex-start !important;
- }
- .align-items-xxl-end {
- align-items: flex-end !important;
- }
- .align-items-xxl-center {
- align-items: center !important;
- }
- .align-items-xxl-baseline {
- align-items: baseline !important;
- }
- .align-items-xxl-stretch {
- align-items: stretch !important;
- }
- .align-content-xxl-start {
- align-content: flex-start !important;
- }
- .align-content-xxl-end {
- align-content: flex-end !important;
- }
- .align-content-xxl-center {
- align-content: center !important;
- }
- .align-content-xxl-between {
- align-content: space-between !important;
- }
- .align-content-xxl-around {
- align-content: space-around !important;
- }
- .align-content-xxl-stretch {
- align-content: stretch !important;
- }
- .align-self-xxl-auto {
- align-self: auto !important;
- }
- .align-self-xxl-start {
- align-self: flex-start !important;
- }
- .align-self-xxl-end {
- align-self: flex-end !important;
- }
- .align-self-xxl-center {
- align-self: center !important;
- }
- .align-self-xxl-baseline {
- align-self: baseline !important;
- }
- .align-self-xxl-stretch {
- align-self: stretch !important;
- }
-}
-@media (min-width: 2600px) {
- .flex-xxxl-row {
- flex-direction: row !important;
- }
- .flex-xxxl-column {
- flex-direction: column !important;
- }
- .flex-xxxl-row-reverse {
- flex-direction: row-reverse !important;
- }
- .flex-xxxl-column-reverse {
- flex-direction: column-reverse !important;
- }
- .flex-xxxl-wrap {
- flex-wrap: wrap !important;
- }
- .flex-xxxl-nowrap {
- flex-wrap: nowrap !important;
- }
- .flex-xxxl-wrap-reverse {
- flex-wrap: wrap-reverse !important;
- }
- .flex-xxxl-fill {
- flex: 1 1 auto !important;
- }
- .flex-xxxl-grow-0 {
- flex-grow: 0 !important;
- }
- .flex-xxxl-grow-1 {
- flex-grow: 1 !important;
- }
- .flex-xxxl-shrink-0 {
- flex-shrink: 0 !important;
- }
- .flex-xxxl-shrink-1 {
- flex-shrink: 1 !important;
- }
- .justify-content-xxxl-start {
- justify-content: flex-start !important;
- }
- .justify-content-xxxl-end {
- justify-content: flex-end !important;
- }
- .justify-content-xxxl-center {
- justify-content: center !important;
- }
- .justify-content-xxxl-between {
- justify-content: space-between !important;
- }
- .justify-content-xxxl-around {
- justify-content: space-around !important;
- }
- .align-items-xxxl-start {
- align-items: flex-start !important;
- }
- .align-items-xxxl-end {
- align-items: flex-end !important;
- }
- .align-items-xxxl-center {
- align-items: center !important;
- }
- .align-items-xxxl-baseline {
- align-items: baseline !important;
- }
- .align-items-xxxl-stretch {
- align-items: stretch !important;
- }
- .align-content-xxxl-start {
- align-content: flex-start !important;
- }
- .align-content-xxxl-end {
- align-content: flex-end !important;
- }
- .align-content-xxxl-center {
- align-content: center !important;
- }
- .align-content-xxxl-between {
- align-content: space-between !important;
- }
- .align-content-xxxl-around {
- align-content: space-around !important;
- }
- .align-content-xxxl-stretch {
- align-content: stretch !important;
- }
- .align-self-xxxl-auto {
- align-self: auto !important;
- }
- .align-self-xxxl-start {
- align-self: flex-start !important;
- }
- .align-self-xxxl-end {
- align-self: flex-end !important;
- }
- .align-self-xxxl-center {
- align-self: center !important;
- }
- .align-self-xxxl-baseline {
- align-self: baseline !important;
- }
- .align-self-xxxl-stretch {
- align-self: stretch !important;
- }
-}
-.float-left {
- float: left !important;
-}
-
-.float-right {
- float: right !important;
-}
-
-.float-none {
- float: none !important;
-}
-
-@media (min-width: 576px) {
- .float-sm-left {
- float: left !important;
- }
- .float-sm-right {
- float: right !important;
- }
- .float-sm-none {
- float: none !important;
- }
-}
-@media (min-width: 768px) {
- .float-md-left {
- float: left !important;
- }
- .float-md-right {
- float: right !important;
- }
- .float-md-none {
- float: none !important;
- }
-}
-@media (min-width: 992px) {
- .float-lg-left {
- float: left !important;
- }
- .float-lg-right {
- float: right !important;
- }
- .float-lg-none {
- float: none !important;
- }
-}
-@media (min-width: 1200px) {
- .float-xl-left {
- float: left !important;
- }
- .float-xl-right {
- float: right !important;
- }
- .float-xl-none {
- float: none !important;
- }
-}
-@media (min-width: 1600px) {
- .float-xxl-left {
- float: left !important;
- }
- .float-xxl-right {
- float: right !important;
- }
- .float-xxl-none {
- float: none !important;
- }
-}
-@media (min-width: 2600px) {
- .float-xxxl-left {
- float: left !important;
- }
- .float-xxxl-right {
- float: right !important;
- }
- .float-xxxl-none {
- float: none !important;
- }
-}
-.user-select-all {
- user-select: all !important;
-}
-
-.user-select-auto {
- user-select: auto !important;
-}
-
-.user-select-none {
- user-select: none !important;
-}
-
-.overflow-auto {
- overflow: auto !important;
-}
-
-.overflow-hidden {
- overflow: hidden !important;
-}
-
-.position-static {
- position: static !important;
-}
-
-.position-relative {
- position: relative !important;
-}
-
-.position-absolute {
- position: absolute !important;
-}
-
-.position-fixed {
- position: fixed !important;
-}
-
-.position-sticky {
- position: sticky !important;
-}
-
-.fixed-top {
- position: fixed;
- top: 0;
- right: 0;
- left: 0;
- z-index: 1030;
-}
-
-.fixed-bottom {
- position: fixed;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 1030;
-}
-
-@supports (position: sticky) {
- .sticky-top {
- position: sticky;
- top: 0;
- z-index: 1020;
- }
-}
-
-.sr-only {
- position: absolute;
- width: 1px;
- height: 1px;
- padding: 0;
- margin: -1px;
- overflow: hidden;
- clip: rect(0, 0, 0, 0);
- white-space: nowrap;
- border: 0;
-}
-
-.sr-only-focusable:active, .sr-only-focusable:focus {
- position: static;
- width: auto;
- height: auto;
- overflow: visible;
- clip: auto;
- white-space: normal;
-}
-
-.shadow-sm {
- box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;
-}
-
-.shadow {
- box-shadow: 0 2px 5px rgba(201, 209, 230, 0.5), 0 7px 20px rgba(201, 209, 230, 0.75) !important;
-}
-
-.shadow-lg {
- box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;
-}
-
-.shadow-none {
- box-shadow: none !important;
-}
-
-.w-25 {
- width: 25% !important;
-}
-
-.w-50, .ports-table-name {
- width: 50% !important;
-}
-
-.w-75 {
- width: 75% !important;
-}
-
-.w-100 {
- width: 100% !important;
-}
-
-.w-auto {
- width: auto !important;
-}
-
-.h-25 {
- height: 25% !important;
-}
-
-.h-50 {
- height: 50% !important;
-}
-
-.h-75 {
- height: 75% !important;
-}
-
-.h-100 {
- height: 100% !important;
-}
-
-.h-auto {
- height: auto !important;
-}
-
-.mw-100 {
- max-width: 100% !important;
-}
-
-.mh-100 {
- max-height: 100% !important;
-}
-
-.min-vw-100 {
- min-width: 100vw !important;
-}
-
-.min-vh-100 {
- min-height: 100vh !important;
-}
-
-.vw-100 {
- width: 100vw !important;
-}
-
-.vh-100 {
- height: 100vh !important;
-}
-
-.m-0 {
- margin: 0 !important;
-}
-
-.mt-0,
-.my-0 {
- margin-top: 0 !important;
-}
-
-.mr-0,
-.mx-0 {
- margin-right: 0 !important;
-}
-
-.mb-0,
-.my-0 {
- margin-bottom: 0 !important;
-}
-
-.ml-0,
-.mx-0 {
- margin-left: 0 !important;
-}
-
-.m-1 {
- margin: 0.25rem !important;
-}
-
-.mt-1,
-.my-1 {
- margin-top: 0.25rem !important;
-}
-
-.mr-1,
-.mx-1 {
- margin-right: 0.25rem !important;
-}
-
-.mb-1,
-.my-1 {
- margin-bottom: 0.25rem !important;
-}
-
-.ml-1,
-.mx-1 {
- margin-left: 0.25rem !important;
-}
-
-.m-2 {
- margin: 0.5rem !important;
-}
-
-.mt-2,
-.my-2 {
- margin-top: 0.5rem !important;
-}
-
-.mr-2,
-.mx-2 {
- margin-right: 0.5rem !important;
-}
-
-.mb-2,
-.my-2 {
- margin-bottom: 0.5rem !important;
-}
-
-.ml-2,
-.mx-2 {
- margin-left: 0.5rem !important;
-}
-
-.m-3 {
- margin: 1rem !important;
-}
-
-.mt-3,
-.my-3 {
- margin-top: 1rem !important;
-}
-
-.mr-3,
-.mx-3 {
- margin-right: 1rem !important;
-}
-
-.mb-3,
-.my-3 {
- margin-bottom: 1rem !important;
-}
-
-.ml-3,
-.mx-3 {
- margin-left: 1rem !important;
-}
-
-.m-4 {
- margin: 1.5rem !important;
-}
-
-.mt-4,
-.my-4 {
- margin-top: 1.5rem !important;
-}
-
-.mr-4,
-.mx-4 {
- margin-right: 1.5rem !important;
-}
-
-.mb-4,
-.my-4 {
- margin-bottom: 1.5rem !important;
-}
-
-.ml-4,
-.mx-4 {
- margin-left: 1.5rem !important;
-}
-
-.m-5 {
- margin: 3rem !important;
-}
-
-.mt-5,
-.my-5 {
- margin-top: 3rem !important;
-}
-
-.mr-5,
-.mx-5 {
- margin-right: 3rem !important;
-}
-
-.mb-5,
-.my-5 {
- margin-bottom: 3rem !important;
-}
-
-.ml-5,
-.mx-5 {
- margin-left: 3rem !important;
-}
-
-.p-0 {
- padding: 0 !important;
-}
-
-.pt-0,
-.py-0 {
- padding-top: 0 !important;
-}
-
-.pr-0,
-.px-0 {
- padding-right: 0 !important;
-}
-
-.pb-0,
-.py-0 {
- padding-bottom: 0 !important;
-}
-
-.pl-0,
-.px-0 {
- padding-left: 0 !important;
-}
-
-.p-1 {
- padding: 0.25rem !important;
-}
-
-.pt-1,
-.py-1 {
- padding-top: 0.25rem !important;
-}
-
-.pr-1,
-.px-1 {
- padding-right: 0.25rem !important;
-}
-
-.pb-1,
-.py-1 {
- padding-bottom: 0.25rem !important;
-}
-
-.pl-1,
-.px-1 {
- padding-left: 0.25rem !important;
-}
-
-.p-2 {
- padding: 0.5rem !important;
-}
-
-.pt-2,
-.py-2 {
- padding-top: 0.5rem !important;
-}
-
-.pr-2,
-.px-2 {
- padding-right: 0.5rem !important;
-}
-
-.pb-2,
-.py-2 {
- padding-bottom: 0.5rem !important;
-}
-
-.pl-2,
-.px-2 {
- padding-left: 0.5rem !important;
-}
-
-.p-3 {
- padding: 1rem !important;
-}
-
-.pt-3,
-.py-3 {
- padding-top: 1rem !important;
-}
-
-.pr-3,
-.px-3 {
- padding-right: 1rem !important;
-}
-
-.pb-3,
-.py-3 {
- padding-bottom: 1rem !important;
-}
-
-.pl-3,
-.px-3 {
- padding-left: 1rem !important;
-}
-
-.p-4 {
- padding: 1.5rem !important;
-}
-
-.pt-4,
-.py-4 {
- padding-top: 1.5rem !important;
-}
-
-.pr-4, .sockets-table-send_oct, .sockets-table-recv_oct, .ports-table-output,
-.px-4,
-.apps-table-version {
- padding-right: 1.5rem !important;
-}
-
-.pb-4,
-.py-4 {
- padding-bottom: 1.5rem !important;
-}
-
-.pl-4, tr > :first-child,
-.px-4,
-.apps-table-version {
- padding-left: 1.5rem !important;
-}
-
-.p-5 {
- padding: 3rem !important;
-}
-
-.pt-5,
-.py-5 {
- padding-top: 3rem !important;
-}
-
-.pr-5,
-.px-5 {
- padding-right: 3rem !important;
-}
-
-.pb-5,
-.py-5 {
- padding-bottom: 3rem !important;
-}
-
-.pl-5,
-.px-5 {
- padding-left: 3rem !important;
-}
-
-.m-n1 {
- margin: -0.25rem !important;
-}
-
-.mt-n1,
-.my-n1 {
- margin-top: -0.25rem !important;
-}
-
-.mr-n1,
-.mx-n1 {
- margin-right: -0.25rem !important;
-}
-
-.mb-n1,
-.my-n1 {
- margin-bottom: -0.25rem !important;
-}
-
-.ml-n1,
-.mx-n1 {
- margin-left: -0.25rem !important;
-}
-
-.m-n2 {
- margin: -0.5rem !important;
-}
-
-.mt-n2,
-.my-n2 {
- margin-top: -0.5rem !important;
-}
-
-.mr-n2,
-.mx-n2 {
- margin-right: -0.5rem !important;
-}
-
-.mb-n2,
-.my-n2 {
- margin-bottom: -0.5rem !important;
-}
-
-.ml-n2,
-.mx-n2 {
- margin-left: -0.5rem !important;
-}
-
-.m-n3 {
- margin: -1rem !important;
-}
-
-.mt-n3,
-.my-n3 {
- margin-top: -1rem !important;
-}
-
-.mr-n3,
-.mx-n3 {
- margin-right: -1rem !important;
-}
-
-.mb-n3,
-.my-n3 {
- margin-bottom: -1rem !important;
-}
-
-.ml-n3,
-.mx-n3 {
- margin-left: -1rem !important;
-}
-
-.m-n4 {
- margin: -1.5rem !important;
-}
-
-.mt-n4,
-.my-n4 {
- margin-top: -1.5rem !important;
-}
-
-.mr-n4,
-.mx-n4 {
- margin-right: -1.5rem !important;
-}
-
-.mb-n4,
-.my-n4 {
- margin-bottom: -1.5rem !important;
-}
-
-.ml-n4,
-.mx-n4 {
- margin-left: -1.5rem !important;
-}
-
-.m-n5 {
- margin: -3rem !important;
-}
-
-.mt-n5,
-.my-n5 {
- margin-top: -3rem !important;
-}
-
-.mr-n5,
-.mx-n5 {
- margin-right: -3rem !important;
-}
-
-.mb-n5,
-.my-n5 {
- margin-bottom: -3rem !important;
-}
-
-.ml-n5,
-.mx-n5 {
- margin-left: -3rem !important;
-}
-
-.m-auto {
- margin: auto !important;
-}
-
-.mt-auto,
-.my-auto {
- margin-top: auto !important;
-}
-
-.mr-auto,
-.mx-auto {
- margin-right: auto !important;
-}
-
-.mb-auto,
-.my-auto {
- margin-bottom: auto !important;
-}
-
-.ml-auto,
-.mx-auto {
- margin-left: auto !important;
-}
-
-@media (min-width: 576px) {
- .m-sm-0 {
- margin: 0 !important;
- }
- .mt-sm-0,
- .my-sm-0 {
- margin-top: 0 !important;
- }
- .mr-sm-0,
- .mx-sm-0 {
- margin-right: 0 !important;
- }
- .mb-sm-0,
- .my-sm-0 {
- margin-bottom: 0 !important;
- }
- .ml-sm-0,
- .mx-sm-0 {
- margin-left: 0 !important;
- }
- .m-sm-1 {
- margin: 0.25rem !important;
- }
- .mt-sm-1,
- .my-sm-1 {
- margin-top: 0.25rem !important;
- }
- .mr-sm-1,
- .mx-sm-1 {
- margin-right: 0.25rem !important;
- }
- .mb-sm-1,
- .my-sm-1 {
- margin-bottom: 0.25rem !important;
- }
- .ml-sm-1,
- .mx-sm-1 {
- margin-left: 0.25rem !important;
- }
- .m-sm-2 {
- margin: 0.5rem !important;
- }
- .mt-sm-2,
- .my-sm-2 {
- margin-top: 0.5rem !important;
- }
- .mr-sm-2,
- .mx-sm-2 {
- margin-right: 0.5rem !important;
- }
- .mb-sm-2,
- .my-sm-2 {
- margin-bottom: 0.5rem !important;
- }
- .ml-sm-2,
- .mx-sm-2 {
- margin-left: 0.5rem !important;
- }
- .m-sm-3 {
- margin: 1rem !important;
- }
- .mt-sm-3,
- .my-sm-3 {
- margin-top: 1rem !important;
- }
- .mr-sm-3,
- .mx-sm-3 {
- margin-right: 1rem !important;
- }
- .mb-sm-3,
- .my-sm-3 {
- margin-bottom: 1rem !important;
- }
- .ml-sm-3,
- .mx-sm-3 {
- margin-left: 1rem !important;
- }
- .m-sm-4 {
- margin: 1.5rem !important;
- }
- .mt-sm-4,
- .my-sm-4 {
- margin-top: 1.5rem !important;
- }
- .mr-sm-4,
- .mx-sm-4 {
- margin-right: 1.5rem !important;
- }
- .mb-sm-4,
- .my-sm-4 {
- margin-bottom: 1.5rem !important;
- }
- .ml-sm-4,
- .mx-sm-4 {
- margin-left: 1.5rem !important;
- }
- .m-sm-5 {
- margin: 3rem !important;
- }
- .mt-sm-5,
- .my-sm-5 {
- margin-top: 3rem !important;
- }
- .mr-sm-5,
- .mx-sm-5 {
- margin-right: 3rem !important;
- }
- .mb-sm-5,
- .my-sm-5 {
- margin-bottom: 3rem !important;
- }
- .ml-sm-5,
- .mx-sm-5 {
- margin-left: 3rem !important;
- }
- .p-sm-0 {
- padding: 0 !important;
- }
- .pt-sm-0,
- .py-sm-0 {
- padding-top: 0 !important;
- }
- .pr-sm-0,
- .px-sm-0 {
- padding-right: 0 !important;
- }
- .pb-sm-0,
- .py-sm-0 {
- padding-bottom: 0 !important;
- }
- .pl-sm-0,
- .px-sm-0 {
- padding-left: 0 !important;
- }
- .p-sm-1 {
- padding: 0.25rem !important;
- }
- .pt-sm-1,
- .py-sm-1 {
- padding-top: 0.25rem !important;
- }
- .pr-sm-1,
- .px-sm-1 {
- padding-right: 0.25rem !important;
- }
- .pb-sm-1,
- .py-sm-1 {
- padding-bottom: 0.25rem !important;
- }
- .pl-sm-1,
- .px-sm-1 {
- padding-left: 0.25rem !important;
- }
- .p-sm-2 {
- padding: 0.5rem !important;
- }
- .pt-sm-2,
- .py-sm-2 {
- padding-top: 0.5rem !important;
- }
- .pr-sm-2,
- .px-sm-2 {
- padding-right: 0.5rem !important;
- }
- .pb-sm-2,
- .py-sm-2 {
- padding-bottom: 0.5rem !important;
- }
- .pl-sm-2,
- .px-sm-2 {
- padding-left: 0.5rem !important;
- }
- .p-sm-3 {
- padding: 1rem !important;
- }
- .pt-sm-3,
- .py-sm-3 {
- padding-top: 1rem !important;
- }
- .pr-sm-3,
- .px-sm-3 {
- padding-right: 1rem !important;
- }
- .pb-sm-3,
- .py-sm-3 {
- padding-bottom: 1rem !important;
- }
- .pl-sm-3,
- .px-sm-3 {
- padding-left: 1rem !important;
- }
- .p-sm-4 {
- padding: 1.5rem !important;
- }
- .pt-sm-4,
- .py-sm-4 {
- padding-top: 1.5rem !important;
- }
- .pr-sm-4,
- .px-sm-4 {
- padding-right: 1.5rem !important;
- }
- .pb-sm-4,
- .py-sm-4 {
- padding-bottom: 1.5rem !important;
- }
- .pl-sm-4,
- .px-sm-4 {
- padding-left: 1.5rem !important;
- }
- .p-sm-5 {
- padding: 3rem !important;
- }
- .pt-sm-5,
- .py-sm-5 {
- padding-top: 3rem !important;
- }
- .pr-sm-5,
- .px-sm-5 {
- padding-right: 3rem !important;
- }
- .pb-sm-5,
- .py-sm-5 {
- padding-bottom: 3rem !important;
- }
- .pl-sm-5,
- .px-sm-5 {
- padding-left: 3rem !important;
- }
- .m-sm-n1 {
- margin: -0.25rem !important;
- }
- .mt-sm-n1,
- .my-sm-n1 {
- margin-top: -0.25rem !important;
- }
- .mr-sm-n1,
- .mx-sm-n1 {
- margin-right: -0.25rem !important;
- }
- .mb-sm-n1,
- .my-sm-n1 {
- margin-bottom: -0.25rem !important;
- }
- .ml-sm-n1,
- .mx-sm-n1 {
- margin-left: -0.25rem !important;
- }
- .m-sm-n2 {
- margin: -0.5rem !important;
- }
- .mt-sm-n2,
- .my-sm-n2 {
- margin-top: -0.5rem !important;
- }
- .mr-sm-n2,
- .mx-sm-n2 {
- margin-right: -0.5rem !important;
- }
- .mb-sm-n2,
- .my-sm-n2 {
- margin-bottom: -0.5rem !important;
- }
- .ml-sm-n2,
- .mx-sm-n2 {
- margin-left: -0.5rem !important;
- }
- .m-sm-n3 {
- margin: -1rem !important;
- }
- .mt-sm-n3,
- .my-sm-n3 {
- margin-top: -1rem !important;
- }
- .mr-sm-n3,
- .mx-sm-n3 {
- margin-right: -1rem !important;
- }
- .mb-sm-n3,
- .my-sm-n3 {
- margin-bottom: -1rem !important;
- }
- .ml-sm-n3,
- .mx-sm-n3 {
- margin-left: -1rem !important;
- }
- .m-sm-n4 {
- margin: -1.5rem !important;
- }
- .mt-sm-n4,
- .my-sm-n4 {
- margin-top: -1.5rem !important;
- }
- .mr-sm-n4,
- .mx-sm-n4 {
- margin-right: -1.5rem !important;
- }
- .mb-sm-n4,
- .my-sm-n4 {
- margin-bottom: -1.5rem !important;
- }
- .ml-sm-n4,
- .mx-sm-n4 {
- margin-left: -1.5rem !important;
- }
- .m-sm-n5 {
- margin: -3rem !important;
- }
- .mt-sm-n5,
- .my-sm-n5 {
- margin-top: -3rem !important;
- }
- .mr-sm-n5,
- .mx-sm-n5 {
- margin-right: -3rem !important;
- }
- .mb-sm-n5,
- .my-sm-n5 {
- margin-bottom: -3rem !important;
- }
- .ml-sm-n5,
- .mx-sm-n5 {
- margin-left: -3rem !important;
- }
- .m-sm-auto {
- margin: auto !important;
- }
- .mt-sm-auto,
- .my-sm-auto {
- margin-top: auto !important;
- }
- .mr-sm-auto,
- .mx-sm-auto {
- margin-right: auto !important;
- }
- .mb-sm-auto,
- .my-sm-auto {
- margin-bottom: auto !important;
- }
- .ml-sm-auto,
- .mx-sm-auto {
- margin-left: auto !important;
- }
-}
-@media (min-width: 768px) {
- .m-md-0 {
- margin: 0 !important;
- }
- .mt-md-0,
- .my-md-0 {
- margin-top: 0 !important;
- }
- .mr-md-0,
- .mx-md-0 {
- margin-right: 0 !important;
- }
- .mb-md-0,
- .my-md-0 {
- margin-bottom: 0 !important;
- }
- .ml-md-0,
- .mx-md-0 {
- margin-left: 0 !important;
- }
- .m-md-1 {
- margin: 0.25rem !important;
- }
- .mt-md-1,
- .my-md-1 {
- margin-top: 0.25rem !important;
- }
- .mr-md-1,
- .mx-md-1 {
- margin-right: 0.25rem !important;
- }
- .mb-md-1,
- .my-md-1 {
- margin-bottom: 0.25rem !important;
- }
- .ml-md-1,
- .mx-md-1 {
- margin-left: 0.25rem !important;
- }
- .m-md-2 {
- margin: 0.5rem !important;
- }
- .mt-md-2,
- .my-md-2 {
- margin-top: 0.5rem !important;
- }
- .mr-md-2,
- .mx-md-2 {
- margin-right: 0.5rem !important;
- }
- .mb-md-2,
- .my-md-2 {
- margin-bottom: 0.5rem !important;
- }
- .ml-md-2,
- .mx-md-2 {
- margin-left: 0.5rem !important;
- }
- .m-md-3 {
- margin: 1rem !important;
- }
- .mt-md-3,
- .my-md-3 {
- margin-top: 1rem !important;
- }
- .mr-md-3,
- .mx-md-3 {
- margin-right: 1rem !important;
- }
- .mb-md-3,
- .my-md-3 {
- margin-bottom: 1rem !important;
- }
- .ml-md-3,
- .mx-md-3 {
- margin-left: 1rem !important;
- }
- .m-md-4 {
- margin: 1.5rem !important;
- }
- .mt-md-4,
- .my-md-4 {
- margin-top: 1.5rem !important;
- }
- .mr-md-4,
- .mx-md-4 {
- margin-right: 1.5rem !important;
- }
- .mb-md-4,
- .my-md-4 {
- margin-bottom: 1.5rem !important;
- }
- .ml-md-4,
- .mx-md-4 {
- margin-left: 1.5rem !important;
- }
- .m-md-5 {
- margin: 3rem !important;
- }
- .mt-md-5,
- .my-md-5 {
- margin-top: 3rem !important;
- }
- .mr-md-5,
- .mx-md-5 {
- margin-right: 3rem !important;
- }
- .mb-md-5,
- .my-md-5 {
- margin-bottom: 3rem !important;
- }
- .ml-md-5,
- .mx-md-5 {
- margin-left: 3rem !important;
- }
- .p-md-0 {
- padding: 0 !important;
- }
- .pt-md-0,
- .py-md-0 {
- padding-top: 0 !important;
- }
- .pr-md-0,
- .px-md-0 {
- padding-right: 0 !important;
- }
- .pb-md-0,
- .py-md-0 {
- padding-bottom: 0 !important;
- }
- .pl-md-0,
- .px-md-0 {
- padding-left: 0 !important;
- }
- .p-md-1 {
- padding: 0.25rem !important;
- }
- .pt-md-1,
- .py-md-1 {
- padding-top: 0.25rem !important;
- }
- .pr-md-1,
- .px-md-1 {
- padding-right: 0.25rem !important;
- }
- .pb-md-1,
- .py-md-1 {
- padding-bottom: 0.25rem !important;
- }
- .pl-md-1,
- .px-md-1 {
- padding-left: 0.25rem !important;
- }
- .p-md-2 {
- padding: 0.5rem !important;
- }
- .pt-md-2,
- .py-md-2 {
- padding-top: 0.5rem !important;
- }
- .pr-md-2,
- .px-md-2 {
- padding-right: 0.5rem !important;
- }
- .pb-md-2,
- .py-md-2 {
- padding-bottom: 0.5rem !important;
- }
- .pl-md-2,
- .px-md-2 {
- padding-left: 0.5rem !important;
- }
- .p-md-3 {
- padding: 1rem !important;
- }
- .pt-md-3,
- .py-md-3 {
- padding-top: 1rem !important;
- }
- .pr-md-3,
- .px-md-3 {
- padding-right: 1rem !important;
- }
- .pb-md-3,
- .py-md-3 {
- padding-bottom: 1rem !important;
- }
- .pl-md-3,
- .px-md-3 {
- padding-left: 1rem !important;
- }
- .p-md-4 {
- padding: 1.5rem !important;
- }
- .pt-md-4,
- .py-md-4 {
- padding-top: 1.5rem !important;
- }
- .pr-md-4,
- .px-md-4 {
- padding-right: 1.5rem !important;
- }
- .pb-md-4,
- .py-md-4 {
- padding-bottom: 1.5rem !important;
- }
- .pl-md-4,
- .px-md-4 {
- padding-left: 1.5rem !important;
- }
- .p-md-5 {
- padding: 3rem !important;
- }
- .pt-md-5,
- .py-md-5 {
- padding-top: 3rem !important;
- }
- .pr-md-5,
- .px-md-5 {
- padding-right: 3rem !important;
- }
- .pb-md-5,
- .py-md-5 {
- padding-bottom: 3rem !important;
- }
- .pl-md-5,
- .px-md-5 {
- padding-left: 3rem !important;
- }
- .m-md-n1 {
- margin: -0.25rem !important;
- }
- .mt-md-n1,
- .my-md-n1 {
- margin-top: -0.25rem !important;
- }
- .mr-md-n1,
- .mx-md-n1 {
- margin-right: -0.25rem !important;
- }
- .mb-md-n1,
- .my-md-n1 {
- margin-bottom: -0.25rem !important;
- }
- .ml-md-n1,
- .mx-md-n1 {
- margin-left: -0.25rem !important;
- }
- .m-md-n2 {
- margin: -0.5rem !important;
- }
- .mt-md-n2,
- .my-md-n2 {
- margin-top: -0.5rem !important;
- }
- .mr-md-n2,
- .mx-md-n2 {
- margin-right: -0.5rem !important;
- }
- .mb-md-n2,
- .my-md-n2 {
- margin-bottom: -0.5rem !important;
- }
- .ml-md-n2,
- .mx-md-n2 {
- margin-left: -0.5rem !important;
- }
- .m-md-n3 {
- margin: -1rem !important;
- }
- .mt-md-n3,
- .my-md-n3 {
- margin-top: -1rem !important;
- }
- .mr-md-n3,
- .mx-md-n3 {
- margin-right: -1rem !important;
- }
- .mb-md-n3,
- .my-md-n3 {
- margin-bottom: -1rem !important;
- }
- .ml-md-n3,
- .mx-md-n3 {
- margin-left: -1rem !important;
- }
- .m-md-n4 {
- margin: -1.5rem !important;
- }
- .mt-md-n4,
- .my-md-n4 {
- margin-top: -1.5rem !important;
- }
- .mr-md-n4,
- .mx-md-n4 {
- margin-right: -1.5rem !important;
- }
- .mb-md-n4,
- .my-md-n4 {
- margin-bottom: -1.5rem !important;
- }
- .ml-md-n4,
- .mx-md-n4 {
- margin-left: -1.5rem !important;
- }
- .m-md-n5 {
- margin: -3rem !important;
- }
- .mt-md-n5,
- .my-md-n5 {
- margin-top: -3rem !important;
- }
- .mr-md-n5,
- .mx-md-n5 {
- margin-right: -3rem !important;
- }
- .mb-md-n5,
- .my-md-n5 {
- margin-bottom: -3rem !important;
- }
- .ml-md-n5,
- .mx-md-n5 {
- margin-left: -3rem !important;
- }
- .m-md-auto {
- margin: auto !important;
- }
- .mt-md-auto,
- .my-md-auto {
- margin-top: auto !important;
- }
- .mr-md-auto,
- .mx-md-auto {
- margin-right: auto !important;
- }
- .mb-md-auto,
- .my-md-auto {
- margin-bottom: auto !important;
- }
- .ml-md-auto,
- .mx-md-auto {
- margin-left: auto !important;
- }
-}
-@media (min-width: 992px) {
- .m-lg-0 {
- margin: 0 !important;
- }
- .mt-lg-0,
- .my-lg-0 {
- margin-top: 0 !important;
- }
- .mr-lg-0,
- .mx-lg-0 {
- margin-right: 0 !important;
- }
- .mb-lg-0,
- .my-lg-0 {
- margin-bottom: 0 !important;
- }
- .ml-lg-0,
- .mx-lg-0 {
- margin-left: 0 !important;
- }
- .m-lg-1 {
- margin: 0.25rem !important;
- }
- .mt-lg-1,
- .my-lg-1 {
- margin-top: 0.25rem !important;
- }
- .mr-lg-1,
- .mx-lg-1 {
- margin-right: 0.25rem !important;
- }
- .mb-lg-1,
- .my-lg-1 {
- margin-bottom: 0.25rem !important;
- }
- .ml-lg-1,
- .mx-lg-1 {
- margin-left: 0.25rem !important;
- }
- .m-lg-2 {
- margin: 0.5rem !important;
- }
- .mt-lg-2,
- .my-lg-2 {
- margin-top: 0.5rem !important;
- }
- .mr-lg-2,
- .mx-lg-2 {
- margin-right: 0.5rem !important;
- }
- .mb-lg-2,
- .my-lg-2 {
- margin-bottom: 0.5rem !important;
- }
- .ml-lg-2,
- .mx-lg-2 {
- margin-left: 0.5rem !important;
- }
- .m-lg-3 {
- margin: 1rem !important;
- }
- .mt-lg-3,
- .my-lg-3 {
- margin-top: 1rem !important;
- }
- .mr-lg-3,
- .mx-lg-3 {
- margin-right: 1rem !important;
- }
- .mb-lg-3,
- .my-lg-3 {
- margin-bottom: 1rem !important;
- }
- .ml-lg-3,
- .mx-lg-3 {
- margin-left: 1rem !important;
- }
- .m-lg-4 {
- margin: 1.5rem !important;
- }
- .mt-lg-4,
- .my-lg-4 {
- margin-top: 1.5rem !important;
- }
- .mr-lg-4,
- .mx-lg-4 {
- margin-right: 1.5rem !important;
- }
- .mb-lg-4,
- .my-lg-4 {
- margin-bottom: 1.5rem !important;
- }
- .ml-lg-4,
- .mx-lg-4 {
- margin-left: 1.5rem !important;
- }
- .m-lg-5 {
- margin: 3rem !important;
- }
- .mt-lg-5,
- .my-lg-5 {
- margin-top: 3rem !important;
- }
- .mr-lg-5,
- .mx-lg-5 {
- margin-right: 3rem !important;
- }
- .mb-lg-5,
- .my-lg-5 {
- margin-bottom: 3rem !important;
- }
- .ml-lg-5,
- .mx-lg-5 {
- margin-left: 3rem !important;
- }
- .p-lg-0 {
- padding: 0 !important;
- }
- .pt-lg-0,
- .py-lg-0 {
- padding-top: 0 !important;
- }
- .pr-lg-0,
- .px-lg-0 {
- padding-right: 0 !important;
- }
- .pb-lg-0,
- .py-lg-0 {
- padding-bottom: 0 !important;
- }
- .pl-lg-0,
- .px-lg-0 {
- padding-left: 0 !important;
- }
- .p-lg-1 {
- padding: 0.25rem !important;
- }
- .pt-lg-1,
- .py-lg-1 {
- padding-top: 0.25rem !important;
- }
- .pr-lg-1,
- .px-lg-1 {
- padding-right: 0.25rem !important;
- }
- .pb-lg-1,
- .py-lg-1 {
- padding-bottom: 0.25rem !important;
- }
- .pl-lg-1,
- .px-lg-1 {
- padding-left: 0.25rem !important;
- }
- .p-lg-2 {
- padding: 0.5rem !important;
- }
- .pt-lg-2,
- .py-lg-2 {
- padding-top: 0.5rem !important;
- }
- .pr-lg-2,
- .px-lg-2 {
- padding-right: 0.5rem !important;
- }
- .pb-lg-2,
- .py-lg-2 {
- padding-bottom: 0.5rem !important;
- }
- .pl-lg-2,
- .px-lg-2 {
- padding-left: 0.5rem !important;
- }
- .p-lg-3 {
- padding: 1rem !important;
- }
- .pt-lg-3,
- .py-lg-3 {
- padding-top: 1rem !important;
- }
- .pr-lg-3,
- .px-lg-3 {
- padding-right: 1rem !important;
- }
- .pb-lg-3,
- .py-lg-3 {
- padding-bottom: 1rem !important;
- }
- .pl-lg-3,
- .px-lg-3 {
- padding-left: 1rem !important;
- }
- .p-lg-4 {
- padding: 1.5rem !important;
- }
- .pt-lg-4,
- .py-lg-4 {
- padding-top: 1.5rem !important;
- }
- .pr-lg-4,
- .px-lg-4 {
- padding-right: 1.5rem !important;
- }
- .pb-lg-4,
- .py-lg-4 {
- padding-bottom: 1.5rem !important;
- }
- .pl-lg-4,
- .px-lg-4 {
- padding-left: 1.5rem !important;
- }
- .p-lg-5 {
- padding: 3rem !important;
- }
- .pt-lg-5,
- .py-lg-5 {
- padding-top: 3rem !important;
- }
- .pr-lg-5,
- .px-lg-5 {
- padding-right: 3rem !important;
- }
- .pb-lg-5,
- .py-lg-5 {
- padding-bottom: 3rem !important;
- }
- .pl-lg-5,
- .px-lg-5 {
- padding-left: 3rem !important;
- }
- .m-lg-n1 {
- margin: -0.25rem !important;
- }
- .mt-lg-n1,
- .my-lg-n1 {
- margin-top: -0.25rem !important;
- }
- .mr-lg-n1,
- .mx-lg-n1 {
- margin-right: -0.25rem !important;
- }
- .mb-lg-n1,
- .my-lg-n1 {
- margin-bottom: -0.25rem !important;
- }
- .ml-lg-n1,
- .mx-lg-n1 {
- margin-left: -0.25rem !important;
- }
- .m-lg-n2 {
- margin: -0.5rem !important;
- }
- .mt-lg-n2,
- .my-lg-n2 {
- margin-top: -0.5rem !important;
- }
- .mr-lg-n2,
- .mx-lg-n2 {
- margin-right: -0.5rem !important;
- }
- .mb-lg-n2,
- .my-lg-n2 {
- margin-bottom: -0.5rem !important;
- }
- .ml-lg-n2,
- .mx-lg-n2 {
- margin-left: -0.5rem !important;
- }
- .m-lg-n3 {
- margin: -1rem !important;
- }
- .mt-lg-n3,
- .my-lg-n3 {
- margin-top: -1rem !important;
- }
- .mr-lg-n3,
- .mx-lg-n3 {
- margin-right: -1rem !important;
- }
- .mb-lg-n3,
- .my-lg-n3 {
- margin-bottom: -1rem !important;
- }
- .ml-lg-n3,
- .mx-lg-n3 {
- margin-left: -1rem !important;
- }
- .m-lg-n4 {
- margin: -1.5rem !important;
- }
- .mt-lg-n4,
- .my-lg-n4 {
- margin-top: -1.5rem !important;
- }
- .mr-lg-n4,
- .mx-lg-n4 {
- margin-right: -1.5rem !important;
- }
- .mb-lg-n4,
- .my-lg-n4 {
- margin-bottom: -1.5rem !important;
- }
- .ml-lg-n4,
- .mx-lg-n4 {
- margin-left: -1.5rem !important;
- }
- .m-lg-n5 {
- margin: -3rem !important;
- }
- .mt-lg-n5,
- .my-lg-n5 {
- margin-top: -3rem !important;
- }
- .mr-lg-n5,
- .mx-lg-n5 {
- margin-right: -3rem !important;
- }
- .mb-lg-n5,
- .my-lg-n5 {
- margin-bottom: -3rem !important;
- }
- .ml-lg-n5,
- .mx-lg-n5 {
- margin-left: -3rem !important;
- }
- .m-lg-auto {
- margin: auto !important;
- }
- .mt-lg-auto,
- .my-lg-auto {
- margin-top: auto !important;
- }
- .mr-lg-auto,
- .mx-lg-auto {
- margin-right: auto !important;
- }
- .mb-lg-auto,
- .my-lg-auto {
- margin-bottom: auto !important;
- }
- .ml-lg-auto,
- .mx-lg-auto {
- margin-left: auto !important;
- }
-}
-@media (min-width: 1200px) {
- .m-xl-0 {
- margin: 0 !important;
- }
- .mt-xl-0,
- .my-xl-0 {
- margin-top: 0 !important;
- }
- .mr-xl-0,
- .mx-xl-0 {
- margin-right: 0 !important;
- }
- .mb-xl-0,
- .my-xl-0 {
- margin-bottom: 0 !important;
- }
- .ml-xl-0,
- .mx-xl-0 {
- margin-left: 0 !important;
- }
- .m-xl-1 {
- margin: 0.25rem !important;
- }
- .mt-xl-1,
- .my-xl-1 {
- margin-top: 0.25rem !important;
- }
- .mr-xl-1,
- .mx-xl-1 {
- margin-right: 0.25rem !important;
- }
- .mb-xl-1,
- .my-xl-1 {
- margin-bottom: 0.25rem !important;
- }
- .ml-xl-1,
- .mx-xl-1 {
- margin-left: 0.25rem !important;
- }
- .m-xl-2 {
- margin: 0.5rem !important;
- }
- .mt-xl-2,
- .my-xl-2 {
- margin-top: 0.5rem !important;
- }
- .mr-xl-2,
- .mx-xl-2 {
- margin-right: 0.5rem !important;
- }
- .mb-xl-2,
- .my-xl-2 {
- margin-bottom: 0.5rem !important;
- }
- .ml-xl-2,
- .mx-xl-2 {
- margin-left: 0.5rem !important;
- }
- .m-xl-3 {
- margin: 1rem !important;
- }
- .mt-xl-3,
- .my-xl-3 {
- margin-top: 1rem !important;
- }
- .mr-xl-3,
- .mx-xl-3 {
- margin-right: 1rem !important;
- }
- .mb-xl-3,
- .my-xl-3 {
- margin-bottom: 1rem !important;
- }
- .ml-xl-3,
- .mx-xl-3 {
- margin-left: 1rem !important;
- }
- .m-xl-4 {
- margin: 1.5rem !important;
- }
- .mt-xl-4,
- .my-xl-4 {
- margin-top: 1.5rem !important;
- }
- .mr-xl-4,
- .mx-xl-4 {
- margin-right: 1.5rem !important;
- }
- .mb-xl-4,
- .my-xl-4 {
- margin-bottom: 1.5rem !important;
- }
- .ml-xl-4,
- .mx-xl-4 {
- margin-left: 1.5rem !important;
- }
- .m-xl-5 {
- margin: 3rem !important;
- }
- .mt-xl-5,
- .my-xl-5 {
- margin-top: 3rem !important;
- }
- .mr-xl-5,
- .mx-xl-5 {
- margin-right: 3rem !important;
- }
- .mb-xl-5,
- .my-xl-5 {
- margin-bottom: 3rem !important;
- }
- .ml-xl-5,
- .mx-xl-5 {
- margin-left: 3rem !important;
- }
- .p-xl-0 {
- padding: 0 !important;
- }
- .pt-xl-0,
- .py-xl-0 {
- padding-top: 0 !important;
- }
- .pr-xl-0,
- .px-xl-0 {
- padding-right: 0 !important;
- }
- .pb-xl-0,
- .py-xl-0 {
- padding-bottom: 0 !important;
- }
- .pl-xl-0,
- .px-xl-0 {
- padding-left: 0 !important;
- }
- .p-xl-1 {
- padding: 0.25rem !important;
- }
- .pt-xl-1,
- .py-xl-1 {
- padding-top: 0.25rem !important;
- }
- .pr-xl-1,
- .px-xl-1 {
- padding-right: 0.25rem !important;
- }
- .pb-xl-1,
- .py-xl-1 {
- padding-bottom: 0.25rem !important;
- }
- .pl-xl-1,
- .px-xl-1 {
- padding-left: 0.25rem !important;
- }
- .p-xl-2 {
- padding: 0.5rem !important;
- }
- .pt-xl-2,
- .py-xl-2 {
- padding-top: 0.5rem !important;
- }
- .pr-xl-2,
- .px-xl-2 {
- padding-right: 0.5rem !important;
- }
- .pb-xl-2,
- .py-xl-2 {
- padding-bottom: 0.5rem !important;
- }
- .pl-xl-2,
- .px-xl-2 {
- padding-left: 0.5rem !important;
- }
- .p-xl-3 {
- padding: 1rem !important;
- }
- .pt-xl-3,
- .py-xl-3 {
- padding-top: 1rem !important;
- }
- .pr-xl-3,
- .px-xl-3 {
- padding-right: 1rem !important;
- }
- .pb-xl-3,
- .py-xl-3 {
- padding-bottom: 1rem !important;
- }
- .pl-xl-3,
- .px-xl-3 {
- padding-left: 1rem !important;
- }
- .p-xl-4 {
- padding: 1.5rem !important;
- }
- .pt-xl-4,
- .py-xl-4 {
- padding-top: 1.5rem !important;
- }
- .pr-xl-4,
- .px-xl-4 {
- padding-right: 1.5rem !important;
- }
- .pb-xl-4,
- .py-xl-4 {
- padding-bottom: 1.5rem !important;
- }
- .pl-xl-4,
- .px-xl-4 {
- padding-left: 1.5rem !important;
- }
- .p-xl-5 {
- padding: 3rem !important;
- }
- .pt-xl-5,
- .py-xl-5 {
- padding-top: 3rem !important;
- }
- .pr-xl-5,
- .px-xl-5 {
- padding-right: 3rem !important;
- }
- .pb-xl-5,
- .py-xl-5 {
- padding-bottom: 3rem !important;
- }
- .pl-xl-5,
- .px-xl-5 {
- padding-left: 3rem !important;
- }
- .m-xl-n1 {
- margin: -0.25rem !important;
- }
- .mt-xl-n1,
- .my-xl-n1 {
- margin-top: -0.25rem !important;
- }
- .mr-xl-n1,
- .mx-xl-n1 {
- margin-right: -0.25rem !important;
- }
- .mb-xl-n1,
- .my-xl-n1 {
- margin-bottom: -0.25rem !important;
- }
- .ml-xl-n1,
- .mx-xl-n1 {
- margin-left: -0.25rem !important;
- }
- .m-xl-n2 {
- margin: -0.5rem !important;
- }
- .mt-xl-n2,
- .my-xl-n2 {
- margin-top: -0.5rem !important;
- }
- .mr-xl-n2,
- .mx-xl-n2 {
- margin-right: -0.5rem !important;
- }
- .mb-xl-n2,
- .my-xl-n2 {
- margin-bottom: -0.5rem !important;
- }
- .ml-xl-n2,
- .mx-xl-n2 {
- margin-left: -0.5rem !important;
- }
- .m-xl-n3 {
- margin: -1rem !important;
- }
- .mt-xl-n3,
- .my-xl-n3 {
- margin-top: -1rem !important;
- }
- .mr-xl-n3,
- .mx-xl-n3 {
- margin-right: -1rem !important;
- }
- .mb-xl-n3,
- .my-xl-n3 {
- margin-bottom: -1rem !important;
- }
- .ml-xl-n3,
- .mx-xl-n3 {
- margin-left: -1rem !important;
- }
- .m-xl-n4 {
- margin: -1.5rem !important;
- }
- .mt-xl-n4,
- .my-xl-n4 {
- margin-top: -1.5rem !important;
- }
- .mr-xl-n4,
- .mx-xl-n4 {
- margin-right: -1.5rem !important;
- }
- .mb-xl-n4,
- .my-xl-n4 {
- margin-bottom: -1.5rem !important;
- }
- .ml-xl-n4,
- .mx-xl-n4 {
- margin-left: -1.5rem !important;
- }
- .m-xl-n5 {
- margin: -3rem !important;
- }
- .mt-xl-n5,
- .my-xl-n5 {
- margin-top: -3rem !important;
- }
- .mr-xl-n5,
- .mx-xl-n5 {
- margin-right: -3rem !important;
- }
- .mb-xl-n5,
- .my-xl-n5 {
- margin-bottom: -3rem !important;
- }
- .ml-xl-n5,
- .mx-xl-n5 {
- margin-left: -3rem !important;
- }
- .m-xl-auto {
- margin: auto !important;
- }
- .mt-xl-auto,
- .my-xl-auto {
- margin-top: auto !important;
- }
- .mr-xl-auto,
- .mx-xl-auto {
- margin-right: auto !important;
- }
- .mb-xl-auto,
- .my-xl-auto {
- margin-bottom: auto !important;
- }
- .ml-xl-auto,
- .mx-xl-auto {
- margin-left: auto !important;
- }
-}
-@media (min-width: 1600px) {
- .m-xxl-0 {
- margin: 0 !important;
- }
- .mt-xxl-0,
- .my-xxl-0 {
- margin-top: 0 !important;
- }
- .mr-xxl-0,
- .mx-xxl-0 {
- margin-right: 0 !important;
- }
- .mb-xxl-0,
- .my-xxl-0 {
- margin-bottom: 0 !important;
- }
- .ml-xxl-0,
- .mx-xxl-0 {
- margin-left: 0 !important;
- }
- .m-xxl-1 {
- margin: 0.25rem !important;
- }
- .mt-xxl-1,
- .my-xxl-1 {
- margin-top: 0.25rem !important;
- }
- .mr-xxl-1,
- .mx-xxl-1 {
- margin-right: 0.25rem !important;
- }
- .mb-xxl-1,
- .my-xxl-1 {
- margin-bottom: 0.25rem !important;
- }
- .ml-xxl-1,
- .mx-xxl-1 {
- margin-left: 0.25rem !important;
- }
- .m-xxl-2 {
- margin: 0.5rem !important;
- }
- .mt-xxl-2,
- .my-xxl-2 {
- margin-top: 0.5rem !important;
- }
- .mr-xxl-2,
- .mx-xxl-2 {
- margin-right: 0.5rem !important;
- }
- .mb-xxl-2,
- .my-xxl-2 {
- margin-bottom: 0.5rem !important;
- }
- .ml-xxl-2,
- .mx-xxl-2 {
- margin-left: 0.5rem !important;
- }
- .m-xxl-3 {
- margin: 1rem !important;
- }
- .mt-xxl-3,
- .my-xxl-3 {
- margin-top: 1rem !important;
- }
- .mr-xxl-3,
- .mx-xxl-3 {
- margin-right: 1rem !important;
- }
- .mb-xxl-3,
- .my-xxl-3 {
- margin-bottom: 1rem !important;
- }
- .ml-xxl-3,
- .mx-xxl-3 {
- margin-left: 1rem !important;
- }
- .m-xxl-4 {
- margin: 1.5rem !important;
- }
- .mt-xxl-4,
- .my-xxl-4 {
- margin-top: 1.5rem !important;
- }
- .mr-xxl-4,
- .mx-xxl-4 {
- margin-right: 1.5rem !important;
- }
- .mb-xxl-4,
- .my-xxl-4 {
- margin-bottom: 1.5rem !important;
- }
- .ml-xxl-4,
- .mx-xxl-4 {
- margin-left: 1.5rem !important;
- }
- .m-xxl-5 {
- margin: 3rem !important;
- }
- .mt-xxl-5,
- .my-xxl-5 {
- margin-top: 3rem !important;
- }
- .mr-xxl-5,
- .mx-xxl-5 {
- margin-right: 3rem !important;
- }
- .mb-xxl-5,
- .my-xxl-5 {
- margin-bottom: 3rem !important;
- }
- .ml-xxl-5,
- .mx-xxl-5 {
- margin-left: 3rem !important;
- }
- .p-xxl-0 {
- padding: 0 !important;
- }
- .pt-xxl-0,
- .py-xxl-0 {
- padding-top: 0 !important;
- }
- .pr-xxl-0,
- .px-xxl-0 {
- padding-right: 0 !important;
- }
- .pb-xxl-0,
- .py-xxl-0 {
- padding-bottom: 0 !important;
- }
- .pl-xxl-0,
- .px-xxl-0 {
- padding-left: 0 !important;
- }
- .p-xxl-1 {
- padding: 0.25rem !important;
- }
- .pt-xxl-1,
- .py-xxl-1 {
- padding-top: 0.25rem !important;
- }
- .pr-xxl-1,
- .px-xxl-1 {
- padding-right: 0.25rem !important;
- }
- .pb-xxl-1,
- .py-xxl-1 {
- padding-bottom: 0.25rem !important;
- }
- .pl-xxl-1,
- .px-xxl-1 {
- padding-left: 0.25rem !important;
- }
- .p-xxl-2 {
- padding: 0.5rem !important;
- }
- .pt-xxl-2,
- .py-xxl-2 {
- padding-top: 0.5rem !important;
- }
- .pr-xxl-2,
- .px-xxl-2 {
- padding-right: 0.5rem !important;
- }
- .pb-xxl-2,
- .py-xxl-2 {
- padding-bottom: 0.5rem !important;
- }
- .pl-xxl-2,
- .px-xxl-2 {
- padding-left: 0.5rem !important;
- }
- .p-xxl-3 {
- padding: 1rem !important;
- }
- .pt-xxl-3,
- .py-xxl-3 {
- padding-top: 1rem !important;
- }
- .pr-xxl-3,
- .px-xxl-3 {
- padding-right: 1rem !important;
- }
- .pb-xxl-3,
- .py-xxl-3 {
- padding-bottom: 1rem !important;
- }
- .pl-xxl-3,
- .px-xxl-3 {
- padding-left: 1rem !important;
- }
- .p-xxl-4 {
- padding: 1.5rem !important;
- }
- .pt-xxl-4,
- .py-xxl-4 {
- padding-top: 1.5rem !important;
- }
- .pr-xxl-4,
- .px-xxl-4 {
- padding-right: 1.5rem !important;
- }
- .pb-xxl-4,
- .py-xxl-4 {
- padding-bottom: 1.5rem !important;
- }
- .pl-xxl-4,
- .px-xxl-4 {
- padding-left: 1.5rem !important;
- }
- .p-xxl-5 {
- padding: 3rem !important;
- }
- .pt-xxl-5,
- .py-xxl-5 {
- padding-top: 3rem !important;
- }
- .pr-xxl-5,
- .px-xxl-5 {
- padding-right: 3rem !important;
- }
- .pb-xxl-5,
- .py-xxl-5 {
- padding-bottom: 3rem !important;
- }
- .pl-xxl-5,
- .px-xxl-5 {
- padding-left: 3rem !important;
- }
- .m-xxl-n1 {
- margin: -0.25rem !important;
- }
- .mt-xxl-n1,
- .my-xxl-n1 {
- margin-top: -0.25rem !important;
- }
- .mr-xxl-n1,
- .mx-xxl-n1 {
- margin-right: -0.25rem !important;
- }
- .mb-xxl-n1,
- .my-xxl-n1 {
- margin-bottom: -0.25rem !important;
- }
- .ml-xxl-n1,
- .mx-xxl-n1 {
- margin-left: -0.25rem !important;
- }
- .m-xxl-n2 {
- margin: -0.5rem !important;
- }
- .mt-xxl-n2,
- .my-xxl-n2 {
- margin-top: -0.5rem !important;
- }
- .mr-xxl-n2,
- .mx-xxl-n2 {
- margin-right: -0.5rem !important;
- }
- .mb-xxl-n2,
- .my-xxl-n2 {
- margin-bottom: -0.5rem !important;
- }
- .ml-xxl-n2,
- .mx-xxl-n2 {
- margin-left: -0.5rem !important;
- }
- .m-xxl-n3 {
- margin: -1rem !important;
- }
- .mt-xxl-n3,
- .my-xxl-n3 {
- margin-top: -1rem !important;
- }
- .mr-xxl-n3,
- .mx-xxl-n3 {
- margin-right: -1rem !important;
- }
- .mb-xxl-n3,
- .my-xxl-n3 {
- margin-bottom: -1rem !important;
- }
- .ml-xxl-n3,
- .mx-xxl-n3 {
- margin-left: -1rem !important;
- }
- .m-xxl-n4 {
- margin: -1.5rem !important;
- }
- .mt-xxl-n4,
- .my-xxl-n4 {
- margin-top: -1.5rem !important;
- }
- .mr-xxl-n4,
- .mx-xxl-n4 {
- margin-right: -1.5rem !important;
- }
- .mb-xxl-n4,
- .my-xxl-n4 {
- margin-bottom: -1.5rem !important;
- }
- .ml-xxl-n4,
- .mx-xxl-n4 {
- margin-left: -1.5rem !important;
- }
- .m-xxl-n5 {
- margin: -3rem !important;
- }
- .mt-xxl-n5,
- .my-xxl-n5 {
- margin-top: -3rem !important;
- }
- .mr-xxl-n5,
- .mx-xxl-n5 {
- margin-right: -3rem !important;
- }
- .mb-xxl-n5,
- .my-xxl-n5 {
- margin-bottom: -3rem !important;
- }
- .ml-xxl-n5,
- .mx-xxl-n5 {
- margin-left: -3rem !important;
- }
- .m-xxl-auto {
- margin: auto !important;
- }
- .mt-xxl-auto,
- .my-xxl-auto {
- margin-top: auto !important;
- }
- .mr-xxl-auto,
- .mx-xxl-auto {
- margin-right: auto !important;
- }
- .mb-xxl-auto,
- .my-xxl-auto {
- margin-bottom: auto !important;
- }
- .ml-xxl-auto,
- .mx-xxl-auto {
- margin-left: auto !important;
- }
-}
-@media (min-width: 2600px) {
- .m-xxxl-0 {
- margin: 0 !important;
- }
- .mt-xxxl-0,
- .my-xxxl-0 {
- margin-top: 0 !important;
- }
- .mr-xxxl-0,
- .mx-xxxl-0 {
- margin-right: 0 !important;
- }
- .mb-xxxl-0,
- .my-xxxl-0 {
- margin-bottom: 0 !important;
- }
- .ml-xxxl-0,
- .mx-xxxl-0 {
- margin-left: 0 !important;
- }
- .m-xxxl-1 {
- margin: 0.25rem !important;
- }
- .mt-xxxl-1,
- .my-xxxl-1 {
- margin-top: 0.25rem !important;
- }
- .mr-xxxl-1,
- .mx-xxxl-1 {
- margin-right: 0.25rem !important;
- }
- .mb-xxxl-1,
- .my-xxxl-1 {
- margin-bottom: 0.25rem !important;
- }
- .ml-xxxl-1,
- .mx-xxxl-1 {
- margin-left: 0.25rem !important;
- }
- .m-xxxl-2 {
- margin: 0.5rem !important;
- }
- .mt-xxxl-2,
- .my-xxxl-2 {
- margin-top: 0.5rem !important;
- }
- .mr-xxxl-2,
- .mx-xxxl-2 {
- margin-right: 0.5rem !important;
- }
- .mb-xxxl-2,
- .my-xxxl-2 {
- margin-bottom: 0.5rem !important;
- }
- .ml-xxxl-2,
- .mx-xxxl-2 {
- margin-left: 0.5rem !important;
- }
- .m-xxxl-3 {
- margin: 1rem !important;
- }
- .mt-xxxl-3,
- .my-xxxl-3 {
- margin-top: 1rem !important;
- }
- .mr-xxxl-3,
- .mx-xxxl-3 {
- margin-right: 1rem !important;
- }
- .mb-xxxl-3,
- .my-xxxl-3 {
- margin-bottom: 1rem !important;
- }
- .ml-xxxl-3,
- .mx-xxxl-3 {
- margin-left: 1rem !important;
- }
- .m-xxxl-4 {
- margin: 1.5rem !important;
- }
- .mt-xxxl-4,
- .my-xxxl-4 {
- margin-top: 1.5rem !important;
- }
- .mr-xxxl-4,
- .mx-xxxl-4 {
- margin-right: 1.5rem !important;
- }
- .mb-xxxl-4,
- .my-xxxl-4 {
- margin-bottom: 1.5rem !important;
- }
- .ml-xxxl-4,
- .mx-xxxl-4 {
- margin-left: 1.5rem !important;
- }
- .m-xxxl-5 {
- margin: 3rem !important;
- }
- .mt-xxxl-5,
- .my-xxxl-5 {
- margin-top: 3rem !important;
- }
- .mr-xxxl-5,
- .mx-xxxl-5 {
- margin-right: 3rem !important;
- }
- .mb-xxxl-5,
- .my-xxxl-5 {
- margin-bottom: 3rem !important;
- }
- .ml-xxxl-5,
- .mx-xxxl-5 {
- margin-left: 3rem !important;
- }
- .p-xxxl-0 {
- padding: 0 !important;
- }
- .pt-xxxl-0,
- .py-xxxl-0 {
- padding-top: 0 !important;
- }
- .pr-xxxl-0,
- .px-xxxl-0 {
- padding-right: 0 !important;
- }
- .pb-xxxl-0,
- .py-xxxl-0 {
- padding-bottom: 0 !important;
- }
- .pl-xxxl-0,
- .px-xxxl-0 {
- padding-left: 0 !important;
- }
- .p-xxxl-1 {
- padding: 0.25rem !important;
- }
- .pt-xxxl-1,
- .py-xxxl-1 {
- padding-top: 0.25rem !important;
- }
- .pr-xxxl-1,
- .px-xxxl-1 {
- padding-right: 0.25rem !important;
- }
- .pb-xxxl-1,
- .py-xxxl-1 {
- padding-bottom: 0.25rem !important;
- }
- .pl-xxxl-1,
- .px-xxxl-1 {
- padding-left: 0.25rem !important;
- }
- .p-xxxl-2 {
- padding: 0.5rem !important;
- }
- .pt-xxxl-2,
- .py-xxxl-2 {
- padding-top: 0.5rem !important;
- }
- .pr-xxxl-2,
- .px-xxxl-2 {
- padding-right: 0.5rem !important;
- }
- .pb-xxxl-2,
- .py-xxxl-2 {
- padding-bottom: 0.5rem !important;
- }
- .pl-xxxl-2,
- .px-xxxl-2 {
- padding-left: 0.5rem !important;
- }
- .p-xxxl-3 {
- padding: 1rem !important;
- }
- .pt-xxxl-3,
- .py-xxxl-3 {
- padding-top: 1rem !important;
- }
- .pr-xxxl-3,
- .px-xxxl-3 {
- padding-right: 1rem !important;
- }
- .pb-xxxl-3,
- .py-xxxl-3 {
- padding-bottom: 1rem !important;
- }
- .pl-xxxl-3,
- .px-xxxl-3 {
- padding-left: 1rem !important;
- }
- .p-xxxl-4 {
- padding: 1.5rem !important;
- }
- .pt-xxxl-4,
- .py-xxxl-4 {
- padding-top: 1.5rem !important;
- }
- .pr-xxxl-4,
- .px-xxxl-4 {
- padding-right: 1.5rem !important;
- }
- .pb-xxxl-4,
- .py-xxxl-4 {
- padding-bottom: 1.5rem !important;
- }
- .pl-xxxl-4,
- .px-xxxl-4 {
- padding-left: 1.5rem !important;
- }
- .p-xxxl-5 {
- padding: 3rem !important;
- }
- .pt-xxxl-5,
- .py-xxxl-5 {
- padding-top: 3rem !important;
- }
- .pr-xxxl-5,
- .px-xxxl-5 {
- padding-right: 3rem !important;
- }
- .pb-xxxl-5,
- .py-xxxl-5 {
- padding-bottom: 3rem !important;
- }
- .pl-xxxl-5,
- .px-xxxl-5 {
- padding-left: 3rem !important;
- }
- .m-xxxl-n1 {
- margin: -0.25rem !important;
- }
- .mt-xxxl-n1,
- .my-xxxl-n1 {
- margin-top: -0.25rem !important;
- }
- .mr-xxxl-n1,
- .mx-xxxl-n1 {
- margin-right: -0.25rem !important;
- }
- .mb-xxxl-n1,
- .my-xxxl-n1 {
- margin-bottom: -0.25rem !important;
- }
- .ml-xxxl-n1,
- .mx-xxxl-n1 {
- margin-left: -0.25rem !important;
- }
- .m-xxxl-n2 {
- margin: -0.5rem !important;
- }
- .mt-xxxl-n2,
- .my-xxxl-n2 {
- margin-top: -0.5rem !important;
- }
- .mr-xxxl-n2,
- .mx-xxxl-n2 {
- margin-right: -0.5rem !important;
- }
- .mb-xxxl-n2,
- .my-xxxl-n2 {
- margin-bottom: -0.5rem !important;
- }
- .ml-xxxl-n2,
- .mx-xxxl-n2 {
- margin-left: -0.5rem !important;
- }
- .m-xxxl-n3 {
- margin: -1rem !important;
- }
- .mt-xxxl-n3,
- .my-xxxl-n3 {
- margin-top: -1rem !important;
- }
- .mr-xxxl-n3,
- .mx-xxxl-n3 {
- margin-right: -1rem !important;
- }
- .mb-xxxl-n3,
- .my-xxxl-n3 {
- margin-bottom: -1rem !important;
- }
- .ml-xxxl-n3,
- .mx-xxxl-n3 {
- margin-left: -1rem !important;
- }
- .m-xxxl-n4 {
- margin: -1.5rem !important;
- }
- .mt-xxxl-n4,
- .my-xxxl-n4 {
- margin-top: -1.5rem !important;
- }
- .mr-xxxl-n4,
- .mx-xxxl-n4 {
- margin-right: -1.5rem !important;
- }
- .mb-xxxl-n4,
- .my-xxxl-n4 {
- margin-bottom: -1.5rem !important;
- }
- .ml-xxxl-n4,
- .mx-xxxl-n4 {
- margin-left: -1.5rem !important;
- }
- .m-xxxl-n5 {
- margin: -3rem !important;
- }
- .mt-xxxl-n5,
- .my-xxxl-n5 {
- margin-top: -3rem !important;
- }
- .mr-xxxl-n5,
- .mx-xxxl-n5 {
- margin-right: -3rem !important;
- }
- .mb-xxxl-n5,
- .my-xxxl-n5 {
- margin-bottom: -3rem !important;
- }
- .ml-xxxl-n5,
- .mx-xxxl-n5 {
- margin-left: -3rem !important;
- }
- .m-xxxl-auto {
- margin: auto !important;
- }
- .mt-xxxl-auto,
- .my-xxxl-auto {
- margin-top: auto !important;
- }
- .mr-xxxl-auto,
- .mx-xxxl-auto {
- margin-right: auto !important;
- }
- .mb-xxxl-auto,
- .my-xxxl-auto {
- margin-bottom: auto !important;
- }
- .ml-xxxl-auto,
- .mx-xxxl-auto {
- margin-left: auto !important;
- }
-}
-.stretched-link::after {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 1;
- pointer-events: auto;
- content: "";
- background-color: rgba(0, 0, 0, 0);
-}
-
-.text-monospace {
- font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important;
-}
-
-.text-justify {
- text-align: justify !important;
-}
-
-.text-wrap {
- white-space: normal !important;
-}
-
-.text-nowrap {
- white-space: nowrap !important;
-}
-
-.text-truncate {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.text-left {
- text-align: left !important;
-}
-
-.text-right {
- text-align: right !important;
-}
-
-.text-center {
- text-align: center !important;
-}
-
-@media (min-width: 576px) {
- .text-sm-left {
- text-align: left !important;
- }
- .text-sm-right {
- text-align: right !important;
- }
- .text-sm-center {
- text-align: center !important;
- }
-}
-@media (min-width: 768px) {
- .text-md-left {
- text-align: left !important;
- }
- .text-md-right {
- text-align: right !important;
- }
- .text-md-center {
- text-align: center !important;
- }
-}
-@media (min-width: 992px) {
- .text-lg-left {
- text-align: left !important;
- }
- .text-lg-right {
- text-align: right !important;
- }
- .text-lg-center {
- text-align: center !important;
- }
-}
-@media (min-width: 1200px) {
- .text-xl-left {
- text-align: left !important;
- }
- .text-xl-right {
- text-align: right !important;
- }
- .text-xl-center {
- text-align: center !important;
- }
-}
-@media (min-width: 1600px) {
- .text-xxl-left {
- text-align: left !important;
- }
- .text-xxl-right {
- text-align: right !important;
- }
- .text-xxl-center {
- text-align: center !important;
- }
-}
-@media (min-width: 2600px) {
- .text-xxxl-left {
- text-align: left !important;
- }
- .text-xxxl-right {
- text-align: right !important;
- }
- .text-xxxl-center {
- text-align: center !important;
- }
-}
-.text-lowercase {
- text-transform: lowercase !important;
-}
-
-.text-uppercase {
- text-transform: uppercase !important;
-}
-
-.text-capitalize {
- text-transform: capitalize !important;
-}
-
-.font-weight-light {
- font-weight: 300 !important;
-}
-
-.font-weight-lighter {
- font-weight: lighter !important;
-}
-
-.font-weight-normal {
- font-weight: 400 !important;
-}
-
-.font-weight-bold {
- font-weight: 700 !important;
-}
-
-.font-weight-bolder {
- font-weight: bolder !important;
-}
-
-.font-italic {
- font-style: italic !important;
-}
-
-.text-white {
- color: #fff !important;
-}
-
-.text-primary {
- color: #4575cf !important;
-}
-
-a.text-primary:hover, a.text-primary:focus {
- color: #29529f !important;
-}
-
-.text-secondary {
- color: #6c757d !important;
-}
-
-a.text-secondary:hover, a.text-secondary:focus {
- color: #494f54 !important;
-}
-
-.text-success {
- color: #28a745 !important;
-}
-
-a.text-success:hover, a.text-success:focus {
- color: #19692c !important;
-}
-
-.text-info {
- color: #17a2b8 !important;
-}
-
-a.text-info:hover, a.text-info:focus {
- color: #0f6674 !important;
-}
-
-.text-warning {
- color: #ffc107 !important;
-}
-
-a.text-warning:hover, a.text-warning:focus {
- color: #ba8b00 !important;
-}
-
-.text-danger {
- color: #dc3545 !important;
-}
-
-a.text-danger:hover, a.text-danger:focus {
- color: #a71d2a !important;
-}
-
-.text-light {
- color: #f8f9fa !important;
-}
-
-a.text-light:hover, a.text-light:focus {
- color: #cbd3da !important;
-}
-
-.text-dark {
- color: #343a40 !important;
-}
-
-a.text-dark:hover, a.text-dark:focus {
- color: #121416 !important;
-}
-
-.text-body {
- color: #212529 !important;
-}
-
-.text-muted {
- color: rgba(85, 91, 104, 0.5) !important;
-}
-
-.text-black-50 {
- color: rgba(0, 0, 0, 0.5) !important;
-}
-
-.text-white-50 {
- color: rgba(255, 255, 255, 0.5) !important;
-}
-
-.text-hide {
- font: 0/0 a;
- color: transparent;
- text-shadow: none;
- background-color: transparent;
- border: 0;
-}
-
-.text-decoration-none {
- text-decoration: none !important;
-}
-
-.text-break {
- word-break: break-word !important;
- word-wrap: break-word !important;
-}
-
-.text-reset {
- color: inherit !important;
-}
-
-.visible {
- visibility: visible !important;
-}
-
-.invisible {
- visibility: hidden !important;
-}
-
-@media print {
- *,
- *::before,
- *::after {
- text-shadow: none !important;
- box-shadow: none !important;
- }
- a:not(.btn) {
- text-decoration: underline;
- }
- abbr[title]::after {
- content: " (" attr(title) ")";
- }
- pre {
- white-space: pre-wrap !important;
- }
- pre,
- blockquote {
- border: 1px solid #adb5bd;
- page-break-inside: avoid;
- }
- tr,
- img {
- page-break-inside: avoid;
- }
- p,
- h2,
- h3 {
- orphans: 3;
- widows: 3;
- }
- h2,
- h3 {
- page-break-after: avoid;
- }
- @page {
- size: a3;
- }
- body {
- min-width: 992px !important;
- }
- .container {
- min-width: 992px !important;
- }
- .navbar {
- display: none;
- }
- .badge {
- border: 1px solid #000;
- }
- .table {
- border-collapse: collapse !important;
- }
- .table td,
- .table th {
- background-color: #fff !important;
- }
- .table-bordered th,
- .table-bordered td {
- border: 1px solid #dee2e6 !important;
- }
- .table-dark {
- color: inherit;
- }
- .table-dark th,
- .table-dark td,
- .table-dark thead th,
- .table-dark tbody + tbody {
- border-color: #dee2e6;
- }
- .table .thead-dark th {
- color: inherit;
- border-color: #dee2e6;
- }
-}
-html {
- height: 100%;
- background-color: #dae0ee;
-}
-
-body {
- background-color: #dae0ee;
- background: linear-gradient(-15deg, #dae0ee, #ebeff6);
- background-size: cover;
- background-repeat: repeat-x;
- color: #555b68;
- font-size: 16px;
- line-height: 1.5;
- height: 100%;
-}
-
-#main {
- padding-top: 3.5rem;
- position: relative;
-}
-
-.layout-wrapper {
- min-height: 100%;
-}
-
-.progress {
- border-radius: 0.5rem;
-}
-
-tr[phx-click] {
- cursor: pointer;
-}
-
-table.table-hover tbody tr:hover {
- background-color: #f2f4f9;
-}
-
-/*
- * `dash-table` adds extra styling on top of regular Bootstrap table css.
- *
- * `.dash-table-wrapper` can be used to add horizontal scrolling:
- *
- * ```
- *
- * ```
- *
- */
-.dash-table {
- color: #4e5156;
- margin-bottom: 0;
-}
-.dash-table th {
- background-color: #f2f4f9;
- white-space: nowrap;
-}
-.dash-table .dash-table-icon {
- padding-left: 0.25rem;
- display: inline-block;
-}
-.dash-table .icon-sort {
- display: inline-block;
- width: 0;
- height: 0;
- line-height: 6px;
- position: relative;
- top: -1px;
- vertical-align: middle;
-}
-.dash-table .icon-asc {
- border-left: 6px solid transparent;
- border-right: 6px solid transparent;
- border-bottom: 6px solid #71747c;
-}
-.dash-table .icon-desc {
- border-left: 6px solid transparent;
- border-right: 6px solid transparent;
- border-top: 6px solid #71747c;
-}
-
-.dash-table-wrapper {
- border-radius: 6px 6px 0 0;
- overflow-x: auto;
-}
-
-.app-info {
- overflow: auto;
-}
-.app-info .node {
- fill: #f2f4f9;
- stroke: #e6eaf3;
- stroke-width: 1;
-}
-.app-info .node:hover {
- cursor: pointer;
- fill: #e6eaf3;
-}
-.app-info .node:hover + .tree-node-text {
- fill: #3d3f43;
-}
-.app-info .line {
- stroke: #e6eaf3;
- stroke-width: 2;
-}
-.app-info .tree {
- position: relative;
- margin: 20px 0;
-}
-.app-info .tree-node-text {
- fill: #555b68;
- font-size: 14px;
- font-family: "LiveDashboardFont";
- pointer-events: none;
-}
-
-#elixir-card {
- background: linear-gradient(40deg, #754fa2, #6979db);
- color: #fff;
-}
-
-#phoenix-card {
- background: linear-gradient(40deg, #f26d40, #dfa843);
- color: #fff;
-}
-
-#app-card {
- background: linear-gradient(40deg, #4575cf, #36a4ee);
- color: #fff;
-}
-
-.bg-green {
- background-color: #4db167;
-}
-
-.bg-blue {
- background-color: #5d89c7;
-}
-
-.bg-purple {
- background-color: #754fa2;
-}
-
-.bg-yellow {
- background-color: #f9bc14;
-}
-
-.bg-orange {
- background-color: #f26d40;
-}
-
-.bg-dark-gray {
- background-color: #9498a2;
-}
-
-.bg-light-gray {
- background-color: #eceff6;
-}
-
-.bg-card-default {
- background-color: #ffffff;
-}
-
-.bg-gradient-green {
- background: linear-gradient(40deg, #4db167, #70c185);
-}
-
-.bg-gradient-blue {
- background: linear-gradient(40deg, #5d89c7, #83a5d4);
-}
-
-.bg-gradient-purple {
- background: linear-gradient(40deg, #754fa2, #8f6cb8);
-}
-
-.bg-gradient-yellow {
- background: linear-gradient(40deg, #f9bc14, #faca46);
-}
-
-.bg-gradient-orange {
- background: linear-gradient(40deg, #f26d40, #f58a66);
-}
-
-.bg-gradient-dark-gray {
- background: linear-gradient(40deg, #9498a2, #afb2ba);
-}
-
-.bg-gradient-light-gray {
- background: linear-gradient(40deg, #eceff6, #f3f5f9);
-}
-
-.banner-card {
- border-radius: 6px;
- box-shadow: 0 2px 5px rgba(201, 209, 230, 0.5), 0 7px 20px rgba(201, 209, 230, 0.75);
- background-color: #fff;
- padding: 1rem;
-}
-
-.banner-card-title {
- margin-bottom: 0.2rem;
-}
-
-.banner-card-value {
- font-size: 1.5rem;
- font-weight: bold;
- margin-bottom: -0.15rem;
-}
-
-#system-info-card .banner-card-value {
- font-size: 16px;
- font-weight: 400;
- padding: 0.3rem;
-}
-
-.btn.btn-primary {
- background-color: #756f9a;
- border-width: 0;
-}
-.btn.btn-primary:not(:disabled):not(.disabled):active {
- background-color: #474360;
-}
-
-.btn.btn-secondary {
- background-color: #8b8b8b;
- border-width: 0;
-}
-
-.card {
- border-radius: 6px;
- box-shadow: 0 2px 5px rgba(201, 209, 230, 0.5), 0 7px 20px rgba(201, 209, 230, 0.75);
- border: none;
-}
-
-.card-title {
- margin-bottom: 0.75rem;
-}
-.card-title .badge {
- font-weight: inherit;
-}
-
-.card-usage {
- padding-top: 12px;
- padding-bottom: 12px;
-}
-
-.charts-col {
- margin-bottom: 2rem;
-}
-.charts-col .card {
- padding: 0.5rem;
-}
-.charts-col .card .hint {
- position: absolute;
- right: 14px;
-}
-.charts-col .card .uplot {
- font-family: "LiveDashboardFont";
- max-width: 100%;
-}
-.charts-col .card .uplot.summary .legend tr:nth-child(n+3) {
- display: table-row;
-}
-.charts-col .card .uplot .title {
- font-weight: 900;
- margin-bottom: 0.75rem;
-}
-.charts-col .card .uplot .legend {
- margin-top: 1.75rem;
- font-size: 0.75rem;
- width: 100%;
- table-layout: fixed;
-}
-.charts-col .card .uplot .legend .labels {
- background-color: #f2f4f9;
- color: #71747c;
-}
-.charts-col .card .uplot .legend .labels th {
- text-overflow: ellipsis;
- overflow: hidden;
- white-space: nowrap;
- min-width: 0;
- text-align: center;
- /* this padding is missing from uPlot css */
- padding: 4px;
-}
-.charts-col .card .uplot .legend .series th {
- text-align: left;
-}
-.charts-col .card .uplot .legend .series td {
- text-overflow: ellipsis;
- overflow: hidden;
- white-space: nowrap;
- min-width: 0;
-}
-.charts-col .card .uplot .legend.inline {
- display: flex;
- flex-wrap: wrap;
- text-align: left;
- margin-top: 0;
-}
-.charts-col .card .uplot .legend.inline .series {
- display: flex;
- flex-basis: 45%;
- order: 10;
-}
-.charts-col .card .uplot .legend.inline .series th {
- align-items: center;
- display: flex;
- flex-basis: 55px;
-}
-.charts-col .card .uplot .legend.inline .series:first-child {
- background-color: #f2f4f9;
- color: #71747c;
- flex-basis: 100%;
- margin: 1.75rem 0 0.5rem 0;
- order: 1;
- text-align: center;
- display: inline-block;
-}
-.charts-col .card .uplot .legend.inline .series:first-child th {
- display: inline-block;
-}
-.charts-col .card .uplot .legend.inline .series:first-child .ident {
- display: none;
-}
-.charts-col .card .uplot .legend.inline .series:nth-child(2) {
- order: 2;
-}
-.charts-col .card .uplot .legend.inline .series:nth-child(5) {
- order: 4;
-}
-.charts-col .card .uplot .legend.inline .series:nth-child(3) {
- order: 3;
-}
-
-@media (min-width: 1600px) {
- [data-phx-view="LiveDashboard.MetricsLive"] #main.container {
- max-width: 95%;
- }
- [data-phx-view="LiveDashboard.MetricsLive"] #main.container .charts-nav {
- max-width: 1140px;
- }
-}
-.code-field {
- background-color: #f2f4f9;
- color: #9498a2;
- border-radius: 6px;
- border-width: 0;
- font-weight: 100;
- padding: 0.5rem 0.75rem;
- white-space: nowrap;
- width: 100%;
- resize: none;
- overflow: auto;
- margin-bottom: 0.75rem;
- scrollbar-width: none;
-}
-.code-field:focus {
- outline: none;
-}
-.code-field::-webkit-scrollbar {
- display: none;
-}
-
-.cookie-status {
- display: inline-block;
- padding: 0.35rem 0 0.25rem 0;
- transition: all 0.3s ease-out;
- padding-left: 18px;
- position: relative;
- opacity: 0;
-}
-.cookie-status[data-enabled] {
- opacity: 0.75;
-}
-.cookie-status::before {
- background-color: #df0606;
- content: "";
- display: block;
- height: 10px;
- width: 10px;
- border-radius: 50px;
- top: 0.82rem;
- left: 0;
- position: absolute;
- animation-name: pulse;
- animation-iteration-count: infinite;
- animation-duration: 1.2s;
- animation-timing-function: ease-in-out;
-}
-
-@keyframes pulse {
- 0% {
- opacity: 1;
- }
- 45% {
- opacity: 1;
- }
- 50% {
- opacity: 0;
- }
- 95% {
- opacity: 0;
- }
-}
-.copy-indicator {
- opacity: 0;
- padding: 0.375rem 0.75rem;
- display: inline-block;
-}
-.copy-indicator[data-enabled] {
- animation-name: blink;
- animation-duration: 1.5s;
- animation-timing-function: ease-out;
-}
-
-@keyframes blink {
- 0% {
- opacity: 0;
- }
- 20% {
- opacity: 1;
- }
- 60% {
- opacity: 1;
- }
- 100% {
- opacity: 0;
- }
-}
-.fields-card dl {
- margin-bottom: 0;
-}
-.fields-card dl .code-field {
- margin-bottom: 0.25rem;
-}
-.fields-card dl dd:last-child {
- margin-bottom: 0;
-}
-.fields-card dl dd:last-child .code-field {
- margin-bottom: 0;
-}
-
-header {
- background: #4a4473;
- position: relative;
-}
-header h1 {
- text-shadow: 2px 2px 0 rgba(23, 31, 50, 0.5);
- color: #eceff6;
- font-size: 1.75rem;
- margin-top: 2.75rem;
- margin-bottom: 0;
-}
-header .container {
- position: relative;
- z-index: 3;
-}
-
-#menu-bar {
- margin-top: auto;
- box-shadow: 0 2px 5px rgba(201, 209, 230, 0.15), 0 7px 20px rgba(201, 209, 230, 0.3);
- border-radius: 6px;
- background-color: #fff;
- display: inline-block;
- padding: 0 0.75rem;
- margin-top: 1rem;
- margin-bottom: -1.5rem;
- position: relative;
- width: 100%;
-}
-#menu-bar .menu-item {
- display: inline-block;
- padding: 0.75rem;
- position: relative;
- text-decoration: none;
- color: rgba(69, 117, 207, 0.75);
-}
-#menu-bar .menu-item:hover {
- color: #3d2954;
-}
-#menu-bar .menu-item.active {
- color: #3d2954;
- text-shadow: 1px 1px rgba(69, 117, 207, 0.1);
-}
-#menu-bar .menu-item-disabled {
- color: rgba(85, 91, 104, 0.5);
-}
-#menu-bar .menu-item-disabled:hover {
- color: rgba(85, 91, 104, 0.5);
-}
-#menu-bar .menu-item-enable-button {
- background-color: #756f9a;
- border-radius: 3px;
- color: #ededed;
- position: absolute;
- font-size: 0.75rem;
- right: 50%;
- bottom: -15px;
- padding: 0.15rem 0.5rem;
- transform: translateX(50%);
-}
-#menu-bar .menu-item-enable-button:hover {
- background-color: #837ea5;
- text-decoration: none;
-}
-
-#nav-dropdowns {
- position: absolute;
- top: 0rem;
- right: 0rem;
- padding-top: 0.25rem;
- padding-right: 0.75rem;
- font-size: 0.9rem;
-}
-#nav-dropdowns form {
- margin: 0.5em 0;
- justify-content: flex-end;
- display: flex;
- flex-flow: row wrap;
-}
-#nav-dropdowns label {
- color: #dae0ee;
- margin: 0 0.5rem 0 0;
- line-height: 1.9rem;
- display: flex;
-}
-#nav-dropdowns label.no-select {
- margin: 0;
-}
-#nav-dropdowns .custom-select {
- background-color: rgba(218, 224, 238, 0.75);
- border-radius: 6px;
- border-width: 0;
- color: black;
- width: auto;
-}
-
-@media (max-width: 768px) {
- header h1 {
- font-size: 1.25rem;
- margin-top: 1.25rem;
- }
- #menu-bar {
- padding: 0 0.5rem;
- margin-top: 0;
- }
- #menu-bar .menu-item {
- padding: 0.75rem 0.5rem;
- }
- #nav-dropdowns {
- position: relative;
- text-align: center;
- width: 100%;
- padding: 0;
- margin-bottom: 0.4rem;
- }
- #nav-dropdowns form {
- justify-content: flex-start;
- }
- #nav-dropdowns label {
- line-height: 1rem;
- margin-bottom: 0.25rem;
- }
- #nav-dropdowns .custom-select {
- width: 100%;
- }
-}
-footer {
- text-align: center;
- padding: 1.5rem 0;
-}
-footer img {
- width: 16px;
- margin: 0 3px 3px 0;
-}
-footer .footer-dashbit {
- padding-left: 0.125rem;
-}
-
-.hint {
- display: inline-block;
- position: relative;
-}
-.hint .hint-text {
- box-shadow: 0 2px 5px rgba(23, 31, 50, 0.15), 0 7px 20px rgba(201, 209, 230, 0.3);
- display: none;
-}
-.hint .hint-icon {
- cursor: help;
- height: 15px;
- width: 15px;
- position: relative;
- top: -1px;
-}
-.hint:hover .hint-text {
- border: 1px solid #b7bcc8;
- border-radius: 6px;
- background-color: #f2f4f9;
- color: #71747c;
- display: block;
- position: absolute;
- transform: translateX(-50%);
- font-size: 1rem;
- bottom: 30px;
- left: 18px;
- width: 300px;
- padding: 1rem 1.5rem;
- z-index: 10;
-}
-.hint .hint-icon-fill {
- fill: #b7bcc8;
-}
-.hint .hint-icon-stroke {
- stroke: #b7bcc8;
-}
-
-.card-title .hint .hint-icon-fill {
- fill: #9498a2;
-}
-.card-title .hint .hint-icon-stroke {
- stroke: #9498a2;
-}
-
-@media (max-width: 576px) {
- .hint:hover .hint-text {
- transform: none;
- left: 0;
- }
-}
-.logs-card {
- display: none;
-}
-.logs-card[data-messages-present=true] {
- display: block;
-}
-.logs-card #logger-messages {
- overflow-y: scroll;
- height: 350px;
-}
-.logs-card #logger-messages pre {
- color: #555b68;
- margin-bottom: 0;
- padding: 0.25rem;
- font-size: 0.75rem;
-}
-.logs-card #logger-messages pre:hover {
- background-color: rgba(237, 237, 237, 0.5);
-}
-.logs-card #logger-messages pre.log-level-debug {
- color: rgba(85, 91, 104, 0.75);
-}
-
-.tabular-column-name, td.sockets-table-port, .processes-table-current_function, .processes-table-name_or_initial_call {
- padding-right: 0;
- max-width: 350px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.tabular-column-id, td.sockets-table-port, .ports-table-port {
- color: #71747c;
-}
-.tabular-column-bytes, td.sockets-table-send_oct, td.sockets-table-recv_oct, .ports-table-output, td.ports-table-input, .ets-table-memory {
- text-align: right;
- white-space: nowrap;
-}
-.tabular-search {
- float: right;
-}
-.tabular-search ::placeholder {
- color: #b7bcc8;
-}
-
-.custom-select {
- background-color: #dae0ee;
- border-radius: 6px;
- border-width: 0;
-}
-
-@media (max-width: 992px) {
- .tabular {
- font-size: 0.85rem;
- }
- .tabular-card {
- border-radius: 0;
- margin-left: -2rem;
- margin-right: -2rem;
- }
- .tabular-column-name, td.sockets-table-port, .processes-table-current_function, .processes-table-name_or_initial_call {
- max-width: 150px;
- }
-}
-.table-hover .active {
- color: #212529;
- background-color: rgba(0, 0, 0, 0.075);
-}
-
-.dash-modal {
- display: block;
- overflow-y: auto;
- background-color: rgba(49, 50, 53, 0.5);
-}
-.dash-modal pre {
- margin-bottom: 0;
- overflow-x: auto;
- white-space: pre-wrap;
- word-break: break-word;
-}
-.dash-modal .modal-dialog {
- max-width: 900px;
-}
-.dash-modal .modal-fullscreen {
- width: 100vw;
- max-width: none;
- height: 100%;
- margin: 0;
-}
-.dash-modal .modal-fullscreen .modal-content {
- height: 100%;
- border: 0;
- border-radius: none;
-}
-.dash-modal .modal-fullscreen .modal-header {
- border-radius: none;
-}
-.dash-modal .modal-fullscreen .modal-body {
- overflow-y: auto;
-}
-.dash-modal .modal-header {
- background-color: #f2f4f9;
- border-bottom: 2px solid #dae0ee;
- padding: 1rem 1.5rem;
-}
-.dash-modal .modal-header h6 {
- font-weight: 700;
-}
-.dash-modal .modal-content .modal-action {
- padding: 1rem;
- margin: -1rem -1rem -1rem auto;
- line-height: 1;
-}
-.dash-modal .modal-content .modal-action-item {
- display: inline-block;
- color: #aaa;
- font-size: 1.5rem;
- vertical-align: middle;
- font-weight: bold;
- text-align: right;
-}
-.dash-modal .modal-content .modal-action-item:hover, .dash-modal .modal-content .modal-action-item:focus {
- color: black;
- text-decoration: none;
- cursor: pointer;
-}
-.dash-modal .modal-content .modal-action-hidden {
- display: none;
-}
-
-@media (max-width: 992px) {
- .dash-modal .modal-dialog {
- max-width: 700px;
- }
-}
-.nav-bar {
- background-color: #dae0ee;
- border-radius: 6px;
- line-height: 1.6;
-}
-
-.nav-bar .nav-link {
- color: #4e5156;
-}
-.nav-bar .nav-link:hover {
- color: #3d2954;
-}
-
-.nav-bar .nav-link.active {
- color: #3d2954;
- border-bottom: 3px solid #756f9a;
-}
-
-.color-bar-progress {
- border-radius: 2px;
- height: 1.5rem;
- background-color: transparent;
- position: relative;
-}
-.color-bar-progress-title {
- color: #9498a2;
- position: absolute;
- right: 6px;
- top: 2px;
- font-weight: bold;
-}
-.color-bar-progress-bar {
- border-color: white;
- border-style: solid;
- border-width: 0 1px;
- min-width: 4px;
- flex-grow: 0;
- user-select: none;
- cursor: pointer;
-}
-.color-bar-progress-bar[data-empty=true] {
- display: none;
-}
-.color-bar-progress-bar[data-muted=true] {
- opacity: 0.15;
-}
-.color-bar-progress-bar.bg-gradient-light-gray[data-muted=false] {
- box-shadow: inset 0 0 0 1px #b7bcc8, inset 0 0 0 3px rgba(242, 244, 249, 0.15);
- background: linear-gradient(90deg, #e2e6f1, #e9ecf4);
-}
-.color-bar-progress-bar.bg-gradient-light-gray[data-muted=true] {
- opacity: 1;
- background: linear-gradient(90deg, #f6f8fb, #f3f5f9);
-}
-.color-bar-progress-bar:last-of-type {
- border-right-width: 0;
-}
-.color-bar-progress-bar:first-of-type {
- border-left-width: 0;
- min-width: 3px;
-}
-.color-bar-progress-bar:hover {
- box-shadow: inset 0 0 0 1px rgba(78, 81, 86, 0.25), inset 0 0 0 3px rgba(242, 244, 249, 0.15);
- filter: contrast(120%) brightness(90%);
-}
-.color-bar-progress-bar:hover[data-muted=true] {
- opacity: 0.6;
-}
-.color-bar-progress-bar.bg-gradient-light-gray:hover, .color-bar-progress-bar:hover .bg-light-gray {
- box-shadow: inset 0 0 0 1px #b7bcc8, inset 0 0 0 3px rgba(242, 244, 249, 0.15);
- filter: none;
-}
-
-.color-bar-legend-color {
- border-radius: 3px;
- display: inline-block;
- height: 16px;
- width: 16px;
-}
-.color-bar-legend-entry {
- user-select: none;
- cursor: pointer;
-}
-.color-bar-legend-entry[data-muted=true] {
- opacity: 0.15;
-}
-.color-bar-legend-entry[data-muted=false] .bg-light-gray {
- box-shadow: inset 0 0 0 1px #b7bcc8, inset 0 0 0 3px rgba(242, 244, 249, 0.15);
-}
-.color-bar-legend-entry:hover {
- box-shadow: none;
- filter: contrast(120%) brightness(90%);
-}
-.color-bar-legend-entry:hover[data-muted=true] {
- opacity: 0.6;
-}
-.color-bar-legend-entry.bg-gradient-light-gray:hover, .color-bar-legend-entry:hover .bg-light-gray {
- box-shadow: inset 0 0 0 1px #b7bcc8, inset 0 0 0 3px rgba(242, 244, 249, 0.15);
- filter: none;
-}
-
-.layered-graph .connection-line {
- stroke: #dae0ee;
- fill: #dae0ee;
- stroke-width: 1;
-}
-.layered-graph .node-label, .layered-graph .node-detail {
- fill: #ffffff;
- font-family: "LiveDashboardFont", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- text-anchor: middle;
-}
-.layered-graph .card-body {
- overflow-x: auto;
-}
-
-.resource-usage-total {
- background-color: #f2f4f9;
- color: #71747c;
-}
-.resource-usage-total-value {
- color: #555b68;
-}
-
-.tabular-info .tabular-info-not-exists {
- border-radius: 6px;
- color: white;
- background-color: #9498a2;
- padding: 1rem 1.5rem;
-}
-.tabular-info .tabular-info-table td:empty::after, .tabular-info .tabular-info-table pre:empty::after {
- font-family: "LiveDashboardFont", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- content: "---";
- opacity: 0.5;
- font-size: 1rem;
-}
-.tabular-info .tabular-info-table td:first-child {
- font-weight: 700;
-}
-.tabular-info .tabular-info-table td:last-child {
- width: 70%;
-}
-
-/* Apps */
-/* ETS */
-/* Ports */
-/* Processes */
-/* Sockets */
-/* LiveView specific classes for your customizations */
-.phx-click-loading {
- opacity: 0.5;
- transition: opacity 1s ease-out;
-}
-
-.phx-disconnected {
- cursor: wait;
-}
-
-.phx-disconnected * {
- pointer-events: none;
-}
+ */:root{--blue: #007bff;--indigo: #6610f2;--purple: #6f42c1;--pink: #e83e8c;--red: #dc3545;--orange: #fd7e14;--yellow: #ffc107;--green: #28a745;--teal: #20c997;--cyan: #17a2b8;--white: #fff;--gray: #6c757d;--gray-dark: #343a40;--primary: #4575cf;--secondary: #6c757d;--success: #28a745;--info: #17a2b8;--warning: #ffc107;--danger: #dc3545;--light: #f8f9fa;--dark: #343a40;--breakpoint-xs: 0;--breakpoint-sm: 576px;--breakpoint-md: 768px;--breakpoint-lg: 992px;--breakpoint-xl: 1200px;--breakpoint-xxl: 1600px;--breakpoint-xxxl: 2600px;--font-family-sans-serif: "LiveDashboardFont", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*,*::before,*::after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:"LiveDashboardFont",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0 !important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:#4575cf;text-decoration:none;background-color:rgba(0,0,0,0)}a:hover{color:#29529f;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:rgba(85,91,104,.5);text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{padding:0;border-style:none}input[type=radio],input[type=checkbox]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}h1,.h1{font-size:2.5rem}h2,.h2{font-size:2rem}h3,.h3{font-size:1.75rem}h4,.h4{font-size:1.5rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}small,.small{font-size:0.875em;font-weight:400}mark,.mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:6px;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-xxxl,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{width:100%;padding-right:12px;padding-left:12px;margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1600px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1300px}}@media(min-width: 2600px){.container-xxxl,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1500px}}.row{display:flex;flex-wrap:wrap;margin-right:-12px;margin-left:-12px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col-xxxl,.col-xxxl-auto,.col-xxxl-12,.col-xxxl-11,.col-xxxl-10,.col-xxxl-9,.col-xxxl-8,.col-xxxl-7,.col-xxxl-6,.col-xxxl-5,.col-xxxl-4,.col-xxxl-3,.col-xxxl-2,.col-xxxl-1,.col-xxl,.col-xxl-auto,.col-xxl-12,.col-xxl-11,.col-xxl-10,.col-xxl-9,.col-xxl-8,.col-xxl-7,.col-xxl-6,.col-xxl-5,.col-xxl-4,.col-xxl-3,.col-xxl-2,.col-xxl-1,.col-xl,.col-xl-auto,.col-xl-12,.col-xl-11,.col-xl-10,.col-xl-9,.col-xl-8,.col-xl-7,.col-xl-6,.col-xl-5,.col-xl-4,.col-xl-3,.col-xl-2,.col-xl-1,.col-lg,.col-lg-auto,.col-lg-12,.col-lg-11,.col-lg-10,.col-lg-9,.col-lg-8,.col-lg-7,.col-lg-6,.col-lg-5,.col-lg-4,.col-lg-3,.col-lg-2,.col-lg-1,.col-md,.col-md-auto,.col-md-12,.col-md-11,.col-md-10,.col-md-9,.col-md-8,.col-md-7,.col-md-6,.col-md-5,.col-md-4,.col-md-3,.col-md-2,.col-md-1,.col-sm,.col-sm-auto,.col-sm-12,.col-sm-11,.col-sm-10,.col-sm-9,.col-sm-8,.col-sm-7,.col-sm-6,.col-sm-5,.col-sm-4,.col-sm-3,.col-sm-2,.col-sm-1,.col,.col-auto,.col-12,.col-11,.col-10,.col-9,.col-8,.col-7,.col-6,.col-5,.col-4,.col-3,.col-2,.col-1{position:relative;width:100%;padding-right:12px;padding-left:12px}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media(min-width: 576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media(min-width: 768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media(min-width: 992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media(min-width: 1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}@media(min-width: 1600px){.col-xxl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xxl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xxl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xxl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xxl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xxl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xxl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xxl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xxl-3{flex:0 0 25%;max-width:25%}.col-xxl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xxl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-xxl-6{flex:0 0 50%;max-width:50%}.col-xxl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xxl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xxl-9{flex:0 0 75%;max-width:75%}.col-xxl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xxl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xxl-12{flex:0 0 100%;max-width:100%}.order-xxl-first{order:-1}.order-xxl-last{order:13}.order-xxl-0{order:0}.order-xxl-1{order:1}.order-xxl-2{order:2}.order-xxl-3{order:3}.order-xxl-4{order:4}.order-xxl-5{order:5}.order-xxl-6{order:6}.order-xxl-7{order:7}.order-xxl-8{order:8}.order-xxl-9{order:9}.order-xxl-10{order:10}.order-xxl-11{order:11}.order-xxl-12{order:12}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}}@media(min-width: 2600px){.col-xxxl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xxxl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xxxl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xxxl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xxxl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xxxl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xxxl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xxxl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xxxl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xxxl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xxxl-3{flex:0 0 25%;max-width:25%}.col-xxxl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xxxl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-xxxl-6{flex:0 0 50%;max-width:50%}.col-xxxl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xxxl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xxxl-9{flex:0 0 75%;max-width:75%}.col-xxxl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xxxl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xxxl-12{flex:0 0 100%;max-width:100%}.order-xxxl-first{order:-1}.order-xxxl-last{order:13}.order-xxxl-0{order:0}.order-xxxl-1{order:1}.order-xxxl-2{order:2}.order-xxxl-3{order:3}.order-xxxl-4{order:4}.order-xxxl-5{order:5}.order-xxxl-6{order:6}.order-xxxl-7{order:7}.order-xxxl-8{order:8}.order-xxxl-9{order:9}.order-xxxl-10{order:10}.order-xxxl-11{order:11}.order-xxxl-12{order:12}.offset-xxxl-0{margin-left:0}.offset-xxxl-1{margin-left:8.33333333%}.offset-xxxl-2{margin-left:16.66666667%}.offset-xxxl-3{margin-left:25%}.offset-xxxl-4{margin-left:33.33333333%}.offset-xxxl-5{margin-left:41.66666667%}.offset-xxxl-6{margin-left:50%}.offset-xxxl-7{margin-left:58.33333333%}.offset-xxxl-8{margin-left:66.66666667%}.offset-xxxl-9{margin-left:75%}.offset-xxxl-10{margin-left:83.33333333%}.offset-xxxl-11{margin-left:91.66666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table th,.table td{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm th,.table-sm td{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered th,.table-bordered td{border:1px solid #dee2e6}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-borderless th,.table-borderless td,.table-borderless thead th,.table-borderless tbody+tbody{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#cbd8f2}.table-primary th,.table-primary td,.table-primary thead th,.table-primary tbody+tbody{border-color:#9eb7e6}.table-hover .table-primary:hover{background-color:#b7c9ed}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b7c9ed}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#d6d8db}.table-secondary th,.table-secondary td,.table-secondary thead th,.table-secondary tbody+tbody{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>th,.table-success>td{background-color:#c3e6cb}.table-success th,.table-success td,.table-success thead th,.table-success tbody+tbody{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>th,.table-info>td{background-color:#bee5eb}.table-info th,.table-info td,.table-info thead th,.table-info tbody+tbody{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>th,.table-warning>td{background-color:#ffeeba}.table-warning th,.table-warning td,.table-warning thead th,.table-warning tbody+tbody{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>th,.table-danger>td{background-color:#f5c6cb}.table-danger th,.table-danger td,.table-danger thead th,.table-danger tbody+tbody{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>th,.table-light>td{background-color:#fdfdfe}.table-light th,.table-light td,.table-light thead th,.table-light tbody+tbody{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>th,.table-dark>td{background-color:#c6c8ca}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark th,.table-dark td,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media(max-width: 575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media(max-width: 767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media(max-width: 991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media(max-width: 1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}@media(max-width: 1599.98px){.table-responsive-xxl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xxl>.table-bordered{border:0}}@media(max-width: 2599.98px){.table-responsive-xxxl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xxxl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + 0.75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:6px;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:rgba(0,0,0,0);border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#aac0e9;outline:0;box-shadow:0 0 0 .2rem rgba(69,117,207,.25)}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{appearance:none}select.form-control:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #495057}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + 0.5rem + 2px);padding:.25rem .5rem;font-size:0.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[size],select.form-control[multiple]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{color:rgba(85,91,104,.5)}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#28a745}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:6px}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#28a745;padding-right:calc(1.5em + 0.75rem) !important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{padding-right:3rem !important;background-position:right 1.5rem center}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#28a745;padding-right:calc(0.75em + 2.3125rem) !important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat}.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#28a745}.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip,.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip{display:block}.was-validated .custom-control-input:valid~.custom-control-label,.custom-control-input.is-valid~.custom-control-label{color:#28a745}.was-validated .custom-control-input:valid~.custom-control-label::before,.custom-control-input.is-valid~.custom-control-label::before{border-color:#28a745}.was-validated .custom-control-input:valid:checked~.custom-control-label::before,.custom-control-input.is-valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.was-validated .custom-control-input:valid:focus~.custom-control-label::before,.custom-control-input.is-valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before,.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.was-validated .custom-file-input:valid~.custom-file-label,.custom-file-input.is-valid~.custom-file-label{border-color:#28a745}.was-validated .custom-file-input:valid:focus~.custom-file-label,.custom-file-input.is-valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:6px}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#dc3545;padding-right:calc(1.5em + 0.75rem) !important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{padding-right:3rem !important;background-position:right 1.5rem center}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#dc3545;padding-right:calc(0.75em + 2.3125rem) !important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat}.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#dc3545}.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip,.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip{display:block}.was-validated .custom-control-input:invalid~.custom-control-label,.custom-control-input.is-invalid~.custom-control-label{color:#dc3545}.was-validated .custom-control-input:invalid~.custom-control-label::before,.custom-control-input.is-invalid~.custom-control-label::before{border-color:#dc3545}.was-validated .custom-control-input:invalid:checked~.custom-control-label::before,.custom-control-input.is-invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.was-validated .custom-control-input:invalid:focus~.custom-control-label::before,.custom-control-input.is-invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before,.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.was-validated .custom-file-input:invalid~.custom-file-label,.custom-file-input.is-invalid~.custom-file-label{border-color:#dc3545}.was-validated .custom-file-input:invalid:focus~.custom-file-label,.custom-file-input.is-invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media(min-width: 576px){.form-inline label{display:flex;align-items:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:flex;flex:0 0 auto;flex-flow:row wrap;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group,.form-inline .custom-select{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;user-select:none;background-color:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:3px;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn:focus,.btn.focus{outline:0;box-shadow:0 0 0 .2rem rgba(69,117,207,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#4575cf;border-color:#4575cf}.btn-primary:hover{color:#fff;background-color:#3162bd;border-color:#2e5cb3}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#3162bd;border-color:#2e5cb3;box-shadow:0 0 0 .2rem rgba(97,138,214,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#4575cf;border-color:#4575cf}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#2e5cb3;border-color:#2c57a9}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(97,138,214,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary:focus,.btn-secondary.focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning:focus,.btn-warning.focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light:focus,.btn-light.focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark:focus,.btn-dark.focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#4575cf;border-color:#4575cf}.btn-outline-primary:hover{color:#fff;background-color:#4575cf;border-color:#4575cf}.btn-outline-primary:focus,.btn-outline-primary.focus{box-shadow:0 0 0 .2rem rgba(69,117,207,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#4575cf;background-color:rgba(0,0,0,0)}.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#4575cf;border-color:#4575cf}.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(69,117,207,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:focus,.btn-outline-secondary.focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:rgba(0,0,0,0)}.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:focus,.btn-outline-success.focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:rgba(0,0,0,0)}.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:focus,.btn-outline-info.focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:rgba(0,0,0,0)}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:focus,.btn-outline-warning.focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:rgba(0,0,0,0)}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:focus,.btn-outline-danger.focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:rgba(0,0,0,0)}.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:focus,.btn-outline-light.focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:rgba(0,0,0,0)}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:focus,.btn-outline-dark.focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:rgba(0,0,0,0)}.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#4575cf;text-decoration:none}.btn-link:hover{color:#29529f;text-decoration:underline}.btn-link:focus,.btn-link.focus{text-decoration:underline}.btn-link:disabled,.btn-link.disabled{color:#6c757d;pointer-events:none}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.width{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.width{transition:none}}.dropup,.dropright,.dropdown,.dropleft{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:6px}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}@media(min-width: 1600px){.dropdown-menu-xxl-left{right:auto;left:0}.dropdown-menu-xxl-right{right:0;left:auto}}@media(min-width: 2600px){.dropdown-menu-xxxl-left{right:auto;left:0}.dropdown-menu-xxxl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=top],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:rgba(0,0,0,0);border:0}.dropdown-item:hover,.dropdown-item:focus{color:#16181b;text-decoration:none;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#4575cf}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:0.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:1}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-control-plaintext,.input-group>.custom-select,.input-group>.custom-file{position:relative;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.form-control+.form-control,.input-group>.form-control+.custom-select,.input-group>.form-control+.custom-file,.input-group>.form-control-plaintext+.form-control,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.custom-file,.input-group>.custom-select+.form-control,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.custom-file,.input-group>.custom-file+.form-control,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.custom-file{margin-left:-1px}.input-group>.form-control:focus,.input-group>.custom-select:focus,.input-group>.custom-file .custom-file-input:focus~.custom-file-label{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.form-control:not(:first-child),.input-group>.custom-select:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group:not(.has-validation)>.form-control:not(:last-child),.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-prepend,.input-group-append{display:flex}.input-group-prepend .btn,.input-group-append .btn{position:relative;z-index:2}.input-group-prepend .btn:focus,.input-group-append .btn:focus{z-index:3}.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:6px}.input-group-text input[type=radio],.input-group-text input[type=checkbox]{margin-top:0}.input-group-lg>.form-control:not(textarea),.input-group-lg>.custom-select{height:calc(1.5em + 1rem + 2px)}.input-group-lg>.form-control,.input-group-lg>.custom-select,.input-group-lg>.input-group-prepend>.input-group-text,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-append>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.form-control:not(textarea),.input-group-sm>.custom-select{height:calc(1.5em + 0.5rem + 2px)}.input-group-sm>.form-control,.input-group-sm>.custom-select,.input-group-sm>.input-group-prepend>.input-group-text,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-append>.btn{padding:.25rem .5rem;font-size:0.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;print-color-adjust:exact}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#4575cf;background-color:#4575cf}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(69,117,207,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#aac0e9}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#d3def4;border-color:#d3def4}.custom-control-input[disabled]~.custom-control-label,.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input[disabled]~.custom-control-label::before,.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:1px solid #adb5bd}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label::before{border-radius:6px}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#4575cf;background-color:#4575cf}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(69,117,207,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(69,117,207,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(69,117,207,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(0.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;transform:translateX(0.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(69,117,207,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + 0.75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:6px;appearance:none}.custom-select:focus{border-color:#aac0e9;outline:0;box-shadow:0 0 0 .2rem rgba(69,117,207,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + 0.5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + 0.75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + 0.75rem + 2px);margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#aac0e9;box-shadow:0 0 0 .2rem rgba(69,117,207,.25)}.custom-file-input[disabled]~.custom-file-label,.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + 0.75rem + 2px);padding:.375rem .75rem;overflow:hidden;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:6px}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + 0.75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 6px 6px 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:rgba(0,0,0,0);appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(69,117,207,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(69,117,207,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(69,117,207,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;background-color:#4575cf;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#d3def4}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#dee2e6;border-color:rgba(0,0,0,0);border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#4575cf;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#d3def4}.custom-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#dee2e6;border-color:rgba(0,0,0,0);border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#4575cf;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#d3def4}.custom-range::-ms-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0);border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:hover,.nav-link:focus{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background-color:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);border-top-left-radius:6px;border-top-right-radius:6px}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:none;border:0;border-radius:6px}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#756f9a}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-sm,.navbar .container-md,.navbar .container-lg,.navbar .container-xl,.navbar .container-xxl,.navbar .container-xxxl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);border-radius:3px}.navbar-toggler:hover,.navbar-toggler:focus{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media(max-width: 575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl,.navbar-expand-sm>.container-xxl,.navbar-expand-sm>.container-xxxl{padding-right:0;padding-left:0}}@media(min-width: 576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl,.navbar-expand-sm>.container-xxl,.navbar-expand-sm>.container-xxxl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media(max-width: 767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl,.navbar-expand-md>.container-xxl,.navbar-expand-md>.container-xxxl{padding-right:0;padding-left:0}}@media(min-width: 768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl,.navbar-expand-md>.container-xxl,.navbar-expand-md>.container-xxxl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media(max-width: 991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl,.navbar-expand-lg>.container-xxl,.navbar-expand-lg>.container-xxxl{padding-right:0;padding-left:0}}@media(min-width: 992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl,.navbar-expand-lg>.container-xxl,.navbar-expand-lg>.container-xxxl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media(max-width: 1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl,.navbar-expand-xl>.container-xxl,.navbar-expand-xl>.container-xxxl{padding-right:0;padding-left:0}}@media(min-width: 1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl,.navbar-expand-xl>.container-xxl,.navbar-expand-xl>.container-xxxl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}@media(max-width: 1599.98px){.navbar-expand-xxl>.container,.navbar-expand-xxl>.container-fluid,.navbar-expand-xxl>.container-sm,.navbar-expand-xxl>.container-md,.navbar-expand-xxl>.container-lg,.navbar-expand-xxl>.container-xl,.navbar-expand-xxl>.container-xxl,.navbar-expand-xxl>.container-xxxl{padding-right:0;padding-left:0}}@media(min-width: 1600px){.navbar-expand-xxl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl>.container,.navbar-expand-xxl>.container-fluid,.navbar-expand-xxl>.container-sm,.navbar-expand-xxl>.container-md,.navbar-expand-xxl>.container-lg,.navbar-expand-xxl>.container-xl,.navbar-expand-xxl>.container-xxl,.navbar-expand-xxl>.container-xxxl{flex-wrap:nowrap}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}}@media(max-width: 2599.98px){.navbar-expand-xxxl>.container,.navbar-expand-xxxl>.container-fluid,.navbar-expand-xxxl>.container-sm,.navbar-expand-xxxl>.container-md,.navbar-expand-xxxl>.container-lg,.navbar-expand-xxxl>.container-xl,.navbar-expand-xxxl>.container-xxl,.navbar-expand-xxxl>.container-xxxl{padding-right:0;padding-left:0}}@media(min-width: 2600px){.navbar-expand-xxxl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xxxl .navbar-nav{flex-direction:row}.navbar-expand-xxxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxxl>.container,.navbar-expand-xxxl>.container-fluid,.navbar-expand-xxxl>.container-sm,.navbar-expand-xxxl>.container-md,.navbar-expand-xxxl>.container-lg,.navbar-expand-xxxl>.container-xl,.navbar-expand-xxxl>.container-xxl,.navbar-expand-xxxl>.container-xxxl{flex-wrap:nowrap}.navbar-expand-xxxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxxl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xxxl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl,.navbar-expand>.container-xxl,.navbar-expand>.container-xxxl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl,.navbar-expand>.container-xxl,.navbar-expand>.container-xxxl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:6px}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:5px;border-top-right-radius:5px}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:5px;border-bottom-left-radius:5px}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-0.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:5px 5px 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 5px 5px}.card-header-tabs{margin-right:-0.625rem;margin-bottom:-0.75rem;margin-left:-0.625rem;border-bottom:0}.card-header-pills{margin-right:-0.625rem;margin-left:-0.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:5px}.card-img,.card-img-top,.card-img-bottom{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:5px;border-top-right-radius:5px}.card-img,.card-img-bottom{border-bottom-right-radius:5px;border-bottom-left-radius:5px}.card-deck .card{margin-bottom:12px}@media(min-width: 576px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-12px;margin-left:-12px}.card-deck .card{flex:1 0 0%;margin-right:12px;margin-bottom:0;margin-left:12px}}.card-group>.card{margin-bottom:12px}@media(min-width: 576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media(min-width: 576px){.card-columns{column-count:3;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:6px}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none;border-radius:6px}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#4575cf;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#29529f;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(69,117,207,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:6px;border-bottom-left-radius:6px}.page-item:last-child .page-link{border-top-right-radius:6px;border-bottom-right-radius:6px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#4575cf;border-color:#4575cf}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:0.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:3px;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.badge{transition:none}}a.badge:hover,a.badge:focus{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#4575cf}a.badge-primary:hover,a.badge-primary:focus{color:#fff;background-color:#2e5cb3}a.badge-primary:focus,a.badge-primary.focus{outline:0;box-shadow:0 0 0 .2rem rgba(69,117,207,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:hover,a.badge-secondary:focus{color:#fff;background-color:#545b62}a.badge-secondary:focus,a.badge-secondary.focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:hover,a.badge-success:focus{color:#fff;background-color:#1e7e34}a.badge-success:focus,a.badge-success.focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:hover,a.badge-info:focus{color:#fff;background-color:#117a8b}a.badge-info:focus,a.badge-info.focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:hover,a.badge-warning:focus{color:#212529;background-color:#d39e00}a.badge-warning:focus,a.badge-warning.focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:hover,a.badge-danger:focus{color:#fff;background-color:#bd2130}a.badge-danger:focus,a.badge-danger.focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:hover,a.badge-light:focus{color:#212529;background-color:#dae0e5}a.badge-light:focus,a.badge-light.focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:hover,a.badge-dark:focus{color:#fff;background-color:#1d2124}a.badge-dark:focus,a.badge-dark.focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media(min-width: 576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid rgba(0,0,0,0);border-radius:6px}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#243d6c;background-color:#dae3f5;border-color:#cbd8f2}.alert-primary hr{border-top-color:#b7c9ed}.alert-primary .alert-link{color:#172746}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:flex;height:1rem;overflow:hidden;line-height:0;font-size:0.75rem;background-color:#e9ecef;border-radius:6px}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#4575cf;transition:width .6s ease}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:6px}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#4575cf;border-color:#4575cf}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:6px;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:6px;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:6px;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:6px;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:6px;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:6px;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:6px;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:6px;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:6px;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:6px;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 1600px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:6px;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:6px;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 2600px){.list-group-horizontal-xxxl{flex-direction:row}.list-group-horizontal-xxxl>.list-group-item:first-child{border-bottom-left-radius:6px;border-top-right-radius:0}.list-group-horizontal-xxxl>.list-group-item:last-child{border-top-right-radius:6px;border-bottom-left-radius:0}.list-group-horizontal-xxxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#243d6c;background-color:#cbd8f2}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#243d6c;background-color:#b7c9ed}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#243d6c;border-color:#243d6c}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):hover,.close:not(:disabled):not(.disabled):focus{opacity:.75}button.close{padding:0;background-color:rgba(0,0,0,0);border:0}a.close.disabled{pointer-events:none}.toast{flex-basis:350px;max-width:350px;font-size:0.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-header,.modal-dialog-scrollable .modal-footer{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(0.3rem - 1px);border-top-right-radius:calc(0.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(0.3rem - 1px);border-bottom-left-radius:calc(0.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media(min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:min-content}.modal-sm{max-width:300px}}@media(min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media(min-width: 1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:"LiveDashboardFont",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[x-placement^=top]{padding:.4rem 0}.bs-tooltip-top .arrow,.bs-tooltip-auto[x-placement^=top] .arrow{bottom:0}.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^=top] .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-right,.bs-tooltip-auto[x-placement^=right]{padding:0 .4rem}.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^=right] .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^=right] .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^=bottom]{padding:.4rem 0}.bs-tooltip-bottom .arrow,.bs-tooltip-auto[x-placement^=bottom] .arrow{top:0}.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^=bottom] .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-left,.bs-tooltip-auto[x-placement^=left]{padding:0 .4rem}.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^=left] .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^=left] .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:6px}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:"LiveDashboardFont",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-popover-top,.bs-popover-auto[x-placement^=top]{margin-bottom:.5rem}.bs-popover-top>.arrow,.bs-popover-auto[x-placement^=top]>.arrow{bottom:calc(-0.5rem - 1px)}.bs-popover-top>.arrow::before,.bs-popover-auto[x-placement^=top]>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-top>.arrow::after,.bs-popover-auto[x-placement^=top]>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-right,.bs-popover-auto[x-placement^=right]{margin-left:.5rem}.bs-popover-right>.arrow,.bs-popover-auto[x-placement^=right]>.arrow{left:calc(-0.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-right>.arrow::before,.bs-popover-auto[x-placement^=right]>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-right>.arrow::after,.bs-popover-auto[x-placement^=right]>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-bottom,.bs-popover-auto[x-placement^=bottom]{margin-top:.5rem}.bs-popover-bottom>.arrow,.bs-popover-auto[x-placement^=bottom]>.arrow{top:calc(-0.5rem - 1px)}.bs-popover-bottom>.arrow::before,.bs-popover-auto[x-placement^=bottom]>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-bottom>.arrow::after,.bs-popover-auto[x-placement^=bottom]>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[x-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-0.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-left,.bs-popover-auto[x-placement^=left]{margin-right:.5rem}.bs-popover-left>.arrow,.bs-popover-auto[x-placement^=left]>.arrow{right:calc(-0.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-left>.arrow::before,.bs-popover-auto[x-placement^=left]>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-left>.arrow::after,.bs-popover-auto[x-placement^=left]>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(0.3rem - 1px);border-top-right-radius:calc(0.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-left),.active.carousel-item-right{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-right),.active.carousel-item-left{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-0.125em;border:.25em solid currentcolor;border-right-color:rgba(0,0,0,0);border-radius:50%;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-0.125em;background-color:currentcolor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.bg-primary{background-color:#4575cf !important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#2e5cb3 !important}.bg-secondary{background-color:#6c757d !important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#545b62 !important}.bg-success{background-color:#28a745 !important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#1e7e34 !important}.bg-info{background-color:#17a2b8 !important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#117a8b !important}.bg-warning{background-color:#ffc107 !important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#d39e00 !important}.bg-danger{background-color:#dc3545 !important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#bd2130 !important}.bg-light{background-color:#f8f9fa !important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#dae0e5 !important}.bg-dark{background-color:#343a40 !important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#1d2124 !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:rgba(0,0,0,0) !important}.border{border:1px solid #dee2e6 !important}.border-top{border-top:1px solid #dee2e6 !important}.border-right{border-right:1px solid #dee2e6 !important}.border-bottom{border-bottom:1px solid #dee2e6 !important}.border-left{border-left:1px solid #dee2e6 !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.border-primary{border-color:#4575cf !important}.border-secondary{border-color:#6c757d !important}.border-success{border-color:#28a745 !important}.border-info{border-color:#17a2b8 !important}.border-warning{border-color:#ffc107 !important}.border-danger{border-color:#dc3545 !important}.border-light{border-color:#f8f9fa !important}.border-dark{border-color:#343a40 !important}.border-white{border-color:#fff !important}.rounded-sm{border-radius:.2rem !important}.rounded{border-radius:6px !important}.rounded-top{border-top-left-radius:6px !important;border-top-right-radius:6px !important}.rounded-right{border-top-right-radius:6px !important;border-bottom-right-radius:6px !important}.rounded-bottom{border-bottom-right-radius:6px !important;border-bottom-left-radius:6px !important}.rounded-left{border-top-left-radius:6px !important;border-bottom-left-radius:6px !important}.rounded-lg{border-radius:.3rem !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:50rem !important}.rounded-0{border-radius:0 !important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}@media(min-width: 576px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}}@media(min-width: 768px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}}@media(min-width: 992px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}}@media(min-width: 1200px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}}@media(min-width: 1600px){.d-xxl-none{display:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}}@media(min-width: 2600px){.d-xxxl-none{display:none !important}.d-xxxl-inline{display:inline !important}.d-xxxl-inline-block{display:inline-block !important}.d-xxxl-block{display:block !important}.d-xxxl-table{display:table !important}.d-xxxl-table-row{display:table-row !important}.d-xxxl-table-cell{display:table-cell !important}.d-xxxl-flex{display:flex !important}.d-xxxl-inline-flex{display:inline-flex !important}}@media print{.d-print-none{display:none !important}.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.85714286%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-fill{flex:1 1 auto !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}@media(min-width: 576px){.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}}@media(min-width: 768px){.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}}@media(min-width: 992px){.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}}@media(min-width: 1200px){.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}}@media(min-width: 1600px){.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}}@media(min-width: 2600px){.flex-xxxl-row{flex-direction:row !important}.flex-xxxl-column{flex-direction:column !important}.flex-xxxl-row-reverse{flex-direction:row-reverse !important}.flex-xxxl-column-reverse{flex-direction:column-reverse !important}.flex-xxxl-wrap{flex-wrap:wrap !important}.flex-xxxl-nowrap{flex-wrap:nowrap !important}.flex-xxxl-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-xxxl-fill{flex:1 1 auto !important}.flex-xxxl-grow-0{flex-grow:0 !important}.flex-xxxl-grow-1{flex-grow:1 !important}.flex-xxxl-shrink-0{flex-shrink:0 !important}.flex-xxxl-shrink-1{flex-shrink:1 !important}.justify-content-xxxl-start{justify-content:flex-start !important}.justify-content-xxxl-end{justify-content:flex-end !important}.justify-content-xxxl-center{justify-content:center !important}.justify-content-xxxl-between{justify-content:space-between !important}.justify-content-xxxl-around{justify-content:space-around !important}.align-items-xxxl-start{align-items:flex-start !important}.align-items-xxxl-end{align-items:flex-end !important}.align-items-xxxl-center{align-items:center !important}.align-items-xxxl-baseline{align-items:baseline !important}.align-items-xxxl-stretch{align-items:stretch !important}.align-content-xxxl-start{align-content:flex-start !important}.align-content-xxxl-end{align-content:flex-end !important}.align-content-xxxl-center{align-content:center !important}.align-content-xxxl-between{align-content:space-between !important}.align-content-xxxl-around{align-content:space-around !important}.align-content-xxxl-stretch{align-content:stretch !important}.align-self-xxxl-auto{align-self:auto !important}.align-self-xxxl-start{align-self:flex-start !important}.align-self-xxxl-end{align-self:flex-end !important}.align-self-xxxl-center{align-self:center !important}.align-self-xxxl-baseline{align-self:baseline !important}.align-self-xxxl-stretch{align-self:stretch !important}}.float-left{float:left !important}.float-right{float:right !important}.float-none{float:none !important}@media(min-width: 576px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media(min-width: 768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media(min-width: 992px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media(min-width: 1200px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}@media(min-width: 1600px){.float-xxl-left{float:left !important}.float-xxl-right{float:right !important}.float-xxl-none{float:none !important}}@media(min-width: 2600px){.float-xxxl-left{float:left !important}.float-xxxl-right{float:right !important}.float-xxxl-none{float:none !important}}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports(position: sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow{box-shadow:0 2px 5px rgba(201,209,230,.5),0 7px 20px rgba(201,209,230,.75) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.w-25{width:25% !important}.w-50,.ports-table-name{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mw-100{max-width:100% !important}.mh-100{max-height:100% !important}.min-vw-100{min-width:100vw !important}.min-vh-100{min-height:100vh !important}.vw-100{width:100vw !important}.vh-100{height:100vh !important}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:.25rem !important}.mt-1,.my-1{margin-top:.25rem !important}.mr-1,.mx-1{margin-right:.25rem !important}.mb-1,.my-1{margin-bottom:.25rem !important}.ml-1,.mx-1{margin-left:.25rem !important}.m-2{margin:.5rem !important}.mt-2,.my-2{margin-top:.5rem !important}.mr-2,.mx-2{margin-right:.5rem !important}.mb-2,.my-2{margin-bottom:.5rem !important}.ml-2,.mx-2{margin-left:.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:.25rem !important}.pt-1,.py-1{padding-top:.25rem !important}.pr-1,.px-1{padding-right:.25rem !important}.pb-1,.py-1{padding-bottom:.25rem !important}.pl-1,.px-1{padding-left:.25rem !important}.p-2{padding:.5rem !important}.pt-2,.py-2{padding-top:.5rem !important}.pr-2,.px-2{padding-right:.5rem !important}.pb-2,.py-2{padding-bottom:.5rem !important}.pl-2,.px-2{padding-left:.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.sockets-table-send_oct,.sockets-table-recv_oct,.ports-table-output,.px-4,.apps-table-version{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,tr>:first-child,.px-4,.apps-table-version{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.m-n1{margin:-0.25rem !important}.mt-n1,.my-n1{margin-top:-0.25rem !important}.mr-n1,.mx-n1{margin-right:-0.25rem !important}.mb-n1,.my-n1{margin-bottom:-0.25rem !important}.ml-n1,.mx-n1{margin-left:-0.25rem !important}.m-n2{margin:-0.5rem !important}.mt-n2,.my-n2{margin-top:-0.5rem !important}.mr-n2,.mx-n2{margin-right:-0.5rem !important}.mb-n2,.my-n2{margin-bottom:-0.5rem !important}.ml-n2,.mx-n2{margin-left:-0.5rem !important}.m-n3{margin:-1rem !important}.mt-n3,.my-n3{margin-top:-1rem !important}.mr-n3,.mx-n3{margin-right:-1rem !important}.mb-n3,.my-n3{margin-bottom:-1rem !important}.ml-n3,.mx-n3{margin-left:-1rem !important}.m-n4{margin:-1.5rem !important}.mt-n4,.my-n4{margin-top:-1.5rem !important}.mr-n4,.mx-n4{margin-right:-1.5rem !important}.mb-n4,.my-n4{margin-bottom:-1.5rem !important}.ml-n4,.mx-n4{margin-left:-1.5rem !important}.m-n5{margin:-3rem !important}.mt-n5,.my-n5{margin-top:-3rem !important}.mr-n5,.mx-n5{margin-right:-3rem !important}.mb-n5,.my-n5{margin-bottom:-3rem !important}.ml-n5,.mx-n5{margin-left:-3rem !important}.m-auto{margin:auto !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}@media(min-width: 576px){.m-sm-0{margin:0 !important}.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.m-sm-1{margin:.25rem !important}.mt-sm-1,.my-sm-1{margin-top:.25rem !important}.mr-sm-1,.mx-sm-1{margin-right:.25rem !important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem !important}.ml-sm-1,.mx-sm-1{margin-left:.25rem !important}.m-sm-2{margin:.5rem !important}.mt-sm-2,.my-sm-2{margin-top:.5rem !important}.mr-sm-2,.mx-sm-2{margin-right:.5rem !important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem !important}.ml-sm-2,.mx-sm-2{margin-left:.5rem !important}.m-sm-3{margin:1rem !important}.mt-sm-3,.my-sm-3{margin-top:1rem !important}.mr-sm-3,.mx-sm-3{margin-right:1rem !important}.mb-sm-3,.my-sm-3{margin-bottom:1rem !important}.ml-sm-3,.mx-sm-3{margin-left:1rem !important}.m-sm-4{margin:1.5rem !important}.mt-sm-4,.my-sm-4{margin-top:1.5rem !important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem !important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem !important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem !important}.m-sm-5{margin:3rem !important}.mt-sm-5,.my-sm-5{margin-top:3rem !important}.mr-sm-5,.mx-sm-5{margin-right:3rem !important}.mb-sm-5,.my-sm-5{margin-bottom:3rem !important}.ml-sm-5,.mx-sm-5{margin-left:3rem !important}.p-sm-0{padding:0 !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.p-sm-1{padding:.25rem !important}.pt-sm-1,.py-sm-1{padding-top:.25rem !important}.pr-sm-1,.px-sm-1{padding-right:.25rem !important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem !important}.pl-sm-1,.px-sm-1{padding-left:.25rem !important}.p-sm-2{padding:.5rem !important}.pt-sm-2,.py-sm-2{padding-top:.5rem !important}.pr-sm-2,.px-sm-2{padding-right:.5rem !important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem !important}.pl-sm-2,.px-sm-2{padding-left:.5rem !important}.p-sm-3{padding:1rem !important}.pt-sm-3,.py-sm-3{padding-top:1rem !important}.pr-sm-3,.px-sm-3{padding-right:1rem !important}.pb-sm-3,.py-sm-3{padding-bottom:1rem !important}.pl-sm-3,.px-sm-3{padding-left:1rem !important}.p-sm-4{padding:1.5rem !important}.pt-sm-4,.py-sm-4{padding-top:1.5rem !important}.pr-sm-4,.px-sm-4{padding-right:1.5rem !important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem !important}.pl-sm-4,.px-sm-4{padding-left:1.5rem !important}.p-sm-5{padding:3rem !important}.pt-sm-5,.py-sm-5{padding-top:3rem !important}.pr-sm-5,.px-sm-5{padding-right:3rem !important}.pb-sm-5,.py-sm-5{padding-bottom:3rem !important}.pl-sm-5,.px-sm-5{padding-left:3rem !important}.m-sm-n1{margin:-0.25rem !important}.mt-sm-n1,.my-sm-n1{margin-top:-0.25rem !important}.mr-sm-n1,.mx-sm-n1{margin-right:-0.25rem !important}.mb-sm-n1,.my-sm-n1{margin-bottom:-0.25rem !important}.ml-sm-n1,.mx-sm-n1{margin-left:-0.25rem !important}.m-sm-n2{margin:-0.5rem !important}.mt-sm-n2,.my-sm-n2{margin-top:-0.5rem !important}.mr-sm-n2,.mx-sm-n2{margin-right:-0.5rem !important}.mb-sm-n2,.my-sm-n2{margin-bottom:-0.5rem !important}.ml-sm-n2,.mx-sm-n2{margin-left:-0.5rem !important}.m-sm-n3{margin:-1rem !important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem !important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem !important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem !important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem !important}.m-sm-n4{margin:-1.5rem !important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem !important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem !important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem !important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem !important}.m-sm-n5{margin:-3rem !important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem !important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem !important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem !important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}}@media(min-width: 768px){.m-md-0{margin:0 !important}.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.m-md-1{margin:.25rem !important}.mt-md-1,.my-md-1{margin-top:.25rem !important}.mr-md-1,.mx-md-1{margin-right:.25rem !important}.mb-md-1,.my-md-1{margin-bottom:.25rem !important}.ml-md-1,.mx-md-1{margin-left:.25rem !important}.m-md-2{margin:.5rem !important}.mt-md-2,.my-md-2{margin-top:.5rem !important}.mr-md-2,.mx-md-2{margin-right:.5rem !important}.mb-md-2,.my-md-2{margin-bottom:.5rem !important}.ml-md-2,.mx-md-2{margin-left:.5rem !important}.m-md-3{margin:1rem !important}.mt-md-3,.my-md-3{margin-top:1rem !important}.mr-md-3,.mx-md-3{margin-right:1rem !important}.mb-md-3,.my-md-3{margin-bottom:1rem !important}.ml-md-3,.mx-md-3{margin-left:1rem !important}.m-md-4{margin:1.5rem !important}.mt-md-4,.my-md-4{margin-top:1.5rem !important}.mr-md-4,.mx-md-4{margin-right:1.5rem !important}.mb-md-4,.my-md-4{margin-bottom:1.5rem !important}.ml-md-4,.mx-md-4{margin-left:1.5rem !important}.m-md-5{margin:3rem !important}.mt-md-5,.my-md-5{margin-top:3rem !important}.mr-md-5,.mx-md-5{margin-right:3rem !important}.mb-md-5,.my-md-5{margin-bottom:3rem !important}.ml-md-5,.mx-md-5{margin-left:3rem !important}.p-md-0{padding:0 !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.p-md-1{padding:.25rem !important}.pt-md-1,.py-md-1{padding-top:.25rem !important}.pr-md-1,.px-md-1{padding-right:.25rem !important}.pb-md-1,.py-md-1{padding-bottom:.25rem !important}.pl-md-1,.px-md-1{padding-left:.25rem !important}.p-md-2{padding:.5rem !important}.pt-md-2,.py-md-2{padding-top:.5rem !important}.pr-md-2,.px-md-2{padding-right:.5rem !important}.pb-md-2,.py-md-2{padding-bottom:.5rem !important}.pl-md-2,.px-md-2{padding-left:.5rem !important}.p-md-3{padding:1rem !important}.pt-md-3,.py-md-3{padding-top:1rem !important}.pr-md-3,.px-md-3{padding-right:1rem !important}.pb-md-3,.py-md-3{padding-bottom:1rem !important}.pl-md-3,.px-md-3{padding-left:1rem !important}.p-md-4{padding:1.5rem !important}.pt-md-4,.py-md-4{padding-top:1.5rem !important}.pr-md-4,.px-md-4{padding-right:1.5rem !important}.pb-md-4,.py-md-4{padding-bottom:1.5rem !important}.pl-md-4,.px-md-4{padding-left:1.5rem !important}.p-md-5{padding:3rem !important}.pt-md-5,.py-md-5{padding-top:3rem !important}.pr-md-5,.px-md-5{padding-right:3rem !important}.pb-md-5,.py-md-5{padding-bottom:3rem !important}.pl-md-5,.px-md-5{padding-left:3rem !important}.m-md-n1{margin:-0.25rem !important}.mt-md-n1,.my-md-n1{margin-top:-0.25rem !important}.mr-md-n1,.mx-md-n1{margin-right:-0.25rem !important}.mb-md-n1,.my-md-n1{margin-bottom:-0.25rem !important}.ml-md-n1,.mx-md-n1{margin-left:-0.25rem !important}.m-md-n2{margin:-0.5rem !important}.mt-md-n2,.my-md-n2{margin-top:-0.5rem !important}.mr-md-n2,.mx-md-n2{margin-right:-0.5rem !important}.mb-md-n2,.my-md-n2{margin-bottom:-0.5rem !important}.ml-md-n2,.mx-md-n2{margin-left:-0.5rem !important}.m-md-n3{margin:-1rem !important}.mt-md-n3,.my-md-n3{margin-top:-1rem !important}.mr-md-n3,.mx-md-n3{margin-right:-1rem !important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem !important}.ml-md-n3,.mx-md-n3{margin-left:-1rem !important}.m-md-n4{margin:-1.5rem !important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem !important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem !important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem !important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem !important}.m-md-n5{margin:-3rem !important}.mt-md-n5,.my-md-n5{margin-top:-3rem !important}.mr-md-n5,.mx-md-n5{margin-right:-3rem !important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem !important}.ml-md-n5,.mx-md-n5{margin-left:-3rem !important}.m-md-auto{margin:auto !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}}@media(min-width: 992px){.m-lg-0{margin:0 !important}.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.m-lg-1{margin:.25rem !important}.mt-lg-1,.my-lg-1{margin-top:.25rem !important}.mr-lg-1,.mx-lg-1{margin-right:.25rem !important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem !important}.ml-lg-1,.mx-lg-1{margin-left:.25rem !important}.m-lg-2{margin:.5rem !important}.mt-lg-2,.my-lg-2{margin-top:.5rem !important}.mr-lg-2,.mx-lg-2{margin-right:.5rem !important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem !important}.ml-lg-2,.mx-lg-2{margin-left:.5rem !important}.m-lg-3{margin:1rem !important}.mt-lg-3,.my-lg-3{margin-top:1rem !important}.mr-lg-3,.mx-lg-3{margin-right:1rem !important}.mb-lg-3,.my-lg-3{margin-bottom:1rem !important}.ml-lg-3,.mx-lg-3{margin-left:1rem !important}.m-lg-4{margin:1.5rem !important}.mt-lg-4,.my-lg-4{margin-top:1.5rem !important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem !important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem !important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem !important}.m-lg-5{margin:3rem !important}.mt-lg-5,.my-lg-5{margin-top:3rem !important}.mr-lg-5,.mx-lg-5{margin-right:3rem !important}.mb-lg-5,.my-lg-5{margin-bottom:3rem !important}.ml-lg-5,.mx-lg-5{margin-left:3rem !important}.p-lg-0{padding:0 !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.p-lg-1{padding:.25rem !important}.pt-lg-1,.py-lg-1{padding-top:.25rem !important}.pr-lg-1,.px-lg-1{padding-right:.25rem !important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem !important}.pl-lg-1,.px-lg-1{padding-left:.25rem !important}.p-lg-2{padding:.5rem !important}.pt-lg-2,.py-lg-2{padding-top:.5rem !important}.pr-lg-2,.px-lg-2{padding-right:.5rem !important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem !important}.pl-lg-2,.px-lg-2{padding-left:.5rem !important}.p-lg-3{padding:1rem !important}.pt-lg-3,.py-lg-3{padding-top:1rem !important}.pr-lg-3,.px-lg-3{padding-right:1rem !important}.pb-lg-3,.py-lg-3{padding-bottom:1rem !important}.pl-lg-3,.px-lg-3{padding-left:1rem !important}.p-lg-4{padding:1.5rem !important}.pt-lg-4,.py-lg-4{padding-top:1.5rem !important}.pr-lg-4,.px-lg-4{padding-right:1.5rem !important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem !important}.pl-lg-4,.px-lg-4{padding-left:1.5rem !important}.p-lg-5{padding:3rem !important}.pt-lg-5,.py-lg-5{padding-top:3rem !important}.pr-lg-5,.px-lg-5{padding-right:3rem !important}.pb-lg-5,.py-lg-5{padding-bottom:3rem !important}.pl-lg-5,.px-lg-5{padding-left:3rem !important}.m-lg-n1{margin:-0.25rem !important}.mt-lg-n1,.my-lg-n1{margin-top:-0.25rem !important}.mr-lg-n1,.mx-lg-n1{margin-right:-0.25rem !important}.mb-lg-n1,.my-lg-n1{margin-bottom:-0.25rem !important}.ml-lg-n1,.mx-lg-n1{margin-left:-0.25rem !important}.m-lg-n2{margin:-0.5rem !important}.mt-lg-n2,.my-lg-n2{margin-top:-0.5rem !important}.mr-lg-n2,.mx-lg-n2{margin-right:-0.5rem !important}.mb-lg-n2,.my-lg-n2{margin-bottom:-0.5rem !important}.ml-lg-n2,.mx-lg-n2{margin-left:-0.5rem !important}.m-lg-n3{margin:-1rem !important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem !important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem !important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem !important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem !important}.m-lg-n4{margin:-1.5rem !important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem !important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem !important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem !important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem !important}.m-lg-n5{margin:-3rem !important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem !important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem !important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem !important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}}@media(min-width: 1200px){.m-xl-0{margin:0 !important}.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.m-xl-1{margin:.25rem !important}.mt-xl-1,.my-xl-1{margin-top:.25rem !important}.mr-xl-1,.mx-xl-1{margin-right:.25rem !important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem !important}.ml-xl-1,.mx-xl-1{margin-left:.25rem !important}.m-xl-2{margin:.5rem !important}.mt-xl-2,.my-xl-2{margin-top:.5rem !important}.mr-xl-2,.mx-xl-2{margin-right:.5rem !important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem !important}.ml-xl-2,.mx-xl-2{margin-left:.5rem !important}.m-xl-3{margin:1rem !important}.mt-xl-3,.my-xl-3{margin-top:1rem !important}.mr-xl-3,.mx-xl-3{margin-right:1rem !important}.mb-xl-3,.my-xl-3{margin-bottom:1rem !important}.ml-xl-3,.mx-xl-3{margin-left:1rem !important}.m-xl-4{margin:1.5rem !important}.mt-xl-4,.my-xl-4{margin-top:1.5rem !important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem !important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem !important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem !important}.m-xl-5{margin:3rem !important}.mt-xl-5,.my-xl-5{margin-top:3rem !important}.mr-xl-5,.mx-xl-5{margin-right:3rem !important}.mb-xl-5,.my-xl-5{margin-bottom:3rem !important}.ml-xl-5,.mx-xl-5{margin-left:3rem !important}.p-xl-0{padding:0 !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.p-xl-1{padding:.25rem !important}.pt-xl-1,.py-xl-1{padding-top:.25rem !important}.pr-xl-1,.px-xl-1{padding-right:.25rem !important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem !important}.pl-xl-1,.px-xl-1{padding-left:.25rem !important}.p-xl-2{padding:.5rem !important}.pt-xl-2,.py-xl-2{padding-top:.5rem !important}.pr-xl-2,.px-xl-2{padding-right:.5rem !important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem !important}.pl-xl-2,.px-xl-2{padding-left:.5rem !important}.p-xl-3{padding:1rem !important}.pt-xl-3,.py-xl-3{padding-top:1rem !important}.pr-xl-3,.px-xl-3{padding-right:1rem !important}.pb-xl-3,.py-xl-3{padding-bottom:1rem !important}.pl-xl-3,.px-xl-3{padding-left:1rem !important}.p-xl-4{padding:1.5rem !important}.pt-xl-4,.py-xl-4{padding-top:1.5rem !important}.pr-xl-4,.px-xl-4{padding-right:1.5rem !important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem !important}.pl-xl-4,.px-xl-4{padding-left:1.5rem !important}.p-xl-5{padding:3rem !important}.pt-xl-5,.py-xl-5{padding-top:3rem !important}.pr-xl-5,.px-xl-5{padding-right:3rem !important}.pb-xl-5,.py-xl-5{padding-bottom:3rem !important}.pl-xl-5,.px-xl-5{padding-left:3rem !important}.m-xl-n1{margin:-0.25rem !important}.mt-xl-n1,.my-xl-n1{margin-top:-0.25rem !important}.mr-xl-n1,.mx-xl-n1{margin-right:-0.25rem !important}.mb-xl-n1,.my-xl-n1{margin-bottom:-0.25rem !important}.ml-xl-n1,.mx-xl-n1{margin-left:-0.25rem !important}.m-xl-n2{margin:-0.5rem !important}.mt-xl-n2,.my-xl-n2{margin-top:-0.5rem !important}.mr-xl-n2,.mx-xl-n2{margin-right:-0.5rem !important}.mb-xl-n2,.my-xl-n2{margin-bottom:-0.5rem !important}.ml-xl-n2,.mx-xl-n2{margin-left:-0.5rem !important}.m-xl-n3{margin:-1rem !important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem !important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem !important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem !important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem !important}.m-xl-n4{margin:-1.5rem !important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem !important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem !important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem !important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem !important}.m-xl-n5{margin:-3rem !important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem !important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem !important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem !important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}}@media(min-width: 1600px){.m-xxl-0{margin:0 !important}.mt-xxl-0,.my-xxl-0{margin-top:0 !important}.mr-xxl-0,.mx-xxl-0{margin-right:0 !important}.mb-xxl-0,.my-xxl-0{margin-bottom:0 !important}.ml-xxl-0,.mx-xxl-0{margin-left:0 !important}.m-xxl-1{margin:.25rem !important}.mt-xxl-1,.my-xxl-1{margin-top:.25rem !important}.mr-xxl-1,.mx-xxl-1{margin-right:.25rem !important}.mb-xxl-1,.my-xxl-1{margin-bottom:.25rem !important}.ml-xxl-1,.mx-xxl-1{margin-left:.25rem !important}.m-xxl-2{margin:.5rem !important}.mt-xxl-2,.my-xxl-2{margin-top:.5rem !important}.mr-xxl-2,.mx-xxl-2{margin-right:.5rem !important}.mb-xxl-2,.my-xxl-2{margin-bottom:.5rem !important}.ml-xxl-2,.mx-xxl-2{margin-left:.5rem !important}.m-xxl-3{margin:1rem !important}.mt-xxl-3,.my-xxl-3{margin-top:1rem !important}.mr-xxl-3,.mx-xxl-3{margin-right:1rem !important}.mb-xxl-3,.my-xxl-3{margin-bottom:1rem !important}.ml-xxl-3,.mx-xxl-3{margin-left:1rem !important}.m-xxl-4{margin:1.5rem !important}.mt-xxl-4,.my-xxl-4{margin-top:1.5rem !important}.mr-xxl-4,.mx-xxl-4{margin-right:1.5rem !important}.mb-xxl-4,.my-xxl-4{margin-bottom:1.5rem !important}.ml-xxl-4,.mx-xxl-4{margin-left:1.5rem !important}.m-xxl-5{margin:3rem !important}.mt-xxl-5,.my-xxl-5{margin-top:3rem !important}.mr-xxl-5,.mx-xxl-5{margin-right:3rem !important}.mb-xxl-5,.my-xxl-5{margin-bottom:3rem !important}.ml-xxl-5,.mx-xxl-5{margin-left:3rem !important}.p-xxl-0{padding:0 !important}.pt-xxl-0,.py-xxl-0{padding-top:0 !important}.pr-xxl-0,.px-xxl-0{padding-right:0 !important}.pb-xxl-0,.py-xxl-0{padding-bottom:0 !important}.pl-xxl-0,.px-xxl-0{padding-left:0 !important}.p-xxl-1{padding:.25rem !important}.pt-xxl-1,.py-xxl-1{padding-top:.25rem !important}.pr-xxl-1,.px-xxl-1{padding-right:.25rem !important}.pb-xxl-1,.py-xxl-1{padding-bottom:.25rem !important}.pl-xxl-1,.px-xxl-1{padding-left:.25rem !important}.p-xxl-2{padding:.5rem !important}.pt-xxl-2,.py-xxl-2{padding-top:.5rem !important}.pr-xxl-2,.px-xxl-2{padding-right:.5rem !important}.pb-xxl-2,.py-xxl-2{padding-bottom:.5rem !important}.pl-xxl-2,.px-xxl-2{padding-left:.5rem !important}.p-xxl-3{padding:1rem !important}.pt-xxl-3,.py-xxl-3{padding-top:1rem !important}.pr-xxl-3,.px-xxl-3{padding-right:1rem !important}.pb-xxl-3,.py-xxl-3{padding-bottom:1rem !important}.pl-xxl-3,.px-xxl-3{padding-left:1rem !important}.p-xxl-4{padding:1.5rem !important}.pt-xxl-4,.py-xxl-4{padding-top:1.5rem !important}.pr-xxl-4,.px-xxl-4{padding-right:1.5rem !important}.pb-xxl-4,.py-xxl-4{padding-bottom:1.5rem !important}.pl-xxl-4,.px-xxl-4{padding-left:1.5rem !important}.p-xxl-5{padding:3rem !important}.pt-xxl-5,.py-xxl-5{padding-top:3rem !important}.pr-xxl-5,.px-xxl-5{padding-right:3rem !important}.pb-xxl-5,.py-xxl-5{padding-bottom:3rem !important}.pl-xxl-5,.px-xxl-5{padding-left:3rem !important}.m-xxl-n1{margin:-0.25rem !important}.mt-xxl-n1,.my-xxl-n1{margin-top:-0.25rem !important}.mr-xxl-n1,.mx-xxl-n1{margin-right:-0.25rem !important}.mb-xxl-n1,.my-xxl-n1{margin-bottom:-0.25rem !important}.ml-xxl-n1,.mx-xxl-n1{margin-left:-0.25rem !important}.m-xxl-n2{margin:-0.5rem !important}.mt-xxl-n2,.my-xxl-n2{margin-top:-0.5rem !important}.mr-xxl-n2,.mx-xxl-n2{margin-right:-0.5rem !important}.mb-xxl-n2,.my-xxl-n2{margin-bottom:-0.5rem !important}.ml-xxl-n2,.mx-xxl-n2{margin-left:-0.5rem !important}.m-xxl-n3{margin:-1rem !important}.mt-xxl-n3,.my-xxl-n3{margin-top:-1rem !important}.mr-xxl-n3,.mx-xxl-n3{margin-right:-1rem !important}.mb-xxl-n3,.my-xxl-n3{margin-bottom:-1rem !important}.ml-xxl-n3,.mx-xxl-n3{margin-left:-1rem !important}.m-xxl-n4{margin:-1.5rem !important}.mt-xxl-n4,.my-xxl-n4{margin-top:-1.5rem !important}.mr-xxl-n4,.mx-xxl-n4{margin-right:-1.5rem !important}.mb-xxl-n4,.my-xxl-n4{margin-bottom:-1.5rem !important}.ml-xxl-n4,.mx-xxl-n4{margin-left:-1.5rem !important}.m-xxl-n5{margin:-3rem !important}.mt-xxl-n5,.my-xxl-n5{margin-top:-3rem !important}.mr-xxl-n5,.mx-xxl-n5{margin-right:-3rem !important}.mb-xxl-n5,.my-xxl-n5{margin-bottom:-3rem !important}.ml-xxl-n5,.mx-xxl-n5{margin-left:-3rem !important}.m-xxl-auto{margin:auto !important}.mt-xxl-auto,.my-xxl-auto{margin-top:auto !important}.mr-xxl-auto,.mx-xxl-auto{margin-right:auto !important}.mb-xxl-auto,.my-xxl-auto{margin-bottom:auto !important}.ml-xxl-auto,.mx-xxl-auto{margin-left:auto !important}}@media(min-width: 2600px){.m-xxxl-0{margin:0 !important}.mt-xxxl-0,.my-xxxl-0{margin-top:0 !important}.mr-xxxl-0,.mx-xxxl-0{margin-right:0 !important}.mb-xxxl-0,.my-xxxl-0{margin-bottom:0 !important}.ml-xxxl-0,.mx-xxxl-0{margin-left:0 !important}.m-xxxl-1{margin:.25rem !important}.mt-xxxl-1,.my-xxxl-1{margin-top:.25rem !important}.mr-xxxl-1,.mx-xxxl-1{margin-right:.25rem !important}.mb-xxxl-1,.my-xxxl-1{margin-bottom:.25rem !important}.ml-xxxl-1,.mx-xxxl-1{margin-left:.25rem !important}.m-xxxl-2{margin:.5rem !important}.mt-xxxl-2,.my-xxxl-2{margin-top:.5rem !important}.mr-xxxl-2,.mx-xxxl-2{margin-right:.5rem !important}.mb-xxxl-2,.my-xxxl-2{margin-bottom:.5rem !important}.ml-xxxl-2,.mx-xxxl-2{margin-left:.5rem !important}.m-xxxl-3{margin:1rem !important}.mt-xxxl-3,.my-xxxl-3{margin-top:1rem !important}.mr-xxxl-3,.mx-xxxl-3{margin-right:1rem !important}.mb-xxxl-3,.my-xxxl-3{margin-bottom:1rem !important}.ml-xxxl-3,.mx-xxxl-3{margin-left:1rem !important}.m-xxxl-4{margin:1.5rem !important}.mt-xxxl-4,.my-xxxl-4{margin-top:1.5rem !important}.mr-xxxl-4,.mx-xxxl-4{margin-right:1.5rem !important}.mb-xxxl-4,.my-xxxl-4{margin-bottom:1.5rem !important}.ml-xxxl-4,.mx-xxxl-4{margin-left:1.5rem !important}.m-xxxl-5{margin:3rem !important}.mt-xxxl-5,.my-xxxl-5{margin-top:3rem !important}.mr-xxxl-5,.mx-xxxl-5{margin-right:3rem !important}.mb-xxxl-5,.my-xxxl-5{margin-bottom:3rem !important}.ml-xxxl-5,.mx-xxxl-5{margin-left:3rem !important}.p-xxxl-0{padding:0 !important}.pt-xxxl-0,.py-xxxl-0{padding-top:0 !important}.pr-xxxl-0,.px-xxxl-0{padding-right:0 !important}.pb-xxxl-0,.py-xxxl-0{padding-bottom:0 !important}.pl-xxxl-0,.px-xxxl-0{padding-left:0 !important}.p-xxxl-1{padding:.25rem !important}.pt-xxxl-1,.py-xxxl-1{padding-top:.25rem !important}.pr-xxxl-1,.px-xxxl-1{padding-right:.25rem !important}.pb-xxxl-1,.py-xxxl-1{padding-bottom:.25rem !important}.pl-xxxl-1,.px-xxxl-1{padding-left:.25rem !important}.p-xxxl-2{padding:.5rem !important}.pt-xxxl-2,.py-xxxl-2{padding-top:.5rem !important}.pr-xxxl-2,.px-xxxl-2{padding-right:.5rem !important}.pb-xxxl-2,.py-xxxl-2{padding-bottom:.5rem !important}.pl-xxxl-2,.px-xxxl-2{padding-left:.5rem !important}.p-xxxl-3{padding:1rem !important}.pt-xxxl-3,.py-xxxl-3{padding-top:1rem !important}.pr-xxxl-3,.px-xxxl-3{padding-right:1rem !important}.pb-xxxl-3,.py-xxxl-3{padding-bottom:1rem !important}.pl-xxxl-3,.px-xxxl-3{padding-left:1rem !important}.p-xxxl-4{padding:1.5rem !important}.pt-xxxl-4,.py-xxxl-4{padding-top:1.5rem !important}.pr-xxxl-4,.px-xxxl-4{padding-right:1.5rem !important}.pb-xxxl-4,.py-xxxl-4{padding-bottom:1.5rem !important}.pl-xxxl-4,.px-xxxl-4{padding-left:1.5rem !important}.p-xxxl-5{padding:3rem !important}.pt-xxxl-5,.py-xxxl-5{padding-top:3rem !important}.pr-xxxl-5,.px-xxxl-5{padding-right:3rem !important}.pb-xxxl-5,.py-xxxl-5{padding-bottom:3rem !important}.pl-xxxl-5,.px-xxxl-5{padding-left:3rem !important}.m-xxxl-n1{margin:-0.25rem !important}.mt-xxxl-n1,.my-xxxl-n1{margin-top:-0.25rem !important}.mr-xxxl-n1,.mx-xxxl-n1{margin-right:-0.25rem !important}.mb-xxxl-n1,.my-xxxl-n1{margin-bottom:-0.25rem !important}.ml-xxxl-n1,.mx-xxxl-n1{margin-left:-0.25rem !important}.m-xxxl-n2{margin:-0.5rem !important}.mt-xxxl-n2,.my-xxxl-n2{margin-top:-0.5rem !important}.mr-xxxl-n2,.mx-xxxl-n2{margin-right:-0.5rem !important}.mb-xxxl-n2,.my-xxxl-n2{margin-bottom:-0.5rem !important}.ml-xxxl-n2,.mx-xxxl-n2{margin-left:-0.5rem !important}.m-xxxl-n3{margin:-1rem !important}.mt-xxxl-n3,.my-xxxl-n3{margin-top:-1rem !important}.mr-xxxl-n3,.mx-xxxl-n3{margin-right:-1rem !important}.mb-xxxl-n3,.my-xxxl-n3{margin-bottom:-1rem !important}.ml-xxxl-n3,.mx-xxxl-n3{margin-left:-1rem !important}.m-xxxl-n4{margin:-1.5rem !important}.mt-xxxl-n4,.my-xxxl-n4{margin-top:-1.5rem !important}.mr-xxxl-n4,.mx-xxxl-n4{margin-right:-1.5rem !important}.mb-xxxl-n4,.my-xxxl-n4{margin-bottom:-1.5rem !important}.ml-xxxl-n4,.mx-xxxl-n4{margin-left:-1.5rem !important}.m-xxxl-n5{margin:-3rem !important}.mt-xxxl-n5,.my-xxxl-n5{margin-top:-3rem !important}.mr-xxxl-n5,.mx-xxxl-n5{margin-right:-3rem !important}.mb-xxxl-n5,.my-xxxl-n5{margin-bottom:-3rem !important}.ml-xxxl-n5,.mx-xxxl-n5{margin-left:-3rem !important}.m-xxxl-auto{margin:auto !important}.mt-xxxl-auto,.my-xxxl-auto{margin-top:auto !important}.mr-xxxl-auto,.mx-xxxl-auto{margin-right:auto !important}.mb-xxxl-auto,.my-xxxl-auto{margin-bottom:auto !important}.ml-xxxl-auto,.mx-xxxl-auto{margin-left:auto !important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace !important}.text-justify{text-align:justify !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media(min-width: 576px){.text-sm-left{text-align:left !important}.text-sm-right{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.text-md-left{text-align:left !important}.text-md-right{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.text-lg-left{text-align:left !important}.text-lg-right{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.text-xl-left{text-align:left !important}.text-xl-right{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1600px){.text-xxl-left{text-align:left !important}.text-xxl-right{text-align:right !important}.text-xxl-center{text-align:center !important}}@media(min-width: 2600px){.text-xxxl-left{text-align:left !important}.text-xxxl-right{text-align:right !important}.text-xxxl-center{text-align:center !important}}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.font-weight-light{font-weight:300 !important}.font-weight-lighter{font-weight:lighter !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:700 !important}.font-weight-bolder{font-weight:bolder !important}.font-italic{font-style:italic !important}.text-white{color:#fff !important}.text-primary{color:#4575cf !important}a.text-primary:hover,a.text-primary:focus{color:#29529f !important}.text-secondary{color:#6c757d !important}a.text-secondary:hover,a.text-secondary:focus{color:#494f54 !important}.text-success{color:#28a745 !important}a.text-success:hover,a.text-success:focus{color:#19692c !important}.text-info{color:#17a2b8 !important}a.text-info:hover,a.text-info:focus{color:#0f6674 !important}.text-warning{color:#ffc107 !important}a.text-warning:hover,a.text-warning:focus{color:#ba8b00 !important}.text-danger{color:#dc3545 !important}a.text-danger:hover,a.text-danger:focus{color:#a71d2a !important}.text-light{color:#f8f9fa !important}a.text-light:hover,a.text-light:focus{color:#cbd3da !important}.text-dark{color:#343a40 !important}a.text-dark:hover,a.text-dark:focus{color:#121416 !important}.text-body{color:#212529 !important}.text-muted{color:rgba(85,91,104,.5) !important}.text-black-50{color:rgba(0,0,0,.5) !important}.text-white-50{color:rgba(255,255,255,.5) !important}.text-hide{font:0/0 a;color:rgba(0,0,0,0);text-shadow:none;background-color:rgba(0,0,0,0);border:0}.text-decoration-none{text-decoration:none !important}.text-break{word-break:break-word !important;word-wrap:break-word !important}.text-reset{color:inherit !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media print{*,*::before,*::after{text-shadow:none !important;box-shadow:none !important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap !important}pre,blockquote{border:1px solid #adb5bd;page-break-inside:avoid}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px !important}.container{min-width:992px !important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #dee2e6 !important}.table-dark{color:inherit}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}html{height:100%;background-color:#dae0ee}body{background-color:#dae0ee;background:linear-gradient(-15deg, #dae0ee, #ebeff6);background-size:cover;background-repeat:repeat-x;color:#555b68;font-size:16px;line-height:1.5;height:100%}#main{padding-top:3.5rem;position:relative}.layout-wrapper{min-height:100%}.progress{border-radius:.5rem}tr[phx-click]{cursor:pointer}table.table-hover tbody tr:hover{background-color:#f2f4f9}.dash-table{color:#4e5156;margin-bottom:0}.dash-table th{background-color:#f2f4f9;white-space:nowrap}.dash-table .dash-table-icon{padding-left:.25rem;display:inline-block}.dash-table .icon-sort{display:inline-block;width:0;height:0;line-height:6px;position:relative;top:-1px;vertical-align:middle}.dash-table .icon-asc{border-left:6px solid rgba(0,0,0,0);border-right:6px solid rgba(0,0,0,0);border-bottom:6px solid #71747c}.dash-table .icon-desc{border-left:6px solid rgba(0,0,0,0);border-right:6px solid rgba(0,0,0,0);border-top:6px solid #71747c}.dash-table-wrapper{border-radius:6px 6px 0 0;overflow-x:auto}.app-info{overflow:auto}.app-info .node{fill:#f2f4f9;stroke:#e6eaf3;stroke-width:1}.app-info .node:hover{cursor:pointer;fill:#e6eaf3}.app-info .node:hover+.tree-node-text{fill:#3d3f43}.app-info .line{stroke:#e6eaf3;stroke-width:2}.app-info .tree{position:relative;margin:20px 0}.app-info .tree-node-text{fill:#555b68;font-size:14px;font-family:"LiveDashboardFont";pointer-events:none}#elixir-card{background:linear-gradient(40deg, #754fa2, #6979db);color:#fff}#phoenix-card{background:linear-gradient(40deg, #f26d40, #dfa843);color:#fff}#app-card{background:linear-gradient(40deg, #4575cf, #36a4ee);color:#fff}.bg-green{background-color:#4db167}.bg-blue{background-color:#5d89c7}.bg-purple{background-color:#754fa2}.bg-yellow{background-color:#f9bc14}.bg-orange{background-color:#f26d40}.bg-dark-gray{background-color:#9498a2}.bg-light-gray{background-color:#eceff6}.bg-card-default{background-color:#fff}.bg-gradient-green{background:linear-gradient(40deg, #4db167, #70c185)}.bg-gradient-blue{background:linear-gradient(40deg, #5d89c7, #83a5d4)}.bg-gradient-purple{background:linear-gradient(40deg, #754fa2, #8f6cb8)}.bg-gradient-yellow{background:linear-gradient(40deg, #f9bc14, #faca46)}.bg-gradient-orange{background:linear-gradient(40deg, #f26d40, #f58a66)}.bg-gradient-dark-gray{background:linear-gradient(40deg, #9498a2, #afb2ba)}.bg-gradient-light-gray{background:linear-gradient(40deg, #eceff6, #f3f5f9)}.banner-card{border-radius:6px;box-shadow:0 2px 5px rgba(201,209,230,.5),0 7px 20px rgba(201,209,230,.75);background-color:#fff;padding:1rem}.banner-card-title{margin-bottom:.2rem}.banner-card-value{font-size:1.5rem;font-weight:bold;margin-bottom:-0.15rem}#system-info-card .banner-card-value{font-size:16px;font-weight:400;padding:.3rem}.btn.btn-primary{background-color:#756f9a;border-width:0}.btn.btn-primary:not(:disabled):not(.disabled):active{background-color:#474360}.btn.btn-secondary{background-color:#8b8b8b;border-width:0}.card{border-radius:6px;box-shadow:0 2px 5px rgba(201,209,230,.5),0 7px 20px rgba(201,209,230,.75);border:none}.card-title{margin-bottom:.75rem}.card-title .badge{font-weight:inherit}.card-usage{padding-top:12px;padding-bottom:12px}.charts-col{margin-bottom:2rem}.charts-col .card{padding:.5rem}.charts-col .card .hint{position:absolute;right:14px}.charts-col .card .uplot{font-family:"LiveDashboardFont";max-width:100%}.charts-col .card .uplot.summary .legend tr:nth-child(n+3){display:table-row}.charts-col .card .uplot .title{font-weight:900;margin-bottom:.75rem}.charts-col .card .uplot .legend{margin-top:1.75rem;font-size:.75rem;width:100%;table-layout:fixed}.charts-col .card .uplot .legend .labels{background-color:#f2f4f9;color:#71747c}.charts-col .card .uplot .legend .labels th{text-overflow:ellipsis;overflow:hidden;white-space:nowrap;min-width:0;text-align:center;padding:4px}.charts-col .card .uplot .legend .series th{text-align:left}.charts-col .card .uplot .legend .series td{text-overflow:ellipsis;overflow:hidden;white-space:nowrap;min-width:0}.charts-col .card .uplot .legend.inline{display:flex;flex-wrap:wrap;text-align:left;margin-top:0}.charts-col .card .uplot .legend.inline .series{display:flex;flex-basis:45%;order:10}.charts-col .card .uplot .legend.inline .series th{align-items:center;display:flex;flex-basis:55px}.charts-col .card .uplot .legend.inline .series:first-child{background-color:#f2f4f9;color:#71747c;flex-basis:100%;margin:1.75rem 0 .5rem 0;order:1;text-align:center;display:inline-block}.charts-col .card .uplot .legend.inline .series:first-child th{display:inline-block}.charts-col .card .uplot .legend.inline .series:first-child .ident{display:none}.charts-col .card .uplot .legend.inline .series:nth-child(2){order:2}.charts-col .card .uplot .legend.inline .series:nth-child(5){order:4}.charts-col .card .uplot .legend.inline .series:nth-child(3){order:3}@media(min-width: 1600px){[data-phx-view="LiveDashboard.MetricsLive"] #main.container{max-width:95%}[data-phx-view="LiveDashboard.MetricsLive"] #main.container .charts-nav{max-width:1140px}}.code-field{background-color:#f2f4f9;color:#9498a2;border-radius:6px;border-width:0;font-weight:100;padding:.5rem .75rem;white-space:nowrap;width:100%;resize:none;overflow:auto;margin-bottom:.75rem;scrollbar-width:none}.code-field:focus{outline:none}.code-field::-webkit-scrollbar{display:none}.cookie-status{display:inline-block;padding:.35rem 0 .25rem 0;transition:all .3s ease-out;padding-left:18px;position:relative;opacity:0}.cookie-status[data-enabled]{opacity:.75}.cookie-status::before{background-color:#df0606;content:"";display:block;height:10px;width:10px;border-radius:50px;top:.82rem;left:0;position:absolute;animation-name:pulse;animation-iteration-count:infinite;animation-duration:1.2s;animation-timing-function:ease-in-out}@keyframes pulse{0%{opacity:1}45%{opacity:1}50%{opacity:0}95%{opacity:0}}.copy-indicator{opacity:0;padding:.375rem .75rem;display:inline-block}.copy-indicator[data-enabled]{animation-name:blink;animation-duration:1.5s;animation-timing-function:ease-out}@keyframes blink{0%{opacity:0}20%{opacity:1}60%{opacity:1}100%{opacity:0}}.fields-card dl{margin-bottom:0}.fields-card dl .code-field{margin-bottom:.25rem}.fields-card dl dd:last-child{margin-bottom:0}.fields-card dl dd:last-child .code-field{margin-bottom:0}header{background:#4a4473;position:relative}header h1{text-shadow:2px 2px 0 rgba(23,31,50,.5);color:#eceff6;font-size:1.75rem;margin-top:2.75rem;margin-bottom:0}header .container{position:relative;z-index:3}#menu-bar{margin-top:auto;box-shadow:0 2px 5px rgba(201,209,230,.15),0 7px 20px rgba(201,209,230,.3);border-radius:6px;background-color:#fff;display:inline-block;padding:0 .75rem;margin-top:1rem;margin-bottom:-1.5rem;position:relative;width:100%}#menu-bar .menu-item{display:inline-block;padding:.75rem;position:relative;text-decoration:none;color:rgba(69,117,207,.75)}#menu-bar .menu-item:hover{color:#3d2954}#menu-bar .menu-item.active{color:#3d2954;text-shadow:1px 1px rgba(69,117,207,.1)}#menu-bar .menu-item-disabled{color:rgba(85,91,104,.5)}#menu-bar .menu-item-disabled:hover{color:rgba(85,91,104,.5)}#menu-bar .menu-item-enable-button{background-color:#756f9a;border-radius:3px;color:#ededed;position:absolute;font-size:.75rem;right:50%;bottom:-15px;padding:.15rem .5rem;transform:translateX(50%)}#menu-bar .menu-item-enable-button:hover{background-color:#837ea5;text-decoration:none}#nav-dropdowns{position:absolute;top:0rem;right:0rem;padding-top:.25rem;padding-right:.75rem;font-size:.9rem}#nav-dropdowns form{margin:.5em 0;justify-content:flex-end;display:flex;flex-flow:row wrap}#nav-dropdowns label{color:#dae0ee;margin:0 .5rem 0 0;line-height:1.9rem;display:flex}#nav-dropdowns label.no-select{margin:0}#nav-dropdowns .custom-select{background-color:rgba(218,224,238,.75);border-radius:6px;border-width:0;color:#000;width:auto}@media(max-width: 768px){header h1{font-size:1.25rem;margin-top:1.25rem}#menu-bar{padding:0 .5rem;margin-top:0}#menu-bar .menu-item{padding:.75rem .5rem}#nav-dropdowns{position:relative;text-align:center;width:100%;padding:0;margin-bottom:.4rem}#nav-dropdowns form{justify-content:flex-start}#nav-dropdowns label{line-height:1rem;margin-bottom:.25rem}#nav-dropdowns .custom-select{width:100%}}footer{text-align:center;padding:1.5rem 0}footer img{width:16px;margin:0 3px 3px 0}footer .footer-dashbit{padding-left:.125rem}.hint{display:inline-block;position:relative}.hint .hint-text{box-shadow:0 2px 5px rgba(23,31,50,.15),0 7px 20px rgba(201,209,230,.3);display:none}.hint .hint-icon{cursor:help;height:15px;width:15px;position:relative;top:-1px}.hint:hover .hint-text{border:1px solid #b7bcc8;border-radius:6px;background-color:#f2f4f9;color:#71747c;display:block;position:absolute;transform:translateX(-50%);font-size:1rem;bottom:30px;left:18px;width:300px;padding:1rem 1.5rem;z-index:10}.hint .hint-icon-fill{fill:#b7bcc8}.hint .hint-icon-stroke{stroke:#b7bcc8}.card-title .hint .hint-icon-fill{fill:#9498a2}.card-title .hint .hint-icon-stroke{stroke:#9498a2}@media(max-width: 576px){.hint:hover .hint-text{transform:none;left:0}}.logs-card{display:none}.logs-card[data-messages-present=true]{display:block}.logs-card #logger-messages{overflow-y:scroll;height:350px}.logs-card #logger-messages pre{color:#555b68;margin-bottom:0;padding:.25rem;font-size:.75rem}.logs-card #logger-messages pre:hover{background-color:rgba(237,237,237,.5)}.logs-card #logger-messages pre.log-level-debug{color:rgba(85,91,104,.75)}.tabular-column-name,td.sockets-table-port,.processes-table-current_function,.processes-table-name_or_initial_call{padding-right:0;max-width:350px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tabular-column-id,td.sockets-table-port,.ports-table-port{color:#71747c}.tabular-column-bytes,td.sockets-table-send_oct,td.sockets-table-recv_oct,.ports-table-output,td.ports-table-input,.ets-table-memory{text-align:right;white-space:nowrap}.tabular-search{float:right}.tabular-search ::placeholder{color:#b7bcc8}.custom-select{background-color:#dae0ee;border-radius:6px;border-width:0}@media(max-width: 992px){.tabular{font-size:.85rem}.tabular-card{border-radius:0;margin-left:-2rem;margin-right:-2rem}.tabular-column-name,td.sockets-table-port,.processes-table-current_function,.processes-table-name_or_initial_call{max-width:150px}}.table-hover .active{color:#212529;background-color:rgba(0,0,0,.075)}.dash-modal{display:block;overflow-y:auto;background-color:rgba(49,50,53,.5)}.dash-modal pre{margin-bottom:0;overflow-x:auto;white-space:pre-wrap;word-break:break-word}.dash-modal .modal-dialog{max-width:900px}.dash-modal .modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.dash-modal .modal-fullscreen .modal-content{height:100%;border:0;border-radius:none}.dash-modal .modal-fullscreen .modal-header{border-radius:none}.dash-modal .modal-fullscreen .modal-body{overflow-y:auto}.dash-modal .modal-header{background-color:#f2f4f9;border-bottom:2px solid #dae0ee;padding:1rem 1.5rem}.dash-modal .modal-header h6{font-weight:700}.dash-modal .modal-content .modal-action{padding:1rem;margin:-1rem -1rem -1rem auto;line-height:1}.dash-modal .modal-content .modal-action-item{display:inline-block;color:#aaa;font-size:1.5rem;vertical-align:middle;font-weight:bold;text-align:right}.dash-modal .modal-content .modal-action-item:hover,.dash-modal .modal-content .modal-action-item:focus{color:#000;text-decoration:none;cursor:pointer}.dash-modal .modal-content .modal-action-hidden{display:none}@media(max-width: 992px){.dash-modal .modal-dialog{max-width:700px}}.nav-bar{background-color:#dae0ee;border-radius:6px;line-height:1.6}.nav-bar .nav-link{color:#4e5156}.nav-bar .nav-link:hover{color:#3d2954}.nav-bar .nav-link.active{color:#3d2954;border-bottom:3px solid #756f9a}.color-bar-progress{border-radius:2px;height:1.5rem;background-color:rgba(0,0,0,0);position:relative}.color-bar-progress-title{color:#9498a2;position:absolute;right:6px;top:2px;font-weight:bold}.color-bar-progress-bar{border-color:#fff;border-style:solid;border-width:0 1px;min-width:4px;flex-grow:0;user-select:none;cursor:pointer}.color-bar-progress-bar[data-empty=true]{display:none}.color-bar-progress-bar[data-muted=true]{opacity:.15}.color-bar-progress-bar.bg-gradient-light-gray[data-muted=false]{box-shadow:inset 0 0 0 1px #b7bcc8,inset 0 0 0 3px rgba(242,244,249,.15);background:linear-gradient(90deg, #e2e6f1, #e9ecf4)}.color-bar-progress-bar.bg-gradient-light-gray[data-muted=true]{opacity:1;background:linear-gradient(90deg, #f6f8fb, #f3f5f9)}.color-bar-progress-bar:last-of-type{border-right-width:0}.color-bar-progress-bar:first-of-type{border-left-width:0;min-width:3px}.color-bar-progress-bar:hover{box-shadow:inset 0 0 0 1px rgba(78,81,86,.25),inset 0 0 0 3px rgba(242,244,249,.15);filter:contrast(120%) brightness(90%)}.color-bar-progress-bar:hover[data-muted=true]{opacity:.6}.color-bar-progress-bar.bg-gradient-light-gray:hover,.color-bar-progress-bar:hover .bg-light-gray{box-shadow:inset 0 0 0 1px #b7bcc8,inset 0 0 0 3px rgba(242,244,249,.15);filter:none}.color-bar-legend-color{border-radius:3px;display:inline-block;height:16px;width:16px}.color-bar-legend-entry{user-select:none;cursor:pointer}.color-bar-legend-entry[data-muted=true]{opacity:.15}.color-bar-legend-entry[data-muted=false] .bg-light-gray{box-shadow:inset 0 0 0 1px #b7bcc8,inset 0 0 0 3px rgba(242,244,249,.15)}.color-bar-legend-entry:hover{box-shadow:none;filter:contrast(120%) brightness(90%)}.color-bar-legend-entry:hover[data-muted=true]{opacity:.6}.color-bar-legend-entry.bg-gradient-light-gray:hover,.color-bar-legend-entry:hover .bg-light-gray{box-shadow:inset 0 0 0 1px #b7bcc8,inset 0 0 0 3px rgba(242,244,249,.15);filter:none}.layered-graph .connection-line{stroke:#dae0ee;fill:#dae0ee;stroke-width:1}.layered-graph .node-label,.layered-graph .node-detail{fill:#fff;font-family:"LiveDashboardFont",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";text-anchor:middle}.layered-graph .card-body{overflow-x:auto}.resource-usage-total{background-color:#f2f4f9;color:#71747c}.resource-usage-total-value{color:#555b68}.tabular-info .tabular-info-not-exists{border-radius:6px;color:#fff;background-color:#9498a2;padding:1rem 1.5rem}.tabular-info .tabular-info-table td:empty::after,.tabular-info .tabular-info-table pre:empty::after{font-family:"LiveDashboardFont",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";content:"---";opacity:.5;font-size:1rem}.tabular-info .tabular-info-table td:first-child{font-weight:700}.tabular-info .tabular-info-table td:last-child{width:70%}.phx-click-loading{opacity:.5;transition:opacity 1s ease-out}.phx-disconnected{cursor:wait}.phx-disconnected *{pointer-events:none}
diff --git a/dist/js/app.js b/dist/js/app.js
index ed165834..032d61e9 100644
--- a/dist/js/app.js
+++ b/dist/js/app.js
@@ -12,6 +12,6 @@
{h}:{mm}{aa}`,null,1],[.001,":{ss}.{fff}",`
{M}/{D}/{YY} {h}:{mm}{aa}`,null,`
{M}/{D} {h}:{mm}{aa}`,null,`
-{h}:{mm}{aa}`,null,1]]}),rr=e=>({show:!0,size:70,space:15,...ou(e)}),ln={width:100,height:300},or={sync:{key:"metrics-live"}};function au(e,t){let n=!1;return()=>{n||(requestAnimationFrame(e),n=!0,setTimeout(()=>{n=!1},t))}}var nn=(e,t=0)=>({...Ol.at(t),...ru(e),label:e.label,spanGaps:!0,points:{show:!1}}),ar=e=>e.slice(0).map(({data:t})=>t);function uu({y:e,z:t},n){this.datasets[0].data.push(t);let s=this.datasets[1].data[this.datasets[1].data.length-1]||0,r=n.call(this,e,s);this.datasets[1].data.push(r)}var ts=e=>e.reduceRight((t,n)=>n!=null&&t==null?n:t,null);function cu({x:e,y:t,z:n},s){let r=this.datasets.findIndex(({key:f})=>e===f);r===-1&&(r=this.datasets.push({key:e,data:Array(this.datasets[0].data.length).fill(null)})-1,this.chart.addSeries(nn({label:e,unit:this.options.unit},r-1),r)),this.datasets=this.datasets.map((f,c)=>(c===0?f.data.push(n):c===r?f.data.push(s.call(this,t,ts(f.data)||0)):f.data.push(null),f))}var ur=({pruneThreshold:e=1e3})=>e,_l=class{static __projections(){return{counter:(t,n)=>n+1,last_value:t=>t,sum:(t,n)=>n+t}}static getConfig(t){return{class:t.kind,title:t.title,width:t.width,height:t.height,cursor:or,series:[{...sr()},nn(t,0)],scales:{x:{min:t.now-60,max:t.now},y:{min:0,max:1}},axes:[ir(),rr(t)]}}static initialData(){return[[],[]]}constructor(t,n){this.__callback=this.constructor.__projections()[n.metric],this.chart=t,this.datasets=[{key:"|x|",data:[]}],this.options=n,this.pruneThreshold=ur(n),n.tagged?(this.chart.delSeries(1),this.__handler=cu):(this.datasets.push({key:n.label,data:[]}),this.__handler=uu)}handleMeasurements(t){t.forEach(s=>this.__handler.call(this,s,this.__callback)),this.datasets[0].data.length>=this.pruneThreshold&&(this.datasets=this.datasets.map(({data:s,...r})=>({data:s.slice(-this.pruneThreshold),...r}))),this.chart.setData(ar(this.datasets))}},yl=class{constructor(t,n){let s=this.constructor.getConfig(t);s.series[1].values=this.__seriesValues.bind(this),this.datasets=[{key:"|x|",data:[]}],this.chart=new Se(s,this.constructor.initialData(t),n),this.pruneThreshold=ur(t),this.options=t,t.tagged?(this.chart.delSeries(1),this.__handler=this.handleTaggedMeasurement.bind(this)):(this.datasets.push(this.constructor.newDataset(t.label)),this.__handler=this.handleMeasurement.bind(this))}handleMeasurements(t){t.forEach(n=>this.__handler(n)),this.__maybePruneDatasets(),this.chart.setData(ar(this.datasets))}handleTaggedMeasurement(t){let n=this.findOrCreateSeries(t.x);this.handleMeasurement(t,n)}handleMeasurement(t,n=1){let{z:s}=t;this.datasets=this.datasets.map((r,f)=>(r.key==="|x|"?r.data.push(s):f===n?this.pushToDataset(r,t):this.pushToDataset(r,null),r))}findOrCreateSeries(t){let n=this.datasets.findIndex(({key:s})=>t===s);if(n===-1){n=this.datasets.push(this.constructor.newDataset(t,this.datasets[0].data.length))-1;let s={values:this.__seriesValues.bind(this),...nn({label:t},n-1)};this.chart.addSeries(s,n)}return n}pushToDataset(t,n){if(n===null){t.data.push(null),t.agg.avg.push(null),t.agg.max.push(null),t.agg.min.push(null);return}let{y:s}=n;return t.agg.count++,t.agg.total+=s,t.data.push(s),(t.last.min===null||st.last.max)&&(t.last.max=s),t.agg.max.push(t.last.max),t.agg.avg.push(t.agg.total/t.agg.count),t}__maybePruneDatasets(){if(this.datasets[0].data.length>this.pruneThreshold){let n=-this.pruneThreshold;this.datasets=this.datasets.map(({key:s,data:r,agg:f})=>{let c=r.slice(n);if(!f)return{key:s,data:c};let{avg:m,count:d,max:g,min:_,total:y}=f,u=_.slice(n),w=g.slice(n);return{key:s,data:c,agg:{avg:m.slice(n),count:d,min:u,max:w,total:y},last:{min:ts(u),max:ts(w)}}})}}__seriesValues(t,n,s){let r=this.datasets[n];if(r&&r.data&&r.data[s]){let{agg:{avg:f,max:c,min:m},data:d}=r;return{Value:d[s].toFixed(3),Min:m[s].toFixed(3),Max:c[s].toFixed(3),Avg:f[s].toFixed(3)}}else return{Value:"--",Min:"--",Max:"--",Avg:"--"}}static initialData(){return[[],[]]}static getConfig(t){return{class:t.kind,title:t.title,width:t.width,height:t.height,cursor:or,series:[{...sr()},nn(t,0)],scales:{x:{min:t.now-60,max:t.now},y:{min:0,max:1}},axes:[ir(),rr(t)]}}static newDataset(t,n=0){let s=n>0?Array(n).fill(null):[];return{key:t,data:[...s],agg:{avg:[...s],count:0,max:[...s],min:[...s],total:0},last:{max:null,min:null}}}},nr={counter:_l,last_value:_l,sum:_l,summary:yl,distribution:tn},ls=class{constructor(t,n){if(n.metric){if(n.metric&&!nr[n.metric])throw new TypeError(`No metric defined for type ${n.metric}`)}else throw new TypeError("No metric type was provided");let s=nr[n.metric];s===yl?(this.metric=new yl(n,t),this.uplotChart=this.metric.chart):(this.uplotChart=new Se(s.getConfig(n),s.initialData(n),t),this.metric=new s(this.uplotChart,n));let r=typeof n.refreshInterval<"u";this._isBufferingData=r,this._buffer=[],this._timer=r?setInterval(this._flushToChart.bind(this),+n.refreshInterval):null}clearTimers(){clearInterval(this._timer)}resize(t){this.uplotChart.setSize({width:Math.max(t.width,ln.width),height:ln.height})}pushData(t){if(!t.length)return;(this._isBufferingData?this._pushToBuffer:this._pushToChart).call(this,t)}_pushToBuffer(t){this._buffer=this._buffer.concat(t)}_pushToChart(t){this.metric.handleMeasurements(t)}_flushToChart(){let t=this._flushBuffer();!t.length||this._pushToChart(t)}_flushBuffer(){if(this._buffer&&!this._buffer.length)return[];let t=this._buffer;return this._buffer=[],t.reduce((n,s)=>n.concat(s),[])}},fu={mounted(){let e=this.el.parentElement.querySelector(".chart"),t=e.getBoundingClientRect(),n=Object.assign({},e.dataset,{tagged:e.dataset.tags&&e.dataset.tags!==""||!1,width:Math.max(t.width,ln.width),height:ln.height,now:new Date/1e3,refreshInterval:1e3});this.chart=new ls(e,n),window.addEventListener("resize",au(()=>{let s=e.getBoundingClientRect();this.chart.resize(s)}))},updated(){let e=Array.from(this.el.children||[]).map(({dataset:{x:t,y:n,z:s}})=>({x:t,y:+n,z:+s/1e6}));e.length>0&&this.chart.pushData(e)},destroyed(){this.chart.clearTimers()}},cr=fu;var hu=e=>{let t=`${e.key}=${e.value};path=/`;window.location.protocol==="https:"&&(t+=";samesite=strict"),e.domain&&(t+=`;domain=${e.domain}`),document.cookie=t},du=e=>{let t="Thu, 01 Jan 1970 00:00:00 GMT";document.cookie=`${e.key}=; expires=${t}`},pu=e=>e.el.hasAttribute("data-cookie-enabled"),mu=e=>({key:e.el.getAttribute("data-cookie-key"),value:e.el.getAttribute("data-cookie-value"),domain:e.el.getAttribute("data-cookie-domain")}),gu={updated(){let e=mu(this);du(e),pu(this)&&hu(e)}},fr=gu;var wu=e=>{if(!navigator.clipboard)e.select(),e.setSelectionRange(0,99999),document.execCommand("copy");else{let t=e.value;navigator.clipboard.writeText(t)}},Su={mounted(){this.el.querySelector(".btn-primary").addEventListener("click",e=>{let t=this.el.querySelector("textarea");wu(t);let n=this.el.querySelector(".copy-indicator");n.setAttribute("data-enabled","false"),n.offsetWidth,n.setAttribute("data-enabled","true")})}},hr=Su;var vu={updated(){if(this.el.querySelector(".logger-autoscroll-checkbox").checked){let e=this.el.querySelector("#logger-messages");e.scrollTop=e.scrollHeight}}},dr=vu;var mr=".progress-bar, .color-bar-legend-entry",sn,pr=e=>{e.querySelectorAll(mr).forEach(t=>{if(sn){let n=t.getAttribute("data-name")!==sn;t.setAttribute("data-muted",n)}else t.removeAttribute("data-muted")})},_u={mounted(){this.el.setAttribute("data-highlight-enabled","true"),this.el.querySelectorAll(mr).forEach(e=>e.addEventListener("click",t=>{let n=t.currentTarget.getAttribute("data-name");sn=n===sn?null:n,pr(this.el)}))},updated(){this.el.setAttribute("data-highlight-enabled","true"),pr(this.el)}},gr=_u;var wr="_refresh_data";function Sr(e,t){let n=JSON.stringify(e),s=xu(n);bu(wr,s,t,15768e4)}function rn(){let e=yu(wr);if(e){let t=ku(e);return JSON.parse(t)}else return null}function yu(e){let t=document.cookie.split("; ").find(n=>n.startsWith(`${e}=`));return t?t.replace(`${e}=`,""):null}function bu(e,t,n,s){let r=`${e}=${t};max-age=${s};path=${n}`;document.cookie=r}function xu(e){return btoa(unescape(encodeURIComponent(e)))}function ku(e){return decodeURIComponent(escape(atob(e)))}var Mu={updated(){let e=rn()||{};e[this.el.dataset.page]=this.el.value,Sr(e,this.el.dataset.dashboardMountPath)}},vr=Mu;var Tu={PhxChartComponent:cr,PhxRequestLoggerCookie:fr,PhxRequestLoggerQueryParameter:hr,PhxRequestLoggerMessages:dr,PhxColorBarHighlight:gr,PhxRememberRefresh:vr},Du=document.querySelector("html").getAttribute("phx-socket")||"/live",Cu=document.querySelector("meta[name='csrf-token']").getAttribute("content"),is=new LiveView.LiveSocket(Du,Phoenix.Socket,{hooks:Tu,params:e=>({_csrf_token:Cu,refresh_data:rn()})}),zt=is.socket,Eu=zt.onConnError,ns=!0;zt.onOpen(()=>{ns=!1});zt.onConnError=(...e)=>{ns?(ns=!1,zt.disconnect(null,3e3),zt.transport=Phoenix.LongPoll,zt.connect()):Eu.apply(zt,e)};window.addEventListener("phx:page-loading-start",e=>ss.default.start());window.addEventListener("phx:page-loading-stop",e=>ss.default.done());is.connect();window.liveSocket=is;})();
+{h}:{mm}{aa}`,null,1]]}),rr=e=>({show:!0,size:70,space:15,...ou(e)}),ln={width:100,height:300},or={sync:{key:"metrics-live"}};function au(e,t){let n=!1;return()=>{n||(requestAnimationFrame(e),n=!0,setTimeout(()=>{n=!1},t))}}var nn=(e,t=0)=>({...Ol.at(t),...ru(e),label:e.label,spanGaps:!0,points:{show:!1}}),ar=e=>e.slice(0).map(({data:t})=>t);function uu({y:e,z:t},n){this.datasets[0].data.push(t);let s=this.datasets[1].data[this.datasets[1].data.length-1]||0,r=n.call(this,e,s);this.datasets[1].data.push(r)}var ts=e=>e.reduceRight((t,n)=>n!=null&&t==null?n:t,null);function cu({x:e,y:t,z:n},s){let r=this.datasets.findIndex(({key:f})=>e===f);r===-1&&(r=this.datasets.push({key:e,data:Array(this.datasets[0].data.length).fill(null)})-1,this.chart.addSeries(nn({label:e,unit:this.options.unit},r-1),r)),this.datasets=this.datasets.map((f,c)=>(c===0?f.data.push(n):c===r?f.data.push(s.call(this,t,ts(f.data)||0)):f.data.push(null),f))}var ur=({pruneThreshold:e=1e3})=>e,_l=class{static __projections(){return{counter:(t,n)=>n+1,last_value:t=>t,sum:(t,n)=>n+t}}static getConfig(t){return{class:t.kind,title:t.title,width:t.width,height:t.height,cursor:or,series:[{...sr()},nn(t,0)],scales:{x:{min:t.now-60,max:t.now},y:{min:0,max:1}},axes:[ir(),rr(t)]}}static initialData(){return[[],[]]}constructor(t,n){this.__callback=this.constructor.__projections()[n.metric],this.chart=t,this.datasets=[{key:"|x|",data:[]}],this.options=n,this.pruneThreshold=ur(n),n.tagged?(this.chart.delSeries(1),this.__handler=cu):(this.datasets.push({key:n.label,data:[]}),this.__handler=uu)}handleMeasurements(t){t.forEach(s=>this.__handler.call(this,s,this.__callback)),this.datasets[0].data.length>=this.pruneThreshold&&(this.datasets=this.datasets.map(({data:s,...r})=>({data:s.slice(-this.pruneThreshold),...r}))),this.chart.setData(ar(this.datasets))}},yl=class{constructor(t,n){let s=this.constructor.getConfig(t);s.series[1].values=this.__seriesValues.bind(this),this.datasets=[{key:"|x|",data:[]}],this.chart=new Se(s,this.constructor.initialData(t),n),this.pruneThreshold=ur(t),this.options=t,t.tagged?(this.chart.delSeries(1),this.__handler=this.handleTaggedMeasurement.bind(this)):(this.datasets.push(this.constructor.newDataset(t.label)),this.__handler=this.handleMeasurement.bind(this))}handleMeasurements(t){t.forEach(n=>this.__handler(n)),this.__maybePruneDatasets(),this.chart.setData(ar(this.datasets))}handleTaggedMeasurement(t){let n=this.findOrCreateSeries(t.x);this.handleMeasurement(t,n)}handleMeasurement(t,n=1){let{z:s}=t;this.datasets=this.datasets.map((r,f)=>(r.key==="|x|"?r.data.push(s):f===n?this.pushToDataset(r,t):this.pushToDataset(r,null),r))}findOrCreateSeries(t){let n=this.datasets.findIndex(({key:s})=>t===s);if(n===-1){n=this.datasets.push(this.constructor.newDataset(t,this.datasets[0].data.length))-1;let s={values:this.__seriesValues.bind(this),...nn({label:t},n-1)};this.chart.addSeries(s,n)}return n}pushToDataset(t,n){if(n===null){t.data.push(null),t.agg.avg.push(null),t.agg.max.push(null),t.agg.min.push(null);return}let{y:s}=n;return t.agg.count++,t.agg.total+=s,t.data.push(s),(t.last.min===null||st.last.max)&&(t.last.max=s),t.agg.max.push(t.last.max),t.agg.avg.push(t.agg.total/t.agg.count),t}__maybePruneDatasets(){if(this.datasets[0].data.length>this.pruneThreshold){let n=-this.pruneThreshold;this.datasets=this.datasets.map(({key:s,data:r,agg:f})=>{let c=r.slice(n);if(!f)return{key:s,data:c};let{avg:m,count:d,max:g,min:_,total:y}=f,u=_.slice(n),w=g.slice(n);return{key:s,data:c,agg:{avg:m.slice(n),count:d,min:u,max:w,total:y},last:{min:ts(u),max:ts(w)}}})}}__seriesValues(t,n,s){let r=this.datasets[n];if(r&&r.data&&r.data[s]){let{agg:{avg:f,max:c,min:m},data:d}=r;return{Value:d[s].toFixed(3),Min:m[s].toFixed(3),Max:c[s].toFixed(3),Avg:f[s].toFixed(3)}}else return{Value:"--",Min:"--",Max:"--",Avg:"--"}}static initialData(){return[[],[]]}static getConfig(t){return{class:t.kind,title:t.title,width:t.width,height:t.height,cursor:or,series:[{...sr()},nn(t,0)],scales:{x:{min:t.now-60,max:t.now},y:{min:0,max:1}},axes:[ir(),rr(t)]}}static newDataset(t,n=0){let s=n>0?Array(n).fill(null):[];return{key:t,data:[...s],agg:{avg:[...s],count:0,max:[...s],min:[...s],total:0},last:{max:null,min:null}}}},nr={counter:_l,last_value:_l,sum:_l,summary:yl,distribution:tn},ls=class{constructor(t,n){if(n.metric){if(n.metric&&!nr[n.metric])throw new TypeError(`No metric defined for type ${n.metric}`)}else throw new TypeError("No metric type was provided");let s=nr[n.metric];s===yl?(this.metric=new yl(n,t),this.uplotChart=this.metric.chart):(this.uplotChart=new Se(s.getConfig(n),s.initialData(n),t),this.metric=new s(this.uplotChart,n));let r=typeof n.refreshInterval<"u";this._isBufferingData=r,this._buffer=[],this._timer=r?setInterval(this._flushToChart.bind(this),+n.refreshInterval):null}clearTimers(){clearInterval(this._timer)}resize(t){this.uplotChart.setSize({width:Math.max(t.width,ln.width),height:ln.height})}pushData(t){if(!t.length)return;(this._isBufferingData?this._pushToBuffer:this._pushToChart).call(this,t)}_pushToBuffer(t){this._buffer=this._buffer.concat(t)}_pushToChart(t){this.metric.handleMeasurements(t)}_flushToChart(){let t=this._flushBuffer();!t.length||this._pushToChart(t)}_flushBuffer(){if(this._buffer&&!this._buffer.length)return[];let t=this._buffer;return this._buffer=[],t.reduce((n,s)=>n.concat(s),[])}},fu={mounted(){let e=this.el.parentElement.querySelector(".chart"),t=e.getBoundingClientRect(),n=Object.assign({},e.dataset,{tagged:e.dataset.tags&&e.dataset.tags!==""||!1,width:Math.max(t.width,ln.width),height:ln.height,now:new Date/1e3,refreshInterval:1e3});this.chart=new ls(e,n),window.addEventListener("resize",au(()=>{let s=e.getBoundingClientRect();this.chart.resize(s)}))},updated(){let e=Array.from(this.el.children||[]).map(({dataset:{x:t,y:n,z:s}})=>({x:t,y:+n,z:+s/1e6}));e.length>0&&this.chart.pushData(e)},destroyed(){this.chart.clearTimers()}},cr=fu;var hu=e=>{let t=`${e.key}=${e.value};path=/`;window.location.protocol==="https:"&&(t+=";samesite=strict"),e.domain&&(t+=`;domain=${e.domain}`),document.cookie=t},du=e=>{let t="Thu, 01 Jan 1970 00:00:00 GMT";document.cookie=`${e.key}=; expires=${t}`},pu=e=>e.el.hasAttribute("data-cookie-enabled"),mu=e=>({key:e.el.getAttribute("data-cookie-key"),value:e.el.getAttribute("data-cookie-value"),domain:e.el.getAttribute("data-cookie-domain")}),gu={updated(){let e=mu(this);du(e),pu(this)&&hu(e)}},fr=gu;var wu=e=>{if(!navigator.clipboard)e.select(),e.setSelectionRange(0,99999),document.execCommand("copy");else{let t=e.value;navigator.clipboard.writeText(t)}},Su={mounted(){this.el.querySelector(".btn-primary").addEventListener("click",e=>{let t=this.el.querySelector("textarea");wu(t);let n=this.el.querySelector(".copy-indicator");n.setAttribute("data-enabled","false"),n.offsetWidth,n.setAttribute("data-enabled","true")})}},hr=Su;var vu={updated(){if(this.el.querySelector(".logger-autoscroll-checkbox").checked){let e=this.el.querySelector("#logger-messages");e.scrollTop=e.scrollHeight}}},dr=vu;var mr=".progress-bar, .color-bar-legend-entry",sn,pr=e=>{e.querySelectorAll(mr).forEach(t=>{if(sn){let n=t.getAttribute("data-name")!==sn;t.setAttribute("data-muted",n)}else t.removeAttribute("data-muted")})},_u={mounted(){this.el.setAttribute("data-highlight-enabled","true"),this.el.querySelectorAll(mr).forEach(e=>e.addEventListener("click",t=>{let n=t.currentTarget.getAttribute("data-name");sn=n===sn?null:n,pr(this.el)}))},updated(){this.el.setAttribute("data-highlight-enabled","true"),pr(this.el)}},gr=_u;var wr="_refresh_data";function Sr(e,t){let n=JSON.stringify(e),s=xu(n);bu(wr,s,t,15768e4)}function rn(){let e=yu(wr);if(e){let t=ku(e);return JSON.parse(t)}else return null}function yu(e){let t=document.cookie.split("; ").find(n=>n.startsWith(`${e}=`));return t?t.replace(`${e}=`,""):null}function bu(e,t,n,s){let r=`${e}=${t};max-age=${s};path=${n}`;document.cookie=r}function xu(e){return btoa(unescape(encodeURIComponent(e)))}function ku(e){return decodeURIComponent(escape(atob(e)))}var Mu={updated(){let e=rn()||{};e[this.el.dataset.page]=this.el.value,Sr(e,this.el.dataset.dashboardMountPath)}},vr=Mu;var Tu={PhxChartComponent:cr,PhxRequestLoggerCookie:fr,PhxRequestLoggerQueryParameter:hr,PhxRequestLoggerMessages:dr,PhxColorBarHighlight:gr,PhxRememberRefresh:vr},Du=document.querySelector("html").getAttribute("phx-socket")||"/live",Cu=document.querySelector("meta[name='csrf-token']").getAttribute("content"),is=new LiveView.LiveSocket(Du,Phoenix.Socket,{hooks:{...Tu,...window.LiveDashboard.customHooks},params:e=>({_csrf_token:Cu,refresh_data:rn()})}),zt=is.socket,Eu=zt.onConnError,ns=!0;zt.onOpen(()=>{ns=!1});zt.onConnError=(...e)=>{ns?(ns=!1,zt.disconnect(null,3e3),zt.transport=Phoenix.LongPoll,zt.connect()):Eu.apply(zt,e)};window.addEventListener("phx:page-loading-start",e=>ss.default.start());window.addEventListener("phx:page-loading-stop",e=>ss.default.done());is.connect();window.liveSocket=is;})();
/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress
* @license MIT */
diff --git a/dist/js/app.js.map b/dist/js/app.js.map
index e6da3c1a..72e3ccd8 100644
--- a/dist/js/app.js.map
+++ b/dist/js/app.js.map
@@ -1,7 +1,7 @@
{
"version": 3,
"sources": ["../../assets/node_modules/nprogress/nprogress.js", "../../assets/js/app.js", "../../assets/js/metrics_live/color_wheel.js", "../../assets/node_modules/uplot/dist/uPlot.esm.js", "../../assets/js/metrics_live/histogram.js", "../../assets/js/metrics_live/index.js", "../../assets/js/request_logger_cookie/index.js", "../../assets/js/request_logger_query_parameter/index.js", "../../assets/js/request_logger_messages/index.js", "../../assets/js/color_bar_highlight/index.js", "../../assets/js/refresh/index.js", "../../assets/js/remember_refresh/index.js"],
- "sourcesContent": ["/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress\n * @license MIT */\n\n;(function(root, factory) {\n\n if (typeof define === 'function' && define.amd) {\n define(factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.NProgress = factory();\n }\n\n})(this, function() {\n var NProgress = {};\n\n NProgress.version = '0.2.0';\n\n var Settings = NProgress.settings = {\n minimum: 0.08,\n easing: 'ease',\n positionUsing: '',\n speed: 200,\n trickle: true,\n trickleRate: 0.02,\n trickleSpeed: 800,\n showSpinner: true,\n barSelector: '[role=\"bar\"]',\n spinnerSelector: '[role=\"spinner\"]',\n parent: 'body',\n template: ''\n };\n\n /**\n * Updates configuration.\n *\n * NProgress.configure({\n * minimum: 0.1\n * });\n */\n NProgress.configure = function(options) {\n var key, value;\n for (key in options) {\n value = options[key];\n if (value !== undefined && options.hasOwnProperty(key)) Settings[key] = value;\n }\n\n return this;\n };\n\n /**\n * Last number.\n */\n\n NProgress.status = null;\n\n /**\n * Sets the progress bar status, where `n` is a number from `0.0` to `1.0`.\n *\n * NProgress.set(0.4);\n * NProgress.set(1.0);\n */\n\n NProgress.set = function(n) {\n var started = NProgress.isStarted();\n\n n = clamp(n, Settings.minimum, 1);\n NProgress.status = (n === 1 ? null : n);\n\n var progress = NProgress.render(!started),\n bar = progress.querySelector(Settings.barSelector),\n speed = Settings.speed,\n ease = Settings.easing;\n\n progress.offsetWidth; /* Repaint */\n\n queue(function(next) {\n // Set positionUsing if it hasn't already been set\n if (Settings.positionUsing === '') Settings.positionUsing = NProgress.getPositioningCSS();\n\n // Add transition\n css(bar, barPositionCSS(n, speed, ease));\n\n if (n === 1) {\n // Fade out\n css(progress, { \n transition: 'none', \n opacity: 1 \n });\n progress.offsetWidth; /* Repaint */\n\n setTimeout(function() {\n css(progress, { \n transition: 'all ' + speed + 'ms linear', \n opacity: 0 \n });\n setTimeout(function() {\n NProgress.remove();\n next();\n }, speed);\n }, speed);\n } else {\n setTimeout(next, speed);\n }\n });\n\n return this;\n };\n\n NProgress.isStarted = function() {\n return typeof NProgress.status === 'number';\n };\n\n /**\n * Shows the progress bar.\n * This is the same as setting the status to 0%, except that it doesn't go backwards.\n *\n * NProgress.start();\n *\n */\n NProgress.start = function() {\n if (!NProgress.status) NProgress.set(0);\n\n var work = function() {\n setTimeout(function() {\n if (!NProgress.status) return;\n NProgress.trickle();\n work();\n }, Settings.trickleSpeed);\n };\n\n if (Settings.trickle) work();\n\n return this;\n };\n\n /**\n * Hides the progress bar.\n * This is the *sort of* the same as setting the status to 100%, with the\n * difference being `done()` makes some placebo effect of some realistic motion.\n *\n * NProgress.done();\n *\n * If `true` is passed, it will show the progress bar even if its hidden.\n *\n * NProgress.done(true);\n */\n\n NProgress.done = function(force) {\n if (!force && !NProgress.status) return this;\n\n return NProgress.inc(0.3 + 0.5 * Math.random()).set(1);\n };\n\n /**\n * Increments by a random amount.\n */\n\n NProgress.inc = function(amount) {\n var n = NProgress.status;\n\n if (!n) {\n return NProgress.start();\n } else {\n if (typeof amount !== 'number') {\n amount = (1 - n) * clamp(Math.random() * n, 0.1, 0.95);\n }\n\n n = clamp(n + amount, 0, 0.994);\n return NProgress.set(n);\n }\n };\n\n NProgress.trickle = function() {\n return NProgress.inc(Math.random() * Settings.trickleRate);\n };\n\n /**\n * Waits for all supplied jQuery promises and\n * increases the progress as the promises resolve.\n *\n * @param $promise jQUery Promise\n */\n (function() {\n var initial = 0, current = 0;\n\n NProgress.promise = function($promise) {\n if (!$promise || $promise.state() === \"resolved\") {\n return this;\n }\n\n if (current === 0) {\n NProgress.start();\n }\n\n initial++;\n current++;\n\n $promise.always(function() {\n current--;\n if (current === 0) {\n initial = 0;\n NProgress.done();\n } else {\n NProgress.set((initial - current) / initial);\n }\n });\n\n return this;\n };\n\n })();\n\n /**\n * (Internal) renders the progress bar markup based on the `template`\n * setting.\n */\n\n NProgress.render = function(fromStart) {\n if (NProgress.isRendered()) return document.getElementById('nprogress');\n\n addClass(document.documentElement, 'nprogress-busy');\n \n var progress = document.createElement('div');\n progress.id = 'nprogress';\n progress.innerHTML = Settings.template;\n\n var bar = progress.querySelector(Settings.barSelector),\n perc = fromStart ? '-100' : toBarPerc(NProgress.status || 0),\n parent = document.querySelector(Settings.parent),\n spinner;\n \n css(bar, {\n transition: 'all 0 linear',\n transform: 'translate3d(' + perc + '%,0,0)'\n });\n\n if (!Settings.showSpinner) {\n spinner = progress.querySelector(Settings.spinnerSelector);\n spinner && removeElement(spinner);\n }\n\n if (parent != document.body) {\n addClass(parent, 'nprogress-custom-parent');\n }\n\n parent.appendChild(progress);\n return progress;\n };\n\n /**\n * Removes the element. Opposite of render().\n */\n\n NProgress.remove = function() {\n removeClass(document.documentElement, 'nprogress-busy');\n removeClass(document.querySelector(Settings.parent), 'nprogress-custom-parent');\n var progress = document.getElementById('nprogress');\n progress && removeElement(progress);\n };\n\n /**\n * Checks if the progress bar is rendered.\n */\n\n NProgress.isRendered = function() {\n return !!document.getElementById('nprogress');\n };\n\n /**\n * Determine which positioning CSS rule to use.\n */\n\n NProgress.getPositioningCSS = function() {\n // Sniff on document.body.style\n var bodyStyle = document.body.style;\n\n // Sniff prefixes\n var vendorPrefix = ('WebkitTransform' in bodyStyle) ? 'Webkit' :\n ('MozTransform' in bodyStyle) ? 'Moz' :\n ('msTransform' in bodyStyle) ? 'ms' :\n ('OTransform' in bodyStyle) ? 'O' : '';\n\n if (vendorPrefix + 'Perspective' in bodyStyle) {\n // Modern browsers with 3D support, e.g. Webkit, IE10\n return 'translate3d';\n } else if (vendorPrefix + 'Transform' in bodyStyle) {\n // Browsers without 3D support, e.g. IE9\n return 'translate';\n } else {\n // Browsers without translate() support, e.g. IE7-8\n return 'margin';\n }\n };\n\n /**\n * Helpers\n */\n\n function clamp(n, min, max) {\n if (n < min) return min;\n if (n > max) return max;\n return n;\n }\n\n /**\n * (Internal) converts a percentage (`0..1`) to a bar translateX\n * percentage (`-100%..0%`).\n */\n\n function toBarPerc(n) {\n return (-1 + n) * 100;\n }\n\n\n /**\n * (Internal) returns the correct CSS for changing the bar's\n * position given an n percentage, and speed and ease from Settings\n */\n\n function barPositionCSS(n, speed, ease) {\n var barCSS;\n\n if (Settings.positionUsing === 'translate3d') {\n barCSS = { transform: 'translate3d('+toBarPerc(n)+'%,0,0)' };\n } else if (Settings.positionUsing === 'translate') {\n barCSS = { transform: 'translate('+toBarPerc(n)+'%,0)' };\n } else {\n barCSS = { 'margin-left': toBarPerc(n)+'%' };\n }\n\n barCSS.transition = 'all '+speed+'ms '+ease;\n\n return barCSS;\n }\n\n /**\n * (Internal) Queues a function to be executed.\n */\n\n var queue = (function() {\n var pending = [];\n \n function next() {\n var fn = pending.shift();\n if (fn) {\n fn(next);\n }\n }\n\n return function(fn) {\n pending.push(fn);\n if (pending.length == 1) next();\n };\n })();\n\n /**\n * (Internal) Applies css properties to an element, similar to the jQuery \n * css method.\n *\n * While this helper does assist with vendor prefixed property names, it \n * does not perform any manipulation of values prior to setting styles.\n */\n\n var css = (function() {\n var cssPrefixes = [ 'Webkit', 'O', 'Moz', 'ms' ],\n cssProps = {};\n\n function camelCase(string) {\n return string.replace(/^-ms-/, 'ms-').replace(/-([\\da-z])/gi, function(match, letter) {\n return letter.toUpperCase();\n });\n }\n\n function getVendorProp(name) {\n var style = document.body.style;\n if (name in style) return name;\n\n var i = cssPrefixes.length,\n capName = name.charAt(0).toUpperCase() + name.slice(1),\n vendorName;\n while (i--) {\n vendorName = cssPrefixes[i] + capName;\n if (vendorName in style) return vendorName;\n }\n\n return name;\n }\n\n function getStyleProp(name) {\n name = camelCase(name);\n return cssProps[name] || (cssProps[name] = getVendorProp(name));\n }\n\n function applyCss(element, prop, value) {\n prop = getStyleProp(prop);\n element.style[prop] = value;\n }\n\n return function(element, properties) {\n var args = arguments,\n prop, \n value;\n\n if (args.length == 2) {\n for (prop in properties) {\n value = properties[prop];\n if (value !== undefined && properties.hasOwnProperty(prop)) applyCss(element, prop, value);\n }\n } else {\n applyCss(element, args[1], args[2]);\n }\n }\n })();\n\n /**\n * (Internal) Determines if an element or space separated list of class names contains a class name.\n */\n\n function hasClass(element, name) {\n var list = typeof element == 'string' ? element : classList(element);\n return list.indexOf(' ' + name + ' ') >= 0;\n }\n\n /**\n * (Internal) Adds a class to an element.\n */\n\n function addClass(element, name) {\n var oldList = classList(element),\n newList = oldList + name;\n\n if (hasClass(oldList, name)) return; \n\n // Trim the opening space.\n element.className = newList.substring(1);\n }\n\n /**\n * (Internal) Removes a class from an element.\n */\n\n function removeClass(element, name) {\n var oldList = classList(element),\n newList;\n\n if (!hasClass(element, name)) return;\n\n // Replace the class name.\n newList = oldList.replace(' ' + name + ' ', ' ');\n\n // Trim the opening and closing spaces.\n element.className = newList.substring(1, newList.length - 1);\n }\n\n /**\n * (Internal) Gets a space separated list of the class names on the element. \n * The list is wrapped with a single space on each end to facilitate finding \n * matches within the list.\n */\n\n function classList(element) {\n return (' ' + (element.className || '') + ' ').replace(/\\s+/gi, ' ');\n }\n\n /**\n * (Internal) Removes an element from the DOM.\n */\n\n function removeElement(element) {\n element && element.parentNode && element.parentNode.removeChild(element);\n }\n\n return NProgress;\n});\n\n", "// Note: Phoenix JS dependencies are loaded\n// from their Application directories by the Assets module\nimport NProgress from \"nprogress\"\nimport PhxChartComponent from \"./metrics_live\"\nimport PhxRequestLoggerCookie from \"./request_logger_cookie\"\nimport PhxRequestLoggerQueryParameter from \"./request_logger_query_parameter\"\nimport PhxRequestLoggerMessages from \"./request_logger_messages\"\nimport PhxColorBarHighlight from \"./color_bar_highlight\"\nimport PhxRememberRefresh from \"./remember_refresh\"\nimport { loadRefreshData } from \"./refresh\";\n\nlet Hooks = {\n PhxChartComponent: PhxChartComponent,\n PhxRequestLoggerCookie: PhxRequestLoggerCookie,\n PhxRequestLoggerQueryParameter: PhxRequestLoggerQueryParameter,\n PhxRequestLoggerMessages: PhxRequestLoggerMessages,\n PhxColorBarHighlight: PhxColorBarHighlight,\n PhxRememberRefresh: PhxRememberRefresh\n}\n\nlet socketPath = document.querySelector(\"html\").getAttribute(\"phx-socket\") || \"/live\"\nlet csrfToken = document.querySelector(\"meta[name='csrf-token']\").getAttribute(\"content\")\nlet liveSocket = new LiveView.LiveSocket(socketPath, Phoenix.Socket, {\n hooks: Hooks,\n params: (liveViewName) => {\n return {\n _csrf_token: csrfToken,\n // Pass the most recent refresh data to the LiveView in `connect_params`\n refresh_data: loadRefreshData(),\n };\n },\n})\n\n\nconst socket = liveSocket.socket\nconst originalOnConnError = socket.onConnError\nlet fallbackToLongPoll = true\n\nsocket.onOpen(() => {\n fallbackToLongPoll = false\n})\n\nsocket.onConnError = (...args) => {\n if (fallbackToLongPoll) {\n // No longer fallback to longpoll\n fallbackToLongPoll = false\n // close the socket with an error code\n socket.disconnect(null, 3000)\n // fall back to long poll\n socket.transport = Phoenix.LongPoll\n // reopen\n socket.connect()\n } else {\n originalOnConnError.apply(socket, args)\n }\n}\n\n// Show progress bar on live navigation and form submits\nwindow.addEventListener(\"phx:page-loading-start\", info => NProgress.start())\nwindow.addEventListener(\"phx:page-loading-stop\", info => NProgress.done())\n\n// connect if there are any LiveViews on the page\nliveSocket.connect()\n\n// expose liveSocket on window for web console debug logs and latency simulation:\n// >> liveSocket.enableDebug()\n// >> liveSocket.enableLatencySim(1000)\nwindow.liveSocket = liveSocket\n", "const COLORS = {\n phoenix: [242, 110, 64],\n elixir: [75, 68, 115],\n red: [255, 99, 132],\n orange: [255, 159, 64],\n yellow: [255, 205, 86],\n green: [75, 192, 192],\n blue: [54, 162, 253],\n purple: [153, 102, 255],\n grey: [201, 203, 207],\n}\n\nconst COLOR_NAMES = Object.keys(COLORS)\n\nexport const ColorWheel = {\n at: (i) => {\n const [r, g, b] = ColorWheel.rgb(i)\n return `rgb(${r}, ${g}, ${b})`\n },\n rgb: (i) => COLORS[COLOR_NAMES[i % COLOR_NAMES.length]],\n}\n\nexport const LineColor = {\n at: (i) => {\n const [r, g, b] = ColorWheel.rgb(i)\n return {\n stroke: `rgb(${r}, ${g}, ${b})`,\n fill: `rgb(${r}, ${g}, ${b}, 0.1)`\n }\n }\n}\n\nexport default ColorWheel\n", "/**\n* Copyright (c) 2022, Leon Sorokin\n* All rights reserved. (MIT Licensed)\n*\n* uPlot.js (\u03BCPlot)\n* A small, fast chart for time series, lines, areas, ohlc & bars\n* https://github.com/leeoniya/uPlot (v1.6.22)\n*/\n\nconst FEAT_TIME = true;\n\nconst pre = \"u-\";\n\nconst UPLOT = \"uplot\";\nconst ORI_HZ = pre + \"hz\";\nconst ORI_VT = pre + \"vt\";\nconst TITLE = pre + \"title\";\nconst WRAP = pre + \"wrap\";\nconst UNDER = pre + \"under\";\nconst OVER = pre + \"over\";\nconst AXIS = pre + \"axis\";\nconst OFF = pre + \"off\";\nconst SELECT = pre + \"select\";\nconst CURSOR_X = pre + \"cursor-x\";\nconst CURSOR_Y = pre + \"cursor-y\";\nconst CURSOR_PT = pre + \"cursor-pt\";\nconst LEGEND = pre + \"legend\";\nconst LEGEND_LIVE = pre + \"live\";\nconst LEGEND_INLINE = pre + \"inline\";\nconst LEGEND_THEAD = pre + \"thead\";\nconst LEGEND_SERIES = pre + \"series\";\nconst LEGEND_MARKER = pre + \"marker\";\nconst LEGEND_LABEL = pre + \"label\";\nconst LEGEND_VALUE = pre + \"value\";\n\nconst WIDTH = \"width\";\nconst HEIGHT = \"height\";\nconst TOP = \"top\";\nconst BOTTOM = \"bottom\";\nconst LEFT = \"left\";\nconst RIGHT = \"right\";\nconst hexBlack = \"#000\";\nconst transparent = hexBlack + \"0\";\n\nconst mousemove = \"mousemove\";\nconst mousedown = \"mousedown\";\nconst mouseup = \"mouseup\";\nconst mouseenter = \"mouseenter\";\nconst mouseleave = \"mouseleave\";\nconst dblclick = \"dblclick\";\nconst resize = \"resize\";\nconst scroll = \"scroll\";\n\nconst change = \"change\";\nconst dppxchange = \"dppxchange\";\n\nconst domEnv = typeof window != 'undefined';\n\nconst doc = domEnv ? document : null;\nconst win = domEnv ? window : null;\nconst nav = domEnv ? navigator : null;\n\nlet pxRatio;\n\nlet query;\n\nfunction setPxRatio() {\n\tlet _pxRatio = devicePixelRatio;\n\n\t// during print preview, Chrome fires off these dppx queries even without changes\n\tif (pxRatio != _pxRatio) {\n\t\tpxRatio = _pxRatio;\n\n\t\tquery && off(change, query, setPxRatio);\n\t\tquery = matchMedia(`(min-resolution: ${pxRatio - 0.001}dppx) and (max-resolution: ${pxRatio + 0.001}dppx)`);\n\t\ton(change, query, setPxRatio);\n\n\t\twin.dispatchEvent(new CustomEvent(dppxchange));\n\t}\n}\n\nfunction addClass(el, c) {\n\tif (c != null) {\n\t\tlet cl = el.classList;\n\t\t!cl.contains(c) && cl.add(c);\n\t}\n}\n\nfunction remClass(el, c) {\n\tlet cl = el.classList;\n\tcl.contains(c) && cl.remove(c);\n}\n\nfunction setStylePx(el, name, value) {\n\tel.style[name] = value + \"px\";\n}\n\nfunction placeTag(tag, cls, targ, refEl) {\n\tlet el = doc.createElement(tag);\n\n\tif (cls != null)\n\t\taddClass(el, cls);\n\n\tif (targ != null)\n\t\ttarg.insertBefore(el, refEl);\n\n\treturn el;\n}\n\nfunction placeDiv(cls, targ) {\n\treturn placeTag(\"div\", cls, targ);\n}\n\nconst xformCache = new WeakMap();\n\nfunction elTrans(el, xPos, yPos, xMax, yMax) {\n\tlet xform = \"translate(\" + xPos + \"px,\" + yPos + \"px)\";\n\tlet xformOld = xformCache.get(el);\n\n\tif (xform != xformOld) {\n\t\tel.style.transform = xform;\n\t\txformCache.set(el, xform);\n\n\t\tif (xPos < 0 || yPos < 0 || xPos > xMax || yPos > yMax)\n\t\t\taddClass(el, OFF);\n\t\telse\n\t\t\tremClass(el, OFF);\n\t}\n}\n\nconst colorCache = new WeakMap();\n\nfunction elColor(el, background, borderColor) {\n\tlet newColor = background + borderColor;\n\tlet oldColor = colorCache.get(el);\n\n\tif (newColor != oldColor) {\n\t\tcolorCache.set(el, newColor);\n\t\tel.style.background = background;\n\t\tel.style.borderColor = borderColor;\n\t}\n}\n\nconst sizeCache = new WeakMap();\n\nfunction elSize(el, newWid, newHgt, centered) {\n\tlet newSize = newWid + \"\" + newHgt;\n\tlet oldSize = sizeCache.get(el);\n\n\tif (newSize != oldSize) {\n\t\tsizeCache.set(el, newSize);\n\t\tel.style.height = newHgt + \"px\";\n\t\tel.style.width = newWid + \"px\";\n\t\tel.style.marginLeft = centered ? -newWid/2 + \"px\" : 0;\n\t\tel.style.marginTop = centered ? -newHgt/2 + \"px\" : 0;\n\t}\n}\n\nconst evOpts = {passive: true};\nconst evOpts2 = {...evOpts, capture: true};\n\nfunction on(ev, el, cb, capt) {\n\tel.addEventListener(ev, cb, capt ? evOpts2 : evOpts);\n}\n\nfunction off(ev, el, cb, capt) {\n\tel.removeEventListener(ev, cb, capt ? evOpts2 : evOpts);\n}\n\ndomEnv && setPxRatio();\n\n// binary search for index of closest value\nfunction closestIdx(num, arr, lo, hi) {\n\tlet mid;\n\tlo = lo || 0;\n\thi = hi || arr.length - 1;\n\tlet bitwise = hi <= 2147483647;\n\n\twhile (hi - lo > 1) {\n\t\tmid = bitwise ? (lo + hi) >> 1 : floor((lo + hi) / 2);\n\n\t\tif (arr[mid] < num)\n\t\t\tlo = mid;\n\t\telse\n\t\t\thi = mid;\n\t}\n\n\tif (num - arr[lo] <= arr[hi] - num)\n\t\treturn lo;\n\n\treturn hi;\n}\n\nfunction nonNullIdx(data, _i0, _i1, dir) {\n\tfor (let i = dir == 1 ? _i0 : _i1; i >= _i0 && i <= _i1; i += dir) {\n\t\tif (data[i] != null)\n\t\t\treturn i;\n\t}\n\n\treturn -1;\n}\n\nfunction getMinMax(data, _i0, _i1, sorted) {\n//\tconsole.log(\"getMinMax()\");\n\n\tlet _min = inf;\n\tlet _max = -inf;\n\n\tif (sorted == 1) {\n\t\t_min = data[_i0];\n\t\t_max = data[_i1];\n\t}\n\telse if (sorted == -1) {\n\t\t_min = data[_i1];\n\t\t_max = data[_i0];\n\t}\n\telse {\n\t\tfor (let i = _i0; i <= _i1; i++) {\n\t\t\tif (data[i] != null) {\n\t\t\t\t_min = min(_min, data[i]);\n\t\t\t\t_max = max(_max, data[i]);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn [_min, _max];\n}\n\nfunction getMinMaxLog(data, _i0, _i1) {\n//\tconsole.log(\"getMinMax()\");\n\n\tlet _min = inf;\n\tlet _max = -inf;\n\n\tfor (let i = _i0; i <= _i1; i++) {\n\t\tif (data[i] > 0) {\n\t\t\t_min = min(_min, data[i]);\n\t\t\t_max = max(_max, data[i]);\n\t\t}\n\t}\n\n\treturn [\n\t\t_min == inf ? 1 : _min,\n\t\t_max == -inf ? 10 : _max,\n\t];\n}\n\nconst _fixedTuple = [0, 0];\n\nfunction fixIncr(minIncr, maxIncr, minExp, maxExp) {\n\t_fixedTuple[0] = minExp < 0 ? roundDec(minIncr, -minExp) : minIncr;\n\t_fixedTuple[1] = maxExp < 0 ? roundDec(maxIncr, -maxExp) : maxIncr;\n\treturn _fixedTuple;\n}\n\nfunction rangeLog(min, max, base, fullMags) {\n\tlet minSign = sign(min);\n\n\tlet logFn = base == 10 ? log10 : log2;\n\n\tif (min == max) {\n\t\tif (minSign == -1) {\n\t\t\tmin *= base;\n\t\t\tmax /= base;\n\t\t}\n\t\telse {\n\t\t\tmin /= base;\n\t\t\tmax *= base;\n\t\t}\n\t}\n\n\tlet minExp, maxExp, minMaxIncrs;\n\n\tif (fullMags) {\n\t\tminExp = floor(logFn(min));\n\t\tmaxExp = ceil(logFn(max));\n\n\t\tminMaxIncrs = fixIncr(pow(base, minExp), pow(base, maxExp), minExp, maxExp);\n\n\t\tmin = minMaxIncrs[0];\n\t\tmax = minMaxIncrs[1];\n\t}\n\telse {\n\t\tminExp = floor(logFn(abs(min)));\n\t\tmaxExp = floor(logFn(abs(max)));\n\n\t\tminMaxIncrs = fixIncr(pow(base, minExp), pow(base, maxExp), minExp, maxExp);\n\n\t\tmin = incrRoundDn(min, minMaxIncrs[0]);\n\t\tmax = incrRoundUp(max, minMaxIncrs[1]);\n\t}\n\n\treturn [min, max];\n}\n\nfunction rangeAsinh(min, max, base, fullMags) {\n\tlet minMax = rangeLog(min, max, base, fullMags);\n\n\tif (min == 0)\n\t\tminMax[0] = 0;\n\n\tif (max == 0)\n\t\tminMax[1] = 0;\n\n\treturn minMax;\n}\n\nconst rangePad = 0.1;\n\nconst autoRangePart = {\n\tmode: 3,\n\tpad: rangePad,\n};\n\nconst _eqRangePart = {\n\tpad: 0,\n\tsoft: null,\n\tmode: 0,\n};\n\nconst _eqRange = {\n\tmin: _eqRangePart,\n\tmax: _eqRangePart,\n};\n\n// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below\n// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value\nfunction rangeNum(_min, _max, mult, extra) {\n\tif (isObj(mult))\n\t\treturn _rangeNum(_min, _max, mult);\n\n\t_eqRangePart.pad = mult;\n\t_eqRangePart.soft = extra ? 0 : null;\n\t_eqRangePart.mode = extra ? 3 : 0;\n\n\treturn _rangeNum(_min, _max, _eqRange);\n}\n\n// nullish coalesce\nfunction ifNull(lh, rh) {\n\treturn lh == null ? rh : lh;\n}\n\n// checks if given index range in an array contains a non-null value\n// aka a range-bounded Array.some()\nfunction hasData(data, idx0, idx1) {\n\tidx0 = ifNull(idx0, 0);\n\tidx1 = ifNull(idx1, data.length - 1);\n\n\twhile (idx0 <= idx1) {\n\t\tif (data[idx0] != null)\n\t\t\treturn true;\n\t\tidx0++;\n\t}\n\n\treturn false;\n}\n\nfunction _rangeNum(_min, _max, cfg) {\n\tlet cmin = cfg.min;\n\tlet cmax = cfg.max;\n\n\tlet padMin = ifNull(cmin.pad, 0);\n\tlet padMax = ifNull(cmax.pad, 0);\n\n\tlet hardMin = ifNull(cmin.hard, -inf);\n\tlet hardMax = ifNull(cmax.hard, inf);\n\n\tlet softMin = ifNull(cmin.soft, inf);\n\tlet softMax = ifNull(cmax.soft, -inf);\n\n\tlet softMinMode = ifNull(cmin.mode, 0);\n\tlet softMaxMode = ifNull(cmax.mode, 0);\n\n\tlet delta = _max - _min;\n\n\t// this handles situations like 89.7, 89.69999999999999\n\t// by assuming 0.001x deltas are precision errors\n//\tif (delta > 0 && delta < abs(_max) / 1e3)\n//\t\tdelta = 0;\n\n\t// treat data as flat if delta is less than 1 billionth\n\tif (delta < 1e-9) {\n\t\tdelta = 0;\n\n\t\t// if soft mode is 2 and all vals are flat at 0, avoid the 0.1 * 1e3 fallback\n\t\t// this prevents 0,0,0 from ranging to -100,100 when softMin/softMax are -1,1\n\t\tif (_min == 0 || _max == 0) {\n\t\t\tdelta = 1e-9;\n\n\t\t\tif (softMinMode == 2 && softMin != inf)\n\t\t\t\tpadMin = 0;\n\n\t\t\tif (softMaxMode == 2 && softMax != -inf)\n\t\t\t\tpadMax = 0;\n\t\t}\n\t}\n\n\tlet nonZeroDelta = delta || abs(_max) || 1e3;\n\tlet mag = log10(nonZeroDelta);\n\tlet base = pow(10, floor(mag));\n\n\tlet _padMin = nonZeroDelta * (delta == 0 ? (_min == 0 ? .1 : 1) : padMin);\n\tlet _newMin = roundDec(incrRoundDn(_min - _padMin, base/10), 9);\n\tlet _softMin = _min >= softMin && (softMinMode == 1 || softMinMode == 3 && _newMin <= softMin || softMinMode == 2 && _newMin >= softMin) ? softMin : inf;\n\tlet minLim = max(hardMin, _newMin < _softMin && _min >= _softMin ? _softMin : min(_softMin, _newMin));\n\n\tlet _padMax = nonZeroDelta * (delta == 0 ? (_max == 0 ? .1 : 1) : padMax);\n\tlet _newMax = roundDec(incrRoundUp(_max + _padMax, base/10), 9);\n\tlet _softMax = _max <= softMax && (softMaxMode == 1 || softMaxMode == 3 && _newMax >= softMax || softMaxMode == 2 && _newMax <= softMax) ? softMax : -inf;\n\tlet maxLim = min(hardMax, _newMax > _softMax && _max <= _softMax ? _softMax : max(_softMax, _newMax));\n\n\tif (minLim == maxLim && minLim == 0)\n\t\tmaxLim = 100;\n\n\treturn [minLim, maxLim];\n}\n\n// alternative: https://stackoverflow.com/a/2254896\nconst numFormatter = new Intl.NumberFormat(domEnv ? nav.language : 'en-US');\nconst fmtNum = val => numFormatter.format(val);\n\nconst M = Math;\n\nconst PI = M.PI;\nconst abs = M.abs;\nconst floor = M.floor;\nconst round = M.round;\nconst ceil = M.ceil;\nconst min = M.min;\nconst max = M.max;\nconst pow = M.pow;\nconst sign = M.sign;\nconst log10 = M.log10;\nconst log2 = M.log2;\n// TODO: seems like this needs to match asinh impl if the passed v is tweaked?\nconst sinh = (v, linthresh = 1) => M.sinh(v) * linthresh;\nconst asinh = (v, linthresh = 1) => M.asinh(v / linthresh);\n\nconst inf = Infinity;\n\nfunction numIntDigits(x) {\n\treturn (log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1;\n}\n\nfunction incrRound(num, incr) {\n\treturn round(num/incr)*incr;\n}\n\nfunction clamp(num, _min, _max) {\n\treturn min(max(num, _min), _max);\n}\n\nfunction fnOrSelf(v) {\n\treturn typeof v == \"function\" ? v : () => v;\n}\n\nconst retArg0 = _0 => _0;\n\nconst retArg1 = (_0, _1) => _1;\n\nconst retNull = _ => null;\n\nconst retTrue = _ => true;\n\nconst retEq = (a, b) => a == b;\n\nfunction incrRoundUp(num, incr) {\n\treturn ceil(num/incr)*incr;\n}\n\nfunction incrRoundDn(num, incr) {\n\treturn floor(num/incr)*incr;\n}\n\nfunction roundDec(val, dec) {\n\treturn round(val * (dec = 10**dec)) / dec;\n}\n\nconst fixedDec = new Map();\n\nfunction guessDec(num) {\n\treturn ((\"\"+num).split(\".\")[1] || \"\").length;\n}\n\nfunction genIncrs(base, minExp, maxExp, mults) {\n\tlet incrs = [];\n\n\tlet multDec = mults.map(guessDec);\n\n\tfor (let exp = minExp; exp < maxExp; exp++) {\n\t\tlet expa = abs(exp);\n\t\tlet mag = roundDec(pow(base, exp), expa);\n\n\t\tfor (let i = 0; i < mults.length; i++) {\n\t\t\tlet _incr = mults[i] * mag;\n\t\t\tlet dec = (_incr >= 0 && exp >= 0 ? 0 : expa) + (exp >= multDec[i] ? 0 : multDec[i]);\n\t\t\tlet incr = roundDec(_incr, dec);\n\t\t\tincrs.push(incr);\n\t\t\tfixedDec.set(incr, dec);\n\t\t}\n\t}\n\n\treturn incrs;\n}\n\n//export const assign = Object.assign;\n\nconst EMPTY_OBJ = {};\nconst EMPTY_ARR = [];\n\nconst nullNullTuple = [null, null];\n\nconst isArr = Array.isArray;\n\nfunction isStr(v) {\n\treturn typeof v == 'string';\n}\n\nfunction isObj(v) {\n\tlet is = false;\n\n\tif (v != null) {\n\t\tlet c = v.constructor;\n\t\tis = c == null || c == Object;\n\t}\n\n\treturn is;\n}\n\nfunction fastIsObj(v) {\n\treturn v != null && typeof v == 'object';\n}\n\nconst TypedArray = Object.getPrototypeOf(Uint8Array);\n\nfunction copy(o, _isObj = isObj) {\n\tlet out;\n\n\tif (isArr(o)) {\n\t\tlet val = o.find(v => v != null);\n\n\t\tif (isArr(val) || _isObj(val)) {\n\t\t\tout = Array(o.length);\n\t\t\tfor (let i = 0; i < o.length; i++)\n\t\t\t\tout[i] = copy(o[i], _isObj);\n\t\t}\n\t\telse\n\t\t\tout = o.slice();\n\t}\n\telse if (o instanceof TypedArray) // also (ArrayBuffer.isView(o) && !(o instanceof DataView))\n\t\tout = o.slice();\n\telse if (_isObj(o)) {\n\t\tout = {};\n\t\tfor (let k in o)\n\t\t\tout[k] = copy(o[k], _isObj);\n\t}\n\telse\n\t\tout = o;\n\n\treturn out;\n}\n\nfunction assign(targ) {\n\tlet args = arguments;\n\n\tfor (let i = 1; i < args.length; i++) {\n\t\tlet src = args[i];\n\n\t\tfor (let key in src) {\n\t\t\tif (isObj(targ[key]))\n\t\t\t\tassign(targ[key], copy(src[key]));\n\t\t\telse\n\t\t\t\ttarg[key] = copy(src[key]);\n\t\t}\n\t}\n\n\treturn targ;\n}\n\n// nullModes\nconst NULL_REMOVE = 0; // nulls are converted to undefined (e.g. for spanGaps: true)\nconst NULL_RETAIN = 1; // nulls are retained, with alignment artifacts set to undefined (default)\nconst NULL_EXPAND = 2; // nulls are expanded to include any adjacent alignment artifacts\n\n// sets undefined values to nulls when adjacent to existing nulls (minesweeper)\nfunction nullExpand(yVals, nullIdxs, alignedLen) {\n\tfor (let i = 0, xi, lastNullIdx = -1; i < nullIdxs.length; i++) {\n\t\tlet nullIdx = nullIdxs[i];\n\n\t\tif (nullIdx > lastNullIdx) {\n\t\t\txi = nullIdx - 1;\n\t\t\twhile (xi >= 0 && yVals[xi] == null)\n\t\t\t\tyVals[xi--] = null;\n\n\t\t\txi = nullIdx + 1;\n\t\t\twhile (xi < alignedLen && yVals[xi] == null)\n\t\t\t\tyVals[lastNullIdx = xi++] = null;\n\t\t}\n\t}\n}\n\n// nullModes is a tables-matched array indicating how to treat nulls in each series\n// output is sorted ASC on the joined field (table[0]) and duplicate join values are collapsed\nfunction join(tables, nullModes) {\n\tlet xVals = new Set();\n\n\tfor (let ti = 0; ti < tables.length; ti++) {\n\t\tlet t = tables[ti];\n\t\tlet xs = t[0];\n\t\tlet len = xs.length;\n\n\t\tfor (let i = 0; i < len; i++)\n\t\t\txVals.add(xs[i]);\n\t}\n\n\tlet data = [Array.from(xVals).sort((a, b) => a - b)];\n\n\tlet alignedLen = data[0].length;\n\n\tlet xIdxs = new Map();\n\n\tfor (let i = 0; i < alignedLen; i++)\n\t\txIdxs.set(data[0][i], i);\n\n\tfor (let ti = 0; ti < tables.length; ti++) {\n\t\tlet t = tables[ti];\n\t\tlet xs = t[0];\n\n\t\tfor (let si = 1; si < t.length; si++) {\n\t\t\tlet ys = t[si];\n\n\t\t\tlet yVals = Array(alignedLen).fill(undefined);\n\n\t\t\tlet nullMode = nullModes ? nullModes[ti][si] : NULL_RETAIN;\n\n\t\t\tlet nullIdxs = [];\n\n\t\t\tfor (let i = 0; i < ys.length; i++) {\n\t\t\t\tlet yVal = ys[i];\n\t\t\t\tlet alignedIdx = xIdxs.get(xs[i]);\n\n\t\t\t\tif (yVal === null) {\n\t\t\t\t\tif (nullMode != NULL_REMOVE) {\n\t\t\t\t\t\tyVals[alignedIdx] = yVal;\n\n\t\t\t\t\t\tif (nullMode == NULL_EXPAND)\n\t\t\t\t\t\t\tnullIdxs.push(alignedIdx);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tyVals[alignedIdx] = yVal;\n\t\t\t}\n\n\t\t\tnullExpand(yVals, nullIdxs, alignedLen);\n\n\t\t\tdata.push(yVals);\n\t\t}\n\t}\n\n\treturn data;\n}\n\nconst microTask = typeof queueMicrotask == \"undefined\" ? fn => Promise.resolve().then(fn) : queueMicrotask;\n\nconst months = [\n\t\"January\",\n\t\"February\",\n\t\"March\",\n\t\"April\",\n\t\"May\",\n\t\"June\",\n\t\"July\",\n\t\"August\",\n\t\"September\",\n\t\"October\",\n\t\"November\",\n\t\"December\",\n];\n\nconst days = [\n\t\"Sunday\",\n\t\"Monday\",\n\t\"Tuesday\",\n\t\"Wednesday\",\n\t\"Thursday\",\n\t\"Friday\",\n\t\"Saturday\",\n];\n\nfunction slice3(str) {\n\treturn str.slice(0, 3);\n}\n\nconst days3 = days.map(slice3);\n\nconst months3 = months.map(slice3);\n\nconst engNames = {\n\tMMMM: months,\n\tMMM: months3,\n\tWWWW: days,\n\tWWW: days3,\n};\n\nfunction zeroPad2(int) {\n\treturn (int < 10 ? '0' : '') + int;\n}\n\nfunction zeroPad3(int) {\n\treturn (int < 10 ? '00' : int < 100 ? '0' : '') + int;\n}\n\n/*\nfunction suffix(int) {\n\tlet mod10 = int % 10;\n\n\treturn int + (\n\t\tmod10 == 1 && int != 11 ? \"st\" :\n\t\tmod10 == 2 && int != 12 ? \"nd\" :\n\t\tmod10 == 3 && int != 13 ? \"rd\" : \"th\"\n\t);\n}\n*/\n\nconst subs = {\n\t// 2019\n\tYYYY:\td => d.getFullYear(),\n\t// 19\n\tYY:\t\td => (d.getFullYear()+'').slice(2),\n\t// July\n\tMMMM:\t(d, names) => names.MMMM[d.getMonth()],\n\t// Jul\n\tMMM:\t(d, names) => names.MMM[d.getMonth()],\n\t// 07\n\tMM:\t\td => zeroPad2(d.getMonth()+1),\n\t// 7\n\tM:\t\td => d.getMonth()+1,\n\t// 09\n\tDD:\t\td => zeroPad2(d.getDate()),\n\t// 9\n\tD:\t\td => d.getDate(),\n\t// Monday\n\tWWWW:\t(d, names) => names.WWWW[d.getDay()],\n\t// Mon\n\tWWW:\t(d, names) => names.WWW[d.getDay()],\n\t// 03\n\tHH:\t\td => zeroPad2(d.getHours()),\n\t// 3\n\tH:\t\td => d.getHours(),\n\t// 9 (12hr, unpadded)\n\th:\t\td => {let h = d.getHours(); return h == 0 ? 12 : h > 12 ? h - 12 : h;},\n\t// AM\n\tAA:\t\td => d.getHours() >= 12 ? 'PM' : 'AM',\n\t// am\n\taa:\t\td => d.getHours() >= 12 ? 'pm' : 'am',\n\t// a\n\ta:\t\td => d.getHours() >= 12 ? 'p' : 'a',\n\t// 09\n\tmm:\t\td => zeroPad2(d.getMinutes()),\n\t// 9\n\tm:\t\td => d.getMinutes(),\n\t// 09\n\tss:\t\td => zeroPad2(d.getSeconds()),\n\t// 9\n\ts:\t\td => d.getSeconds(),\n\t// 374\n\tfff:\td => zeroPad3(d.getMilliseconds()),\n};\n\nfunction fmtDate(tpl, names) {\n\tnames = names || engNames;\n\tlet parts = [];\n\n\tlet R = /\\{([a-z]+)\\}|[^{]+/gi, m;\n\n\twhile (m = R.exec(tpl))\n\t\tparts.push(m[0][0] == '{' ? subs[m[1]] : m[0]);\n\n\treturn d => {\n\t\tlet out = '';\n\n\t\tfor (let i = 0; i < parts.length; i++)\n\t\t\tout += typeof parts[i] == \"string\" ? parts[i] : parts[i](d, names);\n\n\t\treturn out;\n\t}\n}\n\nconst localTz = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n// https://stackoverflow.com/questions/15141762/how-to-initialize-a-javascript-date-to-a-particular-time-zone/53652131#53652131\nfunction tzDate(date, tz) {\n\tlet date2;\n\n\t// perf optimization\n\tif (tz == 'UTC' || tz == 'Etc/UTC')\n\t\tdate2 = new Date(+date + date.getTimezoneOffset() * 6e4);\n\telse if (tz == localTz)\n\t\tdate2 = date;\n\telse {\n\t\tdate2 = new Date(date.toLocaleString('en-US', {timeZone: tz}));\n\t\tdate2.setMilliseconds(date.getMilliseconds());\n\t}\n\n\treturn date2;\n}\n\n//export const series = [];\n\n// default formatters:\n\nconst onlyWhole = v => v % 1 == 0;\n\nconst allMults = [1,2,2.5,5];\n\n// ...0.01, 0.02, 0.025, 0.05, 0.1, 0.2, 0.25, 0.5\nconst decIncrs = genIncrs(10, -16, 0, allMults);\n\n// 1, 2, 2.5, 5, 10, 20, 25, 50...\nconst oneIncrs = genIncrs(10, 0, 16, allMults);\n\n// 1, 2, 5, 10, 20, 25, 50...\nconst wholeIncrs = oneIncrs.filter(onlyWhole);\n\nconst numIncrs = decIncrs.concat(oneIncrs);\n\nconst NL = \"\\n\";\n\nconst yyyy = \"{YYYY}\";\nconst NLyyyy = NL + yyyy;\nconst md = \"{M}/{D}\";\nconst NLmd = NL + md;\nconst NLmdyy = NLmd + \"/{YY}\";\n\nconst aa = \"{aa}\";\nconst hmm = \"{h}:{mm}\";\nconst hmmaa = hmm + aa;\nconst NLhmmaa = NL + hmmaa;\nconst ss = \":{ss}\";\n\nconst _ = null;\n\nfunction genTimeStuffs(ms) {\n\tlet\ts = ms * 1e3,\n\t\tm = s * 60,\n\t\th = m * 60,\n\t\td = h * 24,\n\t\tmo = d * 30,\n\t\ty = d * 365;\n\n\t// min of 1e-3 prevents setting a temporal x ticks too small since Date objects cannot advance ticks smaller than 1ms\n\tlet subSecIncrs = ms == 1 ? genIncrs(10, 0, 3, allMults).filter(onlyWhole) : genIncrs(10, -3, 0, allMults);\n\n\tlet timeIncrs = subSecIncrs.concat([\n\t\t// minute divisors (# of secs)\n\t\ts,\n\t\ts * 5,\n\t\ts * 10,\n\t\ts * 15,\n\t\ts * 30,\n\t\t// hour divisors (# of mins)\n\t\tm,\n\t\tm * 5,\n\t\tm * 10,\n\t\tm * 15,\n\t\tm * 30,\n\t\t// day divisors (# of hrs)\n\t\th,\n\t\th * 2,\n\t\th * 3,\n\t\th * 4,\n\t\th * 6,\n\t\th * 8,\n\t\th * 12,\n\t\t// month divisors TODO: need more?\n\t\td,\n\t\td * 2,\n\t\td * 3,\n\t\td * 4,\n\t\td * 5,\n\t\td * 6,\n\t\td * 7,\n\t\td * 8,\n\t\td * 9,\n\t\td * 10,\n\t\td * 15,\n\t\t// year divisors (# months, approx)\n\t\tmo,\n\t\tmo * 2,\n\t\tmo * 3,\n\t\tmo * 4,\n\t\tmo * 6,\n\t\t// century divisors\n\t\ty,\n\t\ty * 2,\n\t\ty * 5,\n\t\ty * 10,\n\t\ty * 25,\n\t\ty * 50,\n\t\ty * 100,\n\t]);\n\n\t// [0]: minimum num secs in the tick incr\n\t// [1]: default tick format\n\t// [2-7]: rollover tick formats\n\t// [8]: mode: 0: replace [1] -> [2-7], 1: concat [1] + [2-7]\n\tconst _timeAxisStamps = [\n\t// tick incr default year month day hour min sec mode\n\t\t[y, yyyy, _, _, _, _, _, _, 1],\n\t\t[d * 28, \"{MMM}\", NLyyyy, _, _, _, _, _, 1],\n\t\t[d, md, NLyyyy, _, _, _, _, _, 1],\n\t\t[h, \"{h}\" + aa, NLmdyy, _, NLmd, _, _, _, 1],\n\t\t[m, hmmaa, NLmdyy, _, NLmd, _, _, _, 1],\n\t\t[s, ss, NLmdyy + \" \" + hmmaa, _, NLmd + \" \" + hmmaa, _, NLhmmaa, _, 1],\n\t\t[ms, ss + \".{fff}\", NLmdyy + \" \" + hmmaa, _, NLmd + \" \" + hmmaa, _, NLhmmaa, _, 1],\n\t];\n\n\t// the ensures that axis ticks, values & grid are aligned to logical temporal breakpoints and not an arbitrary timestamp\n\t// https://www.timeanddate.com/time/dst/\n\t// https://www.timeanddate.com/time/dst/2019.html\n\t// https://www.epochconverter.com/timezones\n\tfunction timeAxisSplits(tzDate) {\n\t\treturn (self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace) => {\n\t\t\tlet splits = [];\n\t\t\tlet isYr = foundIncr >= y;\n\t\t\tlet isMo = foundIncr >= mo && foundIncr < y;\n\n\t\t\t// get the timezone-adjusted date\n\t\t\tlet minDate = tzDate(scaleMin);\n\t\t\tlet minDateTs = roundDec(minDate * ms, 3);\n\n\t\t\t// get ts of 12am (this lands us at or before the original scaleMin)\n\t\t\tlet minMin = mkDate(minDate.getFullYear(), isYr ? 0 : minDate.getMonth(), isMo || isYr ? 1 : minDate.getDate());\n\t\t\tlet minMinTs = roundDec(minMin * ms, 3);\n\n\t\t\tif (isMo || isYr) {\n\t\t\t\tlet moIncr = isMo ? foundIncr / mo : 0;\n\t\t\t\tlet yrIncr = isYr ? foundIncr / y : 0;\n\t\t\t//\tlet tzOffset = scaleMin - minDateTs;\t\t// needed?\n\t\t\t\tlet split = minDateTs == minMinTs ? minDateTs : roundDec(mkDate(minMin.getFullYear() + yrIncr, minMin.getMonth() + moIncr, 1) * ms, 3);\n\t\t\t\tlet splitDate = new Date(round(split / ms));\n\t\t\t\tlet baseYear = splitDate.getFullYear();\n\t\t\t\tlet baseMonth = splitDate.getMonth();\n\n\t\t\t\tfor (let i = 0; split <= scaleMax; i++) {\n\t\t\t\t\tlet next = mkDate(baseYear + yrIncr * i, baseMonth + moIncr * i, 1);\n\t\t\t\t\tlet offs = next - tzDate(roundDec(next * ms, 3));\n\n\t\t\t\t\tsplit = roundDec((+next + offs) * ms, 3);\n\n\t\t\t\t\tif (split <= scaleMax)\n\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet incr0 = foundIncr >= d ? d : foundIncr;\n\t\t\t\tlet tzOffset = floor(scaleMin) - floor(minDateTs);\n\t\t\t\tlet split = minMinTs + tzOffset + incrRoundUp(minDateTs - minMinTs, incr0);\n\t\t\t\tsplits.push(split);\n\n\t\t\t\tlet date0 = tzDate(split);\n\n\t\t\t\tlet prevHour = date0.getHours() + (date0.getMinutes() / m) + (date0.getSeconds() / h);\n\t\t\t\tlet incrHours = foundIncr / h;\n\n\t\t\t\tlet minSpace = self.axes[axisIdx]._space;\n\t\t\t\tlet pctSpace = foundSpace / minSpace;\n\n\t\t\t\twhile (1) {\n\t\t\t\t\tsplit = roundDec(split + foundIncr, ms == 1 ? 0 : 3);\n\n\t\t\t\t\tif (split > scaleMax)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tif (incrHours > 1) {\n\t\t\t\t\t\tlet expectedHour = floor(roundDec(prevHour + incrHours, 6)) % 24;\n\t\t\t\t\t\tlet splitDate = tzDate(split);\n\t\t\t\t\t\tlet actualHour = splitDate.getHours();\n\n\t\t\t\t\t\tlet dstShift = actualHour - expectedHour;\n\n\t\t\t\t\t\tif (dstShift > 1)\n\t\t\t\t\t\t\tdstShift = -1;\n\n\t\t\t\t\t\tsplit -= dstShift * h;\n\n\t\t\t\t\t\tprevHour = (prevHour + incrHours) % 24;\n\n\t\t\t\t\t\t// add a tick only if it's further than 70% of the min allowed label spacing\n\t\t\t\t\t\tlet prevSplit = splits[splits.length - 1];\n\t\t\t\t\t\tlet pctIncr = roundDec((split - prevSplit) / foundIncr, 3);\n\n\t\t\t\t\t\tif (pctIncr * pctSpace >= .7)\n\t\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn splits;\n\t\t}\n\t}\n\n\treturn [\n\t\ttimeIncrs,\n\t\t_timeAxisStamps,\n\t\ttimeAxisSplits,\n\t];\n}\n\nconst [ timeIncrsMs, _timeAxisStampsMs, timeAxisSplitsMs ] = genTimeStuffs(1);\nconst [ timeIncrsS, _timeAxisStampsS, timeAxisSplitsS ] = genTimeStuffs(1e-3);\n\n// base 2\ngenIncrs(2, -53, 53, [1]);\n\n/*\nconsole.log({\n\tdecIncrs,\n\toneIncrs,\n\twholeIncrs,\n\tnumIncrs,\n\ttimeIncrs,\n\tfixedDec,\n});\n*/\n\nfunction timeAxisStamps(stampCfg, fmtDate) {\n\treturn stampCfg.map(s => s.map((v, i) =>\n\t\ti == 0 || i == 8 || v == null ? v : fmtDate(i == 1 || s[8] == 0 ? v : s[1] + v)\n\t));\n}\n\n// TODO: will need to accept spaces[] and pull incr into the loop when grid will be non-uniform, eg for log scales.\n// currently we ignore this for months since they're *nearly* uniform and the added complexity is not worth it\nfunction timeAxisVals(tzDate, stamps) {\n\treturn (self, splits, axisIdx, foundSpace, foundIncr) => {\n\t\tlet s = stamps.find(s => foundIncr >= s[0]) || stamps[stamps.length - 1];\n\n\t\t// these track boundaries when a full label is needed again\n\t\tlet prevYear;\n\t\tlet prevMnth;\n\t\tlet prevDate;\n\t\tlet prevHour;\n\t\tlet prevMins;\n\t\tlet prevSecs;\n\n\t\treturn splits.map(split => {\n\t\t\tlet date = tzDate(split);\n\n\t\t\tlet newYear = date.getFullYear();\n\t\t\tlet newMnth = date.getMonth();\n\t\t\tlet newDate = date.getDate();\n\t\t\tlet newHour = date.getHours();\n\t\t\tlet newMins = date.getMinutes();\n\t\t\tlet newSecs = date.getSeconds();\n\n\t\t\tlet stamp = (\n\t\t\t\tnewYear != prevYear && s[2] ||\n\t\t\t\tnewMnth != prevMnth && s[3] ||\n\t\t\t\tnewDate != prevDate && s[4] ||\n\t\t\t\tnewHour != prevHour && s[5] ||\n\t\t\t\tnewMins != prevMins && s[6] ||\n\t\t\t\tnewSecs != prevSecs && s[7] ||\n\t\t\t\t s[1]\n\t\t\t);\n\n\t\t\tprevYear = newYear;\n\t\t\tprevMnth = newMnth;\n\t\t\tprevDate = newDate;\n\t\t\tprevHour = newHour;\n\t\t\tprevMins = newMins;\n\t\t\tprevSecs = newSecs;\n\n\t\t\treturn stamp(date);\n\t\t});\n\t}\n}\n\n// for when axis.values is defined as a static fmtDate template string\nfunction timeAxisVal(tzDate, dateTpl) {\n\tlet stamp = fmtDate(dateTpl);\n\treturn (self, splits, axisIdx, foundSpace, foundIncr) => splits.map(split => stamp(tzDate(split)));\n}\n\nfunction mkDate(y, m, d) {\n\treturn new Date(y, m, d);\n}\n\nfunction timeSeriesStamp(stampCfg, fmtDate) {\n\treturn fmtDate(stampCfg);\n}\nconst _timeSeriesStamp = '{YYYY}-{MM}-{DD} {h}:{mm}{aa}';\n\nfunction timeSeriesVal(tzDate, stamp) {\n\treturn (self, val) => stamp(tzDate(val));\n}\n\nfunction legendStroke(self, seriesIdx) {\n\tlet s = self.series[seriesIdx];\n\treturn s.width ? s.stroke(self, seriesIdx) : s.points.width ? s.points.stroke(self, seriesIdx) : null;\n}\n\nfunction legendFill(self, seriesIdx) {\n\treturn self.series[seriesIdx].fill(self, seriesIdx);\n}\n\nconst legendOpts = {\n\tshow: true,\n\tlive: true,\n\tisolate: false,\n\tmarkers: {\n\t\tshow: true,\n\t\twidth: 2,\n\t\tstroke: legendStroke,\n\t\tfill: legendFill,\n\t\tdash: \"solid\",\n\t},\n\tidx: null,\n\tidxs: null,\n\tvalues: [],\n};\n\nfunction cursorPointShow(self, si) {\n\tlet o = self.cursor.points;\n\n\tlet pt = placeDiv();\n\n\tlet size = o.size(self, si);\n\tsetStylePx(pt, WIDTH, size);\n\tsetStylePx(pt, HEIGHT, size);\n\n\tlet mar = size / -2;\n\tsetStylePx(pt, \"marginLeft\", mar);\n\tsetStylePx(pt, \"marginTop\", mar);\n\n\tlet width = o.width(self, si, size);\n\twidth && setStylePx(pt, \"borderWidth\", width);\n\n\treturn pt;\n}\n\nfunction cursorPointFill(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp._fill || sp._stroke;\n}\n\nfunction cursorPointStroke(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp._stroke || sp._fill;\n}\n\nfunction cursorPointSize(self, si) {\n\tlet sp = self.series[si].points;\n\treturn ptDia(sp.width, 1);\n}\n\nfunction dataIdx(self, seriesIdx, cursorIdx) {\n\treturn cursorIdx;\n}\n\nconst moveTuple = [0,0];\n\nfunction cursorMove(self, mouseLeft1, mouseTop1) {\n\tmoveTuple[0] = mouseLeft1;\n\tmoveTuple[1] = mouseTop1;\n\treturn moveTuple;\n}\n\nfunction filtBtn0(self, targ, handle) {\n\treturn e => {\n\t\te.button == 0 && handle(e);\n\t};\n}\n\nfunction passThru(self, targ, handle) {\n\treturn handle;\n}\n\nconst cursorOpts = {\n\tshow: true,\n\tx: true,\n\ty: true,\n\tlock: false,\n\tmove: cursorMove,\n\tpoints: {\n\t\tshow: cursorPointShow,\n\t\tsize: cursorPointSize,\n\t\twidth: 0,\n\t\tstroke: cursorPointStroke,\n\t\tfill: cursorPointFill,\n\t},\n\n\tbind: {\n\t\tmousedown: filtBtn0,\n\t\tmouseup: filtBtn0,\n\t\tclick: filtBtn0,\n\t\tdblclick: filtBtn0,\n\n\t\tmousemove: passThru,\n\t\tmouseleave: passThru,\n\t\tmouseenter: passThru,\n\t},\n\n\tdrag: {\n\t\tsetScale: true,\n\t\tx: true,\n\t\ty: false,\n\t\tdist: 0,\n\t\tuni: null,\n\t\t_x: false,\n\t\t_y: false,\n\t},\n\n\tfocus: {\n\t\tprox: -1,\n\t},\n\n\tleft: -10,\n\ttop: -10,\n\tidx: null,\n\tdataIdx,\n\tidxs: null,\n};\n\nconst axisLines = {\n\tshow: true,\n\tstroke: \"rgba(0,0,0,0.07)\",\n\twidth: 2,\n//\tdash: [],\n};\n\nconst grid = assign({}, axisLines, {\n\tfilter: retArg1,\n});\n\nconst ticks = assign({}, grid, {\n\tsize: 10,\n});\n\nconst border = assign({}, axisLines, {\n\tshow: false,\n});\n\nconst font = '12px system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"';\nconst labelFont = \"bold \" + font;\nconst lineMult = 1.5;\t\t// font-size multiplier\n\nconst xAxisOpts = {\n\tshow: true,\n\tscale: \"x\",\n\tstroke: hexBlack,\n\tspace: 50,\n\tgap: 5,\n\tsize: 50,\n\tlabelGap: 0,\n\tlabelSize: 30,\n\tlabelFont,\n\tside: 2,\n//\tclass: \"x-vals\",\n//\tincrs: timeIncrs,\n//\tvalues: timeVals,\n//\tfilter: retArg1,\n\tgrid,\n\tticks,\n\tborder,\n\tfont,\n\trotate: 0,\n};\n\nconst numSeriesLabel = \"Value\";\nconst timeSeriesLabel = \"Time\";\n\nconst xSeriesOpts = {\n\tshow: true,\n\tscale: \"x\",\n\tauto: false,\n\tsorted: 1,\n//\tlabel: \"Time\",\n//\tvalue: v => stamp(new Date(v * 1e3)),\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n\tidxs: [],\n};\n\nfunction numAxisVals(self, splits, axisIdx, foundSpace, foundIncr) {\n\treturn splits.map(v => v == null ? \"\" : fmtNum(v));\n}\n\nfunction numAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tlet splits = [];\n\n\tlet numDec = fixedDec.get(foundIncr) || 0;\n\n\tscaleMin = forceMin ? scaleMin : roundDec(incrRoundUp(scaleMin, foundIncr), numDec);\n\n\tfor (let val = scaleMin; val <= scaleMax; val = roundDec(val + foundIncr, numDec))\n\t\tsplits.push(Object.is(val, -0) ? 0 : val);\t\t// coalesces -0\n\n\treturn splits;\n}\n\n// this doesnt work for sin, which needs to come off from 0 independently in pos and neg dirs\nfunction logAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tconst splits = [];\n\n\tconst logBase = self.scales[self.axes[axisIdx].scale].log;\n\n\tconst logFn = logBase == 10 ? log10 : log2;\n\n\tconst exp = floor(logFn(scaleMin));\n\n\tfoundIncr = pow(logBase, exp);\n\n\tif (exp < 0)\n\t\tfoundIncr = roundDec(foundIncr, -exp);\n\n\tlet split = scaleMin;\n\n\tdo {\n\t\tsplits.push(split);\n\t\tsplit = roundDec(split + foundIncr, fixedDec.get(foundIncr));\n\n\t\tif (split >= foundIncr * logBase)\n\t\t\tfoundIncr = split;\n\n\t} while (split <= scaleMax);\n\n\treturn splits;\n}\n\nfunction asinhAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tlet sc = self.scales[self.axes[axisIdx].scale];\n\n\tlet linthresh = sc.asinh;\n\n\tlet posSplits = scaleMax > linthresh ? logAxisSplits(self, axisIdx, max(linthresh, scaleMin), scaleMax, foundIncr) : [linthresh];\n\tlet zero = scaleMax >= 0 && scaleMin <= 0 ? [0] : [];\n\tlet negSplits = scaleMin < -linthresh ? logAxisSplits(self, axisIdx, max(linthresh, -scaleMax), -scaleMin, foundIncr): [linthresh];\n\n\treturn negSplits.reverse().map(v => -v).concat(zero, posSplits);\n}\n\nconst RE_ALL = /./;\nconst RE_12357 = /[12357]/;\nconst RE_125 = /[125]/;\nconst RE_1 = /1/;\n\nfunction logAxisValsFilt(self, splits, axisIdx, foundSpace, foundIncr) {\n\tlet axis = self.axes[axisIdx];\n\tlet scaleKey = axis.scale;\n\tlet sc = self.scales[scaleKey];\n\n\tif (sc.distr == 3 && sc.log == 2)\n\t\treturn splits;\n\n\tlet valToPos = self.valToPos;\n\n\tlet minSpace = axis._space;\n\n\tlet _10 = valToPos(10, scaleKey);\n\n\tlet re = (\n\t\tvalToPos(9, scaleKey) - _10 >= minSpace ? RE_ALL :\n\t\tvalToPos(7, scaleKey) - _10 >= minSpace ? RE_12357 :\n\t\tvalToPos(5, scaleKey) - _10 >= minSpace ? RE_125 :\n\t\tRE_1\n\t);\n\n\treturn splits.map(v => ((sc.distr == 4 && v == 0) || re.test(v)) ? v : null);\n}\n\nfunction numSeriesVal(self, val) {\n\treturn val == null ? \"\" : fmtNum(val);\n}\n\nconst yAxisOpts = {\n\tshow: true,\n\tscale: \"y\",\n\tstroke: hexBlack,\n\tspace: 30,\n\tgap: 5,\n\tsize: 50,\n\tlabelGap: 0,\n\tlabelSize: 30,\n\tlabelFont,\n\tside: 3,\n//\tclass: \"y-vals\",\n//\tincrs: numIncrs,\n//\tvalues: (vals, space) => vals,\n//\tfilter: retArg1,\n\tgrid,\n\tticks,\n\tborder,\n\tfont,\n\trotate: 0,\n};\n\n// takes stroke width\nfunction ptDia(width, mult) {\n\tlet dia = 3 + (width || 1) * 2;\n\treturn roundDec(dia * mult, 3);\n}\n\nfunction seriesPointsShow(self, si) {\n\tlet { scale, idxs } = self.series[0];\n\tlet xData = self._data[0];\n\tlet p0 = self.valToPos(xData[idxs[0]], scale, true);\n\tlet p1 = self.valToPos(xData[idxs[1]], scale, true);\n\tlet dim = abs(p1 - p0);\n\n\tlet s = self.series[si];\n//\tconst dia = ptDia(s.width, pxRatio);\n\tlet maxPts = dim / (s.points.space * pxRatio);\n\treturn idxs[1] - idxs[0] <= maxPts;\n}\n\nconst facet = {\n\tscale: null,\n\tauto: true,\n\tsorted: 0,\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n};\n\nconst xySeriesOpts = {\n\tshow: true,\n\tauto: true,\n\tsorted: 0,\n\talpha: 1,\n\tfacets: [\n\t\tassign({}, facet, {scale: 'x'}),\n\t\tassign({}, facet, {scale: 'y'}),\n\t],\n};\n\nconst ySeriesOpts = {\n\tscale: \"y\",\n\tauto: true,\n\tsorted: 0,\n\tshow: true,\n\tspanGaps: false,\n\tgaps: (self, seriesIdx, idx0, idx1, nullGaps) => nullGaps,\n\talpha: 1,\n\tpoints: {\n\t\tshow: seriesPointsShow,\n\t\tfilter: null,\n\t// paths:\n\t//\tstroke: \"#000\",\n\t//\tfill: \"#fff\",\n\t//\twidth: 1,\n\t//\tsize: 10,\n\t},\n//\tlabel: \"Value\",\n//\tvalue: v => v,\n\tvalues: null,\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n\tidxs: [],\n\n\tpath: null,\n\tclip: null,\n};\n\nfunction clampScale(self, val, scaleMin, scaleMax, scaleKey) {\n/*\n\tif (val < 0) {\n\t\tlet cssHgt = self.bbox.height / pxRatio;\n\t\tlet absPos = self.valToPos(abs(val), scaleKey);\n\t\tlet fromBtm = cssHgt - absPos;\n\t\treturn self.posToVal(cssHgt + fromBtm, scaleKey);\n\t}\n*/\n\treturn scaleMin / 10;\n}\n\nconst xScaleOpts = {\n\ttime: FEAT_TIME,\n\tauto: true,\n\tdistr: 1,\n\tlog: 10,\n\tasinh: 1,\n\tmin: null,\n\tmax: null,\n\tdir: 1,\n\tori: 0,\n};\n\nconst yScaleOpts = assign({}, xScaleOpts, {\n\ttime: false,\n\tori: 1,\n});\n\nconst syncs = {};\n\nfunction _sync(key, opts) {\n\tlet s = syncs[key];\n\n\tif (!s) {\n\t\ts = {\n\t\t\tkey,\n\t\t\tplots: [],\n\t\t\tsub(plot) {\n\t\t\t\ts.plots.push(plot);\n\t\t\t},\n\t\t\tunsub(plot) {\n\t\t\t\ts.plots = s.plots.filter(c => c != plot);\n\t\t\t},\n\t\t\tpub(type, self, x, y, w, h, i) {\n\t\t\t\tfor (let j = 0; j < s.plots.length; j++)\n\t\t\t\t\ts.plots[j] != self && s.plots[j].pub(type, self, x, y, w, h, i);\n\t\t\t},\n\t\t};\n\n\t\tif (key != null)\n\t\t\tsyncs[key] = s;\n\t}\n\n\treturn s;\n}\n\nconst BAND_CLIP_FILL = 1 << 0;\nconst BAND_CLIP_STROKE = 1 << 1;\n\nfunction orient(u, seriesIdx, cb) {\n\tconst series = u.series[seriesIdx];\n\tconst scales = u.scales;\n\tconst bbox = u.bbox;\n\tconst scaleX = u.mode == 2 ? scales[series.facets[0].scale] : scales[u.series[0].scale];\n\n\tlet dx = u._data[0],\n\t\tdy = u._data[seriesIdx],\n\t\tsx = scaleX,\n\t\tsy = u.mode == 2 ? scales[series.facets[1].scale] : scales[series.scale],\n\t\tl = bbox.left,\n\t\tt = bbox.top,\n\t\tw = bbox.width,\n\t\th = bbox.height,\n\t\tH = u.valToPosH,\n\t\tV = u.valToPosV;\n\n\treturn (sx.ori == 0\n\t\t? cb(\n\t\t\tseries,\n\t\t\tdx,\n\t\t\tdy,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tH,\n\t\t\tV,\n\t\t\tl,\n\t\t\tt,\n\t\t\tw,\n\t\t\th,\n\t\t\tmoveToH,\n\t\t\tlineToH,\n\t\t\trectH,\n\t\t\tarcH,\n\t\t\tbezierCurveToH,\n\t\t)\n\t\t: cb(\n\t\t\tseries,\n\t\t\tdx,\n\t\t\tdy,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tV,\n\t\t\tH,\n\t\t\tt,\n\t\t\tl,\n\t\t\th,\n\t\t\tw,\n\t\t\tmoveToV,\n\t\t\tlineToV,\n\t\t\trectV,\n\t\t\tarcV,\n\t\t\tbezierCurveToV,\n\t\t)\n\t);\n}\n\nfunction bandFillClipDirs(self, seriesIdx) {\n\tlet fillDir = 0;\n\n\t// 2 bits, -1 | 1\n\tlet clipDirs = 0;\n\n\tlet bands = ifNull(self.bands, EMPTY_ARR);\n\n\tfor (let i = 0; i < bands.length; i++) {\n\t\tlet b = bands[i];\n\n\t\t// is a \"from\" band edge\n\t\tif (b.series[0] == seriesIdx)\n\t\t\tfillDir = b.dir;\n\t\t// is a \"to\" band edge\n\t\telse if (b.series[1] == seriesIdx) {\n\t\t\tif (b.dir == 1)\n\t\t\t\tclipDirs |= 1;\n\t\t\telse\n\t\t\t\tclipDirs |= 2;\n\t\t}\n\t}\n\n\treturn [\n\t\tfillDir,\n\t\t(\n\t\t\tclipDirs == 1 ? -1 : // neg only\n\t\t\tclipDirs == 2 ? 1 : // pos only\n\t\t\tclipDirs == 3 ? 2 : // both\n\t\t\t 0 // neither\n\t\t)\n\t];\n}\n\nfunction seriesFillTo(self, seriesIdx, dataMin, dataMax, bandFillDir) {\n\tlet scale = self.scales[self.series[seriesIdx].scale];\n\n\treturn (\n\t\tbandFillDir == -1 ? scale.min :\n\t\tbandFillDir == 1 ? scale.max :\n\t\tscale.distr == 3 ? (\n\t\t\tscale.dir == 1 ? scale.min :\n\t\t\tscale.max\n\t\t) : 0\n\t);\n}\n\n// creates inverted band clip path (from stroke path -> yMax || yMin)\n// clipDir is always inverse of fillDir\n// default clip dir is upwards (1), since default band fill is downwards/fillBelowTo (-1) (highIdx -> lowIdx)\nfunction clipBandLine(self, seriesIdx, idx0, idx1, strokePath, clipDir) {\n\treturn orient(self, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\tlet pxRound = series.pxRound;\n\n\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\t\tconst lineTo = scaleX.ori == 0 ? lineToH : lineToV;\n\n\t\tlet frIdx, toIdx;\n\n\t\tif (dir == 1) {\n\t\t\tfrIdx = idx0;\n\t\t\ttoIdx = idx1;\n\t\t}\n\t\telse {\n\t\t\tfrIdx = idx1;\n\t\t\ttoIdx = idx0;\n\t\t}\n\n\t\t// path start\n\t\tlet x0 = pxRound(valToPosX(dataX[frIdx], scaleX, xDim, xOff));\n\t\tlet y0 = pxRound(valToPosY(dataY[frIdx], scaleY, yDim, yOff));\n\t\t// path end x\n\t\tlet x1 = pxRound(valToPosX(dataX[toIdx], scaleX, xDim, xOff));\n\t\t// upper or lower y limit\n\t\tlet yLimit = pxRound(valToPosY(clipDir == 1 ? scaleY.max : scaleY.min, scaleY, yDim, yOff));\n\n\t\tlet clip = new Path2D(strokePath);\n\n\t\tlineTo(clip, x1, yLimit);\n\t\tlineTo(clip, x0, yLimit);\n\t\tlineTo(clip, x0, y0);\n\n\t\treturn clip;\n\t});\n}\n\nfunction clipGaps(gaps, ori, plotLft, plotTop, plotWid, plotHgt) {\n\tlet clip = null;\n\n\t// create clip path (invert gaps and non-gaps)\n\tif (gaps.length > 0) {\n\t\tclip = new Path2D();\n\n\t\tconst rect = ori == 0 ? rectH : rectV;\n\n\t\tlet prevGapEnd = plotLft;\n\n\t\tfor (let i = 0; i < gaps.length; i++) {\n\t\t\tlet g = gaps[i];\n\n\t\t\tif (g[1] > g[0]) {\n\t\t\t\tlet w = g[0] - prevGapEnd;\n\n\t\t\t\tw > 0 && rect(clip, prevGapEnd, plotTop, w, plotTop + plotHgt);\n\n\t\t\t\tprevGapEnd = g[1];\n\t\t\t}\n\t\t}\n\n\t\tlet w = plotLft + plotWid - prevGapEnd;\n\n\t\tw > 0 && rect(clip, prevGapEnd, plotTop, w, plotTop + plotHgt);\n\t}\n\n\treturn clip;\n}\n\nfunction addGap(gaps, fromX, toX) {\n\tlet prevGap = gaps[gaps.length - 1];\n\n\tif (prevGap && prevGap[0] == fromX)\t\t\t// TODO: gaps must be encoded at stroke widths?\n\t\tprevGap[1] = toX;\n\telse\n\t\tgaps.push([fromX, toX]);\n}\n\nfunction findGaps(xs, ys, idx0, idx1, dir, pixelForX, align) {\n\tlet gaps = [];\n\n\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\tlet yVal = ys[i];\n\n\t\tif (yVal === null) {\n\t\t\tlet fr = i, to = i;\n\n\t\t\tif (dir == 1) {\n\t\t\t\twhile (++i <= idx1 && ys[i] === null)\n\t\t\t\t\tto = i;\n\t\t\t}\n\t\t\telse {\n\t\t\t\twhile (--i >= idx0 && ys[i] === null)\n\t\t\t\t\tto = i;\n\t\t\t}\n\n\t\t\tlet frPx = pixelForX(xs[fr]);\n\t\t\tlet toPx = to == fr ? frPx : pixelForX(xs[to]);\n\n\t\t\t// if value adjacent to edge null is same pixel, then it's partially\n\t\t\t// filled and gap should start at next pixel\n\t\t\tlet frPx2 = align <= 0 ? pixelForX(xs[fr-dir]) : frPx;\n\t\t//\tif (frPx2 == frPx)\n\t\t//\t\tfrPx++;\n\t\t//\telse\n\t\t\t\tfrPx = frPx2;\n\n\t\t\tlet toPx2 = align >= 0 ? pixelForX(xs[to+dir]) : toPx;\n\t\t//\tif (toPx2 == toPx)\n\t\t//\t\ttoPx--;\n\t\t//\telse\n\t\t\t\ttoPx = toPx2;\n\n\t\t\tif (toPx >= frPx)\n\t\t\t\tgaps.push([frPx, toPx]); // addGap\n\t\t}\n\t}\n\n\treturn gaps;\n}\n\nfunction pxRoundGen(pxAlign) {\n\treturn pxAlign == 0 ? retArg0 : pxAlign == 1 ? round : v => incrRound(v, pxAlign);\n}\n\nfunction rect(ori) {\n\tlet moveTo = ori == 0 ?\n\t\tmoveToH :\n\t\tmoveToV;\n\n\tlet arcTo = ori == 0 ?\n\t\t(p, x1, y1, x2, y2, r) => { p.arcTo(x1, y1, x2, y2, r); } :\n\t\t(p, y1, x1, y2, x2, r) => { p.arcTo(x1, y1, x2, y2, r); };\n\n\tlet rect = ori == 0 ?\n\t\t(p, x, y, w, h) => { p.rect(x, y, w, h); } :\n\t\t(p, y, x, h, w) => { p.rect(x, y, w, h); };\n\n\treturn (p, x, y, w, h, r = 0) => {\n\t\tif (r == 0)\n\t\t\trect(p, x, y, w, h);\n\t\telse {\n\t\t\tr = min(r, w / 2, h / 2);\n\n\t\t\t// adapted from https://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-using-html-canvas/7838871#7838871\n\t\t\tmoveTo(p, x + r, y);\n\t\t\tarcTo(p, x + w, y, x + w, y + h, r);\n\t\t\tarcTo(p, x + w, y + h, x, y + h, r);\n\t\t\tarcTo(p, x, y + h, x, y, r);\n\t\t\tarcTo(p, x, y, x + w, y, r);\n\t\t\tp.closePath();\n\t\t}\n\t};\n}\n\n// orientation-inverting canvas functions\nconst moveToH = (p, x, y) => { p.moveTo(x, y); };\nconst moveToV = (p, y, x) => { p.moveTo(x, y); };\nconst lineToH = (p, x, y) => { p.lineTo(x, y); };\nconst lineToV = (p, y, x) => { p.lineTo(x, y); };\nconst rectH = rect(0);\nconst rectV = rect(1);\nconst arcH = (p, x, y, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); };\nconst arcV = (p, y, x, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); };\nconst bezierCurveToH = (p, bp1x, bp1y, bp2x, bp2y, p2x, p2y) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); };\nconst bezierCurveToV = (p, bp1y, bp1x, bp2y, bp2x, p2y, p2x) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); };\n\n// TODO: drawWrap(seriesIdx, drawPoints) (save, restore, translate, clip)\nfunction points(opts) {\n\treturn (u, seriesIdx, idx0, idx1, filtIdxs) => {\n\t//\tlog(\"drawPoints()\", arguments);\n\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet { pxRound, points } = series;\n\n\t\t\tlet moveTo, arc;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tmoveTo = moveToH;\n\t\t\t\tarc = arcH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmoveTo = moveToV;\n\t\t\t\tarc = arcV;\n\t\t\t}\n\n\t\t\tconst width = roundDec(points.width * pxRatio, 3);\n\n\t\t\tlet rad = (points.size - points.width) / 2 * pxRatio;\n\t\t\tlet dia = roundDec(rad * 2, 3);\n\n\t\t\tlet fill = new Path2D();\n\t\t\tlet clip = new Path2D();\n\n\t\t\tlet { left: lft, top: top, width: wid, height: hgt } = u.bbox;\n\n\t\t\trectH(clip,\n\t\t\t\tlft - dia,\n\t\t\t\ttop - dia,\n\t\t\t\twid + dia * 2,\n\t\t\t\thgt + dia * 2,\n\t\t\t);\n\n\t\t\tconst drawPoint = pi => {\n\t\t\t\tif (dataY[pi] != null) {\n\t\t\t\t\tlet x = pxRound(valToPosX(dataX[pi], scaleX, xDim, xOff));\n\t\t\t\t\tlet y = pxRound(valToPosY(dataY[pi], scaleY, yDim, yOff));\n\n\t\t\t\t\tmoveTo(fill, x + rad, y);\n\t\t\t\t\tarc(fill, x, y, rad, 0, PI * 2);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (filtIdxs)\n\t\t\t\tfiltIdxs.forEach(drawPoint);\n\t\t\telse {\n\t\t\t\tfor (let pi = idx0; pi <= idx1; pi++)\n\t\t\t\t\tdrawPoint(pi);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstroke: width > 0 ? fill : null,\n\t\t\t\tfill,\n\t\t\t\tclip,\n\t\t\t\tflags: BAND_CLIP_FILL | BAND_CLIP_STROKE,\n\t\t\t};\n\t\t});\n\t};\n}\n\nfunction _drawAcc(lineTo) {\n\treturn (stroke, accX, minY, maxY, inY, outY) => {\n\t\tif (minY != maxY) {\n\t\t\tif (inY != minY && outY != minY)\n\t\t\t\tlineTo(stroke, accX, minY);\n\t\t\tif (inY != maxY && outY != maxY)\n\t\t\t\tlineTo(stroke, accX, maxY);\n\n\t\t\tlineTo(stroke, accX, outY);\n\t\t}\n\t};\n}\n\nconst drawAccH = _drawAcc(lineToH);\nconst drawAccV = _drawAcc(lineToV);\n\nfunction linear(opts) {\n\tconst alignGaps = ifNull(opts?.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet lineTo, drawAcc;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tlineTo = lineToH;\n\t\t\t\tdrawAcc = drawAccH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlineTo = lineToV;\n\t\t\t\tdrawAcc = drawAccV;\n\t\t\t}\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tconst _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tlet minY = inf,\n\t\t\t\tmaxY = -inf,\n\t\t\t\tinY, outY, drawnAtX;\n\n\t\t\tlet accX = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\n\t\t\t// data edges\n\t\t\tlet lftIdx = nonNullIdx(dataY, idx0, idx1, 1 * dir);\n\t\t\tlet rgtIdx = nonNullIdx(dataY, idx0, idx1, -1 * dir);\n\t\t\tlet lftX = pixelForX(dataX[lftIdx]);\n\t\t\tlet rgtX = pixelForX(dataX[rgtIdx]);\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet x = pixelForX(dataX[i]);\n\n\t\t\t\tif (x == accX) {\n\t\t\t\t\tif (dataY[i] != null) {\n\t\t\t\t\t\toutY = pixelForY(dataY[i]);\n\n\t\t\t\t\t\tif (minY == inf) {\n\t\t\t\t\t\t\tlineTo(stroke, x, outY);\n\t\t\t\t\t\t\tinY = outY;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tminY = min(outY, minY);\n\t\t\t\t\t\tmaxY = max(outY, maxY);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (minY != inf) {\n\t\t\t\t\t\tdrawAcc(stroke, accX, minY, maxY, inY, outY);\n\t\t\t\t\t\tdrawnAtX = accX;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (dataY[i] != null) {\n\t\t\t\t\t\toutY = pixelForY(dataY[i]);\n\t\t\t\t\t\tlineTo(stroke, x, outY);\n\t\t\t\t\t\tminY = maxY = inY = outY;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tminY = inf;\n\t\t\t\t\t\tmaxY = -inf;\n\t\t\t\t\t}\n\n\t\t\t\t\taccX = x;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (minY != inf && minY != maxY && drawnAtX != accX)\n\t\t\t\tdrawAcc(stroke, accX, minY, maxY, inY, outY);\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillToVal = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillToVal);\n\n\t\t\t\tlineTo(fill, rgtX, fillToY);\n\t\t\t\tlineTo(fill, lftX, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, 1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction stepped(opts) {\n\tconst align = ifNull(opts.align, 1);\n\t// whether to draw ascenders/descenders at null/gap bondaries\n\tconst ascDesc = ifNull(opts.ascDesc, false);\n\n\tconst alignGaps = ifNull(opts.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet lineTo = scaleX.ori == 0 ? lineToH : lineToV;\n\n\t\t\tconst _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tidx0 = nonNullIdx(dataY, idx0, idx1, 1);\n\t\t\tidx1 = nonNullIdx(dataY, idx0, idx1, -1);\n\n\t\t\tlet prevYPos = pixelForY(dataY[dir == 1 ? idx0 : idx1]);\n\t\t\tlet firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\t\t\tlet prevXPos = firstXPos;\n\n\t\t\tlineTo(stroke, firstXPos, prevYPos);\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet yVal1 = dataY[i];\n\n\t\t\t\tif (yVal1 == null)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlet x1 = pixelForX(dataX[i]);\n\t\t\t\tlet y1 = pixelForY(yVal1);\n\n\t\t\t\tif (align == 1)\n\t\t\t\t\tlineTo(stroke, x1, prevYPos);\n\t\t\t\telse\n\t\t\t\t\tlineTo(stroke, prevXPos, y1);\n\n\t\t\t\tlineTo(stroke, x1, y1);\n\n\t\t\t\tprevYPos = y1;\n\t\t\t\tprevXPos = x1;\n\t\t\t}\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillTo);\n\n\t\t\t\tlineTo(fill, prevXPos, fillToY);\n\t\t\t\tlineTo(fill, firstXPos, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t// expand/contract clips for ascenders/descenders\n\t\t\t\tlet halfStroke = (series.width * pxRatio) / 2;\n\t\t\t\tlet startsOffset = (ascDesc || align == 1) ? halfStroke : -halfStroke;\n\t\t\t\tlet endsOffset = (ascDesc || align == -1) ? -halfStroke : halfStroke;\n\n\t\t\t\tgaps.forEach(g => {\n\t\t\t\t\tg[0] += startsOffset;\n\t\t\t\t\tg[1] += endsOffset;\n\t\t\t\t});\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, 1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction bars(opts) {\n\topts = opts || EMPTY_OBJ;\n\tconst size = ifNull(opts.size, [0.6, inf, 1]);\n\tconst align = opts.align || 0;\n\tconst extraGap = (opts.gap || 0) * pxRatio;\n\n\tconst radius = ifNull(opts.radius, 0);\n\n\tconst gapFactor = 1 - size[0];\n\tconst maxWidth = ifNull(size[1], inf) * pxRatio;\n\tconst minWidth = ifNull(size[2], 1) * pxRatio;\n\n\tconst disp = ifNull(opts.disp, EMPTY_OBJ);\n\tconst _each = ifNull(opts.each, _ => {});\n\n\tconst { fill: dispFills, stroke: dispStrokes } = disp;\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tconst _dirX = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\t\t\tconst _dirY = scaleY.dir * (scaleY.ori == 1 ? 1 : -1);\n\n\t\t\tlet rect = scaleX.ori == 0 ? rectH : rectV;\n\n\t\t\tlet each = scaleX.ori == 0 ? _each : (u, seriesIdx, i, top, lft, hgt, wid) => {\n\t\t\t\t_each(u, seriesIdx, i, lft, top, wid, hgt);\n\t\t\t};\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t//\tlet fillToY = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\tlet fillToY = scaleY.distr == 3 ? (bandFillDir == 1 ? scaleY.max : scaleY.min) : 0;\n\n\t\t\tlet y0Pos = valToPosY(fillToY, scaleY, yDim, yOff);\n\n\t\t\t// barWid is to center of stroke\n\t\t\tlet xShift, barWid;\n\n\t\t\tlet strokeWidth = pxRound(series.width * pxRatio);\n\n\t\t\tlet multiPath = false;\n\n\t\t\tlet fillColors = null;\n\t\t\tlet fillPaths = null;\n\t\t\tlet strokeColors = null;\n\t\t\tlet strokePaths = null;\n\n\t\t\tif (dispFills != null && (strokeWidth == 0 || dispStrokes != null)) {\n\t\t\t\tmultiPath = true;\n\n\t\t\t\tfillColors = dispFills.values(u, seriesIdx, idx0, idx1);\n\t\t\t\tfillPaths = new Map();\n\t\t\t\t(new Set(fillColors)).forEach(color => {\n\t\t\t\t\tif (color != null)\n\t\t\t\t\t\tfillPaths.set(color, new Path2D());\n\t\t\t\t});\n\n\t\t\t\tif (strokeWidth > 0) {\n\t\t\t\t\tstrokeColors = dispStrokes.values(u, seriesIdx, idx0, idx1);\n\t\t\t\t\tstrokePaths = new Map();\n\t\t\t\t\t(new Set(strokeColors)).forEach(color => {\n\t\t\t\t\t\tif (color != null)\n\t\t\t\t\t\t\tstrokePaths.set(color, new Path2D());\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { x0, size } = disp;\n\n\t\t\tif (x0 != null && size != null) {\n\t\t\t\tdataX = x0.values(u, seriesIdx, idx0, idx1);\n\n\t\t\t\tif (x0.unit == 2)\n\t\t\t\t\tdataX = dataX.map(pct => u.posToVal(xOff + pct * xDim, scaleX.key, true));\n\n\t\t\t\t// assumes uniform sizes, for now\n\t\t\t\tlet sizes = size.values(u, seriesIdx, idx0, idx1);\n\n\t\t\t\tif (size.unit == 2)\n\t\t\t\t\tbarWid = sizes[0] * xDim;\n\t\t\t\telse\n\t\t\t\t\tbarWid = valToPosX(sizes[0], scaleX, xDim, xOff) - valToPosX(0, scaleX, xDim, xOff); // assumes linear scale (delta from 0)\n\n\t\t\t\tbarWid = pxRound(barWid - strokeWidth);\n\n\t\t\t\txShift = (_dirX == 1 ? -strokeWidth / 2 : barWid + strokeWidth / 2);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet colWid = xDim;\n\n\t\t\t\tif (dataX.length > 1) {\n\t\t\t\t\t// prior index with non-undefined y data\n\t\t\t\t\tlet prevIdx = null;\n\n\t\t\t\t\t// scan full dataset for smallest adjacent delta\n\t\t\t\t\t// will not work properly for non-linear x scales, since does not do expensive valToPosX calcs till end\n\t\t\t\t\tfor (let i = 0, minDelta = Infinity; i < dataX.length; i++) {\n\t\t\t\t\t\tif (dataY[i] !== undefined) {\n\t\t\t\t\t\t\tif (prevIdx != null) {\n\t\t\t\t\t\t\t\tlet delta = abs(dataX[i] - dataX[prevIdx]);\n\n\t\t\t\t\t\t\t\tif (delta < minDelta) {\n\t\t\t\t\t\t\t\t\tminDelta = delta;\n\t\t\t\t\t\t\t\t\tcolWid = abs(valToPosX(dataX[i], scaleX, xDim, xOff) - valToPosX(dataX[prevIdx], scaleX, xDim, xOff));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tprevIdx = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet gapWid = colWid * gapFactor;\n\n\t\t\t\tbarWid = pxRound(min(maxWidth, max(minWidth, colWid - gapWid)) - strokeWidth - extraGap);\n\n\t\t\t\txShift = (align == 0 ? barWid / 2 : align == _dirX ? 0 : barWid) - align * _dirX * extraGap / 2;\n\t\t\t}\n\n\t\t\tconst _paths = {stroke: null, fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL | BAND_CLIP_STROKE}; // disp, geom\n\n\t\t\tlet yLimit;\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = new Path2D();\n\t\t\t\tyLimit = pxRound(valToPosY(bandClipDir == 1 ? scaleY.max : scaleY.min, scaleY, yDim, yOff));\n\t\t\t}\n\n\t\t\tconst stroke = multiPath ? null : new Path2D();\n\t\t\tconst band = _paths.band;\n\n\t\t\tlet { y0, y1 } = disp;\n\n\t\t\tlet dataY0 = null;\n\n\t\t\tif (y0 != null && y1 != null) {\n\t\t\t\tdataY = y1.values(u, seriesIdx, idx0, idx1);\n\t\t\t\tdataY0 = y0.values(u, seriesIdx, idx0, idx1);\n\t\t\t}\n\n\t\t\tfor (let i = _dirX == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += _dirX) {\n\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\t// we can skip both, drawing and band clipping for alignment artifacts\n\t\t\t\tif (yVal === undefined)\n\t\t\t\t\tcontinue;\n\n\t\t\t/*\n\t\t\t\t// interpolate upwards band clips\n\t\t\t\tif (yVal == null) {\n\t\t\t\t//\tif (hasBands)\n\t\t\t\t//\t\tyVal = costlyLerp(i, idx0, idx1, _dirX, dataY);\n\t\t\t\t//\telse\n\t\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t*/\n\n\t\t\t\tlet xVal = scaleX.distr != 2 || disp != null ? dataX[i] : i;\n\n\t\t\t\t// TODO: all xPos can be pre-computed once for all series in aligned set\n\t\t\t\tlet xPos = valToPosX(xVal, scaleX, xDim, xOff);\n\t\t\t\tlet yPos = valToPosY(ifNull(yVal, fillToY), scaleY, yDim, yOff);\n\n\t\t\t\tif (dataY0 != null && yVal != null)\n\t\t\t\t\ty0Pos = valToPosY(dataY0[i], scaleY, yDim, yOff);\n\n\t\t\t\tlet lft = pxRound(xPos - xShift);\n\t\t\t\tlet btm = pxRound(max(yPos, y0Pos));\n\t\t\t\tlet top = pxRound(min(yPos, y0Pos));\n\t\t\t\t// this includes the stroke\n\t\t\t\tlet barHgt = btm - top;\n\n\t\t\t\tlet r = radius * barWid;\n\n\t\t\t\tif (yVal != null) { // && yVal != fillToY (0 height bar)\n\t\t\t\t\tif (multiPath) {\n\t\t\t\t\t\tif (strokeWidth > 0 && strokeColors[i] != null)\n\t\t\t\t\t\t\trect(strokePaths.get(strokeColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), r);\n\n\t\t\t\t\t\tif (fillColors[i] != null)\n\t\t\t\t\t\t\trect(fillPaths.get(fillColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), r);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\trect(stroke, lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), r);\n\n\t\t\t\t\teach(u, seriesIdx, i,\n\t\t\t\t\t\tlft - strokeWidth / 2,\n\t\t\t\t\t\ttop,\n\t\t\t\t\t\tbarWid + strokeWidth,\n\t\t\t\t\t\tbarHgt,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (bandClipDir != 0) {\n\t\t\t\t\tif (_dirY * bandClipDir == 1) {\n\t\t\t\t\t\tbtm = top;\n\t\t\t\t\t\ttop = yLimit;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\ttop = btm;\n\t\t\t\t\t\tbtm = yLimit;\n\t\t\t\t\t}\n\n\t\t\t\t\tbarHgt = btm - top;\n\n\t\t\t\t\trect(band, lft - strokeWidth / 2, top, barWid + strokeWidth, max(0, barHgt), 0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (strokeWidth > 0)\n\t\t\t\t_paths.stroke = multiPath ? strokePaths : stroke;\n\n\t\t\t_paths.fill = multiPath ? fillPaths : stroke;\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction splineInterp(interp, opts) {\n\tconst alignGaps = ifNull(opts?.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet moveTo, bezierCurveTo, lineTo;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tmoveTo = moveToH;\n\t\t\t\tlineTo = lineToH;\n\t\t\t\tbezierCurveTo = bezierCurveToH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmoveTo = moveToV;\n\t\t\t\tlineTo = lineToV;\n\t\t\t\tbezierCurveTo = bezierCurveToV;\n\t\t\t}\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tidx0 = nonNullIdx(dataY, idx0, idx1, 1);\n\t\t\tidx1 = nonNullIdx(dataY, idx0, idx1, -1);\n\n\t\t\tlet firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\t\t\tlet prevXPos = firstXPos;\n\n\t\t\tlet xCoords = [];\n\t\t\tlet yCoords = [];\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\tif (yVal != null) {\n\t\t\t\t\tlet xVal = dataX[i];\n\t\t\t\t\tlet xPos = pixelForX(xVal);\n\n\t\t\t\t\txCoords.push(prevXPos = xPos);\n\t\t\t\t\tyCoords.push(pixelForY(dataY[i]));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst _paths = {stroke: interp(xCoords, yCoords, moveTo, lineTo, bezierCurveTo, pxRound), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillTo);\n\n\t\t\t\tlineTo(fill, prevXPos, fillToY);\n\t\t\t\tlineTo(fill, firstXPos, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, 1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\n\t\t\t// if FEAT_PATHS: false in rollup.config.js\n\t\t\t//\tu.ctx.save();\n\t\t\t//\tu.ctx.beginPath();\n\t\t\t//\tu.ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);\n\t\t\t//\tu.ctx.clip();\n\t\t\t//\tu.ctx.strokeStyle = u.series[sidx].stroke;\n\t\t\t//\tu.ctx.stroke(stroke);\n\t\t\t//\tu.ctx.fillStyle = u.series[sidx].fill;\n\t\t\t//\tu.ctx.fill(fill);\n\t\t\t//\tu.ctx.restore();\n\t\t\t//\treturn null;\n\t\t});\n\t};\n}\n\nfunction monotoneCubic(opts) {\n\treturn splineInterp(_monotoneCubic, opts);\n}\n\n// Monotone Cubic Spline interpolation, adapted from the Chartist.js implementation:\n// https://github.com/gionkunz/chartist-js/blob/e7e78201bffe9609915e5e53cfafa29a5d6c49f9/src/scripts/interpolation.js#L240-L369\nfunction _monotoneCubic(xs, ys, moveTo, lineTo, bezierCurveTo, pxRound) {\n\tconst n = xs.length;\n\n\tif (n < 2)\n\t\treturn null;\n\n\tconst path = new Path2D();\n\n\tmoveTo(path, xs[0], ys[0]);\n\n\tif (n == 2)\n\t\tlineTo(path, xs[1], ys[1]);\n\telse {\n\t\tlet ms = Array(n),\n\t\t\tds = Array(n - 1),\n\t\t\tdys = Array(n - 1),\n\t\t\tdxs = Array(n - 1);\n\n\t\t// calc deltas and derivative\n\t\tfor (let i = 0; i < n - 1; i++) {\n\t\t\tdys[i] = ys[i + 1] - ys[i];\n\t\t\tdxs[i] = xs[i + 1] - xs[i];\n\t\t\tds[i] = dys[i] / dxs[i];\n\t\t}\n\n\t\t// determine desired slope (m) at each point using Fritsch-Carlson method\n\t\t// http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation\n\t\tms[0] = ds[0];\n\n\t\tfor (let i = 1; i < n - 1; i++) {\n\t\t\tif (ds[i] === 0 || ds[i - 1] === 0 || (ds[i - 1] > 0) !== (ds[i] > 0))\n\t\t\t\tms[i] = 0;\n\t\t\telse {\n\t\t\t\tms[i] = 3 * (dxs[i - 1] + dxs[i]) / (\n\t\t\t\t\t(2 * dxs[i] + dxs[i - 1]) / ds[i - 1] +\n\t\t\t\t\t(dxs[i] + 2 * dxs[i - 1]) / ds[i]\n\t\t\t\t);\n\n\t\t\t\tif (!isFinite(ms[i]))\n\t\t\t\t\tms[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\tms[n - 1] = ds[n - 2];\n\n\t\tfor (let i = 0; i < n - 1; i++) {\n\t\t\tbezierCurveTo(\n\t\t\t\tpath,\n\t\t\t\txs[i] + dxs[i] / 3,\n\t\t\t\tys[i] + ms[i] * dxs[i] / 3,\n\t\t\t\txs[i + 1] - dxs[i] / 3,\n\t\t\t\tys[i + 1] - ms[i + 1] * dxs[i] / 3,\n\t\t\t\txs[i + 1],\n\t\t\t\tys[i + 1],\n\t\t\t);\n\t\t}\n\t}\n\n\treturn path;\n}\n\nconst cursorPlots = new Set();\n\nfunction invalidateRects() {\n\tcursorPlots.forEach(u => {\n\t\tu.syncRect(true);\n\t});\n}\n\nif (domEnv) {\n\ton(resize, win, invalidateRects);\n\ton(scroll, win, invalidateRects, true);\n\ton(dppxchange, win, () => { uPlot.pxRatio = pxRatio; });\n}\n\nconst linearPath = linear() ;\nconst pointsPath = points() ;\n\nfunction setDefaults(d, xo, yo, initY) {\n\tlet d2 = initY ? [d[0], d[1]].concat(d.slice(2)) : [d[0]].concat(d.slice(1));\n\treturn d2.map((o, i) => setDefault(o, i, xo, yo));\n}\n\nfunction setDefaults2(d, xyo) {\n\treturn d.map((o, i) => i == 0 ? null : assign({}, xyo, o)); // todo: assign() will not merge facet arrays\n}\n\nfunction setDefault(o, i, xo, yo) {\n\treturn assign({}, (i == 0 ? xo : yo), o);\n}\n\nfunction snapNumX(self, dataMin, dataMax) {\n\treturn dataMin == null ? nullNullTuple : [dataMin, dataMax];\n}\n\nconst snapTimeX = snapNumX;\n\n// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below\n// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value\nfunction snapNumY(self, dataMin, dataMax) {\n\treturn dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, rangePad, true);\n}\n\nfunction snapLogY(self, dataMin, dataMax, scale) {\n\treturn dataMin == null ? nullNullTuple : rangeLog(dataMin, dataMax, self.scales[scale].log, false);\n}\n\nconst snapLogX = snapLogY;\n\nfunction snapAsinhY(self, dataMin, dataMax, scale) {\n\treturn dataMin == null ? nullNullTuple : rangeAsinh(dataMin, dataMax, self.scales[scale].log, false);\n}\n\nconst snapAsinhX = snapAsinhY;\n\n// dim is logical (getClientBoundingRect) pixels, not canvas pixels\nfunction findIncr(minVal, maxVal, incrs, dim, minSpace) {\n\tlet intDigits = max(numIntDigits(minVal), numIntDigits(maxVal));\n\n\tlet delta = maxVal - minVal;\n\n\tlet incrIdx = closestIdx((minSpace / dim) * delta, incrs);\n\n\tdo {\n\t\tlet foundIncr = incrs[incrIdx];\n\t\tlet foundSpace = dim * foundIncr / delta;\n\n\t\tif (foundSpace >= minSpace && intDigits + (foundIncr < 5 ? fixedDec.get(foundIncr) : 0) <= 17)\n\t\t\treturn [foundIncr, foundSpace];\n\t} while (++incrIdx < incrs.length);\n\n\treturn [0, 0];\n}\n\nfunction pxRatioFont(font) {\n\tlet fontSize, fontSizeCss;\n\tfont = font.replace(/(\\d+)px/, (m, p1) => (fontSize = round((fontSizeCss = +p1) * pxRatio)) + 'px');\n\treturn [font, fontSize, fontSizeCss];\n}\n\nfunction syncFontSize(axis) {\n\tif (axis.show) {\n\t\t[axis.font, axis.labelFont].forEach(f => {\n\t\t\tlet size = roundDec(f[2] * pxRatio, 1);\n\t\t\tf[0] = f[0].replace(/[0-9.]+px/, size + 'px');\n\t\t\tf[1] = size;\n\t\t});\n\t}\n}\n\nfunction uPlot(opts, data, then) {\n\tconst self = {\n\t\tmode: ifNull(opts.mode, 1),\n\t};\n\n\tconst mode = self.mode;\n\n\t// TODO: cache denoms & mins scale.cache = {r, min, }\n\tfunction getValPct(val, scale) {\n\t\tlet _val = (\n\t\t\tscale.distr == 3 ? log10(val > 0 ? val : scale.clamp(self, val, scale.min, scale.max, scale.key)) :\n\t\t\tscale.distr == 4 ? asinh(val, scale.asinh) :\n\t\t\tval\n\t\t);\n\n\t\treturn (_val - scale._min) / (scale._max - scale._min);\n\t}\n\n\tfunction getHPos(val, scale, dim, off) {\n\t\tlet pct = getValPct(val, scale);\n\t\treturn off + dim * (scale.dir == -1 ? (1 - pct) : pct);\n\t}\n\n\tfunction getVPos(val, scale, dim, off) {\n\t\tlet pct = getValPct(val, scale);\n\t\treturn off + dim * (scale.dir == -1 ? pct : (1 - pct));\n\t}\n\n\tfunction getPos(val, scale, dim, off) {\n\t\treturn scale.ori == 0 ? getHPos(val, scale, dim, off) : getVPos(val, scale, dim, off);\n\t}\n\n\tself.valToPosH = getHPos;\n\tself.valToPosV = getVPos;\n\n\tlet ready = false;\n\tself.status = 0;\n\n\tconst root = self.root = placeDiv(UPLOT);\n\n\tif (opts.id != null)\n\t\troot.id = opts.id;\n\n\taddClass(root, opts.class);\n\n\tif (opts.title) {\n\t\tlet title = placeDiv(TITLE, root);\n\t\ttitle.textContent = opts.title;\n\t}\n\n\tconst can = placeTag(\"canvas\");\n\tconst ctx = self.ctx = can.getContext(\"2d\");\n\n\tconst wrap = placeDiv(WRAP, root);\n\tconst under = self.under = placeDiv(UNDER, wrap);\n\twrap.appendChild(can);\n\tconst over = self.over = placeDiv(OVER, wrap);\n\n\topts = copy(opts);\n\n\tconst pxAlign = +ifNull(opts.pxAlign, 1);\n\n\tconst pxRound = pxRoundGen(pxAlign);\n\n\t(opts.plugins || []).forEach(p => {\n\t\tif (p.opts)\n\t\t\topts = p.opts(self, opts) || opts;\n\t});\n\n\tconst ms = opts.ms || 1e-3;\n\n\tconst series = self.series = mode == 1 ?\n\t\tsetDefaults(opts.series || [], xSeriesOpts, ySeriesOpts, false) :\n\t\tsetDefaults2(opts.series || [null], xySeriesOpts);\n\tconst axes = self.axes = setDefaults(opts.axes || [], xAxisOpts, yAxisOpts, true);\n\tconst scales = self.scales = {};\n\tconst bands = self.bands = opts.bands || [];\n\n\tbands.forEach(b => {\n\t\tb.fill = fnOrSelf(b.fill || null);\n\t\tb.dir = ifNull(b.dir, -1);\n\t});\n\n\tconst xScaleKey = mode == 2 ? series[1].facets[0].scale : series[0].scale;\n\n\tconst drawOrderMap = {\n\t\taxes: drawAxesGrid,\n\t\tseries: drawSeries,\n\t};\n\n\tconst drawOrder = (opts.drawOrder || [\"axes\", \"series\"]).map(key => drawOrderMap[key]);\n\n\tfunction initScale(scaleKey) {\n\t\tlet sc = scales[scaleKey];\n\n\t\tif (sc == null) {\n\t\t\tlet scaleOpts = (opts.scales || EMPTY_OBJ)[scaleKey] || EMPTY_OBJ;\n\n\t\t\tif (scaleOpts.from != null) {\n\t\t\t\t// ensure parent is initialized\n\t\t\t\tinitScale(scaleOpts.from);\n\t\t\t\t// dependent scales inherit\n\t\t\t\tscales[scaleKey] = assign({}, scales[scaleOpts.from], scaleOpts, {key: scaleKey});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsc = scales[scaleKey] = assign({}, (scaleKey == xScaleKey ? xScaleOpts : yScaleOpts), scaleOpts);\n\n\t\t\t\tsc.key = scaleKey;\n\n\t\t\t\tlet isTime = sc.time;\n\n\t\t\t\tlet rn = sc.range;\n\n\t\t\t\tlet rangeIsArr = isArr(rn);\n\n\t\t\t\tif (scaleKey != xScaleKey || (mode == 2 && !isTime)) {\n\t\t\t\t\t// if range array has null limits, it should be auto\n\t\t\t\t\tif (rangeIsArr && (rn[0] == null || rn[1] == null)) {\n\t\t\t\t\t\trn = {\n\t\t\t\t\t\t\tmin: rn[0] == null ? autoRangePart : {\n\t\t\t\t\t\t\t\tmode: 1,\n\t\t\t\t\t\t\t\thard: rn[0],\n\t\t\t\t\t\t\t\tsoft: rn[0],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmax: rn[1] == null ? autoRangePart : {\n\t\t\t\t\t\t\t\tmode: 1,\n\t\t\t\t\t\t\t\thard: rn[1],\n\t\t\t\t\t\t\t\tsoft: rn[1],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t\trangeIsArr = false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!rangeIsArr && isObj(rn)) {\n\t\t\t\t\t\tlet cfg = rn;\n\t\t\t\t\t\t// this is similar to snapNumY\n\t\t\t\t\t\trn = (self, dataMin, dataMax) => dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, cfg);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsc.range = fnOrSelf(rn || (isTime ? snapTimeX : scaleKey == xScaleKey ?\n\t\t\t\t\t(sc.distr == 3 ? snapLogX : sc.distr == 4 ? snapAsinhX : snapNumX) :\n\t\t\t\t\t(sc.distr == 3 ? snapLogY : sc.distr == 4 ? snapAsinhY : snapNumY)\n\t\t\t\t));\n\n\t\t\t\tsc.auto = fnOrSelf(rangeIsArr ? false : sc.auto);\n\n\t\t\t\tsc.clamp = fnOrSelf(sc.clamp || clampScale);\n\n\t\t\t\t// caches for expensive ops like asinh() & log()\n\t\t\t\tsc._min = sc._max = null;\n\t\t\t}\n\t\t}\n\t}\n\n\tinitScale(\"x\");\n\tinitScale(\"y\");\n\n\t// TODO: init scales from facets in mode: 2\n\tif (mode == 1) {\n\t\tseries.forEach(s => {\n\t\t\tinitScale(s.scale);\n\t\t});\n\t}\n\n\taxes.forEach(a => {\n\t\tinitScale(a.scale);\n\t});\n\n\tfor (let k in opts.scales)\n\t\tinitScale(k);\n\n\tconst scaleX = scales[xScaleKey];\n\n\tconst xScaleDistr = scaleX.distr;\n\n\tlet valToPosX, valToPosY;\n\n\tif (scaleX.ori == 0) {\n\t\taddClass(root, ORI_HZ);\n\t\tvalToPosX = getHPos;\n\t\tvalToPosY = getVPos;\n\t\t/*\n\t\tupdOriDims = () => {\n\t\t\txDimCan = plotWid;\n\t\t\txOffCan = plotLft;\n\t\t\tyDimCan = plotHgt;\n\t\t\tyOffCan = plotTop;\n\n\t\t\txDimCss = plotWidCss;\n\t\t\txOffCss = plotLftCss;\n\t\t\tyDimCss = plotHgtCss;\n\t\t\tyOffCss = plotTopCss;\n\t\t};\n\t\t*/\n\t}\n\telse {\n\t\taddClass(root, ORI_VT);\n\t\tvalToPosX = getVPos;\n\t\tvalToPosY = getHPos;\n\t\t/*\n\t\tupdOriDims = () => {\n\t\t\txDimCan = plotHgt;\n\t\t\txOffCan = plotTop;\n\t\t\tyDimCan = plotWid;\n\t\t\tyOffCan = plotLft;\n\n\t\t\txDimCss = plotHgtCss;\n\t\t\txOffCss = plotTopCss;\n\t\t\tyDimCss = plotWidCss;\n\t\t\tyOffCss = plotLftCss;\n\t\t};\n\t\t*/\n\t}\n\n\tconst pendScales = {};\n\n\t// explicitly-set initial scales\n\tfor (let k in scales) {\n\t\tlet sc = scales[k];\n\n\t\tif (sc.min != null || sc.max != null) {\n\t\t\tpendScales[k] = {min: sc.min, max: sc.max};\n\t\t\tsc.min = sc.max = null;\n\t\t}\n\t}\n\n//\tself.tz = opts.tz || Intl.DateTimeFormat().resolvedOptions().timeZone;\n\tconst _tzDate = (opts.tzDate || (ts => new Date(round(ts / ms))));\n\tconst _fmtDate = (opts.fmtDate || fmtDate);\n\n\tconst _timeAxisSplits = (ms == 1 ? timeAxisSplitsMs(_tzDate) : timeAxisSplitsS(_tzDate));\n\tconst _timeAxisVals = timeAxisVals(_tzDate, timeAxisStamps((ms == 1 ? _timeAxisStampsMs : _timeAxisStampsS), _fmtDate));\n\tconst _timeSeriesVal = timeSeriesVal(_tzDate, timeSeriesStamp(_timeSeriesStamp, _fmtDate));\n\n\tconst activeIdxs = [];\n\n\tconst legend = (self.legend = assign({}, legendOpts, opts.legend));\n\tconst showLegend = legend.show;\n\tconst markers = legend.markers;\n\n\t{\n\t\tlegend.idxs = activeIdxs;\n\n\t\tmarkers.width = fnOrSelf(markers.width);\n\t\tmarkers.dash = fnOrSelf(markers.dash);\n\t\tmarkers.stroke = fnOrSelf(markers.stroke);\n\t\tmarkers.fill = fnOrSelf(markers.fill);\n\t}\n\n\tlet legendEl;\n\tlet legendRows = [];\n\tlet legendCells = [];\n\tlet legendCols;\n\tlet multiValLegend = false;\n\tlet NULL_LEGEND_VALUES = {};\n\n\tif (legend.live) {\n\t\tconst getMultiVals = series[1] ? series[1].values : null;\n\t\tmultiValLegend = getMultiVals != null;\n\t\tlegendCols = multiValLegend ? getMultiVals(self, 1, 0) : {_: 0};\n\n\t\tfor (let k in legendCols)\n\t\t\tNULL_LEGEND_VALUES[k] = \"--\";\n\t}\n\n\tif (showLegend) {\n\t\tlegendEl = placeTag(\"table\", LEGEND, root);\n\n\t\tif (multiValLegend) {\n\t\t\tlet head = placeTag(\"tr\", LEGEND_THEAD, legendEl);\n\t\t\tplaceTag(\"th\", null, head);\n\n\t\t\tfor (var key in legendCols)\n\t\t\t\tplaceTag(\"th\", LEGEND_LABEL, head).textContent = key;\n\t\t}\n\t\telse {\n\t\t\taddClass(legendEl, LEGEND_INLINE);\n\t\t\tlegend.live && addClass(legendEl, LEGEND_LIVE);\n\t\t}\n\t}\n\n\tconst son = {show: true};\n\tconst soff = {show: false};\n\n\tfunction initLegendRow(s, i) {\n\t\tif (i == 0 && (multiValLegend || !legend.live || mode == 2))\n\t\t\treturn nullNullTuple;\n\n\t\tlet cells = [];\n\n\t\tlet row = placeTag(\"tr\", LEGEND_SERIES, legendEl, legendEl.childNodes[i]);\n\n\t\taddClass(row, s.class);\n\n\t\tif (!s.show)\n\t\t\taddClass(row, OFF);\n\n\t\tlet label = placeTag(\"th\", null, row);\n\n\t\tif (markers.show) {\n\t\t\tlet indic = placeDiv(LEGEND_MARKER, label);\n\n\t\t\tif (i > 0) {\n\t\t\t\tlet width = markers.width(self, i);\n\n\t\t\t\tif (width)\n\t\t\t\t\tindic.style.border = width + \"px \" + markers.dash(self, i) + \" \" + markers.stroke(self, i);\n\n\t\t\t\tindic.style.background = markers.fill(self, i);\n\t\t\t}\n\t\t}\n\n\t\tlet text = placeDiv(LEGEND_LABEL, label);\n\t\ttext.textContent = s.label;\n\n\t\tif (i > 0) {\n\t\t\tif (!markers.show)\n\t\t\t\ttext.style.color = s.width > 0 ? markers.stroke(self, i) : markers.fill(self, i);\n\n\t\t\tonMouse(\"click\", label, e => {\n\t\t\t\tif (cursor._lock)\n\t\t\t\t\treturn;\n\n\t\t\t\tlet seriesIdx = series.indexOf(s);\n\n\t\t\t\tif ((e.ctrlKey || e.metaKey) != legend.isolate) {\n\t\t\t\t\t// if any other series is shown, isolate this one. else show all\n\t\t\t\t\tlet isolate = series.some((s, i) => i > 0 && i != seriesIdx && s.show);\n\n\t\t\t\t\tseries.forEach((s, i) => {\n\t\t\t\t\t\ti > 0 && setSeries(i, isolate ? (i == seriesIdx ? son : soff) : son, true, syncOpts.setSeries);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tsetSeries(seriesIdx, {show: !s.show}, true, syncOpts.setSeries);\n\t\t\t});\n\n\t\t\tif (cursorFocus) {\n\t\t\t\tonMouse(mouseenter, label, e => {\n\t\t\t\t\tif (cursor._lock)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tsetSeries(series.indexOf(s), FOCUS_TRUE, true, syncOpts.setSeries);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfor (var key in legendCols) {\n\t\t\tlet v = placeTag(\"td\", LEGEND_VALUE, row);\n\t\t\tv.textContent = \"--\";\n\t\t\tcells.push(v);\n\t\t}\n\n\t\treturn [row, cells];\n\t}\n\n\tconst mouseListeners = new Map();\n\n\tfunction onMouse(ev, targ, fn) {\n\t\tconst targListeners = mouseListeners.get(targ) || {};\n\t\tconst listener = cursor.bind[ev](self, targ, fn);\n\n\t\tif (listener) {\n\t\t\ton(ev, targ, targListeners[ev] = listener);\n\t\t\tmouseListeners.set(targ, targListeners);\n\t\t}\n\t}\n\n\tfunction offMouse(ev, targ, fn) {\n\t\tconst targListeners = mouseListeners.get(targ) || {};\n\n\t\tfor (let k in targListeners) {\n\t\t\tif (ev == null || k == ev) {\n\t\t\t\toff(k, targ, targListeners[k]);\n\t\t\t\tdelete targListeners[k];\n\t\t\t}\n\t\t}\n\n\t\tif (ev == null)\n\t\t\tmouseListeners.delete(targ);\n\t}\n\n\tlet fullWidCss = 0;\n\tlet fullHgtCss = 0;\n\n\tlet plotWidCss = 0;\n\tlet plotHgtCss = 0;\n\n\t// plot margins to account for axes\n\tlet plotLftCss = 0;\n\tlet plotTopCss = 0;\n\n\tlet plotLft = 0;\n\tlet plotTop = 0;\n\tlet plotWid = 0;\n\tlet plotHgt = 0;\n\n\tself.bbox = {};\n\n\tlet shouldSetScales = false;\n\tlet shouldSetSize = false;\n\tlet shouldConvergeSize = false;\n\tlet shouldSetCursor = false;\n\tlet shouldSetLegend = false;\n\n\tfunction _setSize(width, height, force) {\n\t\tif (force || (width != self.width || height != self.height))\n\t\t\tcalcSize(width, height);\n\n\t\tresetYSeries(false);\n\n\t\tshouldConvergeSize = true;\n\t\tshouldSetSize = true;\n\t\tshouldSetCursor = shouldSetLegend = cursor.left >= 0;\n\t\tcommit();\n\t}\n\n\tfunction calcSize(width, height) {\n\t//\tlog(\"calcSize()\", arguments);\n\n\t\tself.width = fullWidCss = plotWidCss = width;\n\t\tself.height = fullHgtCss = plotHgtCss = height;\n\t\tplotLftCss = plotTopCss = 0;\n\n\t\tcalcPlotRect();\n\t\tcalcAxesRects();\n\n\t\tlet bb = self.bbox;\n\n\t\tplotLft = bb.left = incrRound(plotLftCss * pxRatio, 0.5);\n\t\tplotTop = bb.top = incrRound(plotTopCss * pxRatio, 0.5);\n\t\tplotWid = bb.width = incrRound(plotWidCss * pxRatio, 0.5);\n\t\tplotHgt = bb.height = incrRound(plotHgtCss * pxRatio, 0.5);\n\n\t//\tupdOriDims();\n\t}\n\n\t// ensures size calc convergence\n\tconst CYCLE_LIMIT = 3;\n\n\tfunction convergeSize() {\n\t\tlet converged = false;\n\n\t\tlet cycleNum = 0;\n\n\t\twhile (!converged) {\n\t\t\tcycleNum++;\n\n\t\t\tlet axesConverged = axesCalc(cycleNum);\n\t\t\tlet paddingConverged = paddingCalc(cycleNum);\n\n\t\t\tconverged = cycleNum == CYCLE_LIMIT || (axesConverged && paddingConverged);\n\n\t\t\tif (!converged) {\n\t\t\t\tcalcSize(self.width, self.height);\n\t\t\t\tshouldSetSize = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setSize({width, height}) {\n\t\t_setSize(width, height);\n\t}\n\n\tself.setSize = setSize;\n\n\t// accumulate axis offsets, reduce canvas width\n\tfunction calcPlotRect() {\n\t\t// easements for edge labels\n\t\tlet hasTopAxis = false;\n\t\tlet hasBtmAxis = false;\n\t\tlet hasRgtAxis = false;\n\t\tlet hasLftAxis = false;\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (axis.show && axis._show) {\n\t\t\t\tlet {side, _size} = axis;\n\t\t\t\tlet isVt = side % 2;\n\t\t\t\tlet labelSize = axis.label != null ? axis.labelSize : 0;\n\n\t\t\t\tlet fullSize = _size + labelSize;\n\n\t\t\t\tif (fullSize > 0) {\n\t\t\t\t\tif (isVt) {\n\t\t\t\t\t\tplotWidCss -= fullSize;\n\n\t\t\t\t\t\tif (side == 3) {\n\t\t\t\t\t\t\tplotLftCss += fullSize;\n\t\t\t\t\t\t\thasLftAxis = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\thasRgtAxis = true;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tplotHgtCss -= fullSize;\n\n\t\t\t\t\t\tif (side == 0) {\n\t\t\t\t\t\t\tplotTopCss += fullSize;\n\t\t\t\t\t\t\thasTopAxis = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\thasBtmAxis = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tsidesWithAxes[0] = hasTopAxis;\n\t\tsidesWithAxes[1] = hasRgtAxis;\n\t\tsidesWithAxes[2] = hasBtmAxis;\n\t\tsidesWithAxes[3] = hasLftAxis;\n\n\t\t// hz padding\n\t\tplotWidCss -= _padding[1] + _padding[3];\n\t\tplotLftCss += _padding[3];\n\n\t\t// vt padding\n\t\tplotHgtCss -= _padding[2] + _padding[0];\n\t\tplotTopCss += _padding[0];\n\t}\n\n\tfunction calcAxesRects() {\n\t\t// will accum +\n\t\tlet off1 = plotLftCss + plotWidCss;\n\t\tlet off2 = plotTopCss + plotHgtCss;\n\t\t// will accum -\n\t\tlet off3 = plotLftCss;\n\t\tlet off0 = plotTopCss;\n\n\t\tfunction incrOffset(side, size) {\n\t\t\tswitch (side) {\n\t\t\t\tcase 1: off1 += size; return off1 - size;\n\t\t\t\tcase 2: off2 += size; return off2 - size;\n\t\t\t\tcase 3: off3 -= size; return off3 + size;\n\t\t\t\tcase 0: off0 -= size; return off0 + size;\n\t\t\t}\n\t\t}\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (axis.show && axis._show) {\n\t\t\t\tlet side = axis.side;\n\n\t\t\t\taxis._pos = incrOffset(side, axis._size);\n\n\t\t\t\tif (axis.label != null)\n\t\t\t\t\taxis._lpos = incrOffset(side, axis.labelSize);\n\t\t\t}\n\t\t});\n\t}\n\n\tconst cursor = (self.cursor = assign({}, cursorOpts, {drag: {y: mode == 2}}, opts.cursor));\n\n\t{\n\t\tcursor.idxs = activeIdxs;\n\n\t\tcursor._lock = false;\n\n\t\tlet points = cursor.points;\n\n\t\tpoints.show = fnOrSelf(points.show);\n\t\tpoints.size = fnOrSelf(points.size);\n\t\tpoints.stroke = fnOrSelf(points.stroke);\n\t\tpoints.width = fnOrSelf(points.width);\n\t\tpoints.fill = fnOrSelf(points.fill);\n\t}\n\n\tconst focus = self.focus = assign({}, opts.focus || {alpha: 0.3}, cursor.focus);\n\tconst cursorFocus = focus.prox >= 0;\n\n\t// series-intersection markers\n\tlet cursorPts = [null];\n\n\tfunction initCursorPt(s, si) {\n\t\tif (si > 0) {\n\t\t\tlet pt = cursor.points.show(self, si);\n\n\t\t\tif (pt) {\n\t\t\t\taddClass(pt, CURSOR_PT);\n\t\t\t\taddClass(pt, s.class);\n\t\t\t\telTrans(pt, -10, -10, plotWidCss, plotHgtCss);\n\t\t\t\tover.insertBefore(pt, cursorPts[si]);\n\n\t\t\t\treturn pt;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction initSeries(s, i) {\n\t\tif (mode == 1 || i > 0) {\n\t\t\tlet isTime = mode == 1 && scales[s.scale].time;\n\n\t\t\tlet sv = s.value;\n\t\t\ts.value = isTime ? (isStr(sv) ? timeSeriesVal(_tzDate, timeSeriesStamp(sv, _fmtDate)) : sv || _timeSeriesVal) : sv || numSeriesVal;\n\t\t\ts.label = s.label || (isTime ? timeSeriesLabel : numSeriesLabel);\n\t\t}\n\n\t\tif (i > 0) {\n\t\t\ts.width = s.width == null ? 1 : s.width;\n\t\t\ts.paths = s.paths || linearPath || retNull;\n\t\t\ts.fillTo = fnOrSelf(s.fillTo || seriesFillTo);\n\t\t\ts.pxAlign = +ifNull(s.pxAlign, pxAlign);\n\t\t\ts.pxRound = pxRoundGen(s.pxAlign);\n\n\t\t\ts.stroke = fnOrSelf(s.stroke || null);\n\t\t\ts.fill = fnOrSelf(s.fill || null);\n\t\t\ts._stroke = s._fill = s._paths = s._focus = null;\n\n\t\t\tlet _ptDia = ptDia(s.width, 1);\n\t\t\tlet points = s.points = assign({}, {\n\t\t\t\tsize: _ptDia,\n\t\t\t\twidth: max(1, _ptDia * .2),\n\t\t\t\tstroke: s.stroke,\n\t\t\t\tspace: _ptDia * 2,\n\t\t\t\tpaths: pointsPath,\n\t\t\t\t_stroke: null,\n\t\t\t\t_fill: null,\n\t\t\t}, s.points);\n\t\t\tpoints.show = fnOrSelf(points.show);\n\t\t\tpoints.filter = fnOrSelf(points.filter);\n\t\t\tpoints.fill = fnOrSelf(points.fill);\n\t\t\tpoints.stroke = fnOrSelf(points.stroke);\n\t\t\tpoints.paths = fnOrSelf(points.paths);\n\t\t\tpoints.pxAlign = s.pxAlign;\n\t\t}\n\n\t\tif (showLegend) {\n\t\t\tlet rowCells = initLegendRow(s, i);\n\t\t\tlegendRows.splice(i, 0, rowCells[0]);\n\t\t\tlegendCells.splice(i, 0, rowCells[1]);\n\t\t\tlegend.values.push(null);\t// NULL_LEGEND_VALS not yet avil here :(\n\t\t}\n\n\t\tif (cursor.show) {\n\t\t\tactiveIdxs.splice(i, 0, null);\n\n\t\t\tlet pt = initCursorPt(s, i);\n\t\t\tpt && cursorPts.splice(i, 0, pt);\n\t\t}\n\n\t\tfire(\"addSeries\", i);\n\t}\n\n\tfunction addSeries(opts, si) {\n\t\tsi = si == null ? series.length : si;\n\n\t\topts = setDefault(opts, si, xSeriesOpts, ySeriesOpts);\n\t\tseries.splice(si, 0, opts);\n\t\tinitSeries(series[si], si);\n\t}\n\n\tself.addSeries = addSeries;\n\n\tfunction delSeries(i) {\n\t\tseries.splice(i, 1);\n\n\t\tif (showLegend) {\n\t\t\tlegend.values.splice(i, 1);\n\n\t\t\tlegendCells.splice(i, 1);\n\t\t\tlet tr = legendRows.splice(i, 1)[0];\n\t\t\toffMouse(null, tr.firstChild);\n\t\t\ttr.remove();\n\t\t}\n\n\t\tif (cursor.show) {\n\t\t\tactiveIdxs.splice(i, 1);\n\n\t\t\tcursorPts.length > 1 && cursorPts.splice(i, 1)[0].remove();\n\t\t}\n\n\t\t// TODO: de-init no-longer-needed scales?\n\n\t\tfire(\"delSeries\", i);\n\t}\n\n\tself.delSeries = delSeries;\n\n\tconst sidesWithAxes = [false, false, false, false];\n\n\tfunction initAxis(axis, i) {\n\t\taxis._show = axis.show;\n\n\t\tif (axis.show) {\n\t\t\tlet isVt = axis.side % 2;\n\n\t\t\tlet sc = scales[axis.scale];\n\n\t\t\t// this can occur if all series specify non-default scales\n\t\t\tif (sc == null) {\n\t\t\t\taxis.scale = isVt ? series[1].scale : xScaleKey;\n\t\t\t\tsc = scales[axis.scale];\n\t\t\t}\n\n\t\t\t// also set defaults for incrs & values based on axis distr\n\t\t\tlet isTime = sc.time;\n\n\t\t\taxis.size = fnOrSelf(axis.size);\n\t\t\taxis.space = fnOrSelf(axis.space);\n\t\t\taxis.rotate = fnOrSelf(axis.rotate);\n\t\t\taxis.incrs = fnOrSelf(axis.incrs || ( sc.distr == 2 ? wholeIncrs : (isTime ? (ms == 1 ? timeIncrsMs : timeIncrsS) : numIncrs)));\n\t\t\taxis.splits = fnOrSelf(axis.splits || (isTime && sc.distr == 1 ? _timeAxisSplits : sc.distr == 3 ? logAxisSplits : sc.distr == 4 ? asinhAxisSplits : numAxisSplits));\n\n\t\t\taxis.stroke = fnOrSelf(axis.stroke);\n\t\t\taxis.grid.stroke = fnOrSelf(axis.grid.stroke);\n\t\t\taxis.ticks.stroke = fnOrSelf(axis.ticks.stroke);\n\t\t\taxis.border.stroke = fnOrSelf(axis.border.stroke);\n\n\t\t\tlet av = axis.values;\n\n\t\t\taxis.values = (\n\t\t\t\t// static array of tick values\n\t\t\t\tisArr(av) && !isArr(av[0]) ? fnOrSelf(av) :\n\t\t\t\t// temporal\n\t\t\t\tisTime ? (\n\t\t\t\t\t// config array of fmtDate string tpls\n\t\t\t\t\tisArr(av) ?\n\t\t\t\t\t\ttimeAxisVals(_tzDate, timeAxisStamps(av, _fmtDate)) :\n\t\t\t\t\t// fmtDate string tpl\n\t\t\t\t\tisStr(av) ?\n\t\t\t\t\t\ttimeAxisVal(_tzDate, av) :\n\t\t\t\t\tav || _timeAxisVals\n\t\t\t\t) : av || numAxisVals\n\t\t\t);\n\n\t\t\taxis.filter = fnOrSelf(axis.filter || ( sc.distr >= 3 ? logAxisValsFilt : retArg1));\n\n\t\t\taxis.font = pxRatioFont(axis.font);\n\t\t\taxis.labelFont = pxRatioFont(axis.labelFont);\n\n\t\t\taxis._size = axis.size(self, null, i, 0);\n\n\t\t\taxis._space =\n\t\t\taxis._rotate =\n\t\t\taxis._incrs =\n\t\t\taxis._found =\t// foundIncrSpace\n\t\t\taxis._splits =\n\t\t\taxis._values = null;\n\n\t\t\tif (axis._size > 0) {\n\t\t\t\tsidesWithAxes[i] = true;\n\t\t\t\taxis._el = placeDiv(AXIS, wrap);\n\t\t\t}\n\n\t\t\t// debug\n\t\t//\taxis._el.style.background = \"#\" + Math.floor(Math.random()*16777215).toString(16) + '80';\n\t\t}\n\t}\n\n\tfunction autoPadSide(self, side, sidesWithAxes, cycleNum) {\n\t\tlet [hasTopAxis, hasRgtAxis, hasBtmAxis, hasLftAxis] = sidesWithAxes;\n\n\t\tlet ori = side % 2;\n\t\tlet size = 0;\n\n\t\tif (ori == 0 && (hasLftAxis || hasRgtAxis))\n\t\t\tsize = (side == 0 && !hasTopAxis || side == 2 && !hasBtmAxis ? round(xAxisOpts.size / 3) : 0);\n\t\tif (ori == 1 && (hasTopAxis || hasBtmAxis))\n\t\t\tsize = (side == 1 && !hasRgtAxis || side == 3 && !hasLftAxis ? round(yAxisOpts.size / 2) : 0);\n\n\t\treturn size;\n\t}\n\n\tconst padding = self.padding = (opts.padding || [autoPadSide,autoPadSide,autoPadSide,autoPadSide]).map(p => fnOrSelf(ifNull(p, autoPadSide)));\n\tconst _padding = self._padding = padding.map((p, i) => p(self, i, sidesWithAxes, 0));\n\n\tlet dataLen;\n\n\t// rendered data window\n\tlet i0 = null;\n\tlet i1 = null;\n\tconst idxs = mode == 1 ? series[0].idxs : null;\n\n\tlet data0 = null;\n\n\tlet viaAutoScaleX = false;\n\n\tfunction setData(_data, _resetScales) {\n\t\tdata = _data == null ? [] : copy(_data, fastIsObj);\n\n\t\tif (mode == 2) {\n\t\t\tdataLen = 0;\n\t\t\tfor (let i = 1; i < series.length; i++)\n\t\t\t\tdataLen += data[i][0].length;\n\t\t\tself.data = data = _data;\n\t\t}\n\t\telse {\n\t\t\tif (data[0] == null)\n\t\t\t\tdata[0] = [];\n\n\t\t\tself.data = data.slice();\n\n\t\t\tdata0 = data[0];\n\t\t\tdataLen = data0.length;\n\n\t\t\tif (xScaleDistr == 2) {\n\t\t\t\tdata[0] = Array(dataLen);\n\t\t\t\tfor (let i = 0; i < dataLen; i++)\n\t\t\t\t\tdata[0][i] = i;\n\t\t\t}\n\t\t}\n\n\t\tself._data = data;\n\n\t\tresetYSeries(true);\n\n\t\tfire(\"setData\");\n\n\t\t// forces x axis tick values to re-generate when neither x scale nor y scale changes\n\t\t// in ordinal mode, scale range is by index, so will not change if new data has same length, but tick values are from data\n\t\tif (xScaleDistr == 2) {\n\t\t\tshouldConvergeSize = true;\n\n\t\t\t/* or somewhat cheaper, and uglier:\n\t\t\tif (ready) {\n\t\t\t\t// logic extracted from axesCalc()\n\t\t\t\tlet i = 0;\n\t\t\t\tlet axis = axes[i];\n\t\t\t\tlet _splits = axis._splits.map(i => data0[i]);\n\t\t\t\tlet [_incr, _space] = axis._found;\n\t\t\t\tlet incr = data0[_splits[1]] - data0[_splits[0]];\n\t\t\t\taxis._values = axis.values(self, axis.filter(self, _splits, i, _space, incr), i, _space, incr);\n\t\t\t}\n\t\t\t*/\n\t\t}\n\n\t\tif (_resetScales !== false) {\n\t\t\tlet xsc = scaleX;\n\n\t\t\tif (xsc.auto(self, viaAutoScaleX))\n\t\t\t\tautoScaleX();\n\t\t\telse\n\t\t\t\t_setScale(xScaleKey, xsc.min, xsc.max);\n\n\t\t\tshouldSetCursor = cursor.left >= 0;\n\t\t\tshouldSetLegend = true;\n\t\t\tcommit();\n\t\t}\n\t}\n\n\tself.setData = setData;\n\n\tfunction autoScaleX() {\n\t\tviaAutoScaleX = true;\n\n\t\tlet _min, _max;\n\n\t\tif (mode == 1) {\n\t\t\tif (dataLen > 0) {\n\t\t\t\ti0 = idxs[0] = 0;\n\t\t\t\ti1 = idxs[1] = dataLen - 1;\n\n\t\t\t\t_min = data[0][i0];\n\t\t\t\t_max = data[0][i1];\n\n\t\t\t\tif (xScaleDistr == 2) {\n\t\t\t\t\t_min = i0;\n\t\t\t\t\t_max = i1;\n\t\t\t\t}\n\t\t\t\telse if (dataLen == 1) {\n\t\t\t\t\tif (xScaleDistr == 3)\n\t\t\t\t\t\t[_min, _max] = rangeLog(_min, _min, scaleX.log, false);\n\t\t\t\t\telse if (xScaleDistr == 4)\n\t\t\t\t\t\t[_min, _max] = rangeAsinh(_min, _min, scaleX.log, false);\n\t\t\t\t\telse if (scaleX.time)\n\t\t\t\t\t\t_max = _min + round(86400 / ms);\n\t\t\t\t\telse\n\t\t\t\t\t\t[_min, _max] = rangeNum(_min, _max, rangePad, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\ti0 = idxs[0] = _min = null;\n\t\t\t\ti1 = idxs[1] = _max = null;\n\t\t\t}\n\t\t}\n\n\t\t_setScale(xScaleKey, _min, _max);\n\t}\n\n\tlet ctxStroke, ctxFill, ctxWidth, ctxDash, ctxJoin, ctxCap, ctxFont, ctxAlign, ctxBaseline;\n\tlet ctxAlpha;\n\n\tfunction setCtxStyle(stroke = transparent, width, dash = EMPTY_ARR, cap = \"butt\", fill = transparent, join = \"round\") {\n\t\tif (stroke != ctxStroke)\n\t\t\tctx.strokeStyle = ctxStroke = stroke;\n\t\tif (fill != ctxFill)\n\t\t\tctx.fillStyle = ctxFill = fill;\n\t\tif (width != ctxWidth)\n\t\t\tctx.lineWidth = ctxWidth = width;\n\t\tif (join != ctxJoin)\n\t\t\tctx.lineJoin = ctxJoin = join;\n\t\tif (cap != ctxCap)\n\t\t\tctx.lineCap = ctxCap = cap; // (\u203F|\u203F)\n\t\tif (dash != ctxDash)\n\t\t\tctx.setLineDash(ctxDash = dash);\n\t}\n\n\tfunction setFontStyle(font, fill, align, baseline) {\n\t\tif (fill != ctxFill)\n\t\t\tctx.fillStyle = ctxFill = fill;\n\t\tif (font != ctxFont)\n\t\t\tctx.font = ctxFont = font;\n\t\tif (align != ctxAlign)\n\t\t\tctx.textAlign = ctxAlign = align;\n\t\tif (baseline != ctxBaseline)\n\t\t\tctx.textBaseline = ctxBaseline = baseline;\n\t}\n\n\tfunction accScale(wsc, psc, facet, data, sorted = 0) {\n\t\tif (data.length > 0 && wsc.auto(self, viaAutoScaleX) && (psc == null || psc.min == null)) {\n\t\t\tlet _i0 = ifNull(i0, 0);\n\t\t\tlet _i1 = ifNull(i1, data.length - 1);\n\n\t\t\t// only run getMinMax() for invalidated series data, else reuse\n\t\t\tlet minMax = facet.min == null ? (wsc.distr == 3 ? getMinMaxLog(data, _i0, _i1) : getMinMax(data, _i0, _i1, sorted)) : [facet.min, facet.max];\n\n\t\t\t// initial min/max\n\t\t\twsc.min = min(wsc.min, facet.min = minMax[0]);\n\t\t\twsc.max = max(wsc.max, facet.max = minMax[1]);\n\t\t}\n\t}\n\n\tfunction setScales() {\n\t//\tlog(\"setScales()\", arguments);\n\n\t\t// wip scales\n\t\tlet wipScales = copy(scales, fastIsObj);\n\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\t\t\tlet psc = pendScales[k];\n\n\t\t\tif (psc != null && psc.min != null) {\n\t\t\t\tassign(wsc, psc);\n\n\t\t\t\t// explicitly setting the x-scale invalidates everything (acts as redraw)\n\t\t\t\tif (k == xScaleKey)\n\t\t\t\t\tresetYSeries(true);\n\t\t\t}\n\t\t\telse if (k != xScaleKey || mode == 2) {\n\t\t\t\tif (dataLen == 0 && wsc.from == null) {\n\t\t\t\t\tlet minMax = wsc.range(self, null, null, k);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\twsc.min = inf;\n\t\t\t\t\twsc.max = -inf;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (dataLen > 0) {\n\t\t\t// pre-range y-scales from y series' data values\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (mode == 1) {\n\t\t\t\t\tlet k = s.scale;\n\t\t\t\t\tlet wsc = wipScales[k];\n\t\t\t\t\tlet psc = pendScales[k];\n\n\t\t\t\t\tif (i == 0) {\n\t\t\t\t\t\tlet minMax = wsc.range(self, wsc.min, wsc.max, k);\n\n\t\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\t\twsc.max = minMax[1];\n\n\t\t\t\t\t\ti0 = closestIdx(wsc.min, data[0]);\n\t\t\t\t\t\ti1 = closestIdx(wsc.max, data[0]);\n\n\t\t\t\t\t\t// closest indices can be outside of view\n\t\t\t\t\t\tif (data[0][i0] < wsc.min)\n\t\t\t\t\t\t\ti0++;\n\t\t\t\t\t\tif (data[0][i1] > wsc.max)\n\t\t\t\t\t\t\ti1--;\n\n\t\t\t\t\t\ts.min = data0[i0];\n\t\t\t\t\t\ts.max = data0[i1];\n\t\t\t\t\t}\n\t\t\t\t\telse if (s.show && s.auto)\n\t\t\t\t\t\taccScale(wsc, psc, s, data[i], s.sorted);\n\n\t\t\t\t\ts.idxs[0] = i0;\n\t\t\t\t\ts.idxs[1] = i1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\tif (s.show && s.auto) {\n\t\t\t\t\t\t\t// TODO: only handles, assumes and requires facets[0] / 'x' scale, and facets[1] / 'y' scale\n\t\t\t\t\t\t\tlet [ xFacet, yFacet ] = s.facets;\n\t\t\t\t\t\t\tlet xScaleKey = xFacet.scale;\n\t\t\t\t\t\t\tlet yScaleKey = yFacet.scale;\n\t\t\t\t\t\t\tlet [ xData, yData ] = data[i];\n\n\t\t\t\t\t\t\taccScale(wipScales[xScaleKey], pendScales[xScaleKey], xFacet, xData, xFacet.sorted);\n\t\t\t\t\t\t\taccScale(wipScales[yScaleKey], pendScales[yScaleKey], yFacet, yData, yFacet.sorted);\n\n\t\t\t\t\t\t\t// temp\n\t\t\t\t\t\t\ts.min = yFacet.min;\n\t\t\t\t\t\t\ts.max = yFacet.max;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// range independent scales\n\t\t\tfor (let k in wipScales) {\n\t\t\t\tlet wsc = wipScales[k];\n\t\t\t\tlet psc = pendScales[k];\n\n\t\t\t\tif (wsc.from == null && (psc == null || psc.min == null)) {\n\t\t\t\t\tlet minMax = wsc.range(\n\t\t\t\t\t\tself,\n\t\t\t\t\t\twsc.min == inf ? null : wsc.min,\n\t\t\t\t\t\twsc.max == -inf ? null : wsc.max,\n\t\t\t\t\t\tk\n\t\t\t\t\t);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// range dependent scales\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\n\t\t\tif (wsc.from != null) {\n\t\t\t\tlet base = wipScales[wsc.from];\n\n\t\t\t\tif (base.min == null)\n\t\t\t\t\twsc.min = wsc.max = null;\n\t\t\t\telse {\n\t\t\t\t\tlet minMax = wsc.range(self, base.min, base.max, k);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet changed = {};\n\t\tlet anyChanged = false;\n\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\t\t\tlet sc = scales[k];\n\n\t\t\tif (sc.min != wsc.min || sc.max != wsc.max) {\n\t\t\t\tsc.min = wsc.min;\n\t\t\t\tsc.max = wsc.max;\n\n\t\t\t\tlet distr = sc.distr;\n\n\t\t\t\tsc._min = distr == 3 ? log10(sc.min) : distr == 4 ? asinh(sc.min, sc.asinh) : sc.min;\n\t\t\t\tsc._max = distr == 3 ? log10(sc.max) : distr == 4 ? asinh(sc.max, sc.asinh) : sc.max;\n\n\t\t\t\tchanged[k] = anyChanged = true;\n\t\t\t}\n\t\t}\n\n\t\tif (anyChanged) {\n\t\t\t// invalidate paths of all series on changed scales\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (mode == 2) {\n\t\t\t\t\tif (i > 0 && changed.y)\n\t\t\t\t\t\ts._paths = null;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (changed[s.scale])\n\t\t\t\t\t\ts._paths = null;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfor (let k in changed) {\n\t\t\t\tshouldConvergeSize = true;\n\t\t\t\tfire(\"setScale\", k);\n\t\t\t}\n\n\t\t\tif (cursor.show)\n\t\t\t\tshouldSetCursor = shouldSetLegend = cursor.left >= 0;\n\t\t}\n\n\t\tfor (let k in pendScales)\n\t\t\tpendScales[k] = null;\n\t}\n\n\t// grabs the nearest indices with y data outside of x-scale limits\n\tfunction getOuterIdxs(ydata) {\n\t\tlet _i0 = clamp(i0 - 1, 0, dataLen - 1);\n\t\tlet _i1 = clamp(i1 + 1, 0, dataLen - 1);\n\n\t\twhile (ydata[_i0] == null && _i0 > 0)\n\t\t\t_i0--;\n\n\t\twhile (ydata[_i1] == null && _i1 < dataLen - 1)\n\t\t\t_i1++;\n\n\t\treturn [_i0, _i1];\n\t}\n\n\tfunction drawSeries() {\n\t\tif (dataLen > 0) {\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (i > 0 && s.show && s._paths == null) {\n\t\t\t\t\tlet _idxs = getOuterIdxs(data[i]);\n\t\t\t\t\ts._paths = s.paths(self, i, _idxs[0], _idxs[1]);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tif (ctxAlpha != s.alpha)\n\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = s.alpha;\n\n\t\t\t\t\t{\n\t\t\t\t\t\tcacheStrokeFill(i, false);\n\t\t\t\t\t\ts._paths && drawPath(i, false);\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tcacheStrokeFill(i, true);\n\n\t\t\t\t\t\tlet show = s.points.show(self, i, i0, i1);\n\t\t\t\t\t\tlet idxs = s.points.filter(self, i, show, s._paths ? s._paths.gaps : null);\n\n\t\t\t\t\t\tif (show || idxs) {\n\t\t\t\t\t\t\ts.points._paths = s.points.paths(self, i, i0, i1, idxs);\n\t\t\t\t\t\t\tdrawPath(i, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ctxAlpha != 1)\n\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = 1;\n\n\t\t\t\t\tfire(\"drawSeries\", i);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction cacheStrokeFill(si, _points) {\n\t\tlet s = _points ? series[si].points : series[si];\n\n\t\ts._stroke = s.stroke(self, si);\n\t\ts._fill = s.fill(self, si);\n\t}\n\n\tfunction drawPath(si, _points) {\n\t\tlet s = _points ? series[si].points : series[si];\n\n\t\tlet strokeStyle = s._stroke;\n\t\tlet fillStyle = s._fill;\n\n\t\tlet { stroke, fill, clip: gapsClip, flags } = s._paths;\n\t\tlet boundsClip = null;\n\t\tlet width = roundDec(s.width * pxRatio, 3);\n\t\tlet offset = (width % 2) / 2;\n\n\t\tif (_points && fillStyle == null)\n\t\t\tfillStyle = width > 0 ? \"#fff\" : strokeStyle;\n\n\t\tlet _pxAlign = s.pxAlign == 1;\n\n\t\t_pxAlign && ctx.translate(offset, offset);\n\n\t\tif (!_points) {\n\t\t\tlet lft = plotLft,\n\t\t\t\ttop = plotTop,\n\t\t\t\twid = plotWid,\n\t\t\t\thgt = plotHgt;\n\n\t\t\tlet halfWid = width * pxRatio / 2;\n\n\t\t\tif (s.min == 0)\n\t\t\t\thgt += halfWid;\n\n\t\t\tif (s.max == 0) {\n\t\t\t\ttop -= halfWid;\n\t\t\t\thgt += halfWid;\n\t\t\t}\n\n\t\t\tboundsClip = new Path2D();\n\t\t\tboundsClip.rect(lft, top, wid, hgt);\n\t\t}\n\n\t\t// the points pathbuilder's gapsClip is its boundsClip, since points dont need gaps clipping, and bounds depend on point size\n\t\tif (_points)\n\t\t\tstrokeFill(strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, gapsClip);\n\t\telse\n\t\t\tfillStroke(si, strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, boundsClip, gapsClip);\n\n\t\t_pxAlign && ctx.translate(-offset, -offset);\n\t}\n\n\tfunction fillStroke(si, strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip) {\n\t\tlet didStrokeFill = false;\n\n\t\t// for all bands where this series is the top edge, create upwards clips using the bottom edges\n\t\t// and apply clips + fill with band fill or dfltFill\n\t\tbands.forEach((b, bi) => {\n\t\t\t// isUpperEdge?\n\t\t\tif (b.series[0] == si) {\n\t\t\t\tlet lowerEdge = series[b.series[1]];\n\t\t\t\tlet lowerData = data[b.series[1]];\n\n\t\t\t\tlet bandClip = (lowerEdge._paths || EMPTY_OBJ).band;\n\n\t\t\t\tif (isArr(bandClip))\n\t\t\t\t\tbandClip = b.dir == 1 ? bandClip[0] : bandClip[1];\n\n\t\t\t\tlet gapsClip2;\n\n\t\t\t\tlet _fillStyle = null;\n\n\t\t\t\t// hasLowerEdge?\n\t\t\t\tif (lowerEdge.show && bandClip && hasData(lowerData, i0, i1)) {\n\t\t\t\t\t_fillStyle = b.fill(self, bi) || fillStyle;\n\t\t\t\t\tgapsClip2 = lowerEdge._paths.clip;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tbandClip = null;\n\n\t\t\t\tstrokeFill(strokeStyle, lineWidth, lineDash, lineCap, _fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip);\n\n\t\t\t\tdidStrokeFill = true;\n\t\t\t}\n\t\t});\n\n\t\tif (!didStrokeFill)\n\t\t\tstrokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip);\n\t}\n\n\tconst CLIP_FILL_STROKE = BAND_CLIP_FILL | BAND_CLIP_STROKE;\n\n\tfunction strokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip) {\n\t\tsetCtxStyle(strokeStyle, lineWidth, lineDash, lineCap, fillStyle);\n\n\t\tif (boundsClip || gapsClip || bandClip) {\n\t\t\tctx.save();\n\t\t\tboundsClip && ctx.clip(boundsClip);\n\t\t\tgapsClip && ctx.clip(gapsClip);\n\t\t}\n\n\t\tif (bandClip) {\n\t\t\tif ((flags & CLIP_FILL_STROKE) == CLIP_FILL_STROKE) {\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tgapsClip2 && ctx.clip(gapsClip2);\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t\telse if (flags & BAND_CLIP_STROKE) {\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t\telse if (flags & BAND_CLIP_FILL) {\n\t\t\t\tctx.save();\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tgapsClip2 && ctx.clip(gapsClip2);\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tctx.restore();\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tdoFill(fillStyle, fillPath);\n\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t}\n\n\t\tif (boundsClip || gapsClip || bandClip)\n\t\t\tctx.restore();\n\t}\n\n\tfunction doStroke(strokeStyle, strokePath, lineWidth) {\n\t\tif (lineWidth > 0) {\n\t\t\tif (strokePath instanceof Map) {\n\t\t\t\tstrokePath.forEach((strokePath, strokeStyle) => {\n\t\t\t\t\tctx.strokeStyle = ctxStroke = strokeStyle;\n\t\t\t\t\tctx.stroke(strokePath);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse\n\t\t\t\tstrokePath != null && strokeStyle && ctx.stroke(strokePath);\n\t\t}\n\t}\n\n\tfunction doFill(fillStyle, fillPath) {\n\t\tif (fillPath instanceof Map) {\n\t\t\tfillPath.forEach((fillPath, fillStyle) => {\n\t\t\t\tctx.fillStyle = ctxFill = fillStyle;\n\t\t\t\tctx.fill(fillPath);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t\tfillPath != null && fillStyle && ctx.fill(fillPath);\n\t}\n\n\tfunction getIncrSpace(axisIdx, min, max, fullDim) {\n\t\tlet axis = axes[axisIdx];\n\n\t\tlet incrSpace;\n\n\t\tif (fullDim <= 0)\n\t\t\tincrSpace = [0, 0];\n\t\telse {\n\t\t\tlet minSpace = axis._space = axis.space(self, axisIdx, min, max, fullDim);\n\t\t\tlet incrs = axis._incrs = axis.incrs(self, axisIdx, min, max, fullDim, minSpace);\n\t\t\tincrSpace = findIncr(min, max, incrs, fullDim, minSpace);\n\t\t}\n\n\t\treturn (axis._found = incrSpace);\n\t}\n\n\tfunction drawOrthoLines(offs, filts, ori, side, pos0, len, width, stroke, dash, cap) {\n\t\tlet offset = (width % 2) / 2;\n\n\t\tpxAlign == 1 && ctx.translate(offset, offset);\n\n\t\tsetCtxStyle(stroke, width, dash, cap, stroke);\n\n\t\tctx.beginPath();\n\n\t\tlet x0, y0, x1, y1, pos1 = pos0 + (side == 0 || side == 3 ? -len : len);\n\n\t\tif (ori == 0) {\n\t\t\ty0 = pos0;\n\t\t\ty1 = pos1;\n\t\t}\n\t\telse {\n\t\t\tx0 = pos0;\n\t\t\tx1 = pos1;\n\t\t}\n\n\t\tfor (let i = 0; i < offs.length; i++) {\n\t\t\tif (filts[i] != null) {\n\t\t\t\tif (ori == 0)\n\t\t\t\t\tx0 = x1 = offs[i];\n\t\t\t\telse\n\t\t\t\t\ty0 = y1 = offs[i];\n\n\t\t\t\tctx.moveTo(x0, y0);\n\t\t\t\tctx.lineTo(x1, y1);\n\t\t\t}\n\t\t}\n\n\t\tctx.stroke();\n\n\t\tpxAlign == 1 && ctx.translate(-offset, -offset);\n\t}\n\n\tfunction axesCalc(cycleNum) {\n\t//\tlog(\"axesCalc()\", arguments);\n\n\t\tlet converged = true;\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (!axis.show)\n\t\t\t\treturn;\n\n\t\t\tlet scale = scales[axis.scale];\n\n\t\t\tif (scale.min == null) {\n\t\t\t\tif (axis._show) {\n\t\t\t\t\tconverged = false;\n\t\t\t\t\taxis._show = false;\n\t\t\t\t\tresetYSeries(false);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (!axis._show) {\n\t\t\t\t\tconverged = false;\n\t\t\t\t\taxis._show = true;\n\t\t\t\t\tresetYSeries(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet side = axis.side;\n\t\t\tlet ori = side % 2;\n\n\t\t\tlet {min, max} = scale;\t\t// \t\t// should this toggle them ._show = false\n\n\t\t\tlet [_incr, _space] = getIncrSpace(i, min, max, ori == 0 ? plotWidCss : plotHgtCss);\n\n\t\t\tif (_space == 0)\n\t\t\t\treturn;\n\n\t\t\t// if we're using index positions, force first tick to match passed index\n\t\t\tlet forceMin = scale.distr == 2;\n\n\t\t\tlet _splits = axis._splits = axis.splits(self, i, min, max, _incr, _space, forceMin);\n\n\t\t\t// tick labels\n\t\t\t// BOO this assumes a specific data/series\n\t\t\tlet splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits;\n\t\t\tlet incr = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr;\n\n\t\t\tlet values = axis._values = axis.values(self, axis.filter(self, splits, i, _space, incr), i, _space, incr);\n\n\t\t\t// rotating of labels only supported on bottom x axis\n\t\t\taxis._rotate = side == 2 ? axis.rotate(self, values, i, _space) : 0;\n\n\t\t\tlet oldSize = axis._size;\n\n\t\t\taxis._size = ceil(axis.size(self, values, i, cycleNum));\n\n\t\t\tif (oldSize != null && axis._size != oldSize)\t\t\t// ready && ?\n\t\t\t\tconverged = false;\n\t\t});\n\n\t\treturn converged;\n\t}\n\n\tfunction paddingCalc(cycleNum) {\n\t\tlet converged = true;\n\n\t\tpadding.forEach((p, i) => {\n\t\t\tlet _p = p(self, i, sidesWithAxes, cycleNum);\n\n\t\t\tif (_p != _padding[i])\n\t\t\t\tconverged = false;\n\n\t\t\t_padding[i] = _p;\n\t\t});\n\n\t\treturn converged;\n\t}\n\n\tfunction drawAxesGrid() {\n\t\tfor (let i = 0; i < axes.length; i++) {\n\t\t\tlet axis = axes[i];\n\n\t\t\tif (!axis.show || !axis._show)\n\t\t\t\tcontinue;\n\n\t\t\tlet side = axis.side;\n\t\t\tlet ori = side % 2;\n\n\t\t\tlet x, y;\n\n\t\t\tlet fillStyle = axis.stroke(self, i);\n\n\t\t\tlet shiftDir = side == 0 || side == 3 ? -1 : 1;\n\n\t\t\t// axis label\n\t\t\tif (axis.label) {\n\t\t\t\tlet shiftAmt = axis.labelGap * shiftDir;\n\t\t\t\tlet baseLpos = round((axis._lpos + shiftAmt) * pxRatio);\n\n\t\t\t\tsetFontStyle(axis.labelFont[0], fillStyle, \"center\", side == 2 ? TOP : BOTTOM);\n\n\t\t\t\tctx.save();\n\n\t\t\t\tif (ori == 1) {\n\t\t\t\t\tx = y = 0;\n\n\t\t\t\t\tctx.translate(\n\t\t\t\t\t\tbaseLpos,\n\t\t\t\t\t\tround(plotTop + plotHgt / 2),\n\t\t\t\t\t);\n\t\t\t\t\tctx.rotate((side == 3 ? -PI : PI) / 2);\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tx = round(plotLft + plotWid / 2);\n\t\t\t\t\ty = baseLpos;\n\t\t\t\t}\n\n\t\t\t\tctx.fillText(axis.label, x, y);\n\n\t\t\t\tctx.restore();\n\t\t\t}\n\n\t\t\tlet [_incr, _space] = axis._found;\n\n\t\t\tif (_space == 0)\n\t\t\t\tcontinue;\n\n\t\t\tlet scale = scales[axis.scale];\n\n\t\t\tlet plotDim = ori == 0 ? plotWid : plotHgt;\n\t\t\tlet plotOff = ori == 0 ? plotLft : plotTop;\n\n\t\t\tlet axisGap = round(axis.gap * pxRatio);\n\n\t\t\tlet _splits = axis._splits;\n\n\t\t\t// tick labels\n\t\t\t// BOO this assumes a specific data/series\n\t\t\tlet splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits;\n\t\t\tlet incr = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr;\n\n\t\t\tlet ticks = axis.ticks;\n\t\t\tlet border = axis.border;\n\t\t\tlet tickSize = ticks.show ? round(ticks.size * pxRatio) : 0;\n\n\t\t\t// rotating of labels only supported on bottom x axis\n\t\t\tlet angle = axis._rotate * -PI/180;\n\n\t\t\tlet basePos = pxRound(axis._pos * pxRatio);\n\t\t\tlet shiftAmt = (tickSize + axisGap) * shiftDir;\n\t\t\tlet finalPos = basePos + shiftAmt;\n\t\t\t y = ori == 0 ? finalPos : 0;\n\t\t\t x = ori == 1 ? finalPos : 0;\n\n\t\t\tlet font = axis.font[0];\n\t\t\tlet textAlign = axis.align == 1 ? LEFT :\n\t\t\t axis.align == 2 ? RIGHT :\n\t\t\t angle > 0 ? LEFT :\n\t\t\t angle < 0 ? RIGHT :\n\t\t\t ori == 0 ? \"center\" : side == 3 ? RIGHT : LEFT;\n\t\t\tlet textBaseline = angle ||\n\t\t\t ori == 1 ? \"middle\" : side == 2 ? TOP : BOTTOM;\n\n\t\t\tsetFontStyle(font, fillStyle, textAlign, textBaseline);\n\n\t\t\tlet lineHeight = axis.font[1] * lineMult;\n\n\t\t\tlet canOffs = _splits.map(val => pxRound(getPos(val, scale, plotDim, plotOff)));\n\n\t\t\tlet _values = axis._values;\n\n\t\t\tfor (let i = 0; i < _values.length; i++) {\n\t\t\t\tlet val = _values[i];\n\n\t\t\t\tif (val != null) {\n\t\t\t\t\tif (ori == 0)\n\t\t\t\t\t\tx = canOffs[i];\n\t\t\t\t\telse\n\t\t\t\t\t\ty = canOffs[i];\n\n\t\t\t\t\tval = \"\" + val;\n\n\t\t\t\t\tlet _parts = val.indexOf(\"\\n\") == -1 ? [val] : val.split(/\\n/gm);\n\n\t\t\t\t\tfor (let j = 0; j < _parts.length; j++) {\n\t\t\t\t\t\tlet text = _parts[j];\n\n\t\t\t\t\t\tif (angle) {\n\t\t\t\t\t\t\tctx.save();\n\t\t\t\t\t\t\tctx.translate(x, y + j * lineHeight); // can this be replaced with position math?\n\t\t\t\t\t\t\tctx.rotate(angle); // can this be done once?\n\t\t\t\t\t\t\tctx.fillText(text, 0, 0);\n\t\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tctx.fillText(text, x, y + j * lineHeight);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// ticks\n\t\t\tif (ticks.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\tcanOffs,\n\t\t\t\t\tticks.filter(self, splits, i, _space, incr),\n\t\t\t\t\tori,\n\t\t\t\t\tside,\n\t\t\t\t\tbasePos,\n\t\t\t\t\ttickSize,\n\t\t\t\t\troundDec(ticks.width * pxRatio, 3),\n\t\t\t\t\tticks.stroke(self, i),\n\t\t\t\t\tticks.dash,\n\t\t\t\t\tticks.cap,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// grid\n\t\t\tlet grid = axis.grid;\n\n\t\t\tif (grid.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\tcanOffs,\n\t\t\t\t\tgrid.filter(self, splits, i, _space, incr),\n\t\t\t\t\tori,\n\t\t\t\t\tori == 0 ? 2 : 1,\n\t\t\t\t\tori == 0 ? plotTop : plotLft,\n\t\t\t\t\tori == 0 ? plotHgt : plotWid,\n\t\t\t\t\troundDec(grid.width * pxRatio, 3),\n\t\t\t\t\tgrid.stroke(self, i),\n\t\t\t\t\tgrid.dash,\n\t\t\t\t\tgrid.cap,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (border.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\t[basePos],\n\t\t\t\t\t[1],\n\t\t\t\t\tori == 0 ? 1 : 0,\n\t\t\t\t\tori == 0 ? 1 : 2,\n\t\t\t\t\tori == 1 ? plotTop : plotLft,\n\t\t\t\t\tori == 1 ? plotHgt : plotWid,\n\t\t\t\t\troundDec(border.width * pxRatio, 3),\n\t\t\t\t\tborder.stroke(self, i),\n\t\t\t\t\tborder.dash,\n\t\t\t\t\tborder.cap,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfire(\"drawAxes\");\n\t}\n\n\tfunction resetYSeries(minMax) {\n\t//\tlog(\"resetYSeries()\", arguments);\n\n\t\tseries.forEach((s, i) => {\n\t\t\tif (i > 0) {\n\t\t\t\ts._paths = null;\n\n\t\t\t\tif (minMax) {\n\t\t\t\t\tif (mode == 1) {\n\t\t\t\t\t\ts.min = null;\n\t\t\t\t\t\ts.max = null;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\ts.facets.forEach(f => {\n\t\t\t\t\t\t\tf.min = null;\n\t\t\t\t\t\t\tf.max = null;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tlet queuedCommit = false;\n\n\tfunction commit() {\n\t\tif (!queuedCommit) {\n\t\t\tmicroTask(_commit);\n\t\t\tqueuedCommit = true;\n\t\t}\n\t}\n\n\tfunction _commit() {\n\t//\tlog(\"_commit()\", arguments);\n\n\t\tif (shouldSetScales) {\n\t\t\tsetScales();\n\t\t\tshouldSetScales = false;\n\t\t}\n\n\t\tif (shouldConvergeSize) {\n\t\t\tconvergeSize();\n\t\t\tshouldConvergeSize = false;\n\t\t}\n\n\t\tif (shouldSetSize) {\n\t\t\tsetStylePx(under, LEFT, plotLftCss);\n\t\t\tsetStylePx(under, TOP, plotTopCss);\n\t\t\tsetStylePx(under, WIDTH, plotWidCss);\n\t\t\tsetStylePx(under, HEIGHT, plotHgtCss);\n\n\t\t\tsetStylePx(over, LEFT, plotLftCss);\n\t\t\tsetStylePx(over, TOP, plotTopCss);\n\t\t\tsetStylePx(over, WIDTH, plotWidCss);\n\t\t\tsetStylePx(over, HEIGHT, plotHgtCss);\n\n\t\t\tsetStylePx(wrap, WIDTH, fullWidCss);\n\t\t\tsetStylePx(wrap, HEIGHT, fullHgtCss);\n\n\t\t\t// NOTE: mutating this during print preview in Chrome forces transparent\n\t\t\t// canvas pixels to white, even when followed up with clearRect() below\n\t\t\tcan.width = round(fullWidCss * pxRatio);\n\t\t\tcan.height = round(fullHgtCss * pxRatio);\n\n\t\t\taxes.forEach(({ _el, _show, _size, _pos, side }) => {\n\t\t\t\tif (_el != null) {\n\t\t\t\t\tif (_show) {\n\t\t\t\t\t\tlet posOffset = (side === 3 || side === 0 ? _size : 0);\n\t\t\t\t\t\tlet isVt = side % 2 == 1;\n\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"left\" : \"top\", _pos - posOffset);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"width\" : \"height\", _size);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"top\" : \"left\", isVt ? plotTopCss : plotLftCss);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"height\" : \"width\", isVt ? plotHgtCss : plotWidCss);\n\n\t\t\t\t\t\tremClass(_el, OFF);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\taddClass(_el, OFF);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// invalidate ctx style cache\n\t\t\tctxStroke = ctxFill = ctxWidth = ctxJoin = ctxCap = ctxFont = ctxAlign = ctxBaseline = ctxDash = null;\n\t\t\tctxAlpha = 1;\n\n\t\t\tsyncRect(true);\n\n\t\t\tfire(\"setSize\");\n\n\t\t\tshouldSetSize = false;\n\t\t}\n\n\t\tif (fullWidCss > 0 && fullHgtCss > 0) {\n\t\t\tctx.clearRect(0, 0, can.width, can.height);\n\t\t\tfire(\"drawClear\");\n\t\t\tdrawOrder.forEach(fn => fn());\n\t\t\tfire(\"draw\");\n\t\t}\n\n\t//\tif (shouldSetSelect) {\n\t\t// TODO: update .u-select metrics (if visible)\n\t\t//\tsetStylePx(selectDiv, TOP, select.top = 0);\n\t\t//\tsetStylePx(selectDiv, LEFT, select.left = 0);\n\t\t//\tsetStylePx(selectDiv, WIDTH, select.width = 0);\n\t\t//\tsetStylePx(selectDiv, HEIGHT, select.height = 0);\n\t\t//\tshouldSetSelect = false;\n\t//\t}\n\n\t\tif (cursor.show && shouldSetCursor) {\n\t\t\tupdateCursor(null, true, false);\n\t\t\tshouldSetCursor = false;\n\t\t}\n\n\t//\tif (FEAT_LEGEND && legend.show && legend.live && shouldSetLegend) {}\n\n\t\tif (!ready) {\n\t\t\tready = true;\n\t\t\tself.status = 1;\n\n\t\t\tfire(\"ready\");\n\t\t}\n\n\t\tviaAutoScaleX = false;\n\n\t\tqueuedCommit = false;\n\t}\n\n\tself.redraw = (rebuildPaths, recalcAxes) => {\n\t\tshouldConvergeSize = recalcAxes || false;\n\n\t\tif (rebuildPaths !== false)\n\t\t\t_setScale(xScaleKey, scaleX.min, scaleX.max);\n\t\telse\n\t\t\tcommit();\n\t};\n\n\t// redraw() => setScale('x', scales.x.min, scales.x.max);\n\n\t// explicit, never re-ranged (is this actually true? for x and y)\n\tfunction setScale(key, opts) {\n\t\tlet sc = scales[key];\n\n\t\tif (sc.from == null) {\n\t\t\tif (dataLen == 0) {\n\t\t\t\tlet minMax = sc.range(self, opts.min, opts.max, key);\n\t\t\t\topts.min = minMax[0];\n\t\t\t\topts.max = minMax[1];\n\t\t\t}\n\n\t\t\tif (opts.min > opts.max) {\n\t\t\t\tlet _min = opts.min;\n\t\t\t\topts.min = opts.max;\n\t\t\t\topts.max = _min;\n\t\t\t}\n\n\t\t\tif (dataLen > 1 && opts.min != null && opts.max != null && opts.max - opts.min < 1e-16)\n\t\t\t\treturn;\n\n\t\t\tif (key == xScaleKey) {\n\t\t\t\tif (sc.distr == 2 && dataLen > 0) {\n\t\t\t\t\topts.min = closestIdx(opts.min, data[0]);\n\t\t\t\t\topts.max = closestIdx(opts.max, data[0]);\n\n\t\t\t\t\tif (opts.min == opts.max)\n\t\t\t\t\t\topts.max++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t//\tlog(\"setScale()\", arguments);\n\n\t\t\tpendScales[key] = opts;\n\n\t\t\tshouldSetScales = true;\n\t\t\tcommit();\n\t\t}\n\t}\n\n\tself.setScale = setScale;\n\n//\tINTERACTION\n\n\tlet xCursor;\n\tlet yCursor;\n\tlet vCursor;\n\tlet hCursor;\n\n\t// starting position before cursor.move\n\tlet rawMouseLeft0;\n\tlet rawMouseTop0;\n\n\t// starting position\n\tlet mouseLeft0;\n\tlet mouseTop0;\n\n\t// current position before cursor.move\n\tlet rawMouseLeft1;\n\tlet rawMouseTop1;\n\n\t// current position\n\tlet mouseLeft1;\n\tlet mouseTop1;\n\n\tlet dragging = false;\n\n\tconst drag = cursor.drag;\n\n\tlet dragX = drag.x;\n\tlet dragY = drag.y;\n\n\tif (cursor.show) {\n\t\tif (cursor.x)\n\t\t\txCursor = placeDiv(CURSOR_X, over);\n\t\tif (cursor.y)\n\t\t\tyCursor = placeDiv(CURSOR_Y, over);\n\n\t\tif (scaleX.ori == 0) {\n\t\t\tvCursor = xCursor;\n\t\t\thCursor = yCursor;\n\t\t}\n\t\telse {\n\t\t\tvCursor = yCursor;\n\t\t\thCursor = xCursor;\n\t\t}\n\n\t\tmouseLeft1 = cursor.left;\n\t\tmouseTop1 = cursor.top;\n\t}\n\n\tconst select = self.select = assign({\n\t\tshow: true,\n\t\tover: true,\n\t\tleft: 0,\n\t\twidth: 0,\n\t\ttop: 0,\n\t\theight: 0,\n\t}, opts.select);\n\n\tconst selectDiv = select.show ? placeDiv(SELECT, select.over ? over : under) : null;\n\n\tfunction setSelect(opts, _fire) {\n\t\tif (select.show) {\n\t\t\tfor (let prop in opts)\n\t\t\t\tsetStylePx(selectDiv, prop, select[prop] = opts[prop]);\n\n\t\t\t_fire !== false && fire(\"setSelect\");\n\t\t}\n\t}\n\n\tself.setSelect = setSelect;\n\n\tfunction toggleDOM(i, onOff) {\n\t\tlet s = series[i];\n\t\tlet label = showLegend ? legendRows[i] : null;\n\n\t\tif (s.show)\n\t\t\tlabel && remClass(label, OFF);\n\t\telse {\n\t\t\tlabel && addClass(label, OFF);\n\t\t\tcursorPts.length > 1 && elTrans(cursorPts[i], -10, -10, plotWidCss, plotHgtCss);\n\t\t}\n\t}\n\n\tfunction _setScale(key, min, max) {\n\t\tsetScale(key, {min, max});\n\t}\n\n\tfunction setSeries(i, opts, _fire, _pub) {\n\t//\tlog(\"setSeries()\", arguments);\n\n\t\tif (opts.focus != null)\n\t\t\tsetFocus(i);\n\n\t\tif (opts.show != null) {\n\t\t\tseries.forEach((s, si) => {\n\t\t\t\tif (si > 0 && (i == si || i == null)) {\n\t\t\t\t\ts.show = opts.show;\n\t\t\t\t\ttoggleDOM(si, opts.show);\n\n\t\t\t\t\t_setScale(mode == 2 ? s.facets[1].scale : s.scale, null, null);\n\t\t\t\t\tcommit();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t_fire !== false && fire(\"setSeries\", i, opts);\n\n\t\t_pub && pubSync(\"setSeries\", self, i, opts);\n\t}\n\n\tself.setSeries = setSeries;\n\n\tfunction setBand(bi, opts) {\n\t\tassign(bands[bi], opts);\n\t}\n\n\tfunction addBand(opts, bi) {\n\t\topts.fill = fnOrSelf(opts.fill || null);\n\t\topts.dir = ifNull(opts.dir, -1);\n\t\tbi = bi == null ? bands.length : bi;\n\t\tbands.splice(bi, 0, opts);\n\t}\n\n\tfunction delBand(bi) {\n\t\tif (bi == null)\n\t\t\tbands.length = 0;\n\t\telse\n\t\t\tbands.splice(bi, 1);\n\t}\n\n\tself.addBand = addBand;\n\tself.setBand = setBand;\n\tself.delBand = delBand;\n\n\tfunction setAlpha(i, value) {\n\t\tseries[i].alpha = value;\n\n\t\tif (cursor.show && cursorPts[i])\n\t\t\tcursorPts[i].style.opacity = value;\n\n\t\tif (showLegend && legendRows[i])\n\t\t\tlegendRows[i].style.opacity = value;\n\t}\n\n\t// y-distance\n\tlet closestDist;\n\tlet closestSeries;\n\tlet focusedSeries;\n\tconst FOCUS_TRUE = {focus: true};\n\n\tfunction setFocus(i) {\n\t\tif (i != focusedSeries) {\n\t\t//\tlog(\"setFocus()\", arguments);\n\n\t\t\tlet allFocused = i == null;\n\n\t\t\tlet _setAlpha = focus.alpha != 1;\n\n\t\t\tseries.forEach((s, i2) => {\n\t\t\t\tlet isFocused = allFocused || i2 == 0 || i2 == i;\n\t\t\t\ts._focus = allFocused ? null : isFocused;\n\t\t\t\t_setAlpha && setAlpha(i2, isFocused ? 1 : focus.alpha);\n\t\t\t});\n\n\t\t\tfocusedSeries = i;\n\t\t\t_setAlpha && commit();\n\t\t}\n\t}\n\n\tif (showLegend && cursorFocus) {\n\t\ton(mouseleave, legendEl, e => {\n\t\t\tif (cursor._lock)\n\t\t\t\treturn;\n\n\t\t\tif (focusedSeries != null)\n\t\t\t\tsetSeries(null, FOCUS_TRUE, true, syncOpts.setSeries);\n\t\t});\n\t}\n\n\tfunction posToVal(pos, scale, can) {\n\t\tlet sc = scales[scale];\n\n\t\tif (can)\n\t\t\tpos = pos / pxRatio - (sc.ori == 1 ? plotTopCss : plotLftCss);\n\n\t\tlet dim = plotWidCss;\n\n\t\tif (sc.ori == 1) {\n\t\t\tdim = plotHgtCss;\n\t\t\tpos = dim - pos;\n\t\t}\n\n\t\tif (sc.dir == -1)\n\t\t\tpos = dim - pos;\n\n\t\tlet _min = sc._min,\n\t\t\t_max = sc._max,\n\t\t\tpct = pos / dim;\n\n\t\tlet sv = _min + (_max - _min) * pct;\n\n\t\tlet distr = sc.distr;\n\n\t\treturn (\n\t\t\tdistr == 3 ? pow(10, sv) :\n\t\t\tdistr == 4 ? sinh(sv, sc.asinh) :\n\t\t\tsv\n\t\t);\n\t}\n\n\tfunction closestIdxFromXpos(pos, can) {\n\t\tlet v = posToVal(pos, xScaleKey, can);\n\t\treturn closestIdx(v, data[0], i0, i1);\n\t}\n\n\tself.valToIdx = val => closestIdx(val, data[0]);\n\tself.posToIdx = closestIdxFromXpos;\n\tself.posToVal = posToVal;\n\tself.valToPos = (val, scale, can) => (\n\t\tscales[scale].ori == 0 ?\n\t\tgetHPos(val, scales[scale],\n\t\t\tcan ? plotWid : plotWidCss,\n\t\t\tcan ? plotLft : 0,\n\t\t) :\n\t\tgetVPos(val, scales[scale],\n\t\t\tcan ? plotHgt : plotHgtCss,\n\t\t\tcan ? plotTop : 0,\n\t\t)\n\t);\n\n\t// defers calling expensive functions\n\tfunction batch(fn) {\n\t\tfn(self);\n\t\tcommit();\n\t}\n\n\tself.batch = batch;\n\n\t(self.setCursor = (opts, _fire, _pub) => {\n\t\tmouseLeft1 = opts.left;\n\t\tmouseTop1 = opts.top;\n\t//\tassign(cursor, opts);\n\t\tupdateCursor(null, _fire, _pub);\n\t});\n\n\tfunction setSelH(off, dim) {\n\t\tsetStylePx(selectDiv, LEFT, select.left = off);\n\t\tsetStylePx(selectDiv, WIDTH, select.width = dim);\n\t}\n\n\tfunction setSelV(off, dim) {\n\t\tsetStylePx(selectDiv, TOP, select.top = off);\n\t\tsetStylePx(selectDiv, HEIGHT, select.height = dim);\n\t}\n\n\tlet setSelX = scaleX.ori == 0 ? setSelH : setSelV;\n\tlet setSelY = scaleX.ori == 1 ? setSelH : setSelV;\n\n\tfunction syncLegend() {\n\t\tif (showLegend && legend.live) {\n\t\t\tfor (let i = mode == 2 ? 1 : 0; i < series.length; i++) {\n\t\t\t\tif (i == 0 && multiValLegend)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlet vals = legend.values[i];\n\n\t\t\t\tlet j = 0;\n\n\t\t\t\tfor (let k in vals)\n\t\t\t\t\tlegendCells[i][j++].firstChild.nodeValue = vals[k];\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setLegend(opts, _fire) {\n\t\tif (opts != null) {\n\t\t\tlet idx = opts.idx;\n\n\t\t\tlegend.idx = idx;\n\t\t\tseries.forEach((s, sidx) => {\n\t\t\t\t(sidx > 0 || !multiValLegend) && setLegendValues(sidx, idx);\n\t\t\t});\n\t\t}\n\n\t\tif (showLegend && legend.live)\n\t\t\tsyncLegend();\n\n\t\tshouldSetLegend = false;\n\n\t\t_fire !== false && fire(\"setLegend\");\n\t}\n\n\tself.setLegend = setLegend;\n\n\tfunction setLegendValues(sidx, idx) {\n\t\tlet val;\n\n\t\tif (idx == null)\n\t\t\tval = NULL_LEGEND_VALUES;\n\t\telse {\n\t\t\tlet s = series[sidx];\n\t\t\tlet src = sidx == 0 && xScaleDistr == 2 ? data0 : data[sidx];\n\t\t\tval = multiValLegend ? s.values(self, sidx, idx) : {_: s.value(self, src[idx], sidx, idx)};\n\t\t}\n\n\t\tlegend.values[sidx] = val;\n\t}\n\n\tfunction updateCursor(src, _fire, _pub) {\n\t//\tts == null && log(\"updateCursor()\", arguments);\n\n\t\trawMouseLeft1 = mouseLeft1;\n\t\trawMouseTop1 = mouseTop1;\n\n\t\t[mouseLeft1, mouseTop1] = cursor.move(self, mouseLeft1, mouseTop1);\n\n\t\tif (cursor.show) {\n\t\t\tvCursor && elTrans(vCursor, round(mouseLeft1), 0, plotWidCss, plotHgtCss);\n\t\t\thCursor && elTrans(hCursor, 0, round(mouseTop1), plotWidCss, plotHgtCss);\n\t\t}\n\n\t\tlet idx;\n\n\t\t// when zooming to an x scale range between datapoints the binary search\n\t\t// for nearest min/max indices results in this condition. cheap hack :D\n\t\tlet noDataInRange = i0 > i1; // works for mode 1 only\n\n\t\tclosestDist = inf;\n\n\t\t// TODO: extract\n\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss;\n\t\tlet yDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss;\n\n\t\t// if cursor hidden, hide points & clear legend vals\n\t\tif (mouseLeft1 < 0 || dataLen == 0 || noDataInRange) {\n\t\t\tidx = null;\n\n\t\t\tfor (let i = 0; i < series.length; i++) {\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tcursorPts.length > 1 && elTrans(cursorPts[i], -10, -10, plotWidCss, plotHgtCss);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (cursorFocus)\n\t\t\t\tsetSeries(null, FOCUS_TRUE, true, src == null && syncOpts.setSeries);\n\n\t\t\tif (legend.live) {\n\t\t\t\tactiveIdxs.fill(null);\n\t\t\t\tshouldSetLegend = true;\n\n\t\t\t\tfor (let i = 0; i < series.length; i++)\n\t\t\t\t\tlegend.values[i] = NULL_LEGEND_VALUES;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t//\tlet pctY = 1 - (y / rect.height);\n\n\t\t\tlet mouseXPos, valAtPosX, xPos;\n\n\t\t\tif (mode == 1) {\n\t\t\t\tmouseXPos = scaleX.ori == 0 ? mouseLeft1 : mouseTop1;\n\t\t\t\tvalAtPosX = posToVal(mouseXPos, xScaleKey);\n\t\t\t\tidx = closestIdx(valAtPosX, data[0], i0, i1);\n\t\t\t\txPos = incrRoundUp(valToPosX(data[0][idx], scaleX, xDim, 0), 0.5);\n\t\t\t}\n\n\t\t\tfor (let i = mode == 2 ? 1 : 0; i < series.length; i++) {\n\t\t\t\tlet s = series[i];\n\n\t\t\t\tlet idx1 = activeIdxs[i];\n\t\t\t\tlet yVal1 = mode == 1 ? data[i][idx1] : data[i][1][idx1];\n\n\t\t\t\tlet idx2 = cursor.dataIdx(self, i, idx, valAtPosX);\n\t\t\t\tlet yVal2 = mode == 1 ? data[i][idx2] : data[i][1][idx2];\n\n\t\t\t\tshouldSetLegend = shouldSetLegend || yVal2 != yVal1 || idx2 != idx1;\n\n\t\t\t\tactiveIdxs[i] = idx2;\n\n\t\t\t\tlet xPos2 = idx2 == idx ? xPos : incrRoundUp(valToPosX(mode == 1 ? data[0][idx2] : data[i][0][idx2], scaleX, xDim, 0), 0.5);\n\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tlet yPos = yVal2 == null ? -10 : incrRoundUp(valToPosY(yVal2, mode == 1 ? scales[s.scale] : scales[s.facets[1].scale], yDim, 0), 0.5);\n\n\t\t\t\t\tif (yPos > 0 && mode == 1) {\n\t\t\t\t\t\tlet dist = abs(yPos - mouseTop1);\n\n\t\t\t\t\t\tif (dist <= closestDist) {\n\t\t\t\t\t\t\tclosestDist = dist;\n\t\t\t\t\t\t\tclosestSeries = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet hPos, vPos;\n\n\t\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\t\thPos = xPos2;\n\t\t\t\t\t\tvPos = yPos;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\thPos = yPos;\n\t\t\t\t\t\tvPos = xPos2;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (shouldSetLegend && cursorPts.length > 1) {\n\t\t\t\t\t\telColor(cursorPts[i], cursor.points.fill(self, i), cursor.points.stroke(self, i));\n\n\t\t\t\t\t\tlet ptWid, ptHgt, ptLft, ptTop,\n\t\t\t\t\t\t\tcentered = true,\n\t\t\t\t\t\t\tgetBBox = cursor.points.bbox;\n\n\t\t\t\t\t\tif (getBBox != null) {\n\t\t\t\t\t\t\tcentered = false;\n\n\t\t\t\t\t\t\tlet bbox = getBBox(self, i);\n\n\t\t\t\t\t\t\tptLft = bbox.left;\n\t\t\t\t\t\t\tptTop = bbox.top;\n\t\t\t\t\t\t\tptWid = bbox.width;\n\t\t\t\t\t\t\tptHgt = bbox.height;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tptLft = hPos;\n\t\t\t\t\t\t\tptTop = vPos;\n\t\t\t\t\t\t\tptWid = ptHgt = cursor.points.size(self, i);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\telSize(cursorPts[i], ptWid, ptHgt, centered);\n\t\t\t\t\t\telTrans(cursorPts[i], ptLft, ptTop, plotWidCss, plotHgtCss);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (legend.live) {\n\t\t\t\t\tif (!shouldSetLegend || i == 0 && multiValLegend)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tsetLegendValues(i, idx2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcursor.idx = idx;\n\t\tcursor.left = mouseLeft1;\n\t\tcursor.top = mouseTop1;\n\n\t\tif (shouldSetLegend) {\n\t\t\tlegend.idx = idx;\n\t\t\tsetLegend();\n\t\t}\n\n\t\t// nit: cursor.drag.setSelect is assumed always true\n\t\tif (select.show && dragging) {\n\t\t\tif (src != null) {\n\t\t\t\tlet [xKey, yKey] = syncOpts.scales;\n\t\t\t\tlet [matchXKeys, matchYKeys] = syncOpts.match;\n\t\t\t\tlet [xKeySrc, yKeySrc] = src.cursor.sync.scales;\n\n\t\t\t\t// match the dragX/dragY implicitness/explicitness of src\n\t\t\t\tlet sdrag = src.cursor.drag;\n\t\t\t\tdragX = sdrag._x;\n\t\t\t\tdragY = sdrag._y;\n\n\t\t\t\tif (dragX || dragY) {\n\t\t\t\t\tlet { left, top, width, height } = src.select;\n\n\t\t\t\t\tlet sori = src.scales[xKey].ori;\n\t\t\t\t\tlet sPosToVal = src.posToVal;\n\n\t\t\t\t\tlet sOff, sDim, sc, a, b;\n\n\t\t\t\t\tlet matchingX = xKey != null && matchXKeys(xKey, xKeySrc);\n\t\t\t\t\tlet matchingY = yKey != null && matchYKeys(yKey, yKeySrc);\n\n\t\t\t\t\tif (matchingX && dragX) {\n\t\t\t\t\t\tif (sori == 0) {\n\t\t\t\t\t\t\tsOff = left;\n\t\t\t\t\t\t\tsDim = width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsOff = top;\n\t\t\t\t\t\t\tsDim = height;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc = scales[xKey];\n\n\t\t\t\t\t\ta = valToPosX(sPosToVal(sOff, xKeySrc), sc, xDim, 0);\n\t\t\t\t\t\tb = valToPosX(sPosToVal(sOff + sDim, xKeySrc), sc, xDim, 0);\n\n\t\t\t\t\t\tsetSelX(min(a,b), abs(b-a));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsetSelX(0, xDim);\n\n\t\t\t\t\tif (matchingY && dragY) {\n\t\t\t\t\t\tif (sori == 1) {\n\t\t\t\t\t\t\tsOff = left;\n\t\t\t\t\t\t\tsDim = width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsOff = top;\n\t\t\t\t\t\t\tsDim = height;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc = scales[yKey];\n\n\t\t\t\t\t\ta = valToPosY(sPosToVal(sOff, yKeySrc), sc, yDim, 0);\n\t\t\t\t\t\tb = valToPosY(sPosToVal(sOff + sDim, yKeySrc), sc, yDim, 0);\n\n\t\t\t\t\t\tsetSelY(min(a,b), abs(b-a));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsetSelY(0, yDim);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\thideSelect();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet rawDX = abs(rawMouseLeft1 - rawMouseLeft0);\n\t\t\t\tlet rawDY = abs(rawMouseTop1 - rawMouseTop0);\n\n\t\t\t\tif (scaleX.ori == 1) {\n\t\t\t\t\tlet _rawDX = rawDX;\n\t\t\t\t\trawDX = rawDY;\n\t\t\t\t\trawDY = _rawDX;\n\t\t\t\t}\n\n\t\t\t\tdragX = drag.x && rawDX >= drag.dist;\n\t\t\t\tdragY = drag.y && rawDY >= drag.dist;\n\n\t\t\t\tlet uni = drag.uni;\n\n\t\t\t\tif (uni != null) {\n\t\t\t\t\t// only calc drag status if they pass the dist thresh\n\t\t\t\t\tif (dragX && dragY) {\n\t\t\t\t\t\tdragX = rawDX >= uni;\n\t\t\t\t\t\tdragY = rawDY >= uni;\n\n\t\t\t\t\t\t// force unidirectionality when both are under uni limit\n\t\t\t\t\t\tif (!dragX && !dragY) {\n\t\t\t\t\t\t\tif (rawDY > rawDX)\n\t\t\t\t\t\t\t\tdragY = true;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tdragX = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (drag.x && drag.y && (dragX || dragY))\n\t\t\t\t\t// if omni with no uni then both dragX / dragY should be true if either is true\n\t\t\t\t\tdragX = dragY = true;\n\n\t\t\t\tlet p0, p1;\n\n\t\t\t\tif (dragX) {\n\t\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\t\tp0 = mouseLeft0;\n\t\t\t\t\t\tp1 = mouseLeft1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp0 = mouseTop0;\n\t\t\t\t\t\tp1 = mouseTop1;\n\t\t\t\t\t}\n\n\t\t\t\t\tsetSelX(min(p0, p1), abs(p1 - p0));\n\n\t\t\t\t\tif (!dragY)\n\t\t\t\t\t\tsetSelY(0, yDim);\n\t\t\t\t}\n\n\t\t\t\tif (dragY) {\n\t\t\t\t\tif (scaleX.ori == 1) {\n\t\t\t\t\t\tp0 = mouseLeft0;\n\t\t\t\t\t\tp1 = mouseLeft1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp0 = mouseTop0;\n\t\t\t\t\t\tp1 = mouseTop1;\n\t\t\t\t\t}\n\n\t\t\t\t\tsetSelY(min(p0, p1), abs(p1 - p0));\n\n\t\t\t\t\tif (!dragX)\n\t\t\t\t\t\tsetSelX(0, xDim);\n\t\t\t\t}\n\n\t\t\t\t// the drag didn't pass the dist requirement\n\t\t\t\tif (!dragX && !dragY) {\n\t\t\t\t\tsetSelX(0, 0);\n\t\t\t\t\tsetSelY(0, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdrag._x = dragX;\n\t\tdrag._y = dragY;\n\n\t\tif (src == null) {\n\t\t\tif (_pub) {\n\t\t\t\tif (syncKey != null) {\n\t\t\t\t\tlet [xSyncKey, ySyncKey] = syncOpts.scales;\n\n\t\t\t\t\tsyncOpts.values[0] = xSyncKey != null ? posToVal(scaleX.ori == 0 ? mouseLeft1 : mouseTop1, xSyncKey) : null;\n\t\t\t\t\tsyncOpts.values[1] = ySyncKey != null ? posToVal(scaleX.ori == 1 ? mouseLeft1 : mouseTop1, ySyncKey) : null;\n\t\t\t\t}\n\n\t\t\t\tpubSync(mousemove, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, idx);\n\t\t\t}\n\n\t\t\tif (cursorFocus) {\n\t\t\t\tlet shouldPub = _pub && syncOpts.setSeries;\n\t\t\t\tlet p = focus.prox;\n\n\t\t\t\tif (focusedSeries == null) {\n\t\t\t\t\tif (closestDist <= p)\n\t\t\t\t\t\tsetSeries(closestSeries, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (closestDist > p)\n\t\t\t\t\t\tsetSeries(null, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t\telse if (closestSeries != focusedSeries)\n\t\t\t\t\t\tsetSeries(closestSeries, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tready && _fire !== false && fire(\"setCursor\");\n\t}\n\n\tlet rect = null;\n\n\tfunction syncRect(defer) {\n\t\tif (defer === true)\n\t\t\trect = null;\n\t\telse {\n\t\t\trect = over.getBoundingClientRect();\n\t\t\tfire(\"syncRect\", rect);\n\t\t}\n\t}\n\n\tfunction mouseMove(e, src, _l, _t, _w, _h, _i) {\n\t\tif (cursor._lock)\n\t\t\treturn;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, false, e != null);\n\n\t\tif (e != null)\n\t\t\tupdateCursor(null, true, true);\n\t\telse\n\t\t\tupdateCursor(src, true, false);\n\t}\n\n\tfunction cacheMouse(e, src, _l, _t, _w, _h, _i, initial, snap) {\n\t\tif (rect == null)\n\t\t\tsyncRect(false);\n\n\t\tif (e != null) {\n\t\t\t_l = e.clientX - rect.left;\n\t\t\t_t = e.clientY - rect.top;\n\t\t}\n\t\telse {\n\t\t\tif (_l < 0 || _t < 0) {\n\t\t\t\tmouseLeft1 = -10;\n\t\t\t\tmouseTop1 = -10;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet [xKey, yKey] = syncOpts.scales;\n\n\t\t\tlet syncOptsSrc = src.cursor.sync;\n\t\t\tlet [xValSrc, yValSrc] = syncOptsSrc.values;\n\t\t\tlet [xKeySrc, yKeySrc] = syncOptsSrc.scales;\n\t\t\tlet [matchXKeys, matchYKeys] = syncOpts.match;\n\n\t\t\tlet rotSrc = src.axes[0].side % 2 == 1;\n\n\t\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss,\n\t\t\t\tyDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss,\n\t\t\t\t_xDim = rotSrc ? _h : _w,\n\t\t\t\t_yDim = rotSrc ? _w : _h,\n\t\t\t\t_xPos = rotSrc ? _t : _l,\n\t\t\t\t_yPos = rotSrc ? _l : _t;\n\n\t\t\tif (xKeySrc != null)\n\t\t\t\t_l = matchXKeys(xKey, xKeySrc) ? getPos(xValSrc, scales[xKey], xDim, 0) : -10;\n\t\t\telse\n\t\t\t\t_l = xDim * (_xPos/_xDim);\n\n\t\t\tif (yKeySrc != null)\n\t\t\t\t_t = matchYKeys(yKey, yKeySrc) ? getPos(yValSrc, scales[yKey], yDim, 0) : -10;\n\t\t\telse\n\t\t\t\t_t = yDim * (_yPos/_yDim);\n\n\t\t\tif (scaleX.ori == 1) {\n\t\t\t\tlet __l = _l;\n\t\t\t\t_l = _t;\n\t\t\t\t_t = __l;\n\t\t\t}\n\t\t}\n\n\t\tif (snap) {\n\t\t\tif (_l <= 1 || _l >= plotWidCss - 1)\n\t\t\t\t_l = incrRound(_l, plotWidCss);\n\n\t\t\tif (_t <= 1 || _t >= plotHgtCss - 1)\n\t\t\t\t_t = incrRound(_t, plotHgtCss);\n\t\t}\n\n\t\tif (initial) {\n\t\t\trawMouseLeft0 = _l;\n\t\t\trawMouseTop0 = _t;\n\n\t\t\t[mouseLeft0, mouseTop0] = cursor.move(self, _l, _t);\n\t\t}\n\t\telse {\n\t\t\tmouseLeft1 = _l;\n\t\t\tmouseTop1 = _t;\n\t\t}\n\t}\n\n\tconst _hideProps = {\n\t\twidth: 0,\n\t\theight: 0,\n\t};\n\n\tfunction hideSelect() {\n\t\tsetSelect(_hideProps, false);\n\t}\n\n\tfunction mouseDown(e, src, _l, _t, _w, _h, _i) {\n\t\tdragging = true;\n\t\tdragX = dragY = drag._x = drag._y = false;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, true, false);\n\n\t\tif (e != null) {\n\t\t\tonMouse(mouseup, doc, mouseUp);\n\t\t\tpubSync(mousedown, self, mouseLeft0, mouseTop0, plotWidCss, plotHgtCss, null);\n\t\t}\n\t}\n\n\tfunction mouseUp(e, src, _l, _t, _w, _h, _i) {\n\t\tdragging = drag._x = drag._y = false;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, false, true);\n\n\t\tlet { left, top, width, height } = select;\n\n\t\tlet hasSelect = width > 0 || height > 0;\n\n\t\thasSelect && setSelect(select);\n\n\t\tif (drag.setScale && hasSelect) {\n\t\t//\tif (syncKey != null) {\n\t\t//\t\tdragX = drag.x;\n\t\t//\t\tdragY = drag.y;\n\t\t//\t}\n\n\t\t\tlet xOff = left,\n\t\t\t\txDim = width,\n\t\t\t\tyOff = top,\n\t\t\t\tyDim = height;\n\n\t\t\tif (scaleX.ori == 1) {\n\t\t\t\txOff = top,\n\t\t\t\txDim = height,\n\t\t\t\tyOff = left,\n\t\t\t\tyDim = width;\n\t\t\t}\n\n\t\t\tif (dragX) {\n\t\t\t\t_setScale(xScaleKey,\n\t\t\t\t\tposToVal(xOff, xScaleKey),\n\t\t\t\t\tposToVal(xOff + xDim, xScaleKey)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (dragY) {\n\t\t\t\tfor (let k in scales) {\n\t\t\t\t\tlet sc = scales[k];\n\n\t\t\t\t\tif (k != xScaleKey && sc.from == null && sc.min != inf) {\n\t\t\t\t\t\t_setScale(k,\n\t\t\t\t\t\t\tposToVal(yOff + yDim, k),\n\t\t\t\t\t\t\tposToVal(yOff, k)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thideSelect();\n\t\t}\n\t\telse if (cursor.lock) {\n\t\t\tcursor._lock = !cursor._lock;\n\n\t\t\tif (!cursor._lock)\n\t\t\t\tupdateCursor(null, true, false);\n\t\t}\n\n\t\tif (e != null) {\n\t\t\toffMouse(mouseup, doc);\n\t\t\tpubSync(mouseup, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);\n\t\t}\n\t}\n\n\tfunction mouseLeave(e, src, _l, _t, _w, _h, _i) {\n\t\tif (!cursor._lock) {\n\t\t\tlet _dragging = dragging;\n\n\t\t\tif (dragging) {\n\t\t\t\t// handle case when mousemove aren't fired all the way to edges by browser\n\t\t\t\tlet snapH = true;\n\t\t\t\tlet snapV = true;\n\t\t\t\tlet snapProx = 10;\n\n\t\t\t\tlet dragH, dragV;\n\n\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\tdragH = dragX;\n\t\t\t\t\tdragV = dragY;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdragH = dragY;\n\t\t\t\t\tdragV = dragX;\n\t\t\t\t}\n\n\t\t\t\tif (dragH && dragV) {\n\t\t\t\t\t// maybe omni corner snap\n\t\t\t\t\tsnapH = mouseLeft1 <= snapProx || mouseLeft1 >= plotWidCss - snapProx;\n\t\t\t\t\tsnapV = mouseTop1 <= snapProx || mouseTop1 >= plotHgtCss - snapProx;\n\t\t\t\t}\n\n\t\t\t\tif (dragH && snapH)\n\t\t\t\t\tmouseLeft1 = mouseLeft1 < mouseLeft0 ? 0 : plotWidCss;\n\n\t\t\t\tif (dragV && snapV)\n\t\t\t\t\tmouseTop1 = mouseTop1 < mouseTop0 ? 0 : plotHgtCss;\n\n\t\t\t\tupdateCursor(null, true, true);\n\n\t\t\t\tdragging = false;\n\t\t\t}\n\n\t\t\tmouseLeft1 = -10;\n\t\t\tmouseTop1 = -10;\n\n\t\t\t// passing a non-null timestamp to force sync/mousemove event\n\t\t\tupdateCursor(null, true, true);\n\n\t\t\tif (_dragging)\n\t\t\t\tdragging = _dragging;\n\t\t}\n\t}\n\n\tfunction dblClick(e, src, _l, _t, _w, _h, _i) {\n\t\tautoScaleX();\n\n\t\thideSelect();\n\n\t\tif (e != null)\n\t\t\tpubSync(dblclick, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);\n\t}\n\n\tfunction syncPxRatio() {\n\t\taxes.forEach(syncFontSize);\n\t\t_setSize(self.width, self.height, true);\n\t}\n\n\ton(dppxchange, win, syncPxRatio);\n\n\t// internal pub/sub\n\tconst events = {};\n\n\tevents.mousedown = mouseDown;\n\tevents.mousemove = mouseMove;\n\tevents.mouseup = mouseUp;\n\tevents.dblclick = dblClick;\n\tevents[\"setSeries\"] = (e, src, idx, opts) => {\n\t\tsetSeries(idx, opts, true, false);\n\t};\n\n\tif (cursor.show) {\n\t\tonMouse(mousedown, over, mouseDown);\n\t\tonMouse(mousemove, over, mouseMove);\n\t\tonMouse(mouseenter, over, syncRect);\n\t\tonMouse(mouseleave, over, mouseLeave);\n\n\t\tonMouse(dblclick, over, dblClick);\n\n\t\tcursorPlots.add(self);\n\n\t\tself.syncRect = syncRect;\n\t}\n\n\t// external on/off\n\tconst hooks = self.hooks = opts.hooks || {};\n\n\tfunction fire(evName, a1, a2) {\n\t\tif (evName in hooks) {\n\t\t\thooks[evName].forEach(fn => {\n\t\t\t\tfn.call(null, self, a1, a2);\n\t\t\t});\n\t\t}\n\t}\n\n\t(opts.plugins || []).forEach(p => {\n\t\tfor (let evName in p.hooks)\n\t\t\thooks[evName] = (hooks[evName] || []).concat(p.hooks[evName]);\n\t});\n\n\tconst syncOpts = assign({\n\t\tkey: null,\n\t\tsetSeries: false,\n\t\tfilters: {\n\t\t\tpub: retTrue,\n\t\t\tsub: retTrue,\n\t\t},\n\t\tscales: [xScaleKey, series[1] ? series[1].scale : null],\n\t\tmatch: [retEq, retEq],\n\t\tvalues: [null, null],\n\t}, cursor.sync);\n\n\t(cursor.sync = syncOpts);\n\n\tconst syncKey = syncOpts.key;\n\n\tconst sync = _sync(syncKey);\n\n\tfunction pubSync(type, src, x, y, w, h, i) {\n\t\tif (syncOpts.filters.pub(type, src, x, y, w, h, i))\n\t\t\tsync.pub(type, src, x, y, w, h, i);\n\t}\n\n\tsync.sub(self);\n\n\tfunction pub(type, src, x, y, w, h, i) {\n\t\tif (syncOpts.filters.sub(type, src, x, y, w, h, i))\n\t\t\tevents[type](null, src, x, y, w, h, i);\n\t}\n\n\t(self.pub = pub);\n\n\tfunction destroy() {\n\t\tsync.unsub(self);\n\t\tcursorPlots.delete(self);\n\t\tmouseListeners.clear();\n\t\toff(dppxchange, win, syncPxRatio);\n\t\troot.remove();\n\t\tfire(\"destroy\");\n\t}\n\n\tself.destroy = destroy;\n\n\tfunction _init() {\n\t\tfire(\"init\", opts, data);\n\n\t\tsetData(data || opts.data, false);\n\n\t\tif (pendScales[xScaleKey])\n\t\t\tsetScale(xScaleKey, pendScales[xScaleKey]);\n\t\telse\n\t\t\tautoScaleX();\n\n\t\t_setSize(opts.width, opts.height);\n\n\t\tupdateCursor(null, true, false);\n\n\t\tsetSelect(select, false);\n\t}\n\n\tseries.forEach(initSeries);\n\n\taxes.forEach(initAxis);\n\n\tif (then) {\n\t\tif (then instanceof HTMLElement) {\n\t\t\tthen.appendChild(root);\n\t\t\t_init();\n\t\t}\n\t\telse\n\t\t\tthen(self, _init);\n\t}\n\telse\n\t\t_init();\n\n\treturn self;\n}\n\nuPlot.assign = assign;\nuPlot.fmtNum = fmtNum;\nuPlot.rangeNum = rangeNum;\nuPlot.rangeLog = rangeLog;\nuPlot.rangeAsinh = rangeAsinh;\nuPlot.orient = orient;\nuPlot.pxRatio = pxRatio;\n\n{\n\tuPlot.join = join;\n}\n\n{\n\tuPlot.fmtDate = fmtDate;\n\tuPlot.tzDate = tzDate;\n}\n\n{\n\tuPlot.sync = _sync;\n}\n\n{\n\tuPlot.addGap = addGap;\n\tuPlot.clipGaps = clipGaps;\n\n\tlet paths = uPlot.paths = {\n\t\tpoints,\n\t};\n\n\t(paths.linear = linear);\n\t(paths.stepped = stepped);\n\t(paths.bars = bars);\n\t(paths.spline = monotoneCubic);\n}\n\nexport { uPlot as default };\n", "import { LineColor } from './color_wheel'\nimport uPlot from 'uplot'\n\nconst histBucket = (v, offset, incr) => incrRoundDn(v - offset, incr) + offset\nconst histSort = (a, b) => a - b\n\nfunction incrRoundDn(num, incr) {\n return Math.floor(num / incr) * incr\n}\n\nfunction reBin(histogram, sort) {\n let bins = [...histogram.values()]\n\n sort && bins.sort((a, b) => sort(a.value, b.value))\n\n let values = Array(bins.length)\n let counts = Array(bins.length)\n\n for (let i = 0; i < bins.length; i++) {\n values[i] = bins[i].value\n counts[i] = bins[i].count\n }\n\n return [values, counts]\n}\n\nconst getBucketSize = ({ bucketSize = 20 }) => +bucketSize\n\nexport class Histogram {\n constructor(chart, options) {\n this.chart = chart\n this.datasets = new Map();\n this.options = options\n this.bucketSize = getBucketSize(options)\n this.histOffset = 0\n // todo: enable pruning for histogram?\n }\n\n handleMeasurements(data) {\n data.forEach(({ y }) => {\n if (y == null) { return }\n y = histBucket(y, this.histOffset, this.bucketSize)\n\n let entry = this.datasets.get(y)\n\n if (entry) {\n entry.count++\n } else {\n this.datasets.set(y, { value: y, count: 1 })\n }\n })\n\n this.chart.setData(reBin(this.datasets, histSort))\n }\n\n static initialData() { return [[], []] }\n\n static getConfig(options) {\n let bucketIncr = getBucketSize(options)\n let bars = uPlot.paths.bars({ align: 1, size: [1, Infinity], gap: 4 })\n\n return {\n title: options.title,\n width: options.width,\n height: options.height,\n scales: {\n x: {\n time: false,\n auto: false,\n dir: 1,\n range: (u) => [\n u.data[0][0],\n u.data[0][u.data[0].length - 1] + bucketIncr,\n ]\n }\n },\n axes: [\n {\n incrs: () => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(mult => mult * bucketIncr),\n //\tspace: 0,\n splits: (u, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace) => {\n let minSpace = u.axes[axisIdx]._space\n let bucketWidth = u.valToPos(u.data[0][0] + bucketIncr, 'x') - u.valToPos(u.data[0][0], 'x')\n\n let firstSplit = u.data[0][0]\n let lastSplit = u.data[0][u.data[0].length - 1] + bucketIncr\n\n let splits = []\n let skip = Math.ceil(minSpace / bucketWidth)\n\n for (let i = 0, s = firstSplit; s <= lastSplit; i++, s += bucketIncr)\n !(i % skip) && splits.push(s)\n\n return splits\n }\n }\n ],\n series: [\n {\n label: options.label,\n value: (self, rawValue) => rawValue + `-${rawValue + bucketIncr} ${options.unit}`,\n },\n {\n paths: bars,\n points: { show: false },\n ...LineColor.at(1),\n width: 2,\n label: \"Events\"\n },\n ],\n }\n }\n}", "import { LineColor } from './color_wheel'\nimport { Histogram } from './histogram.js'\nimport uPlot from 'uplot'\n\nconst SeriesValue = (options) => {\n if (!options.unit) return {}\n\n return {\n value: (u, v) => v == null ? '--' : v.toFixed(3) + ` ${options.unit}`\n }\n}\n\nconst XSeriesValue = (options) => {\n return {\n value: '{YYYY}-{MM}-{DD} {HH}:{mm}:{ss}'\n }\n}\n\nconst YAxisValue = (options) => {\n if (!options.unit) return {}\n\n return {\n values: (u, vals, space) => vals.map(v => +v.toFixed(2) + ` ${options.unit}`)\n }\n}\n\nconst XAxis = (_options) => {\n return {\n space: 55,\n // [0]: minimum num secs in found axis split (tick incr)\n // [1]: default tick format\n // [2-7]: rollover tick formats\n // [8]: mode: 0: replace [1] -> [2-7], 1: concat [1] + [2-7]\n values: [\n // tick incr default year month day hour min sec mode\n [3600 * 24 * 365, \"{YYYY}\", null, null, null, null, null, null, 1],\n [3600 * 24 * 28, \"{MMM}\", \"\\n{YYYY}\", null, null, null, null, null, 1],\n [3600 * 24, \"{M}/{D}\", \"\\n{YYYY}\", null, null, null, null, null, 1],\n [3600, \"{h}{aa}\", \"\\n{M}/{D}/{YY}\", null, \"\\n{M}/{D}\", null, null, null, 1],\n [60, \"{h}:{mm}{aa}\", \"\\n{M}/{D}/{YY}\", null, \"\\n{M}/{D}\", null, null, null, 1],\n [1, \":{ss}\", \"\\n{M}/{D}/{YY} {h}:{mm}{aa}\", null, \"\\n{M}/{D} {h}:{mm}{aa}\", null, \"\\n{h}:{mm}{aa}\", null, 1],\n [0.001, \":{ss}.{fff}\", \"\\n{M}/{D}/{YY} {h}:{mm}{aa}\", null, \"\\n{M}/{D} {h}:{mm}{aa}\", null, \"\\n{h}:{mm}{aa}\", null, 1],\n ]\n }\n}\n\nconst YAxis = (options) => {\n return {\n show: true,\n size: 70,\n space: 15,\n ...YAxisValue(options)\n }\n}\n\nconst minChartSize = {\n width: 100,\n height: 300\n}\n\nconst cursorOpts = {\n sync: { key: 'metrics-live' }\n}\n\n// Limits how often a function is invoked\nfunction throttle(cb, limit) {\n let wait = false;\n\n return () => {\n if (!wait) {\n requestAnimationFrame(cb);\n wait = true;\n setTimeout(() => {\n wait = false;\n }, limit);\n }\n }\n}\n\nexport const newSeriesConfig = (options, index = 0) => {\n return {\n ...LineColor.at(index),\n ...SeriesValue(options),\n label: options.label,\n spanGaps: true,\n points: { show: false }\n }\n}\n\n/** Telemetry Metrics **/\n\n// Maps an ordered list of dataset objects into an ordered list of data points.\nconst dataForDatasets = (datasets) => datasets.slice(0).map(({ data }) => data)\n\n// Handler for an untagged CommonMetric\nfunction nextValueForCallback({ y, z }, callback) {\n this.datasets[0].data.push(z)\n let currentValue = this.datasets[1].data[this.datasets[1].data.length - 1] || 0\n let nextValue = callback.call(this, y, currentValue)\n this.datasets[1].data.push(nextValue)\n}\n\nconst findLastNonNullValue = (data) => data.reduceRight((a, c) => (c != null && a == null ? c : a), null)\n\n// Handler for a tagged CommonMetric\nfunction nextTaggedValueForCallback({ x, y, z }, callback) {\n // Find or create the series from the tag\n let seriesIndex = this.datasets.findIndex(({ key }) => x === key)\n if (seriesIndex === -1) {\n seriesIndex = this.datasets.push({ key: x, data: Array(this.datasets[0].data.length).fill(null) }) - 1\n this.chart.addSeries(newSeriesConfig({ label: x, unit: this.options.unit }, seriesIndex - 1), seriesIndex)\n }\n\n // Add the new timestamp + value, keeping datasets aligned\n this.datasets = this.datasets.map((dataset, index) => {\n if (index === 0) {\n dataset.data.push(z)\n } else if (index === seriesIndex) {\n dataset.data.push(callback.call(this, y, findLastNonNullValue(dataset.data) || 0))\n } else {\n dataset.data.push(null)\n }\n return dataset\n })\n}\n\nconst getPruneThreshold = ({ pruneThreshold = 1000 }) => pruneThreshold\n\n// Handles the basic metrics like Counter, LastValue, and Sum.\nclass CommonMetric {\n static __projections() {\n return {\n counter: (y, value) => value + 1,\n last_value: (y) => y,\n sum: (y, value) => value + y\n }\n }\n\n static getConfig(options) {\n return {\n class: options.kind,\n title: options.title,\n width: options.width,\n height: options.height,\n cursor: cursorOpts,\n series: [\n { ...XSeriesValue() },\n newSeriesConfig(options, 0)\n ],\n scales: {\n x: {\n min: options.now - 60,\n max: options.now\n },\n y: {\n min: 0,\n max: 1\n },\n },\n axes: [\n XAxis(),\n YAxis(options)\n ]\n }\n }\n\n static initialData() {\n return [[], []]\n }\n\n constructor(chart, options) {\n this.__callback = this.constructor.__projections()[options.metric]\n this.chart = chart\n this.datasets = [{ key: \"|x|\", data: [] }]\n this.options = options\n this.pruneThreshold = getPruneThreshold(options)\n\n if (options.tagged) {\n this.chart.delSeries(1)\n this.__handler = nextTaggedValueForCallback\n } else {\n this.datasets.push({ key: options.label, data: [] })\n this.__handler = nextValueForCallback\n }\n }\n\n handleMeasurements(measurements) {\n // prune datasets when we reach the max number of events\n measurements.forEach((measurement) => this.__handler.call(this, measurement, this.__callback))\n\n let currentSize = this.datasets[0].data.length\n if (currentSize >= this.pruneThreshold) {\n this.datasets = this.datasets.map(({ data, ...rest }) => {\n return { data: data.slice(-this.pruneThreshold), ...rest }\n })\n }\n\n this.chart.setData(dataForDatasets(this.datasets))\n }\n}\n\n// Displays a measurement summary\nclass Summary {\n constructor(options, chartEl) {\n // TODO: Get percentiles from options\n let config = this.constructor.getConfig(options)\n // Bind the series `values` callback to this instance\n config.series[1].values = this.__seriesValues.bind(this)\n\n this.datasets = [{ key: \"|x|\", data: [] }]\n this.chart = new uPlot(config, this.constructor.initialData(options), chartEl)\n this.pruneThreshold = getPruneThreshold(options)\n this.options = options\n\n if (options.tagged) {\n this.chart.delSeries(1)\n this.__handler = this.handleTaggedMeasurement.bind(this)\n } else {\n this.datasets.push(this.constructor.newDataset(options.label))\n this.__handler = this.handleMeasurement.bind(this)\n }\n }\n\n handleMeasurements(measurements) {\n measurements.forEach((measurement) => this.__handler(measurement))\n this.__maybePruneDatasets()\n this.chart.setData(dataForDatasets(this.datasets))\n }\n\n handleTaggedMeasurement(measurement) {\n let seriesIndex = this.findOrCreateSeries(measurement.x)\n this.handleMeasurement(measurement, seriesIndex)\n }\n\n handleMeasurement(measurement, sidx = 1) {\n let { z: timestamp } = measurement\n this.datasets = this.datasets.map((dataset, index) => {\n if (dataset.key === \"|x|\") {\n dataset.data.push(timestamp)\n } else if (index === sidx) {\n this.pushToDataset(dataset, measurement)\n } else {\n this.pushToDataset(dataset, null)\n }\n return dataset\n })\n }\n\n findOrCreateSeries(label) {\n let seriesIndex = this.datasets.findIndex(({ key }) => label === key)\n if (seriesIndex === -1) {\n seriesIndex = this.datasets.push(\n this.constructor.newDataset(label, this.datasets[0].data.length)\n ) - 1\n\n let config = {\n values: this.__seriesValues.bind(this),\n ...newSeriesConfig({ label }, seriesIndex - 1)\n }\n\n this.chart.addSeries(config, seriesIndex)\n }\n\n return seriesIndex\n }\n\n pushToDataset(dataset, measurement) {\n if (measurement === null) {\n dataset.data.push(null)\n dataset.agg.avg.push(null)\n dataset.agg.max.push(null)\n dataset.agg.min.push(null)\n return\n }\n\n let { y } = measurement\n\n // Increment the new overall totals\n dataset.agg.count++\n dataset.agg.total += y\n\n // Push the value\n dataset.data.push(y)\n\n // Push min/max/avg\n if (dataset.last.min === null || y < dataset.last.min) { dataset.last.min = y }\n dataset.agg.min.push(dataset.last.min)\n\n if (dataset.last.max === null || y > dataset.last.max) { dataset.last.max = y }\n dataset.agg.max.push(dataset.last.max)\n\n dataset.agg.avg.push((dataset.agg.total / dataset.agg.count))\n\n return dataset\n }\n\n __maybePruneDatasets() {\n let currentSize = this.datasets[0].data.length\n if (currentSize > this.pruneThreshold) {\n let start = -this.pruneThreshold;\n this.datasets = this.datasets.map(({ key, data, agg }) => {\n let dataPruned = data.slice(start)\n if (!agg) {\n return { key, data: dataPruned }\n }\n\n let { avg, count, max, min, total } = agg\n let minPruned = min.slice(start)\n let maxPruned = max.slice(start)\n\n return {\n key,\n data: dataPruned,\n agg: {\n avg: avg.slice(start),\n count,\n min: minPruned,\n max: maxPruned,\n total\n },\n last: {\n min: findLastNonNullValue(minPruned),\n max: findLastNonNullValue(maxPruned)\n }\n }\n })\n }\n }\n\n __seriesValues(u, sidx, idx) {\n let dataset = this.datasets[sidx]\n if (dataset && dataset.data && dataset.data[idx]) {\n let { agg: { avg, max, min }, data } = dataset\n return {\n Value: data[idx].toFixed(3),\n Min: min[idx].toFixed(3),\n Max: max[idx].toFixed(3),\n Avg: avg[idx].toFixed(3)\n }\n } else {\n return { Value: \"--\", Min: \"--\", Max: \"--\", Avg: \"--\" }\n }\n }\n\n static initialData() { return [[], []] }\n\n static getConfig(options) {\n return {\n class: options.kind,\n title: options.title,\n width: options.width,\n height: options.height,\n cursor: cursorOpts,\n series: [\n { ...XSeriesValue() },\n newSeriesConfig(options, 0)\n ],\n scales: {\n x: {\n min: options.now - 60,\n max: options.now\n },\n y: {\n min: 0,\n max: 1\n },\n },\n axes: [\n XAxis(),\n YAxis(options)\n ]\n }\n }\n\n static newDataset(key, length = 0) {\n let nils = length > 0 ? Array(length).fill(null) : []\n return {\n key,\n data: [...nils],\n agg: { avg: [...nils], count: 0, max: [...nils], min: [...nils], total: 0 },\n last: { max: null, min: null }\n }\n }\n}\n\nconst __METRICS__ = {\n counter: CommonMetric,\n last_value: CommonMetric,\n sum: CommonMetric,\n summary: Summary,\n distribution: Histogram\n}\n\nexport class TelemetryChart {\n constructor(chartEl, options) {\n if (!options.metric) {\n throw new TypeError(`No metric type was provided`)\n } else if (options.metric && !__METRICS__[options.metric]) {\n throw new TypeError(`No metric defined for type ${options.metric}`)\n }\n\n const metric = __METRICS__[options.metric]\n if (metric === Summary) {\n this.metric = new Summary(options, chartEl)\n this.uplotChart = this.metric.chart\n } else {\n this.uplotChart = new uPlot(metric.getConfig(options), metric.initialData(options), chartEl)\n this.metric = new metric(this.uplotChart, options)\n }\n\n // setup the data buffer\n let isBufferingData = typeof options.refreshInterval !== \"undefined\"\n this._isBufferingData = isBufferingData\n this._buffer = []\n this._timer = isBufferingData ? setInterval(\n this._flushToChart.bind(this),\n +options.refreshInterval\n ) : null\n }\n\n clearTimers() { clearInterval(this._timer) }\n\n resize(boundingBox) {\n this.uplotChart.setSize({\n width: Math.max(boundingBox.width, minChartSize.width),\n height: minChartSize.height\n })\n }\n\n pushData(measurements) {\n if (!measurements.length) return\n let callback = this._isBufferingData ? this._pushToBuffer : this._pushToChart\n callback.call(this, measurements)\n }\n\n _pushToBuffer(measurements) {\n this._buffer = this._buffer.concat(measurements)\n }\n\n _pushToChart(measurements) {\n this.metric.handleMeasurements(measurements)\n }\n\n // clears the buffer and pushes the measurements\n _flushToChart() {\n let measurements = this._flushBuffer()\n if (!measurements.length) { return }\n this._pushToChart(measurements)\n }\n\n // clears and returns the buffered data as a flat array\n _flushBuffer() {\n if (this._buffer && !this._buffer.length) { return [] }\n let measurements = this._buffer\n this._buffer = []\n return measurements.reduce((acc, val) => acc.concat(val), [])\n }\n}\n\n/** LiveView Hook **/\n\nconst PhxChartComponent = {\n mounted() {\n let chartEl = this.el.parentElement.querySelector('.chart')\n let size = chartEl.getBoundingClientRect()\n let options = Object.assign({}, chartEl.dataset, {\n tagged: (chartEl.dataset.tags && chartEl.dataset.tags !== \"\") || false,\n width: Math.max(size.width, minChartSize.width),\n height: minChartSize.height,\n now: new Date() / 1e3,\n refreshInterval: 1000\n })\n\n this.chart = new TelemetryChart(chartEl, options)\n\n window.addEventListener(\"resize\", throttle(() => {\n let newSize = chartEl.getBoundingClientRect()\n this.chart.resize(newSize)\n }))\n },\n updated() {\n const data = Array\n .from(this.el.children || [])\n .map(({ dataset: { x, y, z } }) => {\n // converts y-axis value (z) to number,\n // converts timestamp (z) from \u00B5s to fractional seconds\n return { x, y: +y, z: +z / 1e6 }\n })\n\n if (data.length > 0) {\n this.chart.pushData(data)\n }\n },\n destroyed() {\n this.chart.clearTimers()\n }\n}\n\nexport default PhxChartComponent\n", "/** LiveView Hook **/\n\nconst setCookie = (params) => {\n let cookie = `${params.key}=${params.value};path=/`\n if (window.location.protocol === \"https:\") {\n cookie += `;samesite=strict`\n }\n if (params.domain) {\n cookie += `;domain=${params.domain}`\n }\n document.cookie = cookie\n}\n\nconst removeCookie = (params) => {\n const pastDate = 'Thu, 01 Jan 1970 00:00:00 GMT'\n document.cookie = `${params.key}=; expires=${pastDate}`\n}\n\nconst isCookieEnabled = (hook) => {\n return hook.el.hasAttribute('data-cookie-enabled')\n}\n\nconst cookieParams = (hook) => {\n return {\n key: hook.el.getAttribute('data-cookie-key'),\n value: hook.el.getAttribute('data-cookie-value'),\n domain: hook.el.getAttribute('data-cookie-domain')\n }\n}\n\nconst PhxRequestLoggerCookie = {\n updated() {\n const loggerCookieParams = cookieParams(this)\n removeCookie(loggerCookieParams)\n\n if (isCookieEnabled(this)) {\n setCookie(loggerCookieParams)\n }\n },\n}\n\nexport default PhxRequestLoggerCookie\n", "/** LiveView Hook **/\n\nconst copyToClipboard = (textarea) => {\n if (!navigator.clipboard){\n // Deprecated clipboard API\n textarea.select()\n textarea.setSelectionRange(0, 99999)\n document.execCommand('copy')\n } else {\n // Modern Clipboard API\n const text = textarea.value\n navigator.clipboard.writeText(text)\n }\n }\n\nconst PhxRequestLoggerQueryParameter = {\n mounted() {\n this.el.querySelector('.btn-primary').addEventListener('click', e => {\n const textarea = this.el.querySelector('textarea')\n copyToClipboard(textarea)\n const copyIndicator = this.el.querySelector('.copy-indicator')\n copyIndicator.setAttribute('data-enabled', 'false')\n void copyIndicator.offsetWidth // Resets the animation to ensure it will be played again\n copyIndicator.setAttribute('data-enabled', 'true')\n })\n }\n}\n\nexport default PhxRequestLoggerQueryParameter\n", "/** LiveView Hook **/\n\nconst PhxRequestLoggerMessages = {\n updated() {\n if (this.el.querySelector('.logger-autoscroll-checkbox').checked) {\n const messagesElement = this.el.querySelector('#logger-messages')\n messagesElement.scrollTop = messagesElement.scrollHeight\n }\n }\n}\n\nexport default PhxRequestLoggerMessages\n", "const interactiveItemSelector = '.progress-bar, .color-bar-legend-entry'\nlet highlightedElementName\n\nconst highlightElements = (containerElement) => {\n containerElement.querySelectorAll(interactiveItemSelector).forEach((progressBarElement) => {\n if(highlightedElementName) {\n const isMuted = progressBarElement.getAttribute('data-name') !== highlightedElementName\n\n progressBarElement.setAttribute('data-muted', isMuted)\n } else {\n progressBarElement.removeAttribute('data-muted')\n }\n })\n}\n\nconst PhxColorBarHighlight = {\n mounted() {\n this.el.setAttribute('data-highlight-enabled', 'true')\n this.el.querySelectorAll(interactiveItemSelector).forEach((progressBarElement) => (\n progressBarElement.addEventListener('click', e => {\n const name = e.currentTarget.getAttribute('data-name')\n highlightedElementName = name === highlightedElementName ? null : name\n highlightElements(this.el)\n })\n ))\n },\n\n updated() {\n this.el.setAttribute('data-highlight-enabled', 'true')\n highlightElements(this.el)\n }\n}\n\nexport default PhxColorBarHighlight\n", "const REFRESH_DATA_COOKIE = \"_refresh_data\";\n\n/**\n * Stores refresh data in the `\"refresh_data\"` cookie.\n */\nexport function storeRefreshData(refreshData, path) {\n const json = JSON.stringify(refreshData);\n const encoded = encodeBase64(json);\n setCookie(REFRESH_DATA_COOKIE, encoded, path, 157680000); // 5 years\n}\n\n/**\n * Loads refresh data from the `\"refresh_data\"` cookie.\n */\nexport function loadRefreshData() {\n const encoded = getCookieValue(REFRESH_DATA_COOKIE);\n if (encoded) {\n const json = decodeBase64(encoded);\n return JSON.parse(json);\n } else {\n return null;\n }\n}\n\nfunction getCookieValue(key) {\n const cookie = document.cookie\n .split(\"; \")\n .find((cookie) => cookie.startsWith(`${key}=`));\n\n if (cookie) {\n const value = cookie.replace(`${key}=`, \"\");\n return value;\n } else {\n return null;\n }\n}\n\nfunction setCookie(key, value, path, maxAge) {\n const cookie = `${key}=${value};max-age=${maxAge};path=${path}`;\n document.cookie = cookie;\n}\n\nfunction encodeBase64(string) {\n return btoa(unescape(encodeURIComponent(string)));\n}\n\nfunction decodeBase64(binary) {\n return decodeURIComponent(escape(atob(binary)));\n}\n", "/** LiveView Hook **/\n\nimport { storeRefreshData, loadRefreshData } from \"../refresh\";\n\nconst PhxRememberRefresh = {\n updated() {\n let config = loadRefreshData() || {};\n config[this.el.dataset.page] = this.el.value\n storeRefreshData(config, this.el.dataset.dashboardMountPath);\n }\n}\n\nexport default PhxRememberRefresh\n"],
- "mappings": "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",
+ "sourcesContent": ["/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress\n * @license MIT */\n\n;(function(root, factory) {\n\n if (typeof define === 'function' && define.amd) {\n define(factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.NProgress = factory();\n }\n\n})(this, function() {\n var NProgress = {};\n\n NProgress.version = '0.2.0';\n\n var Settings = NProgress.settings = {\n minimum: 0.08,\n easing: 'ease',\n positionUsing: '',\n speed: 200,\n trickle: true,\n trickleRate: 0.02,\n trickleSpeed: 800,\n showSpinner: true,\n barSelector: '[role=\"bar\"]',\n spinnerSelector: '[role=\"spinner\"]',\n parent: 'body',\n template: ''\n };\n\n /**\n * Updates configuration.\n *\n * NProgress.configure({\n * minimum: 0.1\n * });\n */\n NProgress.configure = function(options) {\n var key, value;\n for (key in options) {\n value = options[key];\n if (value !== undefined && options.hasOwnProperty(key)) Settings[key] = value;\n }\n\n return this;\n };\n\n /**\n * Last number.\n */\n\n NProgress.status = null;\n\n /**\n * Sets the progress bar status, where `n` is a number from `0.0` to `1.0`.\n *\n * NProgress.set(0.4);\n * NProgress.set(1.0);\n */\n\n NProgress.set = function(n) {\n var started = NProgress.isStarted();\n\n n = clamp(n, Settings.minimum, 1);\n NProgress.status = (n === 1 ? null : n);\n\n var progress = NProgress.render(!started),\n bar = progress.querySelector(Settings.barSelector),\n speed = Settings.speed,\n ease = Settings.easing;\n\n progress.offsetWidth; /* Repaint */\n\n queue(function(next) {\n // Set positionUsing if it hasn't already been set\n if (Settings.positionUsing === '') Settings.positionUsing = NProgress.getPositioningCSS();\n\n // Add transition\n css(bar, barPositionCSS(n, speed, ease));\n\n if (n === 1) {\n // Fade out\n css(progress, { \n transition: 'none', \n opacity: 1 \n });\n progress.offsetWidth; /* Repaint */\n\n setTimeout(function() {\n css(progress, { \n transition: 'all ' + speed + 'ms linear', \n opacity: 0 \n });\n setTimeout(function() {\n NProgress.remove();\n next();\n }, speed);\n }, speed);\n } else {\n setTimeout(next, speed);\n }\n });\n\n return this;\n };\n\n NProgress.isStarted = function() {\n return typeof NProgress.status === 'number';\n };\n\n /**\n * Shows the progress bar.\n * This is the same as setting the status to 0%, except that it doesn't go backwards.\n *\n * NProgress.start();\n *\n */\n NProgress.start = function() {\n if (!NProgress.status) NProgress.set(0);\n\n var work = function() {\n setTimeout(function() {\n if (!NProgress.status) return;\n NProgress.trickle();\n work();\n }, Settings.trickleSpeed);\n };\n\n if (Settings.trickle) work();\n\n return this;\n };\n\n /**\n * Hides the progress bar.\n * This is the *sort of* the same as setting the status to 100%, with the\n * difference being `done()` makes some placebo effect of some realistic motion.\n *\n * NProgress.done();\n *\n * If `true` is passed, it will show the progress bar even if its hidden.\n *\n * NProgress.done(true);\n */\n\n NProgress.done = function(force) {\n if (!force && !NProgress.status) return this;\n\n return NProgress.inc(0.3 + 0.5 * Math.random()).set(1);\n };\n\n /**\n * Increments by a random amount.\n */\n\n NProgress.inc = function(amount) {\n var n = NProgress.status;\n\n if (!n) {\n return NProgress.start();\n } else {\n if (typeof amount !== 'number') {\n amount = (1 - n) * clamp(Math.random() * n, 0.1, 0.95);\n }\n\n n = clamp(n + amount, 0, 0.994);\n return NProgress.set(n);\n }\n };\n\n NProgress.trickle = function() {\n return NProgress.inc(Math.random() * Settings.trickleRate);\n };\n\n /**\n * Waits for all supplied jQuery promises and\n * increases the progress as the promises resolve.\n *\n * @param $promise jQUery Promise\n */\n (function() {\n var initial = 0, current = 0;\n\n NProgress.promise = function($promise) {\n if (!$promise || $promise.state() === \"resolved\") {\n return this;\n }\n\n if (current === 0) {\n NProgress.start();\n }\n\n initial++;\n current++;\n\n $promise.always(function() {\n current--;\n if (current === 0) {\n initial = 0;\n NProgress.done();\n } else {\n NProgress.set((initial - current) / initial);\n }\n });\n\n return this;\n };\n\n })();\n\n /**\n * (Internal) renders the progress bar markup based on the `template`\n * setting.\n */\n\n NProgress.render = function(fromStart) {\n if (NProgress.isRendered()) return document.getElementById('nprogress');\n\n addClass(document.documentElement, 'nprogress-busy');\n \n var progress = document.createElement('div');\n progress.id = 'nprogress';\n progress.innerHTML = Settings.template;\n\n var bar = progress.querySelector(Settings.barSelector),\n perc = fromStart ? '-100' : toBarPerc(NProgress.status || 0),\n parent = document.querySelector(Settings.parent),\n spinner;\n \n css(bar, {\n transition: 'all 0 linear',\n transform: 'translate3d(' + perc + '%,0,0)'\n });\n\n if (!Settings.showSpinner) {\n spinner = progress.querySelector(Settings.spinnerSelector);\n spinner && removeElement(spinner);\n }\n\n if (parent != document.body) {\n addClass(parent, 'nprogress-custom-parent');\n }\n\n parent.appendChild(progress);\n return progress;\n };\n\n /**\n * Removes the element. Opposite of render().\n */\n\n NProgress.remove = function() {\n removeClass(document.documentElement, 'nprogress-busy');\n removeClass(document.querySelector(Settings.parent), 'nprogress-custom-parent');\n var progress = document.getElementById('nprogress');\n progress && removeElement(progress);\n };\n\n /**\n * Checks if the progress bar is rendered.\n */\n\n NProgress.isRendered = function() {\n return !!document.getElementById('nprogress');\n };\n\n /**\n * Determine which positioning CSS rule to use.\n */\n\n NProgress.getPositioningCSS = function() {\n // Sniff on document.body.style\n var bodyStyle = document.body.style;\n\n // Sniff prefixes\n var vendorPrefix = ('WebkitTransform' in bodyStyle) ? 'Webkit' :\n ('MozTransform' in bodyStyle) ? 'Moz' :\n ('msTransform' in bodyStyle) ? 'ms' :\n ('OTransform' in bodyStyle) ? 'O' : '';\n\n if (vendorPrefix + 'Perspective' in bodyStyle) {\n // Modern browsers with 3D support, e.g. Webkit, IE10\n return 'translate3d';\n } else if (vendorPrefix + 'Transform' in bodyStyle) {\n // Browsers without 3D support, e.g. IE9\n return 'translate';\n } else {\n // Browsers without translate() support, e.g. IE7-8\n return 'margin';\n }\n };\n\n /**\n * Helpers\n */\n\n function clamp(n, min, max) {\n if (n < min) return min;\n if (n > max) return max;\n return n;\n }\n\n /**\n * (Internal) converts a percentage (`0..1`) to a bar translateX\n * percentage (`-100%..0%`).\n */\n\n function toBarPerc(n) {\n return (-1 + n) * 100;\n }\n\n\n /**\n * (Internal) returns the correct CSS for changing the bar's\n * position given an n percentage, and speed and ease from Settings\n */\n\n function barPositionCSS(n, speed, ease) {\n var barCSS;\n\n if (Settings.positionUsing === 'translate3d') {\n barCSS = { transform: 'translate3d('+toBarPerc(n)+'%,0,0)' };\n } else if (Settings.positionUsing === 'translate') {\n barCSS = { transform: 'translate('+toBarPerc(n)+'%,0)' };\n } else {\n barCSS = { 'margin-left': toBarPerc(n)+'%' };\n }\n\n barCSS.transition = 'all '+speed+'ms '+ease;\n\n return barCSS;\n }\n\n /**\n * (Internal) Queues a function to be executed.\n */\n\n var queue = (function() {\n var pending = [];\n \n function next() {\n var fn = pending.shift();\n if (fn) {\n fn(next);\n }\n }\n\n return function(fn) {\n pending.push(fn);\n if (pending.length == 1) next();\n };\n })();\n\n /**\n * (Internal) Applies css properties to an element, similar to the jQuery \n * css method.\n *\n * While this helper does assist with vendor prefixed property names, it \n * does not perform any manipulation of values prior to setting styles.\n */\n\n var css = (function() {\n var cssPrefixes = [ 'Webkit', 'O', 'Moz', 'ms' ],\n cssProps = {};\n\n function camelCase(string) {\n return string.replace(/^-ms-/, 'ms-').replace(/-([\\da-z])/gi, function(match, letter) {\n return letter.toUpperCase();\n });\n }\n\n function getVendorProp(name) {\n var style = document.body.style;\n if (name in style) return name;\n\n var i = cssPrefixes.length,\n capName = name.charAt(0).toUpperCase() + name.slice(1),\n vendorName;\n while (i--) {\n vendorName = cssPrefixes[i] + capName;\n if (vendorName in style) return vendorName;\n }\n\n return name;\n }\n\n function getStyleProp(name) {\n name = camelCase(name);\n return cssProps[name] || (cssProps[name] = getVendorProp(name));\n }\n\n function applyCss(element, prop, value) {\n prop = getStyleProp(prop);\n element.style[prop] = value;\n }\n\n return function(element, properties) {\n var args = arguments,\n prop, \n value;\n\n if (args.length == 2) {\n for (prop in properties) {\n value = properties[prop];\n if (value !== undefined && properties.hasOwnProperty(prop)) applyCss(element, prop, value);\n }\n } else {\n applyCss(element, args[1], args[2]);\n }\n }\n })();\n\n /**\n * (Internal) Determines if an element or space separated list of class names contains a class name.\n */\n\n function hasClass(element, name) {\n var list = typeof element == 'string' ? element : classList(element);\n return list.indexOf(' ' + name + ' ') >= 0;\n }\n\n /**\n * (Internal) Adds a class to an element.\n */\n\n function addClass(element, name) {\n var oldList = classList(element),\n newList = oldList + name;\n\n if (hasClass(oldList, name)) return; \n\n // Trim the opening space.\n element.className = newList.substring(1);\n }\n\n /**\n * (Internal) Removes a class from an element.\n */\n\n function removeClass(element, name) {\n var oldList = classList(element),\n newList;\n\n if (!hasClass(element, name)) return;\n\n // Replace the class name.\n newList = oldList.replace(' ' + name + ' ', ' ');\n\n // Trim the opening and closing spaces.\n element.className = newList.substring(1, newList.length - 1);\n }\n\n /**\n * (Internal) Gets a space separated list of the class names on the element. \n * The list is wrapped with a single space on each end to facilitate finding \n * matches within the list.\n */\n\n function classList(element) {\n return (' ' + (element.className || '') + ' ').replace(/\\s+/gi, ' ');\n }\n\n /**\n * (Internal) Removes an element from the DOM.\n */\n\n function removeElement(element) {\n element && element.parentNode && element.parentNode.removeChild(element);\n }\n\n return NProgress;\n});\n\n", "// Note: Phoenix JS dependencies are loaded\n// from their Application directories by the Assets module\nimport NProgress from \"nprogress\"\nimport PhxChartComponent from \"./metrics_live\"\nimport PhxRequestLoggerCookie from \"./request_logger_cookie\"\nimport PhxRequestLoggerQueryParameter from \"./request_logger_query_parameter\"\nimport PhxRequestLoggerMessages from \"./request_logger_messages\"\nimport PhxColorBarHighlight from \"./color_bar_highlight\"\nimport PhxRememberRefresh from \"./remember_refresh\"\nimport { loadRefreshData } from \"./refresh\";\n\nlet Hooks = {\n PhxChartComponent: PhxChartComponent,\n PhxRequestLoggerCookie: PhxRequestLoggerCookie,\n PhxRequestLoggerQueryParameter: PhxRequestLoggerQueryParameter,\n PhxRequestLoggerMessages: PhxRequestLoggerMessages,\n PhxColorBarHighlight: PhxColorBarHighlight,\n PhxRememberRefresh: PhxRememberRefresh\n}\n\nlet socketPath = document.querySelector(\"html\").getAttribute(\"phx-socket\") || \"/live\"\nlet csrfToken = document.querySelector(\"meta[name='csrf-token']\").getAttribute(\"content\")\nlet liveSocket = new LiveView.LiveSocket(socketPath, Phoenix.Socket, {\n hooks: { ...Hooks, ...window.LiveDashboard.customHooks },\n params: (liveViewName) => {\n return {\n _csrf_token: csrfToken,\n // Pass the most recent refresh data to the LiveView in `connect_params`\n refresh_data: loadRefreshData(),\n };\n },\n})\n\n\nconst socket = liveSocket.socket\nconst originalOnConnError = socket.onConnError\nlet fallbackToLongPoll = true\n\nsocket.onOpen(() => {\n fallbackToLongPoll = false\n})\n\nsocket.onConnError = (...args) => {\n if (fallbackToLongPoll) {\n // No longer fallback to longpoll\n fallbackToLongPoll = false\n // close the socket with an error code\n socket.disconnect(null, 3000)\n // fall back to long poll\n socket.transport = Phoenix.LongPoll\n // reopen\n socket.connect()\n } else {\n originalOnConnError.apply(socket, args)\n }\n}\n\n// Show progress bar on live navigation and form submits\nwindow.addEventListener(\"phx:page-loading-start\", info => NProgress.start())\nwindow.addEventListener(\"phx:page-loading-stop\", info => NProgress.done())\n\n// connect if there are any LiveViews on the page\nliveSocket.connect()\n\n// expose liveSocket on window for web console debug logs and latency simulation:\n// >> liveSocket.enableDebug()\n// >> liveSocket.enableLatencySim(1000)\nwindow.liveSocket = liveSocket\n", "const COLORS = {\n phoenix: [242, 110, 64],\n elixir: [75, 68, 115],\n red: [255, 99, 132],\n orange: [255, 159, 64],\n yellow: [255, 205, 86],\n green: [75, 192, 192],\n blue: [54, 162, 253],\n purple: [153, 102, 255],\n grey: [201, 203, 207],\n}\n\nconst COLOR_NAMES = Object.keys(COLORS)\n\nexport const ColorWheel = {\n at: (i) => {\n const [r, g, b] = ColorWheel.rgb(i)\n return `rgb(${r}, ${g}, ${b})`\n },\n rgb: (i) => COLORS[COLOR_NAMES[i % COLOR_NAMES.length]],\n}\n\nexport const LineColor = {\n at: (i) => {\n const [r, g, b] = ColorWheel.rgb(i)\n return {\n stroke: `rgb(${r}, ${g}, ${b})`,\n fill: `rgb(${r}, ${g}, ${b}, 0.1)`\n }\n }\n}\n\nexport default ColorWheel\n", "/**\n* Copyright (c) 2022, Leon Sorokin\n* All rights reserved. (MIT Licensed)\n*\n* uPlot.js (\u03BCPlot)\n* A small, fast chart for time series, lines, areas, ohlc & bars\n* https://github.com/leeoniya/uPlot (v1.6.22)\n*/\n\nconst FEAT_TIME = true;\n\nconst pre = \"u-\";\n\nconst UPLOT = \"uplot\";\nconst ORI_HZ = pre + \"hz\";\nconst ORI_VT = pre + \"vt\";\nconst TITLE = pre + \"title\";\nconst WRAP = pre + \"wrap\";\nconst UNDER = pre + \"under\";\nconst OVER = pre + \"over\";\nconst AXIS = pre + \"axis\";\nconst OFF = pre + \"off\";\nconst SELECT = pre + \"select\";\nconst CURSOR_X = pre + \"cursor-x\";\nconst CURSOR_Y = pre + \"cursor-y\";\nconst CURSOR_PT = pre + \"cursor-pt\";\nconst LEGEND = pre + \"legend\";\nconst LEGEND_LIVE = pre + \"live\";\nconst LEGEND_INLINE = pre + \"inline\";\nconst LEGEND_THEAD = pre + \"thead\";\nconst LEGEND_SERIES = pre + \"series\";\nconst LEGEND_MARKER = pre + \"marker\";\nconst LEGEND_LABEL = pre + \"label\";\nconst LEGEND_VALUE = pre + \"value\";\n\nconst WIDTH = \"width\";\nconst HEIGHT = \"height\";\nconst TOP = \"top\";\nconst BOTTOM = \"bottom\";\nconst LEFT = \"left\";\nconst RIGHT = \"right\";\nconst hexBlack = \"#000\";\nconst transparent = hexBlack + \"0\";\n\nconst mousemove = \"mousemove\";\nconst mousedown = \"mousedown\";\nconst mouseup = \"mouseup\";\nconst mouseenter = \"mouseenter\";\nconst mouseleave = \"mouseleave\";\nconst dblclick = \"dblclick\";\nconst resize = \"resize\";\nconst scroll = \"scroll\";\n\nconst change = \"change\";\nconst dppxchange = \"dppxchange\";\n\nconst domEnv = typeof window != 'undefined';\n\nconst doc = domEnv ? document : null;\nconst win = domEnv ? window : null;\nconst nav = domEnv ? navigator : null;\n\nlet pxRatio;\n\nlet query;\n\nfunction setPxRatio() {\n\tlet _pxRatio = devicePixelRatio;\n\n\t// during print preview, Chrome fires off these dppx queries even without changes\n\tif (pxRatio != _pxRatio) {\n\t\tpxRatio = _pxRatio;\n\n\t\tquery && off(change, query, setPxRatio);\n\t\tquery = matchMedia(`(min-resolution: ${pxRatio - 0.001}dppx) and (max-resolution: ${pxRatio + 0.001}dppx)`);\n\t\ton(change, query, setPxRatio);\n\n\t\twin.dispatchEvent(new CustomEvent(dppxchange));\n\t}\n}\n\nfunction addClass(el, c) {\n\tif (c != null) {\n\t\tlet cl = el.classList;\n\t\t!cl.contains(c) && cl.add(c);\n\t}\n}\n\nfunction remClass(el, c) {\n\tlet cl = el.classList;\n\tcl.contains(c) && cl.remove(c);\n}\n\nfunction setStylePx(el, name, value) {\n\tel.style[name] = value + \"px\";\n}\n\nfunction placeTag(tag, cls, targ, refEl) {\n\tlet el = doc.createElement(tag);\n\n\tif (cls != null)\n\t\taddClass(el, cls);\n\n\tif (targ != null)\n\t\ttarg.insertBefore(el, refEl);\n\n\treturn el;\n}\n\nfunction placeDiv(cls, targ) {\n\treturn placeTag(\"div\", cls, targ);\n}\n\nconst xformCache = new WeakMap();\n\nfunction elTrans(el, xPos, yPos, xMax, yMax) {\n\tlet xform = \"translate(\" + xPos + \"px,\" + yPos + \"px)\";\n\tlet xformOld = xformCache.get(el);\n\n\tif (xform != xformOld) {\n\t\tel.style.transform = xform;\n\t\txformCache.set(el, xform);\n\n\t\tif (xPos < 0 || yPos < 0 || xPos > xMax || yPos > yMax)\n\t\t\taddClass(el, OFF);\n\t\telse\n\t\t\tremClass(el, OFF);\n\t}\n}\n\nconst colorCache = new WeakMap();\n\nfunction elColor(el, background, borderColor) {\n\tlet newColor = background + borderColor;\n\tlet oldColor = colorCache.get(el);\n\n\tif (newColor != oldColor) {\n\t\tcolorCache.set(el, newColor);\n\t\tel.style.background = background;\n\t\tel.style.borderColor = borderColor;\n\t}\n}\n\nconst sizeCache = new WeakMap();\n\nfunction elSize(el, newWid, newHgt, centered) {\n\tlet newSize = newWid + \"\" + newHgt;\n\tlet oldSize = sizeCache.get(el);\n\n\tif (newSize != oldSize) {\n\t\tsizeCache.set(el, newSize);\n\t\tel.style.height = newHgt + \"px\";\n\t\tel.style.width = newWid + \"px\";\n\t\tel.style.marginLeft = centered ? -newWid/2 + \"px\" : 0;\n\t\tel.style.marginTop = centered ? -newHgt/2 + \"px\" : 0;\n\t}\n}\n\nconst evOpts = {passive: true};\nconst evOpts2 = {...evOpts, capture: true};\n\nfunction on(ev, el, cb, capt) {\n\tel.addEventListener(ev, cb, capt ? evOpts2 : evOpts);\n}\n\nfunction off(ev, el, cb, capt) {\n\tel.removeEventListener(ev, cb, capt ? evOpts2 : evOpts);\n}\n\ndomEnv && setPxRatio();\n\n// binary search for index of closest value\nfunction closestIdx(num, arr, lo, hi) {\n\tlet mid;\n\tlo = lo || 0;\n\thi = hi || arr.length - 1;\n\tlet bitwise = hi <= 2147483647;\n\n\twhile (hi - lo > 1) {\n\t\tmid = bitwise ? (lo + hi) >> 1 : floor((lo + hi) / 2);\n\n\t\tif (arr[mid] < num)\n\t\t\tlo = mid;\n\t\telse\n\t\t\thi = mid;\n\t}\n\n\tif (num - arr[lo] <= arr[hi] - num)\n\t\treturn lo;\n\n\treturn hi;\n}\n\nfunction nonNullIdx(data, _i0, _i1, dir) {\n\tfor (let i = dir == 1 ? _i0 : _i1; i >= _i0 && i <= _i1; i += dir) {\n\t\tif (data[i] != null)\n\t\t\treturn i;\n\t}\n\n\treturn -1;\n}\n\nfunction getMinMax(data, _i0, _i1, sorted) {\n//\tconsole.log(\"getMinMax()\");\n\n\tlet _min = inf;\n\tlet _max = -inf;\n\n\tif (sorted == 1) {\n\t\t_min = data[_i0];\n\t\t_max = data[_i1];\n\t}\n\telse if (sorted == -1) {\n\t\t_min = data[_i1];\n\t\t_max = data[_i0];\n\t}\n\telse {\n\t\tfor (let i = _i0; i <= _i1; i++) {\n\t\t\tif (data[i] != null) {\n\t\t\t\t_min = min(_min, data[i]);\n\t\t\t\t_max = max(_max, data[i]);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn [_min, _max];\n}\n\nfunction getMinMaxLog(data, _i0, _i1) {\n//\tconsole.log(\"getMinMax()\");\n\n\tlet _min = inf;\n\tlet _max = -inf;\n\n\tfor (let i = _i0; i <= _i1; i++) {\n\t\tif (data[i] > 0) {\n\t\t\t_min = min(_min, data[i]);\n\t\t\t_max = max(_max, data[i]);\n\t\t}\n\t}\n\n\treturn [\n\t\t_min == inf ? 1 : _min,\n\t\t_max == -inf ? 10 : _max,\n\t];\n}\n\nconst _fixedTuple = [0, 0];\n\nfunction fixIncr(minIncr, maxIncr, minExp, maxExp) {\n\t_fixedTuple[0] = minExp < 0 ? roundDec(minIncr, -minExp) : minIncr;\n\t_fixedTuple[1] = maxExp < 0 ? roundDec(maxIncr, -maxExp) : maxIncr;\n\treturn _fixedTuple;\n}\n\nfunction rangeLog(min, max, base, fullMags) {\n\tlet minSign = sign(min);\n\n\tlet logFn = base == 10 ? log10 : log2;\n\n\tif (min == max) {\n\t\tif (minSign == -1) {\n\t\t\tmin *= base;\n\t\t\tmax /= base;\n\t\t}\n\t\telse {\n\t\t\tmin /= base;\n\t\t\tmax *= base;\n\t\t}\n\t}\n\n\tlet minExp, maxExp, minMaxIncrs;\n\n\tif (fullMags) {\n\t\tminExp = floor(logFn(min));\n\t\tmaxExp = ceil(logFn(max));\n\n\t\tminMaxIncrs = fixIncr(pow(base, minExp), pow(base, maxExp), minExp, maxExp);\n\n\t\tmin = minMaxIncrs[0];\n\t\tmax = minMaxIncrs[1];\n\t}\n\telse {\n\t\tminExp = floor(logFn(abs(min)));\n\t\tmaxExp = floor(logFn(abs(max)));\n\n\t\tminMaxIncrs = fixIncr(pow(base, minExp), pow(base, maxExp), minExp, maxExp);\n\n\t\tmin = incrRoundDn(min, minMaxIncrs[0]);\n\t\tmax = incrRoundUp(max, minMaxIncrs[1]);\n\t}\n\n\treturn [min, max];\n}\n\nfunction rangeAsinh(min, max, base, fullMags) {\n\tlet minMax = rangeLog(min, max, base, fullMags);\n\n\tif (min == 0)\n\t\tminMax[0] = 0;\n\n\tif (max == 0)\n\t\tminMax[1] = 0;\n\n\treturn minMax;\n}\n\nconst rangePad = 0.1;\n\nconst autoRangePart = {\n\tmode: 3,\n\tpad: rangePad,\n};\n\nconst _eqRangePart = {\n\tpad: 0,\n\tsoft: null,\n\tmode: 0,\n};\n\nconst _eqRange = {\n\tmin: _eqRangePart,\n\tmax: _eqRangePart,\n};\n\n// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below\n// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value\nfunction rangeNum(_min, _max, mult, extra) {\n\tif (isObj(mult))\n\t\treturn _rangeNum(_min, _max, mult);\n\n\t_eqRangePart.pad = mult;\n\t_eqRangePart.soft = extra ? 0 : null;\n\t_eqRangePart.mode = extra ? 3 : 0;\n\n\treturn _rangeNum(_min, _max, _eqRange);\n}\n\n// nullish coalesce\nfunction ifNull(lh, rh) {\n\treturn lh == null ? rh : lh;\n}\n\n// checks if given index range in an array contains a non-null value\n// aka a range-bounded Array.some()\nfunction hasData(data, idx0, idx1) {\n\tidx0 = ifNull(idx0, 0);\n\tidx1 = ifNull(idx1, data.length - 1);\n\n\twhile (idx0 <= idx1) {\n\t\tif (data[idx0] != null)\n\t\t\treturn true;\n\t\tidx0++;\n\t}\n\n\treturn false;\n}\n\nfunction _rangeNum(_min, _max, cfg) {\n\tlet cmin = cfg.min;\n\tlet cmax = cfg.max;\n\n\tlet padMin = ifNull(cmin.pad, 0);\n\tlet padMax = ifNull(cmax.pad, 0);\n\n\tlet hardMin = ifNull(cmin.hard, -inf);\n\tlet hardMax = ifNull(cmax.hard, inf);\n\n\tlet softMin = ifNull(cmin.soft, inf);\n\tlet softMax = ifNull(cmax.soft, -inf);\n\n\tlet softMinMode = ifNull(cmin.mode, 0);\n\tlet softMaxMode = ifNull(cmax.mode, 0);\n\n\tlet delta = _max - _min;\n\n\t// this handles situations like 89.7, 89.69999999999999\n\t// by assuming 0.001x deltas are precision errors\n//\tif (delta > 0 && delta < abs(_max) / 1e3)\n//\t\tdelta = 0;\n\n\t// treat data as flat if delta is less than 1 billionth\n\tif (delta < 1e-9) {\n\t\tdelta = 0;\n\n\t\t// if soft mode is 2 and all vals are flat at 0, avoid the 0.1 * 1e3 fallback\n\t\t// this prevents 0,0,0 from ranging to -100,100 when softMin/softMax are -1,1\n\t\tif (_min == 0 || _max == 0) {\n\t\t\tdelta = 1e-9;\n\n\t\t\tif (softMinMode == 2 && softMin != inf)\n\t\t\t\tpadMin = 0;\n\n\t\t\tif (softMaxMode == 2 && softMax != -inf)\n\t\t\t\tpadMax = 0;\n\t\t}\n\t}\n\n\tlet nonZeroDelta = delta || abs(_max) || 1e3;\n\tlet mag = log10(nonZeroDelta);\n\tlet base = pow(10, floor(mag));\n\n\tlet _padMin = nonZeroDelta * (delta == 0 ? (_min == 0 ? .1 : 1) : padMin);\n\tlet _newMin = roundDec(incrRoundDn(_min - _padMin, base/10), 9);\n\tlet _softMin = _min >= softMin && (softMinMode == 1 || softMinMode == 3 && _newMin <= softMin || softMinMode == 2 && _newMin >= softMin) ? softMin : inf;\n\tlet minLim = max(hardMin, _newMin < _softMin && _min >= _softMin ? _softMin : min(_softMin, _newMin));\n\n\tlet _padMax = nonZeroDelta * (delta == 0 ? (_max == 0 ? .1 : 1) : padMax);\n\tlet _newMax = roundDec(incrRoundUp(_max + _padMax, base/10), 9);\n\tlet _softMax = _max <= softMax && (softMaxMode == 1 || softMaxMode == 3 && _newMax >= softMax || softMaxMode == 2 && _newMax <= softMax) ? softMax : -inf;\n\tlet maxLim = min(hardMax, _newMax > _softMax && _max <= _softMax ? _softMax : max(_softMax, _newMax));\n\n\tif (minLim == maxLim && minLim == 0)\n\t\tmaxLim = 100;\n\n\treturn [minLim, maxLim];\n}\n\n// alternative: https://stackoverflow.com/a/2254896\nconst numFormatter = new Intl.NumberFormat(domEnv ? nav.language : 'en-US');\nconst fmtNum = val => numFormatter.format(val);\n\nconst M = Math;\n\nconst PI = M.PI;\nconst abs = M.abs;\nconst floor = M.floor;\nconst round = M.round;\nconst ceil = M.ceil;\nconst min = M.min;\nconst max = M.max;\nconst pow = M.pow;\nconst sign = M.sign;\nconst log10 = M.log10;\nconst log2 = M.log2;\n// TODO: seems like this needs to match asinh impl if the passed v is tweaked?\nconst sinh = (v, linthresh = 1) => M.sinh(v) * linthresh;\nconst asinh = (v, linthresh = 1) => M.asinh(v / linthresh);\n\nconst inf = Infinity;\n\nfunction numIntDigits(x) {\n\treturn (log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1;\n}\n\nfunction incrRound(num, incr) {\n\treturn round(num/incr)*incr;\n}\n\nfunction clamp(num, _min, _max) {\n\treturn min(max(num, _min), _max);\n}\n\nfunction fnOrSelf(v) {\n\treturn typeof v == \"function\" ? v : () => v;\n}\n\nconst retArg0 = _0 => _0;\n\nconst retArg1 = (_0, _1) => _1;\n\nconst retNull = _ => null;\n\nconst retTrue = _ => true;\n\nconst retEq = (a, b) => a == b;\n\nfunction incrRoundUp(num, incr) {\n\treturn ceil(num/incr)*incr;\n}\n\nfunction incrRoundDn(num, incr) {\n\treturn floor(num/incr)*incr;\n}\n\nfunction roundDec(val, dec) {\n\treturn round(val * (dec = 10**dec)) / dec;\n}\n\nconst fixedDec = new Map();\n\nfunction guessDec(num) {\n\treturn ((\"\"+num).split(\".\")[1] || \"\").length;\n}\n\nfunction genIncrs(base, minExp, maxExp, mults) {\n\tlet incrs = [];\n\n\tlet multDec = mults.map(guessDec);\n\n\tfor (let exp = minExp; exp < maxExp; exp++) {\n\t\tlet expa = abs(exp);\n\t\tlet mag = roundDec(pow(base, exp), expa);\n\n\t\tfor (let i = 0; i < mults.length; i++) {\n\t\t\tlet _incr = mults[i] * mag;\n\t\t\tlet dec = (_incr >= 0 && exp >= 0 ? 0 : expa) + (exp >= multDec[i] ? 0 : multDec[i]);\n\t\t\tlet incr = roundDec(_incr, dec);\n\t\t\tincrs.push(incr);\n\t\t\tfixedDec.set(incr, dec);\n\t\t}\n\t}\n\n\treturn incrs;\n}\n\n//export const assign = Object.assign;\n\nconst EMPTY_OBJ = {};\nconst EMPTY_ARR = [];\n\nconst nullNullTuple = [null, null];\n\nconst isArr = Array.isArray;\n\nfunction isStr(v) {\n\treturn typeof v == 'string';\n}\n\nfunction isObj(v) {\n\tlet is = false;\n\n\tif (v != null) {\n\t\tlet c = v.constructor;\n\t\tis = c == null || c == Object;\n\t}\n\n\treturn is;\n}\n\nfunction fastIsObj(v) {\n\treturn v != null && typeof v == 'object';\n}\n\nconst TypedArray = Object.getPrototypeOf(Uint8Array);\n\nfunction copy(o, _isObj = isObj) {\n\tlet out;\n\n\tif (isArr(o)) {\n\t\tlet val = o.find(v => v != null);\n\n\t\tif (isArr(val) || _isObj(val)) {\n\t\t\tout = Array(o.length);\n\t\t\tfor (let i = 0; i < o.length; i++)\n\t\t\t\tout[i] = copy(o[i], _isObj);\n\t\t}\n\t\telse\n\t\t\tout = o.slice();\n\t}\n\telse if (o instanceof TypedArray) // also (ArrayBuffer.isView(o) && !(o instanceof DataView))\n\t\tout = o.slice();\n\telse if (_isObj(o)) {\n\t\tout = {};\n\t\tfor (let k in o)\n\t\t\tout[k] = copy(o[k], _isObj);\n\t}\n\telse\n\t\tout = o;\n\n\treturn out;\n}\n\nfunction assign(targ) {\n\tlet args = arguments;\n\n\tfor (let i = 1; i < args.length; i++) {\n\t\tlet src = args[i];\n\n\t\tfor (let key in src) {\n\t\t\tif (isObj(targ[key]))\n\t\t\t\tassign(targ[key], copy(src[key]));\n\t\t\telse\n\t\t\t\ttarg[key] = copy(src[key]);\n\t\t}\n\t}\n\n\treturn targ;\n}\n\n// nullModes\nconst NULL_REMOVE = 0; // nulls are converted to undefined (e.g. for spanGaps: true)\nconst NULL_RETAIN = 1; // nulls are retained, with alignment artifacts set to undefined (default)\nconst NULL_EXPAND = 2; // nulls are expanded to include any adjacent alignment artifacts\n\n// sets undefined values to nulls when adjacent to existing nulls (minesweeper)\nfunction nullExpand(yVals, nullIdxs, alignedLen) {\n\tfor (let i = 0, xi, lastNullIdx = -1; i < nullIdxs.length; i++) {\n\t\tlet nullIdx = nullIdxs[i];\n\n\t\tif (nullIdx > lastNullIdx) {\n\t\t\txi = nullIdx - 1;\n\t\t\twhile (xi >= 0 && yVals[xi] == null)\n\t\t\t\tyVals[xi--] = null;\n\n\t\t\txi = nullIdx + 1;\n\t\t\twhile (xi < alignedLen && yVals[xi] == null)\n\t\t\t\tyVals[lastNullIdx = xi++] = null;\n\t\t}\n\t}\n}\n\n// nullModes is a tables-matched array indicating how to treat nulls in each series\n// output is sorted ASC on the joined field (table[0]) and duplicate join values are collapsed\nfunction join(tables, nullModes) {\n\tlet xVals = new Set();\n\n\tfor (let ti = 0; ti < tables.length; ti++) {\n\t\tlet t = tables[ti];\n\t\tlet xs = t[0];\n\t\tlet len = xs.length;\n\n\t\tfor (let i = 0; i < len; i++)\n\t\t\txVals.add(xs[i]);\n\t}\n\n\tlet data = [Array.from(xVals).sort((a, b) => a - b)];\n\n\tlet alignedLen = data[0].length;\n\n\tlet xIdxs = new Map();\n\n\tfor (let i = 0; i < alignedLen; i++)\n\t\txIdxs.set(data[0][i], i);\n\n\tfor (let ti = 0; ti < tables.length; ti++) {\n\t\tlet t = tables[ti];\n\t\tlet xs = t[0];\n\n\t\tfor (let si = 1; si < t.length; si++) {\n\t\t\tlet ys = t[si];\n\n\t\t\tlet yVals = Array(alignedLen).fill(undefined);\n\n\t\t\tlet nullMode = nullModes ? nullModes[ti][si] : NULL_RETAIN;\n\n\t\t\tlet nullIdxs = [];\n\n\t\t\tfor (let i = 0; i < ys.length; i++) {\n\t\t\t\tlet yVal = ys[i];\n\t\t\t\tlet alignedIdx = xIdxs.get(xs[i]);\n\n\t\t\t\tif (yVal === null) {\n\t\t\t\t\tif (nullMode != NULL_REMOVE) {\n\t\t\t\t\t\tyVals[alignedIdx] = yVal;\n\n\t\t\t\t\t\tif (nullMode == NULL_EXPAND)\n\t\t\t\t\t\t\tnullIdxs.push(alignedIdx);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tyVals[alignedIdx] = yVal;\n\t\t\t}\n\n\t\t\tnullExpand(yVals, nullIdxs, alignedLen);\n\n\t\t\tdata.push(yVals);\n\t\t}\n\t}\n\n\treturn data;\n}\n\nconst microTask = typeof queueMicrotask == \"undefined\" ? fn => Promise.resolve().then(fn) : queueMicrotask;\n\nconst months = [\n\t\"January\",\n\t\"February\",\n\t\"March\",\n\t\"April\",\n\t\"May\",\n\t\"June\",\n\t\"July\",\n\t\"August\",\n\t\"September\",\n\t\"October\",\n\t\"November\",\n\t\"December\",\n];\n\nconst days = [\n\t\"Sunday\",\n\t\"Monday\",\n\t\"Tuesday\",\n\t\"Wednesday\",\n\t\"Thursday\",\n\t\"Friday\",\n\t\"Saturday\",\n];\n\nfunction slice3(str) {\n\treturn str.slice(0, 3);\n}\n\nconst days3 = days.map(slice3);\n\nconst months3 = months.map(slice3);\n\nconst engNames = {\n\tMMMM: months,\n\tMMM: months3,\n\tWWWW: days,\n\tWWW: days3,\n};\n\nfunction zeroPad2(int) {\n\treturn (int < 10 ? '0' : '') + int;\n}\n\nfunction zeroPad3(int) {\n\treturn (int < 10 ? '00' : int < 100 ? '0' : '') + int;\n}\n\n/*\nfunction suffix(int) {\n\tlet mod10 = int % 10;\n\n\treturn int + (\n\t\tmod10 == 1 && int != 11 ? \"st\" :\n\t\tmod10 == 2 && int != 12 ? \"nd\" :\n\t\tmod10 == 3 && int != 13 ? \"rd\" : \"th\"\n\t);\n}\n*/\n\nconst subs = {\n\t// 2019\n\tYYYY:\td => d.getFullYear(),\n\t// 19\n\tYY:\t\td => (d.getFullYear()+'').slice(2),\n\t// July\n\tMMMM:\t(d, names) => names.MMMM[d.getMonth()],\n\t// Jul\n\tMMM:\t(d, names) => names.MMM[d.getMonth()],\n\t// 07\n\tMM:\t\td => zeroPad2(d.getMonth()+1),\n\t// 7\n\tM:\t\td => d.getMonth()+1,\n\t// 09\n\tDD:\t\td => zeroPad2(d.getDate()),\n\t// 9\n\tD:\t\td => d.getDate(),\n\t// Monday\n\tWWWW:\t(d, names) => names.WWWW[d.getDay()],\n\t// Mon\n\tWWW:\t(d, names) => names.WWW[d.getDay()],\n\t// 03\n\tHH:\t\td => zeroPad2(d.getHours()),\n\t// 3\n\tH:\t\td => d.getHours(),\n\t// 9 (12hr, unpadded)\n\th:\t\td => {let h = d.getHours(); return h == 0 ? 12 : h > 12 ? h - 12 : h;},\n\t// AM\n\tAA:\t\td => d.getHours() >= 12 ? 'PM' : 'AM',\n\t// am\n\taa:\t\td => d.getHours() >= 12 ? 'pm' : 'am',\n\t// a\n\ta:\t\td => d.getHours() >= 12 ? 'p' : 'a',\n\t// 09\n\tmm:\t\td => zeroPad2(d.getMinutes()),\n\t// 9\n\tm:\t\td => d.getMinutes(),\n\t// 09\n\tss:\t\td => zeroPad2(d.getSeconds()),\n\t// 9\n\ts:\t\td => d.getSeconds(),\n\t// 374\n\tfff:\td => zeroPad3(d.getMilliseconds()),\n};\n\nfunction fmtDate(tpl, names) {\n\tnames = names || engNames;\n\tlet parts = [];\n\n\tlet R = /\\{([a-z]+)\\}|[^{]+/gi, m;\n\n\twhile (m = R.exec(tpl))\n\t\tparts.push(m[0][0] == '{' ? subs[m[1]] : m[0]);\n\n\treturn d => {\n\t\tlet out = '';\n\n\t\tfor (let i = 0; i < parts.length; i++)\n\t\t\tout += typeof parts[i] == \"string\" ? parts[i] : parts[i](d, names);\n\n\t\treturn out;\n\t}\n}\n\nconst localTz = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n// https://stackoverflow.com/questions/15141762/how-to-initialize-a-javascript-date-to-a-particular-time-zone/53652131#53652131\nfunction tzDate(date, tz) {\n\tlet date2;\n\n\t// perf optimization\n\tif (tz == 'UTC' || tz == 'Etc/UTC')\n\t\tdate2 = new Date(+date + date.getTimezoneOffset() * 6e4);\n\telse if (tz == localTz)\n\t\tdate2 = date;\n\telse {\n\t\tdate2 = new Date(date.toLocaleString('en-US', {timeZone: tz}));\n\t\tdate2.setMilliseconds(date.getMilliseconds());\n\t}\n\n\treturn date2;\n}\n\n//export const series = [];\n\n// default formatters:\n\nconst onlyWhole = v => v % 1 == 0;\n\nconst allMults = [1,2,2.5,5];\n\n// ...0.01, 0.02, 0.025, 0.05, 0.1, 0.2, 0.25, 0.5\nconst decIncrs = genIncrs(10, -16, 0, allMults);\n\n// 1, 2, 2.5, 5, 10, 20, 25, 50...\nconst oneIncrs = genIncrs(10, 0, 16, allMults);\n\n// 1, 2, 5, 10, 20, 25, 50...\nconst wholeIncrs = oneIncrs.filter(onlyWhole);\n\nconst numIncrs = decIncrs.concat(oneIncrs);\n\nconst NL = \"\\n\";\n\nconst yyyy = \"{YYYY}\";\nconst NLyyyy = NL + yyyy;\nconst md = \"{M}/{D}\";\nconst NLmd = NL + md;\nconst NLmdyy = NLmd + \"/{YY}\";\n\nconst aa = \"{aa}\";\nconst hmm = \"{h}:{mm}\";\nconst hmmaa = hmm + aa;\nconst NLhmmaa = NL + hmmaa;\nconst ss = \":{ss}\";\n\nconst _ = null;\n\nfunction genTimeStuffs(ms) {\n\tlet\ts = ms * 1e3,\n\t\tm = s * 60,\n\t\th = m * 60,\n\t\td = h * 24,\n\t\tmo = d * 30,\n\t\ty = d * 365;\n\n\t// min of 1e-3 prevents setting a temporal x ticks too small since Date objects cannot advance ticks smaller than 1ms\n\tlet subSecIncrs = ms == 1 ? genIncrs(10, 0, 3, allMults).filter(onlyWhole) : genIncrs(10, -3, 0, allMults);\n\n\tlet timeIncrs = subSecIncrs.concat([\n\t\t// minute divisors (# of secs)\n\t\ts,\n\t\ts * 5,\n\t\ts * 10,\n\t\ts * 15,\n\t\ts * 30,\n\t\t// hour divisors (# of mins)\n\t\tm,\n\t\tm * 5,\n\t\tm * 10,\n\t\tm * 15,\n\t\tm * 30,\n\t\t// day divisors (# of hrs)\n\t\th,\n\t\th * 2,\n\t\th * 3,\n\t\th * 4,\n\t\th * 6,\n\t\th * 8,\n\t\th * 12,\n\t\t// month divisors TODO: need more?\n\t\td,\n\t\td * 2,\n\t\td * 3,\n\t\td * 4,\n\t\td * 5,\n\t\td * 6,\n\t\td * 7,\n\t\td * 8,\n\t\td * 9,\n\t\td * 10,\n\t\td * 15,\n\t\t// year divisors (# months, approx)\n\t\tmo,\n\t\tmo * 2,\n\t\tmo * 3,\n\t\tmo * 4,\n\t\tmo * 6,\n\t\t// century divisors\n\t\ty,\n\t\ty * 2,\n\t\ty * 5,\n\t\ty * 10,\n\t\ty * 25,\n\t\ty * 50,\n\t\ty * 100,\n\t]);\n\n\t// [0]: minimum num secs in the tick incr\n\t// [1]: default tick format\n\t// [2-7]: rollover tick formats\n\t// [8]: mode: 0: replace [1] -> [2-7], 1: concat [1] + [2-7]\n\tconst _timeAxisStamps = [\n\t// tick incr default year month day hour min sec mode\n\t\t[y, yyyy, _, _, _, _, _, _, 1],\n\t\t[d * 28, \"{MMM}\", NLyyyy, _, _, _, _, _, 1],\n\t\t[d, md, NLyyyy, _, _, _, _, _, 1],\n\t\t[h, \"{h}\" + aa, NLmdyy, _, NLmd, _, _, _, 1],\n\t\t[m, hmmaa, NLmdyy, _, NLmd, _, _, _, 1],\n\t\t[s, ss, NLmdyy + \" \" + hmmaa, _, NLmd + \" \" + hmmaa, _, NLhmmaa, _, 1],\n\t\t[ms, ss + \".{fff}\", NLmdyy + \" \" + hmmaa, _, NLmd + \" \" + hmmaa, _, NLhmmaa, _, 1],\n\t];\n\n\t// the ensures that axis ticks, values & grid are aligned to logical temporal breakpoints and not an arbitrary timestamp\n\t// https://www.timeanddate.com/time/dst/\n\t// https://www.timeanddate.com/time/dst/2019.html\n\t// https://www.epochconverter.com/timezones\n\tfunction timeAxisSplits(tzDate) {\n\t\treturn (self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace) => {\n\t\t\tlet splits = [];\n\t\t\tlet isYr = foundIncr >= y;\n\t\t\tlet isMo = foundIncr >= mo && foundIncr < y;\n\n\t\t\t// get the timezone-adjusted date\n\t\t\tlet minDate = tzDate(scaleMin);\n\t\t\tlet minDateTs = roundDec(minDate * ms, 3);\n\n\t\t\t// get ts of 12am (this lands us at or before the original scaleMin)\n\t\t\tlet minMin = mkDate(minDate.getFullYear(), isYr ? 0 : minDate.getMonth(), isMo || isYr ? 1 : minDate.getDate());\n\t\t\tlet minMinTs = roundDec(minMin * ms, 3);\n\n\t\t\tif (isMo || isYr) {\n\t\t\t\tlet moIncr = isMo ? foundIncr / mo : 0;\n\t\t\t\tlet yrIncr = isYr ? foundIncr / y : 0;\n\t\t\t//\tlet tzOffset = scaleMin - minDateTs;\t\t// needed?\n\t\t\t\tlet split = minDateTs == minMinTs ? minDateTs : roundDec(mkDate(minMin.getFullYear() + yrIncr, minMin.getMonth() + moIncr, 1) * ms, 3);\n\t\t\t\tlet splitDate = new Date(round(split / ms));\n\t\t\t\tlet baseYear = splitDate.getFullYear();\n\t\t\t\tlet baseMonth = splitDate.getMonth();\n\n\t\t\t\tfor (let i = 0; split <= scaleMax; i++) {\n\t\t\t\t\tlet next = mkDate(baseYear + yrIncr * i, baseMonth + moIncr * i, 1);\n\t\t\t\t\tlet offs = next - tzDate(roundDec(next * ms, 3));\n\n\t\t\t\t\tsplit = roundDec((+next + offs) * ms, 3);\n\n\t\t\t\t\tif (split <= scaleMax)\n\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet incr0 = foundIncr >= d ? d : foundIncr;\n\t\t\t\tlet tzOffset = floor(scaleMin) - floor(minDateTs);\n\t\t\t\tlet split = minMinTs + tzOffset + incrRoundUp(minDateTs - minMinTs, incr0);\n\t\t\t\tsplits.push(split);\n\n\t\t\t\tlet date0 = tzDate(split);\n\n\t\t\t\tlet prevHour = date0.getHours() + (date0.getMinutes() / m) + (date0.getSeconds() / h);\n\t\t\t\tlet incrHours = foundIncr / h;\n\n\t\t\t\tlet minSpace = self.axes[axisIdx]._space;\n\t\t\t\tlet pctSpace = foundSpace / minSpace;\n\n\t\t\t\twhile (1) {\n\t\t\t\t\tsplit = roundDec(split + foundIncr, ms == 1 ? 0 : 3);\n\n\t\t\t\t\tif (split > scaleMax)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tif (incrHours > 1) {\n\t\t\t\t\t\tlet expectedHour = floor(roundDec(prevHour + incrHours, 6)) % 24;\n\t\t\t\t\t\tlet splitDate = tzDate(split);\n\t\t\t\t\t\tlet actualHour = splitDate.getHours();\n\n\t\t\t\t\t\tlet dstShift = actualHour - expectedHour;\n\n\t\t\t\t\t\tif (dstShift > 1)\n\t\t\t\t\t\t\tdstShift = -1;\n\n\t\t\t\t\t\tsplit -= dstShift * h;\n\n\t\t\t\t\t\tprevHour = (prevHour + incrHours) % 24;\n\n\t\t\t\t\t\t// add a tick only if it's further than 70% of the min allowed label spacing\n\t\t\t\t\t\tlet prevSplit = splits[splits.length - 1];\n\t\t\t\t\t\tlet pctIncr = roundDec((split - prevSplit) / foundIncr, 3);\n\n\t\t\t\t\t\tif (pctIncr * pctSpace >= .7)\n\t\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn splits;\n\t\t}\n\t}\n\n\treturn [\n\t\ttimeIncrs,\n\t\t_timeAxisStamps,\n\t\ttimeAxisSplits,\n\t];\n}\n\nconst [ timeIncrsMs, _timeAxisStampsMs, timeAxisSplitsMs ] = genTimeStuffs(1);\nconst [ timeIncrsS, _timeAxisStampsS, timeAxisSplitsS ] = genTimeStuffs(1e-3);\n\n// base 2\ngenIncrs(2, -53, 53, [1]);\n\n/*\nconsole.log({\n\tdecIncrs,\n\toneIncrs,\n\twholeIncrs,\n\tnumIncrs,\n\ttimeIncrs,\n\tfixedDec,\n});\n*/\n\nfunction timeAxisStamps(stampCfg, fmtDate) {\n\treturn stampCfg.map(s => s.map((v, i) =>\n\t\ti == 0 || i == 8 || v == null ? v : fmtDate(i == 1 || s[8] == 0 ? v : s[1] + v)\n\t));\n}\n\n// TODO: will need to accept spaces[] and pull incr into the loop when grid will be non-uniform, eg for log scales.\n// currently we ignore this for months since they're *nearly* uniform and the added complexity is not worth it\nfunction timeAxisVals(tzDate, stamps) {\n\treturn (self, splits, axisIdx, foundSpace, foundIncr) => {\n\t\tlet s = stamps.find(s => foundIncr >= s[0]) || stamps[stamps.length - 1];\n\n\t\t// these track boundaries when a full label is needed again\n\t\tlet prevYear;\n\t\tlet prevMnth;\n\t\tlet prevDate;\n\t\tlet prevHour;\n\t\tlet prevMins;\n\t\tlet prevSecs;\n\n\t\treturn splits.map(split => {\n\t\t\tlet date = tzDate(split);\n\n\t\t\tlet newYear = date.getFullYear();\n\t\t\tlet newMnth = date.getMonth();\n\t\t\tlet newDate = date.getDate();\n\t\t\tlet newHour = date.getHours();\n\t\t\tlet newMins = date.getMinutes();\n\t\t\tlet newSecs = date.getSeconds();\n\n\t\t\tlet stamp = (\n\t\t\t\tnewYear != prevYear && s[2] ||\n\t\t\t\tnewMnth != prevMnth && s[3] ||\n\t\t\t\tnewDate != prevDate && s[4] ||\n\t\t\t\tnewHour != prevHour && s[5] ||\n\t\t\t\tnewMins != prevMins && s[6] ||\n\t\t\t\tnewSecs != prevSecs && s[7] ||\n\t\t\t\t s[1]\n\t\t\t);\n\n\t\t\tprevYear = newYear;\n\t\t\tprevMnth = newMnth;\n\t\t\tprevDate = newDate;\n\t\t\tprevHour = newHour;\n\t\t\tprevMins = newMins;\n\t\t\tprevSecs = newSecs;\n\n\t\t\treturn stamp(date);\n\t\t});\n\t}\n}\n\n// for when axis.values is defined as a static fmtDate template string\nfunction timeAxisVal(tzDate, dateTpl) {\n\tlet stamp = fmtDate(dateTpl);\n\treturn (self, splits, axisIdx, foundSpace, foundIncr) => splits.map(split => stamp(tzDate(split)));\n}\n\nfunction mkDate(y, m, d) {\n\treturn new Date(y, m, d);\n}\n\nfunction timeSeriesStamp(stampCfg, fmtDate) {\n\treturn fmtDate(stampCfg);\n}\nconst _timeSeriesStamp = '{YYYY}-{MM}-{DD} {h}:{mm}{aa}';\n\nfunction timeSeriesVal(tzDate, stamp) {\n\treturn (self, val) => stamp(tzDate(val));\n}\n\nfunction legendStroke(self, seriesIdx) {\n\tlet s = self.series[seriesIdx];\n\treturn s.width ? s.stroke(self, seriesIdx) : s.points.width ? s.points.stroke(self, seriesIdx) : null;\n}\n\nfunction legendFill(self, seriesIdx) {\n\treturn self.series[seriesIdx].fill(self, seriesIdx);\n}\n\nconst legendOpts = {\n\tshow: true,\n\tlive: true,\n\tisolate: false,\n\tmarkers: {\n\t\tshow: true,\n\t\twidth: 2,\n\t\tstroke: legendStroke,\n\t\tfill: legendFill,\n\t\tdash: \"solid\",\n\t},\n\tidx: null,\n\tidxs: null,\n\tvalues: [],\n};\n\nfunction cursorPointShow(self, si) {\n\tlet o = self.cursor.points;\n\n\tlet pt = placeDiv();\n\n\tlet size = o.size(self, si);\n\tsetStylePx(pt, WIDTH, size);\n\tsetStylePx(pt, HEIGHT, size);\n\n\tlet mar = size / -2;\n\tsetStylePx(pt, \"marginLeft\", mar);\n\tsetStylePx(pt, \"marginTop\", mar);\n\n\tlet width = o.width(self, si, size);\n\twidth && setStylePx(pt, \"borderWidth\", width);\n\n\treturn pt;\n}\n\nfunction cursorPointFill(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp._fill || sp._stroke;\n}\n\nfunction cursorPointStroke(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp._stroke || sp._fill;\n}\n\nfunction cursorPointSize(self, si) {\n\tlet sp = self.series[si].points;\n\treturn ptDia(sp.width, 1);\n}\n\nfunction dataIdx(self, seriesIdx, cursorIdx) {\n\treturn cursorIdx;\n}\n\nconst moveTuple = [0,0];\n\nfunction cursorMove(self, mouseLeft1, mouseTop1) {\n\tmoveTuple[0] = mouseLeft1;\n\tmoveTuple[1] = mouseTop1;\n\treturn moveTuple;\n}\n\nfunction filtBtn0(self, targ, handle) {\n\treturn e => {\n\t\te.button == 0 && handle(e);\n\t};\n}\n\nfunction passThru(self, targ, handle) {\n\treturn handle;\n}\n\nconst cursorOpts = {\n\tshow: true,\n\tx: true,\n\ty: true,\n\tlock: false,\n\tmove: cursorMove,\n\tpoints: {\n\t\tshow: cursorPointShow,\n\t\tsize: cursorPointSize,\n\t\twidth: 0,\n\t\tstroke: cursorPointStroke,\n\t\tfill: cursorPointFill,\n\t},\n\n\tbind: {\n\t\tmousedown: filtBtn0,\n\t\tmouseup: filtBtn0,\n\t\tclick: filtBtn0,\n\t\tdblclick: filtBtn0,\n\n\t\tmousemove: passThru,\n\t\tmouseleave: passThru,\n\t\tmouseenter: passThru,\n\t},\n\n\tdrag: {\n\t\tsetScale: true,\n\t\tx: true,\n\t\ty: false,\n\t\tdist: 0,\n\t\tuni: null,\n\t\t_x: false,\n\t\t_y: false,\n\t},\n\n\tfocus: {\n\t\tprox: -1,\n\t},\n\n\tleft: -10,\n\ttop: -10,\n\tidx: null,\n\tdataIdx,\n\tidxs: null,\n};\n\nconst axisLines = {\n\tshow: true,\n\tstroke: \"rgba(0,0,0,0.07)\",\n\twidth: 2,\n//\tdash: [],\n};\n\nconst grid = assign({}, axisLines, {\n\tfilter: retArg1,\n});\n\nconst ticks = assign({}, grid, {\n\tsize: 10,\n});\n\nconst border = assign({}, axisLines, {\n\tshow: false,\n});\n\nconst font = '12px system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"';\nconst labelFont = \"bold \" + font;\nconst lineMult = 1.5;\t\t// font-size multiplier\n\nconst xAxisOpts = {\n\tshow: true,\n\tscale: \"x\",\n\tstroke: hexBlack,\n\tspace: 50,\n\tgap: 5,\n\tsize: 50,\n\tlabelGap: 0,\n\tlabelSize: 30,\n\tlabelFont,\n\tside: 2,\n//\tclass: \"x-vals\",\n//\tincrs: timeIncrs,\n//\tvalues: timeVals,\n//\tfilter: retArg1,\n\tgrid,\n\tticks,\n\tborder,\n\tfont,\n\trotate: 0,\n};\n\nconst numSeriesLabel = \"Value\";\nconst timeSeriesLabel = \"Time\";\n\nconst xSeriesOpts = {\n\tshow: true,\n\tscale: \"x\",\n\tauto: false,\n\tsorted: 1,\n//\tlabel: \"Time\",\n//\tvalue: v => stamp(new Date(v * 1e3)),\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n\tidxs: [],\n};\n\nfunction numAxisVals(self, splits, axisIdx, foundSpace, foundIncr) {\n\treturn splits.map(v => v == null ? \"\" : fmtNum(v));\n}\n\nfunction numAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tlet splits = [];\n\n\tlet numDec = fixedDec.get(foundIncr) || 0;\n\n\tscaleMin = forceMin ? scaleMin : roundDec(incrRoundUp(scaleMin, foundIncr), numDec);\n\n\tfor (let val = scaleMin; val <= scaleMax; val = roundDec(val + foundIncr, numDec))\n\t\tsplits.push(Object.is(val, -0) ? 0 : val);\t\t// coalesces -0\n\n\treturn splits;\n}\n\n// this doesnt work for sin, which needs to come off from 0 independently in pos and neg dirs\nfunction logAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tconst splits = [];\n\n\tconst logBase = self.scales[self.axes[axisIdx].scale].log;\n\n\tconst logFn = logBase == 10 ? log10 : log2;\n\n\tconst exp = floor(logFn(scaleMin));\n\n\tfoundIncr = pow(logBase, exp);\n\n\tif (exp < 0)\n\t\tfoundIncr = roundDec(foundIncr, -exp);\n\n\tlet split = scaleMin;\n\n\tdo {\n\t\tsplits.push(split);\n\t\tsplit = roundDec(split + foundIncr, fixedDec.get(foundIncr));\n\n\t\tif (split >= foundIncr * logBase)\n\t\t\tfoundIncr = split;\n\n\t} while (split <= scaleMax);\n\n\treturn splits;\n}\n\nfunction asinhAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tlet sc = self.scales[self.axes[axisIdx].scale];\n\n\tlet linthresh = sc.asinh;\n\n\tlet posSplits = scaleMax > linthresh ? logAxisSplits(self, axisIdx, max(linthresh, scaleMin), scaleMax, foundIncr) : [linthresh];\n\tlet zero = scaleMax >= 0 && scaleMin <= 0 ? [0] : [];\n\tlet negSplits = scaleMin < -linthresh ? logAxisSplits(self, axisIdx, max(linthresh, -scaleMax), -scaleMin, foundIncr): [linthresh];\n\n\treturn negSplits.reverse().map(v => -v).concat(zero, posSplits);\n}\n\nconst RE_ALL = /./;\nconst RE_12357 = /[12357]/;\nconst RE_125 = /[125]/;\nconst RE_1 = /1/;\n\nfunction logAxisValsFilt(self, splits, axisIdx, foundSpace, foundIncr) {\n\tlet axis = self.axes[axisIdx];\n\tlet scaleKey = axis.scale;\n\tlet sc = self.scales[scaleKey];\n\n\tif (sc.distr == 3 && sc.log == 2)\n\t\treturn splits;\n\n\tlet valToPos = self.valToPos;\n\n\tlet minSpace = axis._space;\n\n\tlet _10 = valToPos(10, scaleKey);\n\n\tlet re = (\n\t\tvalToPos(9, scaleKey) - _10 >= minSpace ? RE_ALL :\n\t\tvalToPos(7, scaleKey) - _10 >= minSpace ? RE_12357 :\n\t\tvalToPos(5, scaleKey) - _10 >= minSpace ? RE_125 :\n\t\tRE_1\n\t);\n\n\treturn splits.map(v => ((sc.distr == 4 && v == 0) || re.test(v)) ? v : null);\n}\n\nfunction numSeriesVal(self, val) {\n\treturn val == null ? \"\" : fmtNum(val);\n}\n\nconst yAxisOpts = {\n\tshow: true,\n\tscale: \"y\",\n\tstroke: hexBlack,\n\tspace: 30,\n\tgap: 5,\n\tsize: 50,\n\tlabelGap: 0,\n\tlabelSize: 30,\n\tlabelFont,\n\tside: 3,\n//\tclass: \"y-vals\",\n//\tincrs: numIncrs,\n//\tvalues: (vals, space) => vals,\n//\tfilter: retArg1,\n\tgrid,\n\tticks,\n\tborder,\n\tfont,\n\trotate: 0,\n};\n\n// takes stroke width\nfunction ptDia(width, mult) {\n\tlet dia = 3 + (width || 1) * 2;\n\treturn roundDec(dia * mult, 3);\n}\n\nfunction seriesPointsShow(self, si) {\n\tlet { scale, idxs } = self.series[0];\n\tlet xData = self._data[0];\n\tlet p0 = self.valToPos(xData[idxs[0]], scale, true);\n\tlet p1 = self.valToPos(xData[idxs[1]], scale, true);\n\tlet dim = abs(p1 - p0);\n\n\tlet s = self.series[si];\n//\tconst dia = ptDia(s.width, pxRatio);\n\tlet maxPts = dim / (s.points.space * pxRatio);\n\treturn idxs[1] - idxs[0] <= maxPts;\n}\n\nconst facet = {\n\tscale: null,\n\tauto: true,\n\tsorted: 0,\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n};\n\nconst xySeriesOpts = {\n\tshow: true,\n\tauto: true,\n\tsorted: 0,\n\talpha: 1,\n\tfacets: [\n\t\tassign({}, facet, {scale: 'x'}),\n\t\tassign({}, facet, {scale: 'y'}),\n\t],\n};\n\nconst ySeriesOpts = {\n\tscale: \"y\",\n\tauto: true,\n\tsorted: 0,\n\tshow: true,\n\tspanGaps: false,\n\tgaps: (self, seriesIdx, idx0, idx1, nullGaps) => nullGaps,\n\talpha: 1,\n\tpoints: {\n\t\tshow: seriesPointsShow,\n\t\tfilter: null,\n\t// paths:\n\t//\tstroke: \"#000\",\n\t//\tfill: \"#fff\",\n\t//\twidth: 1,\n\t//\tsize: 10,\n\t},\n//\tlabel: \"Value\",\n//\tvalue: v => v,\n\tvalues: null,\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n\tidxs: [],\n\n\tpath: null,\n\tclip: null,\n};\n\nfunction clampScale(self, val, scaleMin, scaleMax, scaleKey) {\n/*\n\tif (val < 0) {\n\t\tlet cssHgt = self.bbox.height / pxRatio;\n\t\tlet absPos = self.valToPos(abs(val), scaleKey);\n\t\tlet fromBtm = cssHgt - absPos;\n\t\treturn self.posToVal(cssHgt + fromBtm, scaleKey);\n\t}\n*/\n\treturn scaleMin / 10;\n}\n\nconst xScaleOpts = {\n\ttime: FEAT_TIME,\n\tauto: true,\n\tdistr: 1,\n\tlog: 10,\n\tasinh: 1,\n\tmin: null,\n\tmax: null,\n\tdir: 1,\n\tori: 0,\n};\n\nconst yScaleOpts = assign({}, xScaleOpts, {\n\ttime: false,\n\tori: 1,\n});\n\nconst syncs = {};\n\nfunction _sync(key, opts) {\n\tlet s = syncs[key];\n\n\tif (!s) {\n\t\ts = {\n\t\t\tkey,\n\t\t\tplots: [],\n\t\t\tsub(plot) {\n\t\t\t\ts.plots.push(plot);\n\t\t\t},\n\t\t\tunsub(plot) {\n\t\t\t\ts.plots = s.plots.filter(c => c != plot);\n\t\t\t},\n\t\t\tpub(type, self, x, y, w, h, i) {\n\t\t\t\tfor (let j = 0; j < s.plots.length; j++)\n\t\t\t\t\ts.plots[j] != self && s.plots[j].pub(type, self, x, y, w, h, i);\n\t\t\t},\n\t\t};\n\n\t\tif (key != null)\n\t\t\tsyncs[key] = s;\n\t}\n\n\treturn s;\n}\n\nconst BAND_CLIP_FILL = 1 << 0;\nconst BAND_CLIP_STROKE = 1 << 1;\n\nfunction orient(u, seriesIdx, cb) {\n\tconst series = u.series[seriesIdx];\n\tconst scales = u.scales;\n\tconst bbox = u.bbox;\n\tconst scaleX = u.mode == 2 ? scales[series.facets[0].scale] : scales[u.series[0].scale];\n\n\tlet dx = u._data[0],\n\t\tdy = u._data[seriesIdx],\n\t\tsx = scaleX,\n\t\tsy = u.mode == 2 ? scales[series.facets[1].scale] : scales[series.scale],\n\t\tl = bbox.left,\n\t\tt = bbox.top,\n\t\tw = bbox.width,\n\t\th = bbox.height,\n\t\tH = u.valToPosH,\n\t\tV = u.valToPosV;\n\n\treturn (sx.ori == 0\n\t\t? cb(\n\t\t\tseries,\n\t\t\tdx,\n\t\t\tdy,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tH,\n\t\t\tV,\n\t\t\tl,\n\t\t\tt,\n\t\t\tw,\n\t\t\th,\n\t\t\tmoveToH,\n\t\t\tlineToH,\n\t\t\trectH,\n\t\t\tarcH,\n\t\t\tbezierCurveToH,\n\t\t)\n\t\t: cb(\n\t\t\tseries,\n\t\t\tdx,\n\t\t\tdy,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tV,\n\t\t\tH,\n\t\t\tt,\n\t\t\tl,\n\t\t\th,\n\t\t\tw,\n\t\t\tmoveToV,\n\t\t\tlineToV,\n\t\t\trectV,\n\t\t\tarcV,\n\t\t\tbezierCurveToV,\n\t\t)\n\t);\n}\n\nfunction bandFillClipDirs(self, seriesIdx) {\n\tlet fillDir = 0;\n\n\t// 2 bits, -1 | 1\n\tlet clipDirs = 0;\n\n\tlet bands = ifNull(self.bands, EMPTY_ARR);\n\n\tfor (let i = 0; i < bands.length; i++) {\n\t\tlet b = bands[i];\n\n\t\t// is a \"from\" band edge\n\t\tif (b.series[0] == seriesIdx)\n\t\t\tfillDir = b.dir;\n\t\t// is a \"to\" band edge\n\t\telse if (b.series[1] == seriesIdx) {\n\t\t\tif (b.dir == 1)\n\t\t\t\tclipDirs |= 1;\n\t\t\telse\n\t\t\t\tclipDirs |= 2;\n\t\t}\n\t}\n\n\treturn [\n\t\tfillDir,\n\t\t(\n\t\t\tclipDirs == 1 ? -1 : // neg only\n\t\t\tclipDirs == 2 ? 1 : // pos only\n\t\t\tclipDirs == 3 ? 2 : // both\n\t\t\t 0 // neither\n\t\t)\n\t];\n}\n\nfunction seriesFillTo(self, seriesIdx, dataMin, dataMax, bandFillDir) {\n\tlet scale = self.scales[self.series[seriesIdx].scale];\n\n\treturn (\n\t\tbandFillDir == -1 ? scale.min :\n\t\tbandFillDir == 1 ? scale.max :\n\t\tscale.distr == 3 ? (\n\t\t\tscale.dir == 1 ? scale.min :\n\t\t\tscale.max\n\t\t) : 0\n\t);\n}\n\n// creates inverted band clip path (from stroke path -> yMax || yMin)\n// clipDir is always inverse of fillDir\n// default clip dir is upwards (1), since default band fill is downwards/fillBelowTo (-1) (highIdx -> lowIdx)\nfunction clipBandLine(self, seriesIdx, idx0, idx1, strokePath, clipDir) {\n\treturn orient(self, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\tlet pxRound = series.pxRound;\n\n\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\t\tconst lineTo = scaleX.ori == 0 ? lineToH : lineToV;\n\n\t\tlet frIdx, toIdx;\n\n\t\tif (dir == 1) {\n\t\t\tfrIdx = idx0;\n\t\t\ttoIdx = idx1;\n\t\t}\n\t\telse {\n\t\t\tfrIdx = idx1;\n\t\t\ttoIdx = idx0;\n\t\t}\n\n\t\t// path start\n\t\tlet x0 = pxRound(valToPosX(dataX[frIdx], scaleX, xDim, xOff));\n\t\tlet y0 = pxRound(valToPosY(dataY[frIdx], scaleY, yDim, yOff));\n\t\t// path end x\n\t\tlet x1 = pxRound(valToPosX(dataX[toIdx], scaleX, xDim, xOff));\n\t\t// upper or lower y limit\n\t\tlet yLimit = pxRound(valToPosY(clipDir == 1 ? scaleY.max : scaleY.min, scaleY, yDim, yOff));\n\n\t\tlet clip = new Path2D(strokePath);\n\n\t\tlineTo(clip, x1, yLimit);\n\t\tlineTo(clip, x0, yLimit);\n\t\tlineTo(clip, x0, y0);\n\n\t\treturn clip;\n\t});\n}\n\nfunction clipGaps(gaps, ori, plotLft, plotTop, plotWid, plotHgt) {\n\tlet clip = null;\n\n\t// create clip path (invert gaps and non-gaps)\n\tif (gaps.length > 0) {\n\t\tclip = new Path2D();\n\n\t\tconst rect = ori == 0 ? rectH : rectV;\n\n\t\tlet prevGapEnd = plotLft;\n\n\t\tfor (let i = 0; i < gaps.length; i++) {\n\t\t\tlet g = gaps[i];\n\n\t\t\tif (g[1] > g[0]) {\n\t\t\t\tlet w = g[0] - prevGapEnd;\n\n\t\t\t\tw > 0 && rect(clip, prevGapEnd, plotTop, w, plotTop + plotHgt);\n\n\t\t\t\tprevGapEnd = g[1];\n\t\t\t}\n\t\t}\n\n\t\tlet w = plotLft + plotWid - prevGapEnd;\n\n\t\tw > 0 && rect(clip, prevGapEnd, plotTop, w, plotTop + plotHgt);\n\t}\n\n\treturn clip;\n}\n\nfunction addGap(gaps, fromX, toX) {\n\tlet prevGap = gaps[gaps.length - 1];\n\n\tif (prevGap && prevGap[0] == fromX)\t\t\t// TODO: gaps must be encoded at stroke widths?\n\t\tprevGap[1] = toX;\n\telse\n\t\tgaps.push([fromX, toX]);\n}\n\nfunction findGaps(xs, ys, idx0, idx1, dir, pixelForX, align) {\n\tlet gaps = [];\n\n\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\tlet yVal = ys[i];\n\n\t\tif (yVal === null) {\n\t\t\tlet fr = i, to = i;\n\n\t\t\tif (dir == 1) {\n\t\t\t\twhile (++i <= idx1 && ys[i] === null)\n\t\t\t\t\tto = i;\n\t\t\t}\n\t\t\telse {\n\t\t\t\twhile (--i >= idx0 && ys[i] === null)\n\t\t\t\t\tto = i;\n\t\t\t}\n\n\t\t\tlet frPx = pixelForX(xs[fr]);\n\t\t\tlet toPx = to == fr ? frPx : pixelForX(xs[to]);\n\n\t\t\t// if value adjacent to edge null is same pixel, then it's partially\n\t\t\t// filled and gap should start at next pixel\n\t\t\tlet frPx2 = align <= 0 ? pixelForX(xs[fr-dir]) : frPx;\n\t\t//\tif (frPx2 == frPx)\n\t\t//\t\tfrPx++;\n\t\t//\telse\n\t\t\t\tfrPx = frPx2;\n\n\t\t\tlet toPx2 = align >= 0 ? pixelForX(xs[to+dir]) : toPx;\n\t\t//\tif (toPx2 == toPx)\n\t\t//\t\ttoPx--;\n\t\t//\telse\n\t\t\t\ttoPx = toPx2;\n\n\t\t\tif (toPx >= frPx)\n\t\t\t\tgaps.push([frPx, toPx]); // addGap\n\t\t}\n\t}\n\n\treturn gaps;\n}\n\nfunction pxRoundGen(pxAlign) {\n\treturn pxAlign == 0 ? retArg0 : pxAlign == 1 ? round : v => incrRound(v, pxAlign);\n}\n\nfunction rect(ori) {\n\tlet moveTo = ori == 0 ?\n\t\tmoveToH :\n\t\tmoveToV;\n\n\tlet arcTo = ori == 0 ?\n\t\t(p, x1, y1, x2, y2, r) => { p.arcTo(x1, y1, x2, y2, r); } :\n\t\t(p, y1, x1, y2, x2, r) => { p.arcTo(x1, y1, x2, y2, r); };\n\n\tlet rect = ori == 0 ?\n\t\t(p, x, y, w, h) => { p.rect(x, y, w, h); } :\n\t\t(p, y, x, h, w) => { p.rect(x, y, w, h); };\n\n\treturn (p, x, y, w, h, r = 0) => {\n\t\tif (r == 0)\n\t\t\trect(p, x, y, w, h);\n\t\telse {\n\t\t\tr = min(r, w / 2, h / 2);\n\n\t\t\t// adapted from https://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-using-html-canvas/7838871#7838871\n\t\t\tmoveTo(p, x + r, y);\n\t\t\tarcTo(p, x + w, y, x + w, y + h, r);\n\t\t\tarcTo(p, x + w, y + h, x, y + h, r);\n\t\t\tarcTo(p, x, y + h, x, y, r);\n\t\t\tarcTo(p, x, y, x + w, y, r);\n\t\t\tp.closePath();\n\t\t}\n\t};\n}\n\n// orientation-inverting canvas functions\nconst moveToH = (p, x, y) => { p.moveTo(x, y); };\nconst moveToV = (p, y, x) => { p.moveTo(x, y); };\nconst lineToH = (p, x, y) => { p.lineTo(x, y); };\nconst lineToV = (p, y, x) => { p.lineTo(x, y); };\nconst rectH = rect(0);\nconst rectV = rect(1);\nconst arcH = (p, x, y, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); };\nconst arcV = (p, y, x, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); };\nconst bezierCurveToH = (p, bp1x, bp1y, bp2x, bp2y, p2x, p2y) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); };\nconst bezierCurveToV = (p, bp1y, bp1x, bp2y, bp2x, p2y, p2x) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); };\n\n// TODO: drawWrap(seriesIdx, drawPoints) (save, restore, translate, clip)\nfunction points(opts) {\n\treturn (u, seriesIdx, idx0, idx1, filtIdxs) => {\n\t//\tlog(\"drawPoints()\", arguments);\n\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet { pxRound, points } = series;\n\n\t\t\tlet moveTo, arc;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tmoveTo = moveToH;\n\t\t\t\tarc = arcH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmoveTo = moveToV;\n\t\t\t\tarc = arcV;\n\t\t\t}\n\n\t\t\tconst width = roundDec(points.width * pxRatio, 3);\n\n\t\t\tlet rad = (points.size - points.width) / 2 * pxRatio;\n\t\t\tlet dia = roundDec(rad * 2, 3);\n\n\t\t\tlet fill = new Path2D();\n\t\t\tlet clip = new Path2D();\n\n\t\t\tlet { left: lft, top: top, width: wid, height: hgt } = u.bbox;\n\n\t\t\trectH(clip,\n\t\t\t\tlft - dia,\n\t\t\t\ttop - dia,\n\t\t\t\twid + dia * 2,\n\t\t\t\thgt + dia * 2,\n\t\t\t);\n\n\t\t\tconst drawPoint = pi => {\n\t\t\t\tif (dataY[pi] != null) {\n\t\t\t\t\tlet x = pxRound(valToPosX(dataX[pi], scaleX, xDim, xOff));\n\t\t\t\t\tlet y = pxRound(valToPosY(dataY[pi], scaleY, yDim, yOff));\n\n\t\t\t\t\tmoveTo(fill, x + rad, y);\n\t\t\t\t\tarc(fill, x, y, rad, 0, PI * 2);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (filtIdxs)\n\t\t\t\tfiltIdxs.forEach(drawPoint);\n\t\t\telse {\n\t\t\t\tfor (let pi = idx0; pi <= idx1; pi++)\n\t\t\t\t\tdrawPoint(pi);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstroke: width > 0 ? fill : null,\n\t\t\t\tfill,\n\t\t\t\tclip,\n\t\t\t\tflags: BAND_CLIP_FILL | BAND_CLIP_STROKE,\n\t\t\t};\n\t\t});\n\t};\n}\n\nfunction _drawAcc(lineTo) {\n\treturn (stroke, accX, minY, maxY, inY, outY) => {\n\t\tif (minY != maxY) {\n\t\t\tif (inY != minY && outY != minY)\n\t\t\t\tlineTo(stroke, accX, minY);\n\t\t\tif (inY != maxY && outY != maxY)\n\t\t\t\tlineTo(stroke, accX, maxY);\n\n\t\t\tlineTo(stroke, accX, outY);\n\t\t}\n\t};\n}\n\nconst drawAccH = _drawAcc(lineToH);\nconst drawAccV = _drawAcc(lineToV);\n\nfunction linear(opts) {\n\tconst alignGaps = ifNull(opts?.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet lineTo, drawAcc;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tlineTo = lineToH;\n\t\t\t\tdrawAcc = drawAccH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlineTo = lineToV;\n\t\t\t\tdrawAcc = drawAccV;\n\t\t\t}\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tconst _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tlet minY = inf,\n\t\t\t\tmaxY = -inf,\n\t\t\t\tinY, outY, drawnAtX;\n\n\t\t\tlet accX = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\n\t\t\t// data edges\n\t\t\tlet lftIdx = nonNullIdx(dataY, idx0, idx1, 1 * dir);\n\t\t\tlet rgtIdx = nonNullIdx(dataY, idx0, idx1, -1 * dir);\n\t\t\tlet lftX = pixelForX(dataX[lftIdx]);\n\t\t\tlet rgtX = pixelForX(dataX[rgtIdx]);\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet x = pixelForX(dataX[i]);\n\n\t\t\t\tif (x == accX) {\n\t\t\t\t\tif (dataY[i] != null) {\n\t\t\t\t\t\toutY = pixelForY(dataY[i]);\n\n\t\t\t\t\t\tif (minY == inf) {\n\t\t\t\t\t\t\tlineTo(stroke, x, outY);\n\t\t\t\t\t\t\tinY = outY;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tminY = min(outY, minY);\n\t\t\t\t\t\tmaxY = max(outY, maxY);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (minY != inf) {\n\t\t\t\t\t\tdrawAcc(stroke, accX, minY, maxY, inY, outY);\n\t\t\t\t\t\tdrawnAtX = accX;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (dataY[i] != null) {\n\t\t\t\t\t\toutY = pixelForY(dataY[i]);\n\t\t\t\t\t\tlineTo(stroke, x, outY);\n\t\t\t\t\t\tminY = maxY = inY = outY;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tminY = inf;\n\t\t\t\t\t\tmaxY = -inf;\n\t\t\t\t\t}\n\n\t\t\t\t\taccX = x;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (minY != inf && minY != maxY && drawnAtX != accX)\n\t\t\t\tdrawAcc(stroke, accX, minY, maxY, inY, outY);\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillToVal = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillToVal);\n\n\t\t\t\tlineTo(fill, rgtX, fillToY);\n\t\t\t\tlineTo(fill, lftX, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, 1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction stepped(opts) {\n\tconst align = ifNull(opts.align, 1);\n\t// whether to draw ascenders/descenders at null/gap bondaries\n\tconst ascDesc = ifNull(opts.ascDesc, false);\n\n\tconst alignGaps = ifNull(opts.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet lineTo = scaleX.ori == 0 ? lineToH : lineToV;\n\n\t\t\tconst _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tidx0 = nonNullIdx(dataY, idx0, idx1, 1);\n\t\t\tidx1 = nonNullIdx(dataY, idx0, idx1, -1);\n\n\t\t\tlet prevYPos = pixelForY(dataY[dir == 1 ? idx0 : idx1]);\n\t\t\tlet firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\t\t\tlet prevXPos = firstXPos;\n\n\t\t\tlineTo(stroke, firstXPos, prevYPos);\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet yVal1 = dataY[i];\n\n\t\t\t\tif (yVal1 == null)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlet x1 = pixelForX(dataX[i]);\n\t\t\t\tlet y1 = pixelForY(yVal1);\n\n\t\t\t\tif (align == 1)\n\t\t\t\t\tlineTo(stroke, x1, prevYPos);\n\t\t\t\telse\n\t\t\t\t\tlineTo(stroke, prevXPos, y1);\n\n\t\t\t\tlineTo(stroke, x1, y1);\n\n\t\t\t\tprevYPos = y1;\n\t\t\t\tprevXPos = x1;\n\t\t\t}\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillTo);\n\n\t\t\t\tlineTo(fill, prevXPos, fillToY);\n\t\t\t\tlineTo(fill, firstXPos, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t// expand/contract clips for ascenders/descenders\n\t\t\t\tlet halfStroke = (series.width * pxRatio) / 2;\n\t\t\t\tlet startsOffset = (ascDesc || align == 1) ? halfStroke : -halfStroke;\n\t\t\t\tlet endsOffset = (ascDesc || align == -1) ? -halfStroke : halfStroke;\n\n\t\t\t\tgaps.forEach(g => {\n\t\t\t\t\tg[0] += startsOffset;\n\t\t\t\t\tg[1] += endsOffset;\n\t\t\t\t});\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, 1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction bars(opts) {\n\topts = opts || EMPTY_OBJ;\n\tconst size = ifNull(opts.size, [0.6, inf, 1]);\n\tconst align = opts.align || 0;\n\tconst extraGap = (opts.gap || 0) * pxRatio;\n\n\tconst radius = ifNull(opts.radius, 0);\n\n\tconst gapFactor = 1 - size[0];\n\tconst maxWidth = ifNull(size[1], inf) * pxRatio;\n\tconst minWidth = ifNull(size[2], 1) * pxRatio;\n\n\tconst disp = ifNull(opts.disp, EMPTY_OBJ);\n\tconst _each = ifNull(opts.each, _ => {});\n\n\tconst { fill: dispFills, stroke: dispStrokes } = disp;\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tconst _dirX = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\t\t\tconst _dirY = scaleY.dir * (scaleY.ori == 1 ? 1 : -1);\n\n\t\t\tlet rect = scaleX.ori == 0 ? rectH : rectV;\n\n\t\t\tlet each = scaleX.ori == 0 ? _each : (u, seriesIdx, i, top, lft, hgt, wid) => {\n\t\t\t\t_each(u, seriesIdx, i, lft, top, wid, hgt);\n\t\t\t};\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t//\tlet fillToY = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\tlet fillToY = scaleY.distr == 3 ? (bandFillDir == 1 ? scaleY.max : scaleY.min) : 0;\n\n\t\t\tlet y0Pos = valToPosY(fillToY, scaleY, yDim, yOff);\n\n\t\t\t// barWid is to center of stroke\n\t\t\tlet xShift, barWid;\n\n\t\t\tlet strokeWidth = pxRound(series.width * pxRatio);\n\n\t\t\tlet multiPath = false;\n\n\t\t\tlet fillColors = null;\n\t\t\tlet fillPaths = null;\n\t\t\tlet strokeColors = null;\n\t\t\tlet strokePaths = null;\n\n\t\t\tif (dispFills != null && (strokeWidth == 0 || dispStrokes != null)) {\n\t\t\t\tmultiPath = true;\n\n\t\t\t\tfillColors = dispFills.values(u, seriesIdx, idx0, idx1);\n\t\t\t\tfillPaths = new Map();\n\t\t\t\t(new Set(fillColors)).forEach(color => {\n\t\t\t\t\tif (color != null)\n\t\t\t\t\t\tfillPaths.set(color, new Path2D());\n\t\t\t\t});\n\n\t\t\t\tif (strokeWidth > 0) {\n\t\t\t\t\tstrokeColors = dispStrokes.values(u, seriesIdx, idx0, idx1);\n\t\t\t\t\tstrokePaths = new Map();\n\t\t\t\t\t(new Set(strokeColors)).forEach(color => {\n\t\t\t\t\t\tif (color != null)\n\t\t\t\t\t\t\tstrokePaths.set(color, new Path2D());\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { x0, size } = disp;\n\n\t\t\tif (x0 != null && size != null) {\n\t\t\t\tdataX = x0.values(u, seriesIdx, idx0, idx1);\n\n\t\t\t\tif (x0.unit == 2)\n\t\t\t\t\tdataX = dataX.map(pct => u.posToVal(xOff + pct * xDim, scaleX.key, true));\n\n\t\t\t\t// assumes uniform sizes, for now\n\t\t\t\tlet sizes = size.values(u, seriesIdx, idx0, idx1);\n\n\t\t\t\tif (size.unit == 2)\n\t\t\t\t\tbarWid = sizes[0] * xDim;\n\t\t\t\telse\n\t\t\t\t\tbarWid = valToPosX(sizes[0], scaleX, xDim, xOff) - valToPosX(0, scaleX, xDim, xOff); // assumes linear scale (delta from 0)\n\n\t\t\t\tbarWid = pxRound(barWid - strokeWidth);\n\n\t\t\t\txShift = (_dirX == 1 ? -strokeWidth / 2 : barWid + strokeWidth / 2);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet colWid = xDim;\n\n\t\t\t\tif (dataX.length > 1) {\n\t\t\t\t\t// prior index with non-undefined y data\n\t\t\t\t\tlet prevIdx = null;\n\n\t\t\t\t\t// scan full dataset for smallest adjacent delta\n\t\t\t\t\t// will not work properly for non-linear x scales, since does not do expensive valToPosX calcs till end\n\t\t\t\t\tfor (let i = 0, minDelta = Infinity; i < dataX.length; i++) {\n\t\t\t\t\t\tif (dataY[i] !== undefined) {\n\t\t\t\t\t\t\tif (prevIdx != null) {\n\t\t\t\t\t\t\t\tlet delta = abs(dataX[i] - dataX[prevIdx]);\n\n\t\t\t\t\t\t\t\tif (delta < minDelta) {\n\t\t\t\t\t\t\t\t\tminDelta = delta;\n\t\t\t\t\t\t\t\t\tcolWid = abs(valToPosX(dataX[i], scaleX, xDim, xOff) - valToPosX(dataX[prevIdx], scaleX, xDim, xOff));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tprevIdx = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet gapWid = colWid * gapFactor;\n\n\t\t\t\tbarWid = pxRound(min(maxWidth, max(minWidth, colWid - gapWid)) - strokeWidth - extraGap);\n\n\t\t\t\txShift = (align == 0 ? barWid / 2 : align == _dirX ? 0 : barWid) - align * _dirX * extraGap / 2;\n\t\t\t}\n\n\t\t\tconst _paths = {stroke: null, fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL | BAND_CLIP_STROKE}; // disp, geom\n\n\t\t\tlet yLimit;\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = new Path2D();\n\t\t\t\tyLimit = pxRound(valToPosY(bandClipDir == 1 ? scaleY.max : scaleY.min, scaleY, yDim, yOff));\n\t\t\t}\n\n\t\t\tconst stroke = multiPath ? null : new Path2D();\n\t\t\tconst band = _paths.band;\n\n\t\t\tlet { y0, y1 } = disp;\n\n\t\t\tlet dataY0 = null;\n\n\t\t\tif (y0 != null && y1 != null) {\n\t\t\t\tdataY = y1.values(u, seriesIdx, idx0, idx1);\n\t\t\t\tdataY0 = y0.values(u, seriesIdx, idx0, idx1);\n\t\t\t}\n\n\t\t\tfor (let i = _dirX == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += _dirX) {\n\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\t// we can skip both, drawing and band clipping for alignment artifacts\n\t\t\t\tif (yVal === undefined)\n\t\t\t\t\tcontinue;\n\n\t\t\t/*\n\t\t\t\t// interpolate upwards band clips\n\t\t\t\tif (yVal == null) {\n\t\t\t\t//\tif (hasBands)\n\t\t\t\t//\t\tyVal = costlyLerp(i, idx0, idx1, _dirX, dataY);\n\t\t\t\t//\telse\n\t\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t*/\n\n\t\t\t\tlet xVal = scaleX.distr != 2 || disp != null ? dataX[i] : i;\n\n\t\t\t\t// TODO: all xPos can be pre-computed once for all series in aligned set\n\t\t\t\tlet xPos = valToPosX(xVal, scaleX, xDim, xOff);\n\t\t\t\tlet yPos = valToPosY(ifNull(yVal, fillToY), scaleY, yDim, yOff);\n\n\t\t\t\tif (dataY0 != null && yVal != null)\n\t\t\t\t\ty0Pos = valToPosY(dataY0[i], scaleY, yDim, yOff);\n\n\t\t\t\tlet lft = pxRound(xPos - xShift);\n\t\t\t\tlet btm = pxRound(max(yPos, y0Pos));\n\t\t\t\tlet top = pxRound(min(yPos, y0Pos));\n\t\t\t\t// this includes the stroke\n\t\t\t\tlet barHgt = btm - top;\n\n\t\t\t\tlet r = radius * barWid;\n\n\t\t\t\tif (yVal != null) { // && yVal != fillToY (0 height bar)\n\t\t\t\t\tif (multiPath) {\n\t\t\t\t\t\tif (strokeWidth > 0 && strokeColors[i] != null)\n\t\t\t\t\t\t\trect(strokePaths.get(strokeColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), r);\n\n\t\t\t\t\t\tif (fillColors[i] != null)\n\t\t\t\t\t\t\trect(fillPaths.get(fillColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), r);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\trect(stroke, lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), r);\n\n\t\t\t\t\teach(u, seriesIdx, i,\n\t\t\t\t\t\tlft - strokeWidth / 2,\n\t\t\t\t\t\ttop,\n\t\t\t\t\t\tbarWid + strokeWidth,\n\t\t\t\t\t\tbarHgt,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (bandClipDir != 0) {\n\t\t\t\t\tif (_dirY * bandClipDir == 1) {\n\t\t\t\t\t\tbtm = top;\n\t\t\t\t\t\ttop = yLimit;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\ttop = btm;\n\t\t\t\t\t\tbtm = yLimit;\n\t\t\t\t\t}\n\n\t\t\t\t\tbarHgt = btm - top;\n\n\t\t\t\t\trect(band, lft - strokeWidth / 2, top, barWid + strokeWidth, max(0, barHgt), 0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (strokeWidth > 0)\n\t\t\t\t_paths.stroke = multiPath ? strokePaths : stroke;\n\n\t\t\t_paths.fill = multiPath ? fillPaths : stroke;\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction splineInterp(interp, opts) {\n\tconst alignGaps = ifNull(opts?.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet moveTo, bezierCurveTo, lineTo;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tmoveTo = moveToH;\n\t\t\t\tlineTo = lineToH;\n\t\t\t\tbezierCurveTo = bezierCurveToH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmoveTo = moveToV;\n\t\t\t\tlineTo = lineToV;\n\t\t\t\tbezierCurveTo = bezierCurveToV;\n\t\t\t}\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tidx0 = nonNullIdx(dataY, idx0, idx1, 1);\n\t\t\tidx1 = nonNullIdx(dataY, idx0, idx1, -1);\n\n\t\t\tlet firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\t\t\tlet prevXPos = firstXPos;\n\n\t\t\tlet xCoords = [];\n\t\t\tlet yCoords = [];\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\tif (yVal != null) {\n\t\t\t\t\tlet xVal = dataX[i];\n\t\t\t\t\tlet xPos = pixelForX(xVal);\n\n\t\t\t\t\txCoords.push(prevXPos = xPos);\n\t\t\t\t\tyCoords.push(pixelForY(dataY[i]));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst _paths = {stroke: interp(xCoords, yCoords, moveTo, lineTo, bezierCurveTo, pxRound), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillTo);\n\n\t\t\t\tlineTo(fill, prevXPos, fillToY);\n\t\t\t\tlineTo(fill, firstXPos, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, 1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\n\t\t\t// if FEAT_PATHS: false in rollup.config.js\n\t\t\t//\tu.ctx.save();\n\t\t\t//\tu.ctx.beginPath();\n\t\t\t//\tu.ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);\n\t\t\t//\tu.ctx.clip();\n\t\t\t//\tu.ctx.strokeStyle = u.series[sidx].stroke;\n\t\t\t//\tu.ctx.stroke(stroke);\n\t\t\t//\tu.ctx.fillStyle = u.series[sidx].fill;\n\t\t\t//\tu.ctx.fill(fill);\n\t\t\t//\tu.ctx.restore();\n\t\t\t//\treturn null;\n\t\t});\n\t};\n}\n\nfunction monotoneCubic(opts) {\n\treturn splineInterp(_monotoneCubic, opts);\n}\n\n// Monotone Cubic Spline interpolation, adapted from the Chartist.js implementation:\n// https://github.com/gionkunz/chartist-js/blob/e7e78201bffe9609915e5e53cfafa29a5d6c49f9/src/scripts/interpolation.js#L240-L369\nfunction _monotoneCubic(xs, ys, moveTo, lineTo, bezierCurveTo, pxRound) {\n\tconst n = xs.length;\n\n\tif (n < 2)\n\t\treturn null;\n\n\tconst path = new Path2D();\n\n\tmoveTo(path, xs[0], ys[0]);\n\n\tif (n == 2)\n\t\tlineTo(path, xs[1], ys[1]);\n\telse {\n\t\tlet ms = Array(n),\n\t\t\tds = Array(n - 1),\n\t\t\tdys = Array(n - 1),\n\t\t\tdxs = Array(n - 1);\n\n\t\t// calc deltas and derivative\n\t\tfor (let i = 0; i < n - 1; i++) {\n\t\t\tdys[i] = ys[i + 1] - ys[i];\n\t\t\tdxs[i] = xs[i + 1] - xs[i];\n\t\t\tds[i] = dys[i] / dxs[i];\n\t\t}\n\n\t\t// determine desired slope (m) at each point using Fritsch-Carlson method\n\t\t// http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation\n\t\tms[0] = ds[0];\n\n\t\tfor (let i = 1; i < n - 1; i++) {\n\t\t\tif (ds[i] === 0 || ds[i - 1] === 0 || (ds[i - 1] > 0) !== (ds[i] > 0))\n\t\t\t\tms[i] = 0;\n\t\t\telse {\n\t\t\t\tms[i] = 3 * (dxs[i - 1] + dxs[i]) / (\n\t\t\t\t\t(2 * dxs[i] + dxs[i - 1]) / ds[i - 1] +\n\t\t\t\t\t(dxs[i] + 2 * dxs[i - 1]) / ds[i]\n\t\t\t\t);\n\n\t\t\t\tif (!isFinite(ms[i]))\n\t\t\t\t\tms[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\tms[n - 1] = ds[n - 2];\n\n\t\tfor (let i = 0; i < n - 1; i++) {\n\t\t\tbezierCurveTo(\n\t\t\t\tpath,\n\t\t\t\txs[i] + dxs[i] / 3,\n\t\t\t\tys[i] + ms[i] * dxs[i] / 3,\n\t\t\t\txs[i + 1] - dxs[i] / 3,\n\t\t\t\tys[i + 1] - ms[i + 1] * dxs[i] / 3,\n\t\t\t\txs[i + 1],\n\t\t\t\tys[i + 1],\n\t\t\t);\n\t\t}\n\t}\n\n\treturn path;\n}\n\nconst cursorPlots = new Set();\n\nfunction invalidateRects() {\n\tcursorPlots.forEach(u => {\n\t\tu.syncRect(true);\n\t});\n}\n\nif (domEnv) {\n\ton(resize, win, invalidateRects);\n\ton(scroll, win, invalidateRects, true);\n\ton(dppxchange, win, () => { uPlot.pxRatio = pxRatio; });\n}\n\nconst linearPath = linear() ;\nconst pointsPath = points() ;\n\nfunction setDefaults(d, xo, yo, initY) {\n\tlet d2 = initY ? [d[0], d[1]].concat(d.slice(2)) : [d[0]].concat(d.slice(1));\n\treturn d2.map((o, i) => setDefault(o, i, xo, yo));\n}\n\nfunction setDefaults2(d, xyo) {\n\treturn d.map((o, i) => i == 0 ? null : assign({}, xyo, o)); // todo: assign() will not merge facet arrays\n}\n\nfunction setDefault(o, i, xo, yo) {\n\treturn assign({}, (i == 0 ? xo : yo), o);\n}\n\nfunction snapNumX(self, dataMin, dataMax) {\n\treturn dataMin == null ? nullNullTuple : [dataMin, dataMax];\n}\n\nconst snapTimeX = snapNumX;\n\n// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below\n// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value\nfunction snapNumY(self, dataMin, dataMax) {\n\treturn dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, rangePad, true);\n}\n\nfunction snapLogY(self, dataMin, dataMax, scale) {\n\treturn dataMin == null ? nullNullTuple : rangeLog(dataMin, dataMax, self.scales[scale].log, false);\n}\n\nconst snapLogX = snapLogY;\n\nfunction snapAsinhY(self, dataMin, dataMax, scale) {\n\treturn dataMin == null ? nullNullTuple : rangeAsinh(dataMin, dataMax, self.scales[scale].log, false);\n}\n\nconst snapAsinhX = snapAsinhY;\n\n// dim is logical (getClientBoundingRect) pixels, not canvas pixels\nfunction findIncr(minVal, maxVal, incrs, dim, minSpace) {\n\tlet intDigits = max(numIntDigits(minVal), numIntDigits(maxVal));\n\n\tlet delta = maxVal - minVal;\n\n\tlet incrIdx = closestIdx((minSpace / dim) * delta, incrs);\n\n\tdo {\n\t\tlet foundIncr = incrs[incrIdx];\n\t\tlet foundSpace = dim * foundIncr / delta;\n\n\t\tif (foundSpace >= minSpace && intDigits + (foundIncr < 5 ? fixedDec.get(foundIncr) : 0) <= 17)\n\t\t\treturn [foundIncr, foundSpace];\n\t} while (++incrIdx < incrs.length);\n\n\treturn [0, 0];\n}\n\nfunction pxRatioFont(font) {\n\tlet fontSize, fontSizeCss;\n\tfont = font.replace(/(\\d+)px/, (m, p1) => (fontSize = round((fontSizeCss = +p1) * pxRatio)) + 'px');\n\treturn [font, fontSize, fontSizeCss];\n}\n\nfunction syncFontSize(axis) {\n\tif (axis.show) {\n\t\t[axis.font, axis.labelFont].forEach(f => {\n\t\t\tlet size = roundDec(f[2] * pxRatio, 1);\n\t\t\tf[0] = f[0].replace(/[0-9.]+px/, size + 'px');\n\t\t\tf[1] = size;\n\t\t});\n\t}\n}\n\nfunction uPlot(opts, data, then) {\n\tconst self = {\n\t\tmode: ifNull(opts.mode, 1),\n\t};\n\n\tconst mode = self.mode;\n\n\t// TODO: cache denoms & mins scale.cache = {r, min, }\n\tfunction getValPct(val, scale) {\n\t\tlet _val = (\n\t\t\tscale.distr == 3 ? log10(val > 0 ? val : scale.clamp(self, val, scale.min, scale.max, scale.key)) :\n\t\t\tscale.distr == 4 ? asinh(val, scale.asinh) :\n\t\t\tval\n\t\t);\n\n\t\treturn (_val - scale._min) / (scale._max - scale._min);\n\t}\n\n\tfunction getHPos(val, scale, dim, off) {\n\t\tlet pct = getValPct(val, scale);\n\t\treturn off + dim * (scale.dir == -1 ? (1 - pct) : pct);\n\t}\n\n\tfunction getVPos(val, scale, dim, off) {\n\t\tlet pct = getValPct(val, scale);\n\t\treturn off + dim * (scale.dir == -1 ? pct : (1 - pct));\n\t}\n\n\tfunction getPos(val, scale, dim, off) {\n\t\treturn scale.ori == 0 ? getHPos(val, scale, dim, off) : getVPos(val, scale, dim, off);\n\t}\n\n\tself.valToPosH = getHPos;\n\tself.valToPosV = getVPos;\n\n\tlet ready = false;\n\tself.status = 0;\n\n\tconst root = self.root = placeDiv(UPLOT);\n\n\tif (opts.id != null)\n\t\troot.id = opts.id;\n\n\taddClass(root, opts.class);\n\n\tif (opts.title) {\n\t\tlet title = placeDiv(TITLE, root);\n\t\ttitle.textContent = opts.title;\n\t}\n\n\tconst can = placeTag(\"canvas\");\n\tconst ctx = self.ctx = can.getContext(\"2d\");\n\n\tconst wrap = placeDiv(WRAP, root);\n\tconst under = self.under = placeDiv(UNDER, wrap);\n\twrap.appendChild(can);\n\tconst over = self.over = placeDiv(OVER, wrap);\n\n\topts = copy(opts);\n\n\tconst pxAlign = +ifNull(opts.pxAlign, 1);\n\n\tconst pxRound = pxRoundGen(pxAlign);\n\n\t(opts.plugins || []).forEach(p => {\n\t\tif (p.opts)\n\t\t\topts = p.opts(self, opts) || opts;\n\t});\n\n\tconst ms = opts.ms || 1e-3;\n\n\tconst series = self.series = mode == 1 ?\n\t\tsetDefaults(opts.series || [], xSeriesOpts, ySeriesOpts, false) :\n\t\tsetDefaults2(opts.series || [null], xySeriesOpts);\n\tconst axes = self.axes = setDefaults(opts.axes || [], xAxisOpts, yAxisOpts, true);\n\tconst scales = self.scales = {};\n\tconst bands = self.bands = opts.bands || [];\n\n\tbands.forEach(b => {\n\t\tb.fill = fnOrSelf(b.fill || null);\n\t\tb.dir = ifNull(b.dir, -1);\n\t});\n\n\tconst xScaleKey = mode == 2 ? series[1].facets[0].scale : series[0].scale;\n\n\tconst drawOrderMap = {\n\t\taxes: drawAxesGrid,\n\t\tseries: drawSeries,\n\t};\n\n\tconst drawOrder = (opts.drawOrder || [\"axes\", \"series\"]).map(key => drawOrderMap[key]);\n\n\tfunction initScale(scaleKey) {\n\t\tlet sc = scales[scaleKey];\n\n\t\tif (sc == null) {\n\t\t\tlet scaleOpts = (opts.scales || EMPTY_OBJ)[scaleKey] || EMPTY_OBJ;\n\n\t\t\tif (scaleOpts.from != null) {\n\t\t\t\t// ensure parent is initialized\n\t\t\t\tinitScale(scaleOpts.from);\n\t\t\t\t// dependent scales inherit\n\t\t\t\tscales[scaleKey] = assign({}, scales[scaleOpts.from], scaleOpts, {key: scaleKey});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsc = scales[scaleKey] = assign({}, (scaleKey == xScaleKey ? xScaleOpts : yScaleOpts), scaleOpts);\n\n\t\t\t\tsc.key = scaleKey;\n\n\t\t\t\tlet isTime = sc.time;\n\n\t\t\t\tlet rn = sc.range;\n\n\t\t\t\tlet rangeIsArr = isArr(rn);\n\n\t\t\t\tif (scaleKey != xScaleKey || (mode == 2 && !isTime)) {\n\t\t\t\t\t// if range array has null limits, it should be auto\n\t\t\t\t\tif (rangeIsArr && (rn[0] == null || rn[1] == null)) {\n\t\t\t\t\t\trn = {\n\t\t\t\t\t\t\tmin: rn[0] == null ? autoRangePart : {\n\t\t\t\t\t\t\t\tmode: 1,\n\t\t\t\t\t\t\t\thard: rn[0],\n\t\t\t\t\t\t\t\tsoft: rn[0],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmax: rn[1] == null ? autoRangePart : {\n\t\t\t\t\t\t\t\tmode: 1,\n\t\t\t\t\t\t\t\thard: rn[1],\n\t\t\t\t\t\t\t\tsoft: rn[1],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t\trangeIsArr = false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!rangeIsArr && isObj(rn)) {\n\t\t\t\t\t\tlet cfg = rn;\n\t\t\t\t\t\t// this is similar to snapNumY\n\t\t\t\t\t\trn = (self, dataMin, dataMax) => dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, cfg);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsc.range = fnOrSelf(rn || (isTime ? snapTimeX : scaleKey == xScaleKey ?\n\t\t\t\t\t(sc.distr == 3 ? snapLogX : sc.distr == 4 ? snapAsinhX : snapNumX) :\n\t\t\t\t\t(sc.distr == 3 ? snapLogY : sc.distr == 4 ? snapAsinhY : snapNumY)\n\t\t\t\t));\n\n\t\t\t\tsc.auto = fnOrSelf(rangeIsArr ? false : sc.auto);\n\n\t\t\t\tsc.clamp = fnOrSelf(sc.clamp || clampScale);\n\n\t\t\t\t// caches for expensive ops like asinh() & log()\n\t\t\t\tsc._min = sc._max = null;\n\t\t\t}\n\t\t}\n\t}\n\n\tinitScale(\"x\");\n\tinitScale(\"y\");\n\n\t// TODO: init scales from facets in mode: 2\n\tif (mode == 1) {\n\t\tseries.forEach(s => {\n\t\t\tinitScale(s.scale);\n\t\t});\n\t}\n\n\taxes.forEach(a => {\n\t\tinitScale(a.scale);\n\t});\n\n\tfor (let k in opts.scales)\n\t\tinitScale(k);\n\n\tconst scaleX = scales[xScaleKey];\n\n\tconst xScaleDistr = scaleX.distr;\n\n\tlet valToPosX, valToPosY;\n\n\tif (scaleX.ori == 0) {\n\t\taddClass(root, ORI_HZ);\n\t\tvalToPosX = getHPos;\n\t\tvalToPosY = getVPos;\n\t\t/*\n\t\tupdOriDims = () => {\n\t\t\txDimCan = plotWid;\n\t\t\txOffCan = plotLft;\n\t\t\tyDimCan = plotHgt;\n\t\t\tyOffCan = plotTop;\n\n\t\t\txDimCss = plotWidCss;\n\t\t\txOffCss = plotLftCss;\n\t\t\tyDimCss = plotHgtCss;\n\t\t\tyOffCss = plotTopCss;\n\t\t};\n\t\t*/\n\t}\n\telse {\n\t\taddClass(root, ORI_VT);\n\t\tvalToPosX = getVPos;\n\t\tvalToPosY = getHPos;\n\t\t/*\n\t\tupdOriDims = () => {\n\t\t\txDimCan = plotHgt;\n\t\t\txOffCan = plotTop;\n\t\t\tyDimCan = plotWid;\n\t\t\tyOffCan = plotLft;\n\n\t\t\txDimCss = plotHgtCss;\n\t\t\txOffCss = plotTopCss;\n\t\t\tyDimCss = plotWidCss;\n\t\t\tyOffCss = plotLftCss;\n\t\t};\n\t\t*/\n\t}\n\n\tconst pendScales = {};\n\n\t// explicitly-set initial scales\n\tfor (let k in scales) {\n\t\tlet sc = scales[k];\n\n\t\tif (sc.min != null || sc.max != null) {\n\t\t\tpendScales[k] = {min: sc.min, max: sc.max};\n\t\t\tsc.min = sc.max = null;\n\t\t}\n\t}\n\n//\tself.tz = opts.tz || Intl.DateTimeFormat().resolvedOptions().timeZone;\n\tconst _tzDate = (opts.tzDate || (ts => new Date(round(ts / ms))));\n\tconst _fmtDate = (opts.fmtDate || fmtDate);\n\n\tconst _timeAxisSplits = (ms == 1 ? timeAxisSplitsMs(_tzDate) : timeAxisSplitsS(_tzDate));\n\tconst _timeAxisVals = timeAxisVals(_tzDate, timeAxisStamps((ms == 1 ? _timeAxisStampsMs : _timeAxisStampsS), _fmtDate));\n\tconst _timeSeriesVal = timeSeriesVal(_tzDate, timeSeriesStamp(_timeSeriesStamp, _fmtDate));\n\n\tconst activeIdxs = [];\n\n\tconst legend = (self.legend = assign({}, legendOpts, opts.legend));\n\tconst showLegend = legend.show;\n\tconst markers = legend.markers;\n\n\t{\n\t\tlegend.idxs = activeIdxs;\n\n\t\tmarkers.width = fnOrSelf(markers.width);\n\t\tmarkers.dash = fnOrSelf(markers.dash);\n\t\tmarkers.stroke = fnOrSelf(markers.stroke);\n\t\tmarkers.fill = fnOrSelf(markers.fill);\n\t}\n\n\tlet legendEl;\n\tlet legendRows = [];\n\tlet legendCells = [];\n\tlet legendCols;\n\tlet multiValLegend = false;\n\tlet NULL_LEGEND_VALUES = {};\n\n\tif (legend.live) {\n\t\tconst getMultiVals = series[1] ? series[1].values : null;\n\t\tmultiValLegend = getMultiVals != null;\n\t\tlegendCols = multiValLegend ? getMultiVals(self, 1, 0) : {_: 0};\n\n\t\tfor (let k in legendCols)\n\t\t\tNULL_LEGEND_VALUES[k] = \"--\";\n\t}\n\n\tif (showLegend) {\n\t\tlegendEl = placeTag(\"table\", LEGEND, root);\n\n\t\tif (multiValLegend) {\n\t\t\tlet head = placeTag(\"tr\", LEGEND_THEAD, legendEl);\n\t\t\tplaceTag(\"th\", null, head);\n\n\t\t\tfor (var key in legendCols)\n\t\t\t\tplaceTag(\"th\", LEGEND_LABEL, head).textContent = key;\n\t\t}\n\t\telse {\n\t\t\taddClass(legendEl, LEGEND_INLINE);\n\t\t\tlegend.live && addClass(legendEl, LEGEND_LIVE);\n\t\t}\n\t}\n\n\tconst son = {show: true};\n\tconst soff = {show: false};\n\n\tfunction initLegendRow(s, i) {\n\t\tif (i == 0 && (multiValLegend || !legend.live || mode == 2))\n\t\t\treturn nullNullTuple;\n\n\t\tlet cells = [];\n\n\t\tlet row = placeTag(\"tr\", LEGEND_SERIES, legendEl, legendEl.childNodes[i]);\n\n\t\taddClass(row, s.class);\n\n\t\tif (!s.show)\n\t\t\taddClass(row, OFF);\n\n\t\tlet label = placeTag(\"th\", null, row);\n\n\t\tif (markers.show) {\n\t\t\tlet indic = placeDiv(LEGEND_MARKER, label);\n\n\t\t\tif (i > 0) {\n\t\t\t\tlet width = markers.width(self, i);\n\n\t\t\t\tif (width)\n\t\t\t\t\tindic.style.border = width + \"px \" + markers.dash(self, i) + \" \" + markers.stroke(self, i);\n\n\t\t\t\tindic.style.background = markers.fill(self, i);\n\t\t\t}\n\t\t}\n\n\t\tlet text = placeDiv(LEGEND_LABEL, label);\n\t\ttext.textContent = s.label;\n\n\t\tif (i > 0) {\n\t\t\tif (!markers.show)\n\t\t\t\ttext.style.color = s.width > 0 ? markers.stroke(self, i) : markers.fill(self, i);\n\n\t\t\tonMouse(\"click\", label, e => {\n\t\t\t\tif (cursor._lock)\n\t\t\t\t\treturn;\n\n\t\t\t\tlet seriesIdx = series.indexOf(s);\n\n\t\t\t\tif ((e.ctrlKey || e.metaKey) != legend.isolate) {\n\t\t\t\t\t// if any other series is shown, isolate this one. else show all\n\t\t\t\t\tlet isolate = series.some((s, i) => i > 0 && i != seriesIdx && s.show);\n\n\t\t\t\t\tseries.forEach((s, i) => {\n\t\t\t\t\t\ti > 0 && setSeries(i, isolate ? (i == seriesIdx ? son : soff) : son, true, syncOpts.setSeries);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tsetSeries(seriesIdx, {show: !s.show}, true, syncOpts.setSeries);\n\t\t\t});\n\n\t\t\tif (cursorFocus) {\n\t\t\t\tonMouse(mouseenter, label, e => {\n\t\t\t\t\tif (cursor._lock)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tsetSeries(series.indexOf(s), FOCUS_TRUE, true, syncOpts.setSeries);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfor (var key in legendCols) {\n\t\t\tlet v = placeTag(\"td\", LEGEND_VALUE, row);\n\t\t\tv.textContent = \"--\";\n\t\t\tcells.push(v);\n\t\t}\n\n\t\treturn [row, cells];\n\t}\n\n\tconst mouseListeners = new Map();\n\n\tfunction onMouse(ev, targ, fn) {\n\t\tconst targListeners = mouseListeners.get(targ) || {};\n\t\tconst listener = cursor.bind[ev](self, targ, fn);\n\n\t\tif (listener) {\n\t\t\ton(ev, targ, targListeners[ev] = listener);\n\t\t\tmouseListeners.set(targ, targListeners);\n\t\t}\n\t}\n\n\tfunction offMouse(ev, targ, fn) {\n\t\tconst targListeners = mouseListeners.get(targ) || {};\n\n\t\tfor (let k in targListeners) {\n\t\t\tif (ev == null || k == ev) {\n\t\t\t\toff(k, targ, targListeners[k]);\n\t\t\t\tdelete targListeners[k];\n\t\t\t}\n\t\t}\n\n\t\tif (ev == null)\n\t\t\tmouseListeners.delete(targ);\n\t}\n\n\tlet fullWidCss = 0;\n\tlet fullHgtCss = 0;\n\n\tlet plotWidCss = 0;\n\tlet plotHgtCss = 0;\n\n\t// plot margins to account for axes\n\tlet plotLftCss = 0;\n\tlet plotTopCss = 0;\n\n\tlet plotLft = 0;\n\tlet plotTop = 0;\n\tlet plotWid = 0;\n\tlet plotHgt = 0;\n\n\tself.bbox = {};\n\n\tlet shouldSetScales = false;\n\tlet shouldSetSize = false;\n\tlet shouldConvergeSize = false;\n\tlet shouldSetCursor = false;\n\tlet shouldSetLegend = false;\n\n\tfunction _setSize(width, height, force) {\n\t\tif (force || (width != self.width || height != self.height))\n\t\t\tcalcSize(width, height);\n\n\t\tresetYSeries(false);\n\n\t\tshouldConvergeSize = true;\n\t\tshouldSetSize = true;\n\t\tshouldSetCursor = shouldSetLegend = cursor.left >= 0;\n\t\tcommit();\n\t}\n\n\tfunction calcSize(width, height) {\n\t//\tlog(\"calcSize()\", arguments);\n\n\t\tself.width = fullWidCss = plotWidCss = width;\n\t\tself.height = fullHgtCss = plotHgtCss = height;\n\t\tplotLftCss = plotTopCss = 0;\n\n\t\tcalcPlotRect();\n\t\tcalcAxesRects();\n\n\t\tlet bb = self.bbox;\n\n\t\tplotLft = bb.left = incrRound(plotLftCss * pxRatio, 0.5);\n\t\tplotTop = bb.top = incrRound(plotTopCss * pxRatio, 0.5);\n\t\tplotWid = bb.width = incrRound(plotWidCss * pxRatio, 0.5);\n\t\tplotHgt = bb.height = incrRound(plotHgtCss * pxRatio, 0.5);\n\n\t//\tupdOriDims();\n\t}\n\n\t// ensures size calc convergence\n\tconst CYCLE_LIMIT = 3;\n\n\tfunction convergeSize() {\n\t\tlet converged = false;\n\n\t\tlet cycleNum = 0;\n\n\t\twhile (!converged) {\n\t\t\tcycleNum++;\n\n\t\t\tlet axesConverged = axesCalc(cycleNum);\n\t\t\tlet paddingConverged = paddingCalc(cycleNum);\n\n\t\t\tconverged = cycleNum == CYCLE_LIMIT || (axesConverged && paddingConverged);\n\n\t\t\tif (!converged) {\n\t\t\t\tcalcSize(self.width, self.height);\n\t\t\t\tshouldSetSize = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setSize({width, height}) {\n\t\t_setSize(width, height);\n\t}\n\n\tself.setSize = setSize;\n\n\t// accumulate axis offsets, reduce canvas width\n\tfunction calcPlotRect() {\n\t\t// easements for edge labels\n\t\tlet hasTopAxis = false;\n\t\tlet hasBtmAxis = false;\n\t\tlet hasRgtAxis = false;\n\t\tlet hasLftAxis = false;\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (axis.show && axis._show) {\n\t\t\t\tlet {side, _size} = axis;\n\t\t\t\tlet isVt = side % 2;\n\t\t\t\tlet labelSize = axis.label != null ? axis.labelSize : 0;\n\n\t\t\t\tlet fullSize = _size + labelSize;\n\n\t\t\t\tif (fullSize > 0) {\n\t\t\t\t\tif (isVt) {\n\t\t\t\t\t\tplotWidCss -= fullSize;\n\n\t\t\t\t\t\tif (side == 3) {\n\t\t\t\t\t\t\tplotLftCss += fullSize;\n\t\t\t\t\t\t\thasLftAxis = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\thasRgtAxis = true;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tplotHgtCss -= fullSize;\n\n\t\t\t\t\t\tif (side == 0) {\n\t\t\t\t\t\t\tplotTopCss += fullSize;\n\t\t\t\t\t\t\thasTopAxis = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\thasBtmAxis = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tsidesWithAxes[0] = hasTopAxis;\n\t\tsidesWithAxes[1] = hasRgtAxis;\n\t\tsidesWithAxes[2] = hasBtmAxis;\n\t\tsidesWithAxes[3] = hasLftAxis;\n\n\t\t// hz padding\n\t\tplotWidCss -= _padding[1] + _padding[3];\n\t\tplotLftCss += _padding[3];\n\n\t\t// vt padding\n\t\tplotHgtCss -= _padding[2] + _padding[0];\n\t\tplotTopCss += _padding[0];\n\t}\n\n\tfunction calcAxesRects() {\n\t\t// will accum +\n\t\tlet off1 = plotLftCss + plotWidCss;\n\t\tlet off2 = plotTopCss + plotHgtCss;\n\t\t// will accum -\n\t\tlet off3 = plotLftCss;\n\t\tlet off0 = plotTopCss;\n\n\t\tfunction incrOffset(side, size) {\n\t\t\tswitch (side) {\n\t\t\t\tcase 1: off1 += size; return off1 - size;\n\t\t\t\tcase 2: off2 += size; return off2 - size;\n\t\t\t\tcase 3: off3 -= size; return off3 + size;\n\t\t\t\tcase 0: off0 -= size; return off0 + size;\n\t\t\t}\n\t\t}\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (axis.show && axis._show) {\n\t\t\t\tlet side = axis.side;\n\n\t\t\t\taxis._pos = incrOffset(side, axis._size);\n\n\t\t\t\tif (axis.label != null)\n\t\t\t\t\taxis._lpos = incrOffset(side, axis.labelSize);\n\t\t\t}\n\t\t});\n\t}\n\n\tconst cursor = (self.cursor = assign({}, cursorOpts, {drag: {y: mode == 2}}, opts.cursor));\n\n\t{\n\t\tcursor.idxs = activeIdxs;\n\n\t\tcursor._lock = false;\n\n\t\tlet points = cursor.points;\n\n\t\tpoints.show = fnOrSelf(points.show);\n\t\tpoints.size = fnOrSelf(points.size);\n\t\tpoints.stroke = fnOrSelf(points.stroke);\n\t\tpoints.width = fnOrSelf(points.width);\n\t\tpoints.fill = fnOrSelf(points.fill);\n\t}\n\n\tconst focus = self.focus = assign({}, opts.focus || {alpha: 0.3}, cursor.focus);\n\tconst cursorFocus = focus.prox >= 0;\n\n\t// series-intersection markers\n\tlet cursorPts = [null];\n\n\tfunction initCursorPt(s, si) {\n\t\tif (si > 0) {\n\t\t\tlet pt = cursor.points.show(self, si);\n\n\t\t\tif (pt) {\n\t\t\t\taddClass(pt, CURSOR_PT);\n\t\t\t\taddClass(pt, s.class);\n\t\t\t\telTrans(pt, -10, -10, plotWidCss, plotHgtCss);\n\t\t\t\tover.insertBefore(pt, cursorPts[si]);\n\n\t\t\t\treturn pt;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction initSeries(s, i) {\n\t\tif (mode == 1 || i > 0) {\n\t\t\tlet isTime = mode == 1 && scales[s.scale].time;\n\n\t\t\tlet sv = s.value;\n\t\t\ts.value = isTime ? (isStr(sv) ? timeSeriesVal(_tzDate, timeSeriesStamp(sv, _fmtDate)) : sv || _timeSeriesVal) : sv || numSeriesVal;\n\t\t\ts.label = s.label || (isTime ? timeSeriesLabel : numSeriesLabel);\n\t\t}\n\n\t\tif (i > 0) {\n\t\t\ts.width = s.width == null ? 1 : s.width;\n\t\t\ts.paths = s.paths || linearPath || retNull;\n\t\t\ts.fillTo = fnOrSelf(s.fillTo || seriesFillTo);\n\t\t\ts.pxAlign = +ifNull(s.pxAlign, pxAlign);\n\t\t\ts.pxRound = pxRoundGen(s.pxAlign);\n\n\t\t\ts.stroke = fnOrSelf(s.stroke || null);\n\t\t\ts.fill = fnOrSelf(s.fill || null);\n\t\t\ts._stroke = s._fill = s._paths = s._focus = null;\n\n\t\t\tlet _ptDia = ptDia(s.width, 1);\n\t\t\tlet points = s.points = assign({}, {\n\t\t\t\tsize: _ptDia,\n\t\t\t\twidth: max(1, _ptDia * .2),\n\t\t\t\tstroke: s.stroke,\n\t\t\t\tspace: _ptDia * 2,\n\t\t\t\tpaths: pointsPath,\n\t\t\t\t_stroke: null,\n\t\t\t\t_fill: null,\n\t\t\t}, s.points);\n\t\t\tpoints.show = fnOrSelf(points.show);\n\t\t\tpoints.filter = fnOrSelf(points.filter);\n\t\t\tpoints.fill = fnOrSelf(points.fill);\n\t\t\tpoints.stroke = fnOrSelf(points.stroke);\n\t\t\tpoints.paths = fnOrSelf(points.paths);\n\t\t\tpoints.pxAlign = s.pxAlign;\n\t\t}\n\n\t\tif (showLegend) {\n\t\t\tlet rowCells = initLegendRow(s, i);\n\t\t\tlegendRows.splice(i, 0, rowCells[0]);\n\t\t\tlegendCells.splice(i, 0, rowCells[1]);\n\t\t\tlegend.values.push(null);\t// NULL_LEGEND_VALS not yet avil here :(\n\t\t}\n\n\t\tif (cursor.show) {\n\t\t\tactiveIdxs.splice(i, 0, null);\n\n\t\t\tlet pt = initCursorPt(s, i);\n\t\t\tpt && cursorPts.splice(i, 0, pt);\n\t\t}\n\n\t\tfire(\"addSeries\", i);\n\t}\n\n\tfunction addSeries(opts, si) {\n\t\tsi = si == null ? series.length : si;\n\n\t\topts = setDefault(opts, si, xSeriesOpts, ySeriesOpts);\n\t\tseries.splice(si, 0, opts);\n\t\tinitSeries(series[si], si);\n\t}\n\n\tself.addSeries = addSeries;\n\n\tfunction delSeries(i) {\n\t\tseries.splice(i, 1);\n\n\t\tif (showLegend) {\n\t\t\tlegend.values.splice(i, 1);\n\n\t\t\tlegendCells.splice(i, 1);\n\t\t\tlet tr = legendRows.splice(i, 1)[0];\n\t\t\toffMouse(null, tr.firstChild);\n\t\t\ttr.remove();\n\t\t}\n\n\t\tif (cursor.show) {\n\t\t\tactiveIdxs.splice(i, 1);\n\n\t\t\tcursorPts.length > 1 && cursorPts.splice(i, 1)[0].remove();\n\t\t}\n\n\t\t// TODO: de-init no-longer-needed scales?\n\n\t\tfire(\"delSeries\", i);\n\t}\n\n\tself.delSeries = delSeries;\n\n\tconst sidesWithAxes = [false, false, false, false];\n\n\tfunction initAxis(axis, i) {\n\t\taxis._show = axis.show;\n\n\t\tif (axis.show) {\n\t\t\tlet isVt = axis.side % 2;\n\n\t\t\tlet sc = scales[axis.scale];\n\n\t\t\t// this can occur if all series specify non-default scales\n\t\t\tif (sc == null) {\n\t\t\t\taxis.scale = isVt ? series[1].scale : xScaleKey;\n\t\t\t\tsc = scales[axis.scale];\n\t\t\t}\n\n\t\t\t// also set defaults for incrs & values based on axis distr\n\t\t\tlet isTime = sc.time;\n\n\t\t\taxis.size = fnOrSelf(axis.size);\n\t\t\taxis.space = fnOrSelf(axis.space);\n\t\t\taxis.rotate = fnOrSelf(axis.rotate);\n\t\t\taxis.incrs = fnOrSelf(axis.incrs || ( sc.distr == 2 ? wholeIncrs : (isTime ? (ms == 1 ? timeIncrsMs : timeIncrsS) : numIncrs)));\n\t\t\taxis.splits = fnOrSelf(axis.splits || (isTime && sc.distr == 1 ? _timeAxisSplits : sc.distr == 3 ? logAxisSplits : sc.distr == 4 ? asinhAxisSplits : numAxisSplits));\n\n\t\t\taxis.stroke = fnOrSelf(axis.stroke);\n\t\t\taxis.grid.stroke = fnOrSelf(axis.grid.stroke);\n\t\t\taxis.ticks.stroke = fnOrSelf(axis.ticks.stroke);\n\t\t\taxis.border.stroke = fnOrSelf(axis.border.stroke);\n\n\t\t\tlet av = axis.values;\n\n\t\t\taxis.values = (\n\t\t\t\t// static array of tick values\n\t\t\t\tisArr(av) && !isArr(av[0]) ? fnOrSelf(av) :\n\t\t\t\t// temporal\n\t\t\t\tisTime ? (\n\t\t\t\t\t// config array of fmtDate string tpls\n\t\t\t\t\tisArr(av) ?\n\t\t\t\t\t\ttimeAxisVals(_tzDate, timeAxisStamps(av, _fmtDate)) :\n\t\t\t\t\t// fmtDate string tpl\n\t\t\t\t\tisStr(av) ?\n\t\t\t\t\t\ttimeAxisVal(_tzDate, av) :\n\t\t\t\t\tav || _timeAxisVals\n\t\t\t\t) : av || numAxisVals\n\t\t\t);\n\n\t\t\taxis.filter = fnOrSelf(axis.filter || ( sc.distr >= 3 ? logAxisValsFilt : retArg1));\n\n\t\t\taxis.font = pxRatioFont(axis.font);\n\t\t\taxis.labelFont = pxRatioFont(axis.labelFont);\n\n\t\t\taxis._size = axis.size(self, null, i, 0);\n\n\t\t\taxis._space =\n\t\t\taxis._rotate =\n\t\t\taxis._incrs =\n\t\t\taxis._found =\t// foundIncrSpace\n\t\t\taxis._splits =\n\t\t\taxis._values = null;\n\n\t\t\tif (axis._size > 0) {\n\t\t\t\tsidesWithAxes[i] = true;\n\t\t\t\taxis._el = placeDiv(AXIS, wrap);\n\t\t\t}\n\n\t\t\t// debug\n\t\t//\taxis._el.style.background = \"#\" + Math.floor(Math.random()*16777215).toString(16) + '80';\n\t\t}\n\t}\n\n\tfunction autoPadSide(self, side, sidesWithAxes, cycleNum) {\n\t\tlet [hasTopAxis, hasRgtAxis, hasBtmAxis, hasLftAxis] = sidesWithAxes;\n\n\t\tlet ori = side % 2;\n\t\tlet size = 0;\n\n\t\tif (ori == 0 && (hasLftAxis || hasRgtAxis))\n\t\t\tsize = (side == 0 && !hasTopAxis || side == 2 && !hasBtmAxis ? round(xAxisOpts.size / 3) : 0);\n\t\tif (ori == 1 && (hasTopAxis || hasBtmAxis))\n\t\t\tsize = (side == 1 && !hasRgtAxis || side == 3 && !hasLftAxis ? round(yAxisOpts.size / 2) : 0);\n\n\t\treturn size;\n\t}\n\n\tconst padding = self.padding = (opts.padding || [autoPadSide,autoPadSide,autoPadSide,autoPadSide]).map(p => fnOrSelf(ifNull(p, autoPadSide)));\n\tconst _padding = self._padding = padding.map((p, i) => p(self, i, sidesWithAxes, 0));\n\n\tlet dataLen;\n\n\t// rendered data window\n\tlet i0 = null;\n\tlet i1 = null;\n\tconst idxs = mode == 1 ? series[0].idxs : null;\n\n\tlet data0 = null;\n\n\tlet viaAutoScaleX = false;\n\n\tfunction setData(_data, _resetScales) {\n\t\tdata = _data == null ? [] : copy(_data, fastIsObj);\n\n\t\tif (mode == 2) {\n\t\t\tdataLen = 0;\n\t\t\tfor (let i = 1; i < series.length; i++)\n\t\t\t\tdataLen += data[i][0].length;\n\t\t\tself.data = data = _data;\n\t\t}\n\t\telse {\n\t\t\tif (data[0] == null)\n\t\t\t\tdata[0] = [];\n\n\t\t\tself.data = data.slice();\n\n\t\t\tdata0 = data[0];\n\t\t\tdataLen = data0.length;\n\n\t\t\tif (xScaleDistr == 2) {\n\t\t\t\tdata[0] = Array(dataLen);\n\t\t\t\tfor (let i = 0; i < dataLen; i++)\n\t\t\t\t\tdata[0][i] = i;\n\t\t\t}\n\t\t}\n\n\t\tself._data = data;\n\n\t\tresetYSeries(true);\n\n\t\tfire(\"setData\");\n\n\t\t// forces x axis tick values to re-generate when neither x scale nor y scale changes\n\t\t// in ordinal mode, scale range is by index, so will not change if new data has same length, but tick values are from data\n\t\tif (xScaleDistr == 2) {\n\t\t\tshouldConvergeSize = true;\n\n\t\t\t/* or somewhat cheaper, and uglier:\n\t\t\tif (ready) {\n\t\t\t\t// logic extracted from axesCalc()\n\t\t\t\tlet i = 0;\n\t\t\t\tlet axis = axes[i];\n\t\t\t\tlet _splits = axis._splits.map(i => data0[i]);\n\t\t\t\tlet [_incr, _space] = axis._found;\n\t\t\t\tlet incr = data0[_splits[1]] - data0[_splits[0]];\n\t\t\t\taxis._values = axis.values(self, axis.filter(self, _splits, i, _space, incr), i, _space, incr);\n\t\t\t}\n\t\t\t*/\n\t\t}\n\n\t\tif (_resetScales !== false) {\n\t\t\tlet xsc = scaleX;\n\n\t\t\tif (xsc.auto(self, viaAutoScaleX))\n\t\t\t\tautoScaleX();\n\t\t\telse\n\t\t\t\t_setScale(xScaleKey, xsc.min, xsc.max);\n\n\t\t\tshouldSetCursor = cursor.left >= 0;\n\t\t\tshouldSetLegend = true;\n\t\t\tcommit();\n\t\t}\n\t}\n\n\tself.setData = setData;\n\n\tfunction autoScaleX() {\n\t\tviaAutoScaleX = true;\n\n\t\tlet _min, _max;\n\n\t\tif (mode == 1) {\n\t\t\tif (dataLen > 0) {\n\t\t\t\ti0 = idxs[0] = 0;\n\t\t\t\ti1 = idxs[1] = dataLen - 1;\n\n\t\t\t\t_min = data[0][i0];\n\t\t\t\t_max = data[0][i1];\n\n\t\t\t\tif (xScaleDistr == 2) {\n\t\t\t\t\t_min = i0;\n\t\t\t\t\t_max = i1;\n\t\t\t\t}\n\t\t\t\telse if (dataLen == 1) {\n\t\t\t\t\tif (xScaleDistr == 3)\n\t\t\t\t\t\t[_min, _max] = rangeLog(_min, _min, scaleX.log, false);\n\t\t\t\t\telse if (xScaleDistr == 4)\n\t\t\t\t\t\t[_min, _max] = rangeAsinh(_min, _min, scaleX.log, false);\n\t\t\t\t\telse if (scaleX.time)\n\t\t\t\t\t\t_max = _min + round(86400 / ms);\n\t\t\t\t\telse\n\t\t\t\t\t\t[_min, _max] = rangeNum(_min, _max, rangePad, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\ti0 = idxs[0] = _min = null;\n\t\t\t\ti1 = idxs[1] = _max = null;\n\t\t\t}\n\t\t}\n\n\t\t_setScale(xScaleKey, _min, _max);\n\t}\n\n\tlet ctxStroke, ctxFill, ctxWidth, ctxDash, ctxJoin, ctxCap, ctxFont, ctxAlign, ctxBaseline;\n\tlet ctxAlpha;\n\n\tfunction setCtxStyle(stroke = transparent, width, dash = EMPTY_ARR, cap = \"butt\", fill = transparent, join = \"round\") {\n\t\tif (stroke != ctxStroke)\n\t\t\tctx.strokeStyle = ctxStroke = stroke;\n\t\tif (fill != ctxFill)\n\t\t\tctx.fillStyle = ctxFill = fill;\n\t\tif (width != ctxWidth)\n\t\t\tctx.lineWidth = ctxWidth = width;\n\t\tif (join != ctxJoin)\n\t\t\tctx.lineJoin = ctxJoin = join;\n\t\tif (cap != ctxCap)\n\t\t\tctx.lineCap = ctxCap = cap; // (\u203F|\u203F)\n\t\tif (dash != ctxDash)\n\t\t\tctx.setLineDash(ctxDash = dash);\n\t}\n\n\tfunction setFontStyle(font, fill, align, baseline) {\n\t\tif (fill != ctxFill)\n\t\t\tctx.fillStyle = ctxFill = fill;\n\t\tif (font != ctxFont)\n\t\t\tctx.font = ctxFont = font;\n\t\tif (align != ctxAlign)\n\t\t\tctx.textAlign = ctxAlign = align;\n\t\tif (baseline != ctxBaseline)\n\t\t\tctx.textBaseline = ctxBaseline = baseline;\n\t}\n\n\tfunction accScale(wsc, psc, facet, data, sorted = 0) {\n\t\tif (data.length > 0 && wsc.auto(self, viaAutoScaleX) && (psc == null || psc.min == null)) {\n\t\t\tlet _i0 = ifNull(i0, 0);\n\t\t\tlet _i1 = ifNull(i1, data.length - 1);\n\n\t\t\t// only run getMinMax() for invalidated series data, else reuse\n\t\t\tlet minMax = facet.min == null ? (wsc.distr == 3 ? getMinMaxLog(data, _i0, _i1) : getMinMax(data, _i0, _i1, sorted)) : [facet.min, facet.max];\n\n\t\t\t// initial min/max\n\t\t\twsc.min = min(wsc.min, facet.min = minMax[0]);\n\t\t\twsc.max = max(wsc.max, facet.max = minMax[1]);\n\t\t}\n\t}\n\n\tfunction setScales() {\n\t//\tlog(\"setScales()\", arguments);\n\n\t\t// wip scales\n\t\tlet wipScales = copy(scales, fastIsObj);\n\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\t\t\tlet psc = pendScales[k];\n\n\t\t\tif (psc != null && psc.min != null) {\n\t\t\t\tassign(wsc, psc);\n\n\t\t\t\t// explicitly setting the x-scale invalidates everything (acts as redraw)\n\t\t\t\tif (k == xScaleKey)\n\t\t\t\t\tresetYSeries(true);\n\t\t\t}\n\t\t\telse if (k != xScaleKey || mode == 2) {\n\t\t\t\tif (dataLen == 0 && wsc.from == null) {\n\t\t\t\t\tlet minMax = wsc.range(self, null, null, k);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\twsc.min = inf;\n\t\t\t\t\twsc.max = -inf;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (dataLen > 0) {\n\t\t\t// pre-range y-scales from y series' data values\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (mode == 1) {\n\t\t\t\t\tlet k = s.scale;\n\t\t\t\t\tlet wsc = wipScales[k];\n\t\t\t\t\tlet psc = pendScales[k];\n\n\t\t\t\t\tif (i == 0) {\n\t\t\t\t\t\tlet minMax = wsc.range(self, wsc.min, wsc.max, k);\n\n\t\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\t\twsc.max = minMax[1];\n\n\t\t\t\t\t\ti0 = closestIdx(wsc.min, data[0]);\n\t\t\t\t\t\ti1 = closestIdx(wsc.max, data[0]);\n\n\t\t\t\t\t\t// closest indices can be outside of view\n\t\t\t\t\t\tif (data[0][i0] < wsc.min)\n\t\t\t\t\t\t\ti0++;\n\t\t\t\t\t\tif (data[0][i1] > wsc.max)\n\t\t\t\t\t\t\ti1--;\n\n\t\t\t\t\t\ts.min = data0[i0];\n\t\t\t\t\t\ts.max = data0[i1];\n\t\t\t\t\t}\n\t\t\t\t\telse if (s.show && s.auto)\n\t\t\t\t\t\taccScale(wsc, psc, s, data[i], s.sorted);\n\n\t\t\t\t\ts.idxs[0] = i0;\n\t\t\t\t\ts.idxs[1] = i1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\tif (s.show && s.auto) {\n\t\t\t\t\t\t\t// TODO: only handles, assumes and requires facets[0] / 'x' scale, and facets[1] / 'y' scale\n\t\t\t\t\t\t\tlet [ xFacet, yFacet ] = s.facets;\n\t\t\t\t\t\t\tlet xScaleKey = xFacet.scale;\n\t\t\t\t\t\t\tlet yScaleKey = yFacet.scale;\n\t\t\t\t\t\t\tlet [ xData, yData ] = data[i];\n\n\t\t\t\t\t\t\taccScale(wipScales[xScaleKey], pendScales[xScaleKey], xFacet, xData, xFacet.sorted);\n\t\t\t\t\t\t\taccScale(wipScales[yScaleKey], pendScales[yScaleKey], yFacet, yData, yFacet.sorted);\n\n\t\t\t\t\t\t\t// temp\n\t\t\t\t\t\t\ts.min = yFacet.min;\n\t\t\t\t\t\t\ts.max = yFacet.max;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// range independent scales\n\t\t\tfor (let k in wipScales) {\n\t\t\t\tlet wsc = wipScales[k];\n\t\t\t\tlet psc = pendScales[k];\n\n\t\t\t\tif (wsc.from == null && (psc == null || psc.min == null)) {\n\t\t\t\t\tlet minMax = wsc.range(\n\t\t\t\t\t\tself,\n\t\t\t\t\t\twsc.min == inf ? null : wsc.min,\n\t\t\t\t\t\twsc.max == -inf ? null : wsc.max,\n\t\t\t\t\t\tk\n\t\t\t\t\t);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// range dependent scales\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\n\t\t\tif (wsc.from != null) {\n\t\t\t\tlet base = wipScales[wsc.from];\n\n\t\t\t\tif (base.min == null)\n\t\t\t\t\twsc.min = wsc.max = null;\n\t\t\t\telse {\n\t\t\t\t\tlet minMax = wsc.range(self, base.min, base.max, k);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet changed = {};\n\t\tlet anyChanged = false;\n\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\t\t\tlet sc = scales[k];\n\n\t\t\tif (sc.min != wsc.min || sc.max != wsc.max) {\n\t\t\t\tsc.min = wsc.min;\n\t\t\t\tsc.max = wsc.max;\n\n\t\t\t\tlet distr = sc.distr;\n\n\t\t\t\tsc._min = distr == 3 ? log10(sc.min) : distr == 4 ? asinh(sc.min, sc.asinh) : sc.min;\n\t\t\t\tsc._max = distr == 3 ? log10(sc.max) : distr == 4 ? asinh(sc.max, sc.asinh) : sc.max;\n\n\t\t\t\tchanged[k] = anyChanged = true;\n\t\t\t}\n\t\t}\n\n\t\tif (anyChanged) {\n\t\t\t// invalidate paths of all series on changed scales\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (mode == 2) {\n\t\t\t\t\tif (i > 0 && changed.y)\n\t\t\t\t\t\ts._paths = null;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (changed[s.scale])\n\t\t\t\t\t\ts._paths = null;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfor (let k in changed) {\n\t\t\t\tshouldConvergeSize = true;\n\t\t\t\tfire(\"setScale\", k);\n\t\t\t}\n\n\t\t\tif (cursor.show)\n\t\t\t\tshouldSetCursor = shouldSetLegend = cursor.left >= 0;\n\t\t}\n\n\t\tfor (let k in pendScales)\n\t\t\tpendScales[k] = null;\n\t}\n\n\t// grabs the nearest indices with y data outside of x-scale limits\n\tfunction getOuterIdxs(ydata) {\n\t\tlet _i0 = clamp(i0 - 1, 0, dataLen - 1);\n\t\tlet _i1 = clamp(i1 + 1, 0, dataLen - 1);\n\n\t\twhile (ydata[_i0] == null && _i0 > 0)\n\t\t\t_i0--;\n\n\t\twhile (ydata[_i1] == null && _i1 < dataLen - 1)\n\t\t\t_i1++;\n\n\t\treturn [_i0, _i1];\n\t}\n\n\tfunction drawSeries() {\n\t\tif (dataLen > 0) {\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (i > 0 && s.show && s._paths == null) {\n\t\t\t\t\tlet _idxs = getOuterIdxs(data[i]);\n\t\t\t\t\ts._paths = s.paths(self, i, _idxs[0], _idxs[1]);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tif (ctxAlpha != s.alpha)\n\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = s.alpha;\n\n\t\t\t\t\t{\n\t\t\t\t\t\tcacheStrokeFill(i, false);\n\t\t\t\t\t\ts._paths && drawPath(i, false);\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tcacheStrokeFill(i, true);\n\n\t\t\t\t\t\tlet show = s.points.show(self, i, i0, i1);\n\t\t\t\t\t\tlet idxs = s.points.filter(self, i, show, s._paths ? s._paths.gaps : null);\n\n\t\t\t\t\t\tif (show || idxs) {\n\t\t\t\t\t\t\ts.points._paths = s.points.paths(self, i, i0, i1, idxs);\n\t\t\t\t\t\t\tdrawPath(i, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ctxAlpha != 1)\n\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = 1;\n\n\t\t\t\t\tfire(\"drawSeries\", i);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction cacheStrokeFill(si, _points) {\n\t\tlet s = _points ? series[si].points : series[si];\n\n\t\ts._stroke = s.stroke(self, si);\n\t\ts._fill = s.fill(self, si);\n\t}\n\n\tfunction drawPath(si, _points) {\n\t\tlet s = _points ? series[si].points : series[si];\n\n\t\tlet strokeStyle = s._stroke;\n\t\tlet fillStyle = s._fill;\n\n\t\tlet { stroke, fill, clip: gapsClip, flags } = s._paths;\n\t\tlet boundsClip = null;\n\t\tlet width = roundDec(s.width * pxRatio, 3);\n\t\tlet offset = (width % 2) / 2;\n\n\t\tif (_points && fillStyle == null)\n\t\t\tfillStyle = width > 0 ? \"#fff\" : strokeStyle;\n\n\t\tlet _pxAlign = s.pxAlign == 1;\n\n\t\t_pxAlign && ctx.translate(offset, offset);\n\n\t\tif (!_points) {\n\t\t\tlet lft = plotLft,\n\t\t\t\ttop = plotTop,\n\t\t\t\twid = plotWid,\n\t\t\t\thgt = plotHgt;\n\n\t\t\tlet halfWid = width * pxRatio / 2;\n\n\t\t\tif (s.min == 0)\n\t\t\t\thgt += halfWid;\n\n\t\t\tif (s.max == 0) {\n\t\t\t\ttop -= halfWid;\n\t\t\t\thgt += halfWid;\n\t\t\t}\n\n\t\t\tboundsClip = new Path2D();\n\t\t\tboundsClip.rect(lft, top, wid, hgt);\n\t\t}\n\n\t\t// the points pathbuilder's gapsClip is its boundsClip, since points dont need gaps clipping, and bounds depend on point size\n\t\tif (_points)\n\t\t\tstrokeFill(strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, gapsClip);\n\t\telse\n\t\t\tfillStroke(si, strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, boundsClip, gapsClip);\n\n\t\t_pxAlign && ctx.translate(-offset, -offset);\n\t}\n\n\tfunction fillStroke(si, strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip) {\n\t\tlet didStrokeFill = false;\n\n\t\t// for all bands where this series is the top edge, create upwards clips using the bottom edges\n\t\t// and apply clips + fill with band fill or dfltFill\n\t\tbands.forEach((b, bi) => {\n\t\t\t// isUpperEdge?\n\t\t\tif (b.series[0] == si) {\n\t\t\t\tlet lowerEdge = series[b.series[1]];\n\t\t\t\tlet lowerData = data[b.series[1]];\n\n\t\t\t\tlet bandClip = (lowerEdge._paths || EMPTY_OBJ).band;\n\n\t\t\t\tif (isArr(bandClip))\n\t\t\t\t\tbandClip = b.dir == 1 ? bandClip[0] : bandClip[1];\n\n\t\t\t\tlet gapsClip2;\n\n\t\t\t\tlet _fillStyle = null;\n\n\t\t\t\t// hasLowerEdge?\n\t\t\t\tif (lowerEdge.show && bandClip && hasData(lowerData, i0, i1)) {\n\t\t\t\t\t_fillStyle = b.fill(self, bi) || fillStyle;\n\t\t\t\t\tgapsClip2 = lowerEdge._paths.clip;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tbandClip = null;\n\n\t\t\t\tstrokeFill(strokeStyle, lineWidth, lineDash, lineCap, _fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip);\n\n\t\t\t\tdidStrokeFill = true;\n\t\t\t}\n\t\t});\n\n\t\tif (!didStrokeFill)\n\t\t\tstrokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip);\n\t}\n\n\tconst CLIP_FILL_STROKE = BAND_CLIP_FILL | BAND_CLIP_STROKE;\n\n\tfunction strokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip) {\n\t\tsetCtxStyle(strokeStyle, lineWidth, lineDash, lineCap, fillStyle);\n\n\t\tif (boundsClip || gapsClip || bandClip) {\n\t\t\tctx.save();\n\t\t\tboundsClip && ctx.clip(boundsClip);\n\t\t\tgapsClip && ctx.clip(gapsClip);\n\t\t}\n\n\t\tif (bandClip) {\n\t\t\tif ((flags & CLIP_FILL_STROKE) == CLIP_FILL_STROKE) {\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tgapsClip2 && ctx.clip(gapsClip2);\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t\telse if (flags & BAND_CLIP_STROKE) {\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t\telse if (flags & BAND_CLIP_FILL) {\n\t\t\t\tctx.save();\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tgapsClip2 && ctx.clip(gapsClip2);\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tctx.restore();\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tdoFill(fillStyle, fillPath);\n\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t}\n\n\t\tif (boundsClip || gapsClip || bandClip)\n\t\t\tctx.restore();\n\t}\n\n\tfunction doStroke(strokeStyle, strokePath, lineWidth) {\n\t\tif (lineWidth > 0) {\n\t\t\tif (strokePath instanceof Map) {\n\t\t\t\tstrokePath.forEach((strokePath, strokeStyle) => {\n\t\t\t\t\tctx.strokeStyle = ctxStroke = strokeStyle;\n\t\t\t\t\tctx.stroke(strokePath);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse\n\t\t\t\tstrokePath != null && strokeStyle && ctx.stroke(strokePath);\n\t\t}\n\t}\n\n\tfunction doFill(fillStyle, fillPath) {\n\t\tif (fillPath instanceof Map) {\n\t\t\tfillPath.forEach((fillPath, fillStyle) => {\n\t\t\t\tctx.fillStyle = ctxFill = fillStyle;\n\t\t\t\tctx.fill(fillPath);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t\tfillPath != null && fillStyle && ctx.fill(fillPath);\n\t}\n\n\tfunction getIncrSpace(axisIdx, min, max, fullDim) {\n\t\tlet axis = axes[axisIdx];\n\n\t\tlet incrSpace;\n\n\t\tif (fullDim <= 0)\n\t\t\tincrSpace = [0, 0];\n\t\telse {\n\t\t\tlet minSpace = axis._space = axis.space(self, axisIdx, min, max, fullDim);\n\t\t\tlet incrs = axis._incrs = axis.incrs(self, axisIdx, min, max, fullDim, minSpace);\n\t\t\tincrSpace = findIncr(min, max, incrs, fullDim, minSpace);\n\t\t}\n\n\t\treturn (axis._found = incrSpace);\n\t}\n\n\tfunction drawOrthoLines(offs, filts, ori, side, pos0, len, width, stroke, dash, cap) {\n\t\tlet offset = (width % 2) / 2;\n\n\t\tpxAlign == 1 && ctx.translate(offset, offset);\n\n\t\tsetCtxStyle(stroke, width, dash, cap, stroke);\n\n\t\tctx.beginPath();\n\n\t\tlet x0, y0, x1, y1, pos1 = pos0 + (side == 0 || side == 3 ? -len : len);\n\n\t\tif (ori == 0) {\n\t\t\ty0 = pos0;\n\t\t\ty1 = pos1;\n\t\t}\n\t\telse {\n\t\t\tx0 = pos0;\n\t\t\tx1 = pos1;\n\t\t}\n\n\t\tfor (let i = 0; i < offs.length; i++) {\n\t\t\tif (filts[i] != null) {\n\t\t\t\tif (ori == 0)\n\t\t\t\t\tx0 = x1 = offs[i];\n\t\t\t\telse\n\t\t\t\t\ty0 = y1 = offs[i];\n\n\t\t\t\tctx.moveTo(x0, y0);\n\t\t\t\tctx.lineTo(x1, y1);\n\t\t\t}\n\t\t}\n\n\t\tctx.stroke();\n\n\t\tpxAlign == 1 && ctx.translate(-offset, -offset);\n\t}\n\n\tfunction axesCalc(cycleNum) {\n\t//\tlog(\"axesCalc()\", arguments);\n\n\t\tlet converged = true;\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (!axis.show)\n\t\t\t\treturn;\n\n\t\t\tlet scale = scales[axis.scale];\n\n\t\t\tif (scale.min == null) {\n\t\t\t\tif (axis._show) {\n\t\t\t\t\tconverged = false;\n\t\t\t\t\taxis._show = false;\n\t\t\t\t\tresetYSeries(false);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (!axis._show) {\n\t\t\t\t\tconverged = false;\n\t\t\t\t\taxis._show = true;\n\t\t\t\t\tresetYSeries(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet side = axis.side;\n\t\t\tlet ori = side % 2;\n\n\t\t\tlet {min, max} = scale;\t\t// \t\t// should this toggle them ._show = false\n\n\t\t\tlet [_incr, _space] = getIncrSpace(i, min, max, ori == 0 ? plotWidCss : plotHgtCss);\n\n\t\t\tif (_space == 0)\n\t\t\t\treturn;\n\n\t\t\t// if we're using index positions, force first tick to match passed index\n\t\t\tlet forceMin = scale.distr == 2;\n\n\t\t\tlet _splits = axis._splits = axis.splits(self, i, min, max, _incr, _space, forceMin);\n\n\t\t\t// tick labels\n\t\t\t// BOO this assumes a specific data/series\n\t\t\tlet splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits;\n\t\t\tlet incr = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr;\n\n\t\t\tlet values = axis._values = axis.values(self, axis.filter(self, splits, i, _space, incr), i, _space, incr);\n\n\t\t\t// rotating of labels only supported on bottom x axis\n\t\t\taxis._rotate = side == 2 ? axis.rotate(self, values, i, _space) : 0;\n\n\t\t\tlet oldSize = axis._size;\n\n\t\t\taxis._size = ceil(axis.size(self, values, i, cycleNum));\n\n\t\t\tif (oldSize != null && axis._size != oldSize)\t\t\t// ready && ?\n\t\t\t\tconverged = false;\n\t\t});\n\n\t\treturn converged;\n\t}\n\n\tfunction paddingCalc(cycleNum) {\n\t\tlet converged = true;\n\n\t\tpadding.forEach((p, i) => {\n\t\t\tlet _p = p(self, i, sidesWithAxes, cycleNum);\n\n\t\t\tif (_p != _padding[i])\n\t\t\t\tconverged = false;\n\n\t\t\t_padding[i] = _p;\n\t\t});\n\n\t\treturn converged;\n\t}\n\n\tfunction drawAxesGrid() {\n\t\tfor (let i = 0; i < axes.length; i++) {\n\t\t\tlet axis = axes[i];\n\n\t\t\tif (!axis.show || !axis._show)\n\t\t\t\tcontinue;\n\n\t\t\tlet side = axis.side;\n\t\t\tlet ori = side % 2;\n\n\t\t\tlet x, y;\n\n\t\t\tlet fillStyle = axis.stroke(self, i);\n\n\t\t\tlet shiftDir = side == 0 || side == 3 ? -1 : 1;\n\n\t\t\t// axis label\n\t\t\tif (axis.label) {\n\t\t\t\tlet shiftAmt = axis.labelGap * shiftDir;\n\t\t\t\tlet baseLpos = round((axis._lpos + shiftAmt) * pxRatio);\n\n\t\t\t\tsetFontStyle(axis.labelFont[0], fillStyle, \"center\", side == 2 ? TOP : BOTTOM);\n\n\t\t\t\tctx.save();\n\n\t\t\t\tif (ori == 1) {\n\t\t\t\t\tx = y = 0;\n\n\t\t\t\t\tctx.translate(\n\t\t\t\t\t\tbaseLpos,\n\t\t\t\t\t\tround(plotTop + plotHgt / 2),\n\t\t\t\t\t);\n\t\t\t\t\tctx.rotate((side == 3 ? -PI : PI) / 2);\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tx = round(plotLft + plotWid / 2);\n\t\t\t\t\ty = baseLpos;\n\t\t\t\t}\n\n\t\t\t\tctx.fillText(axis.label, x, y);\n\n\t\t\t\tctx.restore();\n\t\t\t}\n\n\t\t\tlet [_incr, _space] = axis._found;\n\n\t\t\tif (_space == 0)\n\t\t\t\tcontinue;\n\n\t\t\tlet scale = scales[axis.scale];\n\n\t\t\tlet plotDim = ori == 0 ? plotWid : plotHgt;\n\t\t\tlet plotOff = ori == 0 ? plotLft : plotTop;\n\n\t\t\tlet axisGap = round(axis.gap * pxRatio);\n\n\t\t\tlet _splits = axis._splits;\n\n\t\t\t// tick labels\n\t\t\t// BOO this assumes a specific data/series\n\t\t\tlet splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits;\n\t\t\tlet incr = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr;\n\n\t\t\tlet ticks = axis.ticks;\n\t\t\tlet border = axis.border;\n\t\t\tlet tickSize = ticks.show ? round(ticks.size * pxRatio) : 0;\n\n\t\t\t// rotating of labels only supported on bottom x axis\n\t\t\tlet angle = axis._rotate * -PI/180;\n\n\t\t\tlet basePos = pxRound(axis._pos * pxRatio);\n\t\t\tlet shiftAmt = (tickSize + axisGap) * shiftDir;\n\t\t\tlet finalPos = basePos + shiftAmt;\n\t\t\t y = ori == 0 ? finalPos : 0;\n\t\t\t x = ori == 1 ? finalPos : 0;\n\n\t\t\tlet font = axis.font[0];\n\t\t\tlet textAlign = axis.align == 1 ? LEFT :\n\t\t\t axis.align == 2 ? RIGHT :\n\t\t\t angle > 0 ? LEFT :\n\t\t\t angle < 0 ? RIGHT :\n\t\t\t ori == 0 ? \"center\" : side == 3 ? RIGHT : LEFT;\n\t\t\tlet textBaseline = angle ||\n\t\t\t ori == 1 ? \"middle\" : side == 2 ? TOP : BOTTOM;\n\n\t\t\tsetFontStyle(font, fillStyle, textAlign, textBaseline);\n\n\t\t\tlet lineHeight = axis.font[1] * lineMult;\n\n\t\t\tlet canOffs = _splits.map(val => pxRound(getPos(val, scale, plotDim, plotOff)));\n\n\t\t\tlet _values = axis._values;\n\n\t\t\tfor (let i = 0; i < _values.length; i++) {\n\t\t\t\tlet val = _values[i];\n\n\t\t\t\tif (val != null) {\n\t\t\t\t\tif (ori == 0)\n\t\t\t\t\t\tx = canOffs[i];\n\t\t\t\t\telse\n\t\t\t\t\t\ty = canOffs[i];\n\n\t\t\t\t\tval = \"\" + val;\n\n\t\t\t\t\tlet _parts = val.indexOf(\"\\n\") == -1 ? [val] : val.split(/\\n/gm);\n\n\t\t\t\t\tfor (let j = 0; j < _parts.length; j++) {\n\t\t\t\t\t\tlet text = _parts[j];\n\n\t\t\t\t\t\tif (angle) {\n\t\t\t\t\t\t\tctx.save();\n\t\t\t\t\t\t\tctx.translate(x, y + j * lineHeight); // can this be replaced with position math?\n\t\t\t\t\t\t\tctx.rotate(angle); // can this be done once?\n\t\t\t\t\t\t\tctx.fillText(text, 0, 0);\n\t\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tctx.fillText(text, x, y + j * lineHeight);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// ticks\n\t\t\tif (ticks.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\tcanOffs,\n\t\t\t\t\tticks.filter(self, splits, i, _space, incr),\n\t\t\t\t\tori,\n\t\t\t\t\tside,\n\t\t\t\t\tbasePos,\n\t\t\t\t\ttickSize,\n\t\t\t\t\troundDec(ticks.width * pxRatio, 3),\n\t\t\t\t\tticks.stroke(self, i),\n\t\t\t\t\tticks.dash,\n\t\t\t\t\tticks.cap,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// grid\n\t\t\tlet grid = axis.grid;\n\n\t\t\tif (grid.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\tcanOffs,\n\t\t\t\t\tgrid.filter(self, splits, i, _space, incr),\n\t\t\t\t\tori,\n\t\t\t\t\tori == 0 ? 2 : 1,\n\t\t\t\t\tori == 0 ? plotTop : plotLft,\n\t\t\t\t\tori == 0 ? plotHgt : plotWid,\n\t\t\t\t\troundDec(grid.width * pxRatio, 3),\n\t\t\t\t\tgrid.stroke(self, i),\n\t\t\t\t\tgrid.dash,\n\t\t\t\t\tgrid.cap,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (border.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\t[basePos],\n\t\t\t\t\t[1],\n\t\t\t\t\tori == 0 ? 1 : 0,\n\t\t\t\t\tori == 0 ? 1 : 2,\n\t\t\t\t\tori == 1 ? plotTop : plotLft,\n\t\t\t\t\tori == 1 ? plotHgt : plotWid,\n\t\t\t\t\troundDec(border.width * pxRatio, 3),\n\t\t\t\t\tborder.stroke(self, i),\n\t\t\t\t\tborder.dash,\n\t\t\t\t\tborder.cap,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfire(\"drawAxes\");\n\t}\n\n\tfunction resetYSeries(minMax) {\n\t//\tlog(\"resetYSeries()\", arguments);\n\n\t\tseries.forEach((s, i) => {\n\t\t\tif (i > 0) {\n\t\t\t\ts._paths = null;\n\n\t\t\t\tif (minMax) {\n\t\t\t\t\tif (mode == 1) {\n\t\t\t\t\t\ts.min = null;\n\t\t\t\t\t\ts.max = null;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\ts.facets.forEach(f => {\n\t\t\t\t\t\t\tf.min = null;\n\t\t\t\t\t\t\tf.max = null;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tlet queuedCommit = false;\n\n\tfunction commit() {\n\t\tif (!queuedCommit) {\n\t\t\tmicroTask(_commit);\n\t\t\tqueuedCommit = true;\n\t\t}\n\t}\n\n\tfunction _commit() {\n\t//\tlog(\"_commit()\", arguments);\n\n\t\tif (shouldSetScales) {\n\t\t\tsetScales();\n\t\t\tshouldSetScales = false;\n\t\t}\n\n\t\tif (shouldConvergeSize) {\n\t\t\tconvergeSize();\n\t\t\tshouldConvergeSize = false;\n\t\t}\n\n\t\tif (shouldSetSize) {\n\t\t\tsetStylePx(under, LEFT, plotLftCss);\n\t\t\tsetStylePx(under, TOP, plotTopCss);\n\t\t\tsetStylePx(under, WIDTH, plotWidCss);\n\t\t\tsetStylePx(under, HEIGHT, plotHgtCss);\n\n\t\t\tsetStylePx(over, LEFT, plotLftCss);\n\t\t\tsetStylePx(over, TOP, plotTopCss);\n\t\t\tsetStylePx(over, WIDTH, plotWidCss);\n\t\t\tsetStylePx(over, HEIGHT, plotHgtCss);\n\n\t\t\tsetStylePx(wrap, WIDTH, fullWidCss);\n\t\t\tsetStylePx(wrap, HEIGHT, fullHgtCss);\n\n\t\t\t// NOTE: mutating this during print preview in Chrome forces transparent\n\t\t\t// canvas pixels to white, even when followed up with clearRect() below\n\t\t\tcan.width = round(fullWidCss * pxRatio);\n\t\t\tcan.height = round(fullHgtCss * pxRatio);\n\n\t\t\taxes.forEach(({ _el, _show, _size, _pos, side }) => {\n\t\t\t\tif (_el != null) {\n\t\t\t\t\tif (_show) {\n\t\t\t\t\t\tlet posOffset = (side === 3 || side === 0 ? _size : 0);\n\t\t\t\t\t\tlet isVt = side % 2 == 1;\n\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"left\" : \"top\", _pos - posOffset);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"width\" : \"height\", _size);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"top\" : \"left\", isVt ? plotTopCss : plotLftCss);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"height\" : \"width\", isVt ? plotHgtCss : plotWidCss);\n\n\t\t\t\t\t\tremClass(_el, OFF);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\taddClass(_el, OFF);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// invalidate ctx style cache\n\t\t\tctxStroke = ctxFill = ctxWidth = ctxJoin = ctxCap = ctxFont = ctxAlign = ctxBaseline = ctxDash = null;\n\t\t\tctxAlpha = 1;\n\n\t\t\tsyncRect(true);\n\n\t\t\tfire(\"setSize\");\n\n\t\t\tshouldSetSize = false;\n\t\t}\n\n\t\tif (fullWidCss > 0 && fullHgtCss > 0) {\n\t\t\tctx.clearRect(0, 0, can.width, can.height);\n\t\t\tfire(\"drawClear\");\n\t\t\tdrawOrder.forEach(fn => fn());\n\t\t\tfire(\"draw\");\n\t\t}\n\n\t//\tif (shouldSetSelect) {\n\t\t// TODO: update .u-select metrics (if visible)\n\t\t//\tsetStylePx(selectDiv, TOP, select.top = 0);\n\t\t//\tsetStylePx(selectDiv, LEFT, select.left = 0);\n\t\t//\tsetStylePx(selectDiv, WIDTH, select.width = 0);\n\t\t//\tsetStylePx(selectDiv, HEIGHT, select.height = 0);\n\t\t//\tshouldSetSelect = false;\n\t//\t}\n\n\t\tif (cursor.show && shouldSetCursor) {\n\t\t\tupdateCursor(null, true, false);\n\t\t\tshouldSetCursor = false;\n\t\t}\n\n\t//\tif (FEAT_LEGEND && legend.show && legend.live && shouldSetLegend) {}\n\n\t\tif (!ready) {\n\t\t\tready = true;\n\t\t\tself.status = 1;\n\n\t\t\tfire(\"ready\");\n\t\t}\n\n\t\tviaAutoScaleX = false;\n\n\t\tqueuedCommit = false;\n\t}\n\n\tself.redraw = (rebuildPaths, recalcAxes) => {\n\t\tshouldConvergeSize = recalcAxes || false;\n\n\t\tif (rebuildPaths !== false)\n\t\t\t_setScale(xScaleKey, scaleX.min, scaleX.max);\n\t\telse\n\t\t\tcommit();\n\t};\n\n\t// redraw() => setScale('x', scales.x.min, scales.x.max);\n\n\t// explicit, never re-ranged (is this actually true? for x and y)\n\tfunction setScale(key, opts) {\n\t\tlet sc = scales[key];\n\n\t\tif (sc.from == null) {\n\t\t\tif (dataLen == 0) {\n\t\t\t\tlet minMax = sc.range(self, opts.min, opts.max, key);\n\t\t\t\topts.min = minMax[0];\n\t\t\t\topts.max = minMax[1];\n\t\t\t}\n\n\t\t\tif (opts.min > opts.max) {\n\t\t\t\tlet _min = opts.min;\n\t\t\t\topts.min = opts.max;\n\t\t\t\topts.max = _min;\n\t\t\t}\n\n\t\t\tif (dataLen > 1 && opts.min != null && opts.max != null && opts.max - opts.min < 1e-16)\n\t\t\t\treturn;\n\n\t\t\tif (key == xScaleKey) {\n\t\t\t\tif (sc.distr == 2 && dataLen > 0) {\n\t\t\t\t\topts.min = closestIdx(opts.min, data[0]);\n\t\t\t\t\topts.max = closestIdx(opts.max, data[0]);\n\n\t\t\t\t\tif (opts.min == opts.max)\n\t\t\t\t\t\topts.max++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t//\tlog(\"setScale()\", arguments);\n\n\t\t\tpendScales[key] = opts;\n\n\t\t\tshouldSetScales = true;\n\t\t\tcommit();\n\t\t}\n\t}\n\n\tself.setScale = setScale;\n\n//\tINTERACTION\n\n\tlet xCursor;\n\tlet yCursor;\n\tlet vCursor;\n\tlet hCursor;\n\n\t// starting position before cursor.move\n\tlet rawMouseLeft0;\n\tlet rawMouseTop0;\n\n\t// starting position\n\tlet mouseLeft0;\n\tlet mouseTop0;\n\n\t// current position before cursor.move\n\tlet rawMouseLeft1;\n\tlet rawMouseTop1;\n\n\t// current position\n\tlet mouseLeft1;\n\tlet mouseTop1;\n\n\tlet dragging = false;\n\n\tconst drag = cursor.drag;\n\n\tlet dragX = drag.x;\n\tlet dragY = drag.y;\n\n\tif (cursor.show) {\n\t\tif (cursor.x)\n\t\t\txCursor = placeDiv(CURSOR_X, over);\n\t\tif (cursor.y)\n\t\t\tyCursor = placeDiv(CURSOR_Y, over);\n\n\t\tif (scaleX.ori == 0) {\n\t\t\tvCursor = xCursor;\n\t\t\thCursor = yCursor;\n\t\t}\n\t\telse {\n\t\t\tvCursor = yCursor;\n\t\t\thCursor = xCursor;\n\t\t}\n\n\t\tmouseLeft1 = cursor.left;\n\t\tmouseTop1 = cursor.top;\n\t}\n\n\tconst select = self.select = assign({\n\t\tshow: true,\n\t\tover: true,\n\t\tleft: 0,\n\t\twidth: 0,\n\t\ttop: 0,\n\t\theight: 0,\n\t}, opts.select);\n\n\tconst selectDiv = select.show ? placeDiv(SELECT, select.over ? over : under) : null;\n\n\tfunction setSelect(opts, _fire) {\n\t\tif (select.show) {\n\t\t\tfor (let prop in opts)\n\t\t\t\tsetStylePx(selectDiv, prop, select[prop] = opts[prop]);\n\n\t\t\t_fire !== false && fire(\"setSelect\");\n\t\t}\n\t}\n\n\tself.setSelect = setSelect;\n\n\tfunction toggleDOM(i, onOff) {\n\t\tlet s = series[i];\n\t\tlet label = showLegend ? legendRows[i] : null;\n\n\t\tif (s.show)\n\t\t\tlabel && remClass(label, OFF);\n\t\telse {\n\t\t\tlabel && addClass(label, OFF);\n\t\t\tcursorPts.length > 1 && elTrans(cursorPts[i], -10, -10, plotWidCss, plotHgtCss);\n\t\t}\n\t}\n\n\tfunction _setScale(key, min, max) {\n\t\tsetScale(key, {min, max});\n\t}\n\n\tfunction setSeries(i, opts, _fire, _pub) {\n\t//\tlog(\"setSeries()\", arguments);\n\n\t\tif (opts.focus != null)\n\t\t\tsetFocus(i);\n\n\t\tif (opts.show != null) {\n\t\t\tseries.forEach((s, si) => {\n\t\t\t\tif (si > 0 && (i == si || i == null)) {\n\t\t\t\t\ts.show = opts.show;\n\t\t\t\t\ttoggleDOM(si, opts.show);\n\n\t\t\t\t\t_setScale(mode == 2 ? s.facets[1].scale : s.scale, null, null);\n\t\t\t\t\tcommit();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t_fire !== false && fire(\"setSeries\", i, opts);\n\n\t\t_pub && pubSync(\"setSeries\", self, i, opts);\n\t}\n\n\tself.setSeries = setSeries;\n\n\tfunction setBand(bi, opts) {\n\t\tassign(bands[bi], opts);\n\t}\n\n\tfunction addBand(opts, bi) {\n\t\topts.fill = fnOrSelf(opts.fill || null);\n\t\topts.dir = ifNull(opts.dir, -1);\n\t\tbi = bi == null ? bands.length : bi;\n\t\tbands.splice(bi, 0, opts);\n\t}\n\n\tfunction delBand(bi) {\n\t\tif (bi == null)\n\t\t\tbands.length = 0;\n\t\telse\n\t\t\tbands.splice(bi, 1);\n\t}\n\n\tself.addBand = addBand;\n\tself.setBand = setBand;\n\tself.delBand = delBand;\n\n\tfunction setAlpha(i, value) {\n\t\tseries[i].alpha = value;\n\n\t\tif (cursor.show && cursorPts[i])\n\t\t\tcursorPts[i].style.opacity = value;\n\n\t\tif (showLegend && legendRows[i])\n\t\t\tlegendRows[i].style.opacity = value;\n\t}\n\n\t// y-distance\n\tlet closestDist;\n\tlet closestSeries;\n\tlet focusedSeries;\n\tconst FOCUS_TRUE = {focus: true};\n\n\tfunction setFocus(i) {\n\t\tif (i != focusedSeries) {\n\t\t//\tlog(\"setFocus()\", arguments);\n\n\t\t\tlet allFocused = i == null;\n\n\t\t\tlet _setAlpha = focus.alpha != 1;\n\n\t\t\tseries.forEach((s, i2) => {\n\t\t\t\tlet isFocused = allFocused || i2 == 0 || i2 == i;\n\t\t\t\ts._focus = allFocused ? null : isFocused;\n\t\t\t\t_setAlpha && setAlpha(i2, isFocused ? 1 : focus.alpha);\n\t\t\t});\n\n\t\t\tfocusedSeries = i;\n\t\t\t_setAlpha && commit();\n\t\t}\n\t}\n\n\tif (showLegend && cursorFocus) {\n\t\ton(mouseleave, legendEl, e => {\n\t\t\tif (cursor._lock)\n\t\t\t\treturn;\n\n\t\t\tif (focusedSeries != null)\n\t\t\t\tsetSeries(null, FOCUS_TRUE, true, syncOpts.setSeries);\n\t\t});\n\t}\n\n\tfunction posToVal(pos, scale, can) {\n\t\tlet sc = scales[scale];\n\n\t\tif (can)\n\t\t\tpos = pos / pxRatio - (sc.ori == 1 ? plotTopCss : plotLftCss);\n\n\t\tlet dim = plotWidCss;\n\n\t\tif (sc.ori == 1) {\n\t\t\tdim = plotHgtCss;\n\t\t\tpos = dim - pos;\n\t\t}\n\n\t\tif (sc.dir == -1)\n\t\t\tpos = dim - pos;\n\n\t\tlet _min = sc._min,\n\t\t\t_max = sc._max,\n\t\t\tpct = pos / dim;\n\n\t\tlet sv = _min + (_max - _min) * pct;\n\n\t\tlet distr = sc.distr;\n\n\t\treturn (\n\t\t\tdistr == 3 ? pow(10, sv) :\n\t\t\tdistr == 4 ? sinh(sv, sc.asinh) :\n\t\t\tsv\n\t\t);\n\t}\n\n\tfunction closestIdxFromXpos(pos, can) {\n\t\tlet v = posToVal(pos, xScaleKey, can);\n\t\treturn closestIdx(v, data[0], i0, i1);\n\t}\n\n\tself.valToIdx = val => closestIdx(val, data[0]);\n\tself.posToIdx = closestIdxFromXpos;\n\tself.posToVal = posToVal;\n\tself.valToPos = (val, scale, can) => (\n\t\tscales[scale].ori == 0 ?\n\t\tgetHPos(val, scales[scale],\n\t\t\tcan ? plotWid : plotWidCss,\n\t\t\tcan ? plotLft : 0,\n\t\t) :\n\t\tgetVPos(val, scales[scale],\n\t\t\tcan ? plotHgt : plotHgtCss,\n\t\t\tcan ? plotTop : 0,\n\t\t)\n\t);\n\n\t// defers calling expensive functions\n\tfunction batch(fn) {\n\t\tfn(self);\n\t\tcommit();\n\t}\n\n\tself.batch = batch;\n\n\t(self.setCursor = (opts, _fire, _pub) => {\n\t\tmouseLeft1 = opts.left;\n\t\tmouseTop1 = opts.top;\n\t//\tassign(cursor, opts);\n\t\tupdateCursor(null, _fire, _pub);\n\t});\n\n\tfunction setSelH(off, dim) {\n\t\tsetStylePx(selectDiv, LEFT, select.left = off);\n\t\tsetStylePx(selectDiv, WIDTH, select.width = dim);\n\t}\n\n\tfunction setSelV(off, dim) {\n\t\tsetStylePx(selectDiv, TOP, select.top = off);\n\t\tsetStylePx(selectDiv, HEIGHT, select.height = dim);\n\t}\n\n\tlet setSelX = scaleX.ori == 0 ? setSelH : setSelV;\n\tlet setSelY = scaleX.ori == 1 ? setSelH : setSelV;\n\n\tfunction syncLegend() {\n\t\tif (showLegend && legend.live) {\n\t\t\tfor (let i = mode == 2 ? 1 : 0; i < series.length; i++) {\n\t\t\t\tif (i == 0 && multiValLegend)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlet vals = legend.values[i];\n\n\t\t\t\tlet j = 0;\n\n\t\t\t\tfor (let k in vals)\n\t\t\t\t\tlegendCells[i][j++].firstChild.nodeValue = vals[k];\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setLegend(opts, _fire) {\n\t\tif (opts != null) {\n\t\t\tlet idx = opts.idx;\n\n\t\t\tlegend.idx = idx;\n\t\t\tseries.forEach((s, sidx) => {\n\t\t\t\t(sidx > 0 || !multiValLegend) && setLegendValues(sidx, idx);\n\t\t\t});\n\t\t}\n\n\t\tif (showLegend && legend.live)\n\t\t\tsyncLegend();\n\n\t\tshouldSetLegend = false;\n\n\t\t_fire !== false && fire(\"setLegend\");\n\t}\n\n\tself.setLegend = setLegend;\n\n\tfunction setLegendValues(sidx, idx) {\n\t\tlet val;\n\n\t\tif (idx == null)\n\t\t\tval = NULL_LEGEND_VALUES;\n\t\telse {\n\t\t\tlet s = series[sidx];\n\t\t\tlet src = sidx == 0 && xScaleDistr == 2 ? data0 : data[sidx];\n\t\t\tval = multiValLegend ? s.values(self, sidx, idx) : {_: s.value(self, src[idx], sidx, idx)};\n\t\t}\n\n\t\tlegend.values[sidx] = val;\n\t}\n\n\tfunction updateCursor(src, _fire, _pub) {\n\t//\tts == null && log(\"updateCursor()\", arguments);\n\n\t\trawMouseLeft1 = mouseLeft1;\n\t\trawMouseTop1 = mouseTop1;\n\n\t\t[mouseLeft1, mouseTop1] = cursor.move(self, mouseLeft1, mouseTop1);\n\n\t\tif (cursor.show) {\n\t\t\tvCursor && elTrans(vCursor, round(mouseLeft1), 0, plotWidCss, plotHgtCss);\n\t\t\thCursor && elTrans(hCursor, 0, round(mouseTop1), plotWidCss, plotHgtCss);\n\t\t}\n\n\t\tlet idx;\n\n\t\t// when zooming to an x scale range between datapoints the binary search\n\t\t// for nearest min/max indices results in this condition. cheap hack :D\n\t\tlet noDataInRange = i0 > i1; // works for mode 1 only\n\n\t\tclosestDist = inf;\n\n\t\t// TODO: extract\n\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss;\n\t\tlet yDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss;\n\n\t\t// if cursor hidden, hide points & clear legend vals\n\t\tif (mouseLeft1 < 0 || dataLen == 0 || noDataInRange) {\n\t\t\tidx = null;\n\n\t\t\tfor (let i = 0; i < series.length; i++) {\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tcursorPts.length > 1 && elTrans(cursorPts[i], -10, -10, plotWidCss, plotHgtCss);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (cursorFocus)\n\t\t\t\tsetSeries(null, FOCUS_TRUE, true, src == null && syncOpts.setSeries);\n\n\t\t\tif (legend.live) {\n\t\t\t\tactiveIdxs.fill(null);\n\t\t\t\tshouldSetLegend = true;\n\n\t\t\t\tfor (let i = 0; i < series.length; i++)\n\t\t\t\t\tlegend.values[i] = NULL_LEGEND_VALUES;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t//\tlet pctY = 1 - (y / rect.height);\n\n\t\t\tlet mouseXPos, valAtPosX, xPos;\n\n\t\t\tif (mode == 1) {\n\t\t\t\tmouseXPos = scaleX.ori == 0 ? mouseLeft1 : mouseTop1;\n\t\t\t\tvalAtPosX = posToVal(mouseXPos, xScaleKey);\n\t\t\t\tidx = closestIdx(valAtPosX, data[0], i0, i1);\n\t\t\t\txPos = incrRoundUp(valToPosX(data[0][idx], scaleX, xDim, 0), 0.5);\n\t\t\t}\n\n\t\t\tfor (let i = mode == 2 ? 1 : 0; i < series.length; i++) {\n\t\t\t\tlet s = series[i];\n\n\t\t\t\tlet idx1 = activeIdxs[i];\n\t\t\t\tlet yVal1 = mode == 1 ? data[i][idx1] : data[i][1][idx1];\n\n\t\t\t\tlet idx2 = cursor.dataIdx(self, i, idx, valAtPosX);\n\t\t\t\tlet yVal2 = mode == 1 ? data[i][idx2] : data[i][1][idx2];\n\n\t\t\t\tshouldSetLegend = shouldSetLegend || yVal2 != yVal1 || idx2 != idx1;\n\n\t\t\t\tactiveIdxs[i] = idx2;\n\n\t\t\t\tlet xPos2 = idx2 == idx ? xPos : incrRoundUp(valToPosX(mode == 1 ? data[0][idx2] : data[i][0][idx2], scaleX, xDim, 0), 0.5);\n\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tlet yPos = yVal2 == null ? -10 : incrRoundUp(valToPosY(yVal2, mode == 1 ? scales[s.scale] : scales[s.facets[1].scale], yDim, 0), 0.5);\n\n\t\t\t\t\tif (yPos > 0 && mode == 1) {\n\t\t\t\t\t\tlet dist = abs(yPos - mouseTop1);\n\n\t\t\t\t\t\tif (dist <= closestDist) {\n\t\t\t\t\t\t\tclosestDist = dist;\n\t\t\t\t\t\t\tclosestSeries = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet hPos, vPos;\n\n\t\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\t\thPos = xPos2;\n\t\t\t\t\t\tvPos = yPos;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\thPos = yPos;\n\t\t\t\t\t\tvPos = xPos2;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (shouldSetLegend && cursorPts.length > 1) {\n\t\t\t\t\t\telColor(cursorPts[i], cursor.points.fill(self, i), cursor.points.stroke(self, i));\n\n\t\t\t\t\t\tlet ptWid, ptHgt, ptLft, ptTop,\n\t\t\t\t\t\t\tcentered = true,\n\t\t\t\t\t\t\tgetBBox = cursor.points.bbox;\n\n\t\t\t\t\t\tif (getBBox != null) {\n\t\t\t\t\t\t\tcentered = false;\n\n\t\t\t\t\t\t\tlet bbox = getBBox(self, i);\n\n\t\t\t\t\t\t\tptLft = bbox.left;\n\t\t\t\t\t\t\tptTop = bbox.top;\n\t\t\t\t\t\t\tptWid = bbox.width;\n\t\t\t\t\t\t\tptHgt = bbox.height;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tptLft = hPos;\n\t\t\t\t\t\t\tptTop = vPos;\n\t\t\t\t\t\t\tptWid = ptHgt = cursor.points.size(self, i);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\telSize(cursorPts[i], ptWid, ptHgt, centered);\n\t\t\t\t\t\telTrans(cursorPts[i], ptLft, ptTop, plotWidCss, plotHgtCss);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (legend.live) {\n\t\t\t\t\tif (!shouldSetLegend || i == 0 && multiValLegend)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tsetLegendValues(i, idx2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcursor.idx = idx;\n\t\tcursor.left = mouseLeft1;\n\t\tcursor.top = mouseTop1;\n\n\t\tif (shouldSetLegend) {\n\t\t\tlegend.idx = idx;\n\t\t\tsetLegend();\n\t\t}\n\n\t\t// nit: cursor.drag.setSelect is assumed always true\n\t\tif (select.show && dragging) {\n\t\t\tif (src != null) {\n\t\t\t\tlet [xKey, yKey] = syncOpts.scales;\n\t\t\t\tlet [matchXKeys, matchYKeys] = syncOpts.match;\n\t\t\t\tlet [xKeySrc, yKeySrc] = src.cursor.sync.scales;\n\n\t\t\t\t// match the dragX/dragY implicitness/explicitness of src\n\t\t\t\tlet sdrag = src.cursor.drag;\n\t\t\t\tdragX = sdrag._x;\n\t\t\t\tdragY = sdrag._y;\n\n\t\t\t\tif (dragX || dragY) {\n\t\t\t\t\tlet { left, top, width, height } = src.select;\n\n\t\t\t\t\tlet sori = src.scales[xKey].ori;\n\t\t\t\t\tlet sPosToVal = src.posToVal;\n\n\t\t\t\t\tlet sOff, sDim, sc, a, b;\n\n\t\t\t\t\tlet matchingX = xKey != null && matchXKeys(xKey, xKeySrc);\n\t\t\t\t\tlet matchingY = yKey != null && matchYKeys(yKey, yKeySrc);\n\n\t\t\t\t\tif (matchingX && dragX) {\n\t\t\t\t\t\tif (sori == 0) {\n\t\t\t\t\t\t\tsOff = left;\n\t\t\t\t\t\t\tsDim = width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsOff = top;\n\t\t\t\t\t\t\tsDim = height;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc = scales[xKey];\n\n\t\t\t\t\t\ta = valToPosX(sPosToVal(sOff, xKeySrc), sc, xDim, 0);\n\t\t\t\t\t\tb = valToPosX(sPosToVal(sOff + sDim, xKeySrc), sc, xDim, 0);\n\n\t\t\t\t\t\tsetSelX(min(a,b), abs(b-a));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsetSelX(0, xDim);\n\n\t\t\t\t\tif (matchingY && dragY) {\n\t\t\t\t\t\tif (sori == 1) {\n\t\t\t\t\t\t\tsOff = left;\n\t\t\t\t\t\t\tsDim = width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsOff = top;\n\t\t\t\t\t\t\tsDim = height;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc = scales[yKey];\n\n\t\t\t\t\t\ta = valToPosY(sPosToVal(sOff, yKeySrc), sc, yDim, 0);\n\t\t\t\t\t\tb = valToPosY(sPosToVal(sOff + sDim, yKeySrc), sc, yDim, 0);\n\n\t\t\t\t\t\tsetSelY(min(a,b), abs(b-a));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsetSelY(0, yDim);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\thideSelect();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet rawDX = abs(rawMouseLeft1 - rawMouseLeft0);\n\t\t\t\tlet rawDY = abs(rawMouseTop1 - rawMouseTop0);\n\n\t\t\t\tif (scaleX.ori == 1) {\n\t\t\t\t\tlet _rawDX = rawDX;\n\t\t\t\t\trawDX = rawDY;\n\t\t\t\t\trawDY = _rawDX;\n\t\t\t\t}\n\n\t\t\t\tdragX = drag.x && rawDX >= drag.dist;\n\t\t\t\tdragY = drag.y && rawDY >= drag.dist;\n\n\t\t\t\tlet uni = drag.uni;\n\n\t\t\t\tif (uni != null) {\n\t\t\t\t\t// only calc drag status if they pass the dist thresh\n\t\t\t\t\tif (dragX && dragY) {\n\t\t\t\t\t\tdragX = rawDX >= uni;\n\t\t\t\t\t\tdragY = rawDY >= uni;\n\n\t\t\t\t\t\t// force unidirectionality when both are under uni limit\n\t\t\t\t\t\tif (!dragX && !dragY) {\n\t\t\t\t\t\t\tif (rawDY > rawDX)\n\t\t\t\t\t\t\t\tdragY = true;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tdragX = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (drag.x && drag.y && (dragX || dragY))\n\t\t\t\t\t// if omni with no uni then both dragX / dragY should be true if either is true\n\t\t\t\t\tdragX = dragY = true;\n\n\t\t\t\tlet p0, p1;\n\n\t\t\t\tif (dragX) {\n\t\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\t\tp0 = mouseLeft0;\n\t\t\t\t\t\tp1 = mouseLeft1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp0 = mouseTop0;\n\t\t\t\t\t\tp1 = mouseTop1;\n\t\t\t\t\t}\n\n\t\t\t\t\tsetSelX(min(p0, p1), abs(p1 - p0));\n\n\t\t\t\t\tif (!dragY)\n\t\t\t\t\t\tsetSelY(0, yDim);\n\t\t\t\t}\n\n\t\t\t\tif (dragY) {\n\t\t\t\t\tif (scaleX.ori == 1) {\n\t\t\t\t\t\tp0 = mouseLeft0;\n\t\t\t\t\t\tp1 = mouseLeft1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp0 = mouseTop0;\n\t\t\t\t\t\tp1 = mouseTop1;\n\t\t\t\t\t}\n\n\t\t\t\t\tsetSelY(min(p0, p1), abs(p1 - p0));\n\n\t\t\t\t\tif (!dragX)\n\t\t\t\t\t\tsetSelX(0, xDim);\n\t\t\t\t}\n\n\t\t\t\t// the drag didn't pass the dist requirement\n\t\t\t\tif (!dragX && !dragY) {\n\t\t\t\t\tsetSelX(0, 0);\n\t\t\t\t\tsetSelY(0, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdrag._x = dragX;\n\t\tdrag._y = dragY;\n\n\t\tif (src == null) {\n\t\t\tif (_pub) {\n\t\t\t\tif (syncKey != null) {\n\t\t\t\t\tlet [xSyncKey, ySyncKey] = syncOpts.scales;\n\n\t\t\t\t\tsyncOpts.values[0] = xSyncKey != null ? posToVal(scaleX.ori == 0 ? mouseLeft1 : mouseTop1, xSyncKey) : null;\n\t\t\t\t\tsyncOpts.values[1] = ySyncKey != null ? posToVal(scaleX.ori == 1 ? mouseLeft1 : mouseTop1, ySyncKey) : null;\n\t\t\t\t}\n\n\t\t\t\tpubSync(mousemove, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, idx);\n\t\t\t}\n\n\t\t\tif (cursorFocus) {\n\t\t\t\tlet shouldPub = _pub && syncOpts.setSeries;\n\t\t\t\tlet p = focus.prox;\n\n\t\t\t\tif (focusedSeries == null) {\n\t\t\t\t\tif (closestDist <= p)\n\t\t\t\t\t\tsetSeries(closestSeries, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (closestDist > p)\n\t\t\t\t\t\tsetSeries(null, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t\telse if (closestSeries != focusedSeries)\n\t\t\t\t\t\tsetSeries(closestSeries, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tready && _fire !== false && fire(\"setCursor\");\n\t}\n\n\tlet rect = null;\n\n\tfunction syncRect(defer) {\n\t\tif (defer === true)\n\t\t\trect = null;\n\t\telse {\n\t\t\trect = over.getBoundingClientRect();\n\t\t\tfire(\"syncRect\", rect);\n\t\t}\n\t}\n\n\tfunction mouseMove(e, src, _l, _t, _w, _h, _i) {\n\t\tif (cursor._lock)\n\t\t\treturn;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, false, e != null);\n\n\t\tif (e != null)\n\t\t\tupdateCursor(null, true, true);\n\t\telse\n\t\t\tupdateCursor(src, true, false);\n\t}\n\n\tfunction cacheMouse(e, src, _l, _t, _w, _h, _i, initial, snap) {\n\t\tif (rect == null)\n\t\t\tsyncRect(false);\n\n\t\tif (e != null) {\n\t\t\t_l = e.clientX - rect.left;\n\t\t\t_t = e.clientY - rect.top;\n\t\t}\n\t\telse {\n\t\t\tif (_l < 0 || _t < 0) {\n\t\t\t\tmouseLeft1 = -10;\n\t\t\t\tmouseTop1 = -10;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet [xKey, yKey] = syncOpts.scales;\n\n\t\t\tlet syncOptsSrc = src.cursor.sync;\n\t\t\tlet [xValSrc, yValSrc] = syncOptsSrc.values;\n\t\t\tlet [xKeySrc, yKeySrc] = syncOptsSrc.scales;\n\t\t\tlet [matchXKeys, matchYKeys] = syncOpts.match;\n\n\t\t\tlet rotSrc = src.axes[0].side % 2 == 1;\n\n\t\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss,\n\t\t\t\tyDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss,\n\t\t\t\t_xDim = rotSrc ? _h : _w,\n\t\t\t\t_yDim = rotSrc ? _w : _h,\n\t\t\t\t_xPos = rotSrc ? _t : _l,\n\t\t\t\t_yPos = rotSrc ? _l : _t;\n\n\t\t\tif (xKeySrc != null)\n\t\t\t\t_l = matchXKeys(xKey, xKeySrc) ? getPos(xValSrc, scales[xKey], xDim, 0) : -10;\n\t\t\telse\n\t\t\t\t_l = xDim * (_xPos/_xDim);\n\n\t\t\tif (yKeySrc != null)\n\t\t\t\t_t = matchYKeys(yKey, yKeySrc) ? getPos(yValSrc, scales[yKey], yDim, 0) : -10;\n\t\t\telse\n\t\t\t\t_t = yDim * (_yPos/_yDim);\n\n\t\t\tif (scaleX.ori == 1) {\n\t\t\t\tlet __l = _l;\n\t\t\t\t_l = _t;\n\t\t\t\t_t = __l;\n\t\t\t}\n\t\t}\n\n\t\tif (snap) {\n\t\t\tif (_l <= 1 || _l >= plotWidCss - 1)\n\t\t\t\t_l = incrRound(_l, plotWidCss);\n\n\t\t\tif (_t <= 1 || _t >= plotHgtCss - 1)\n\t\t\t\t_t = incrRound(_t, plotHgtCss);\n\t\t}\n\n\t\tif (initial) {\n\t\t\trawMouseLeft0 = _l;\n\t\t\trawMouseTop0 = _t;\n\n\t\t\t[mouseLeft0, mouseTop0] = cursor.move(self, _l, _t);\n\t\t}\n\t\telse {\n\t\t\tmouseLeft1 = _l;\n\t\t\tmouseTop1 = _t;\n\t\t}\n\t}\n\n\tconst _hideProps = {\n\t\twidth: 0,\n\t\theight: 0,\n\t};\n\n\tfunction hideSelect() {\n\t\tsetSelect(_hideProps, false);\n\t}\n\n\tfunction mouseDown(e, src, _l, _t, _w, _h, _i) {\n\t\tdragging = true;\n\t\tdragX = dragY = drag._x = drag._y = false;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, true, false);\n\n\t\tif (e != null) {\n\t\t\tonMouse(mouseup, doc, mouseUp);\n\t\t\tpubSync(mousedown, self, mouseLeft0, mouseTop0, plotWidCss, plotHgtCss, null);\n\t\t}\n\t}\n\n\tfunction mouseUp(e, src, _l, _t, _w, _h, _i) {\n\t\tdragging = drag._x = drag._y = false;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, false, true);\n\n\t\tlet { left, top, width, height } = select;\n\n\t\tlet hasSelect = width > 0 || height > 0;\n\n\t\thasSelect && setSelect(select);\n\n\t\tif (drag.setScale && hasSelect) {\n\t\t//\tif (syncKey != null) {\n\t\t//\t\tdragX = drag.x;\n\t\t//\t\tdragY = drag.y;\n\t\t//\t}\n\n\t\t\tlet xOff = left,\n\t\t\t\txDim = width,\n\t\t\t\tyOff = top,\n\t\t\t\tyDim = height;\n\n\t\t\tif (scaleX.ori == 1) {\n\t\t\t\txOff = top,\n\t\t\t\txDim = height,\n\t\t\t\tyOff = left,\n\t\t\t\tyDim = width;\n\t\t\t}\n\n\t\t\tif (dragX) {\n\t\t\t\t_setScale(xScaleKey,\n\t\t\t\t\tposToVal(xOff, xScaleKey),\n\t\t\t\t\tposToVal(xOff + xDim, xScaleKey)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (dragY) {\n\t\t\t\tfor (let k in scales) {\n\t\t\t\t\tlet sc = scales[k];\n\n\t\t\t\t\tif (k != xScaleKey && sc.from == null && sc.min != inf) {\n\t\t\t\t\t\t_setScale(k,\n\t\t\t\t\t\t\tposToVal(yOff + yDim, k),\n\t\t\t\t\t\t\tposToVal(yOff, k)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thideSelect();\n\t\t}\n\t\telse if (cursor.lock) {\n\t\t\tcursor._lock = !cursor._lock;\n\n\t\t\tif (!cursor._lock)\n\t\t\t\tupdateCursor(null, true, false);\n\t\t}\n\n\t\tif (e != null) {\n\t\t\toffMouse(mouseup, doc);\n\t\t\tpubSync(mouseup, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);\n\t\t}\n\t}\n\n\tfunction mouseLeave(e, src, _l, _t, _w, _h, _i) {\n\t\tif (!cursor._lock) {\n\t\t\tlet _dragging = dragging;\n\n\t\t\tif (dragging) {\n\t\t\t\t// handle case when mousemove aren't fired all the way to edges by browser\n\t\t\t\tlet snapH = true;\n\t\t\t\tlet snapV = true;\n\t\t\t\tlet snapProx = 10;\n\n\t\t\t\tlet dragH, dragV;\n\n\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\tdragH = dragX;\n\t\t\t\t\tdragV = dragY;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdragH = dragY;\n\t\t\t\t\tdragV = dragX;\n\t\t\t\t}\n\n\t\t\t\tif (dragH && dragV) {\n\t\t\t\t\t// maybe omni corner snap\n\t\t\t\t\tsnapH = mouseLeft1 <= snapProx || mouseLeft1 >= plotWidCss - snapProx;\n\t\t\t\t\tsnapV = mouseTop1 <= snapProx || mouseTop1 >= plotHgtCss - snapProx;\n\t\t\t\t}\n\n\t\t\t\tif (dragH && snapH)\n\t\t\t\t\tmouseLeft1 = mouseLeft1 < mouseLeft0 ? 0 : plotWidCss;\n\n\t\t\t\tif (dragV && snapV)\n\t\t\t\t\tmouseTop1 = mouseTop1 < mouseTop0 ? 0 : plotHgtCss;\n\n\t\t\t\tupdateCursor(null, true, true);\n\n\t\t\t\tdragging = false;\n\t\t\t}\n\n\t\t\tmouseLeft1 = -10;\n\t\t\tmouseTop1 = -10;\n\n\t\t\t// passing a non-null timestamp to force sync/mousemove event\n\t\t\tupdateCursor(null, true, true);\n\n\t\t\tif (_dragging)\n\t\t\t\tdragging = _dragging;\n\t\t}\n\t}\n\n\tfunction dblClick(e, src, _l, _t, _w, _h, _i) {\n\t\tautoScaleX();\n\n\t\thideSelect();\n\n\t\tif (e != null)\n\t\t\tpubSync(dblclick, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);\n\t}\n\n\tfunction syncPxRatio() {\n\t\taxes.forEach(syncFontSize);\n\t\t_setSize(self.width, self.height, true);\n\t}\n\n\ton(dppxchange, win, syncPxRatio);\n\n\t// internal pub/sub\n\tconst events = {};\n\n\tevents.mousedown = mouseDown;\n\tevents.mousemove = mouseMove;\n\tevents.mouseup = mouseUp;\n\tevents.dblclick = dblClick;\n\tevents[\"setSeries\"] = (e, src, idx, opts) => {\n\t\tsetSeries(idx, opts, true, false);\n\t};\n\n\tif (cursor.show) {\n\t\tonMouse(mousedown, over, mouseDown);\n\t\tonMouse(mousemove, over, mouseMove);\n\t\tonMouse(mouseenter, over, syncRect);\n\t\tonMouse(mouseleave, over, mouseLeave);\n\n\t\tonMouse(dblclick, over, dblClick);\n\n\t\tcursorPlots.add(self);\n\n\t\tself.syncRect = syncRect;\n\t}\n\n\t// external on/off\n\tconst hooks = self.hooks = opts.hooks || {};\n\n\tfunction fire(evName, a1, a2) {\n\t\tif (evName in hooks) {\n\t\t\thooks[evName].forEach(fn => {\n\t\t\t\tfn.call(null, self, a1, a2);\n\t\t\t});\n\t\t}\n\t}\n\n\t(opts.plugins || []).forEach(p => {\n\t\tfor (let evName in p.hooks)\n\t\t\thooks[evName] = (hooks[evName] || []).concat(p.hooks[evName]);\n\t});\n\n\tconst syncOpts = assign({\n\t\tkey: null,\n\t\tsetSeries: false,\n\t\tfilters: {\n\t\t\tpub: retTrue,\n\t\t\tsub: retTrue,\n\t\t},\n\t\tscales: [xScaleKey, series[1] ? series[1].scale : null],\n\t\tmatch: [retEq, retEq],\n\t\tvalues: [null, null],\n\t}, cursor.sync);\n\n\t(cursor.sync = syncOpts);\n\n\tconst syncKey = syncOpts.key;\n\n\tconst sync = _sync(syncKey);\n\n\tfunction pubSync(type, src, x, y, w, h, i) {\n\t\tif (syncOpts.filters.pub(type, src, x, y, w, h, i))\n\t\t\tsync.pub(type, src, x, y, w, h, i);\n\t}\n\n\tsync.sub(self);\n\n\tfunction pub(type, src, x, y, w, h, i) {\n\t\tif (syncOpts.filters.sub(type, src, x, y, w, h, i))\n\t\t\tevents[type](null, src, x, y, w, h, i);\n\t}\n\n\t(self.pub = pub);\n\n\tfunction destroy() {\n\t\tsync.unsub(self);\n\t\tcursorPlots.delete(self);\n\t\tmouseListeners.clear();\n\t\toff(dppxchange, win, syncPxRatio);\n\t\troot.remove();\n\t\tfire(\"destroy\");\n\t}\n\n\tself.destroy = destroy;\n\n\tfunction _init() {\n\t\tfire(\"init\", opts, data);\n\n\t\tsetData(data || opts.data, false);\n\n\t\tif (pendScales[xScaleKey])\n\t\t\tsetScale(xScaleKey, pendScales[xScaleKey]);\n\t\telse\n\t\t\tautoScaleX();\n\n\t\t_setSize(opts.width, opts.height);\n\n\t\tupdateCursor(null, true, false);\n\n\t\tsetSelect(select, false);\n\t}\n\n\tseries.forEach(initSeries);\n\n\taxes.forEach(initAxis);\n\n\tif (then) {\n\t\tif (then instanceof HTMLElement) {\n\t\t\tthen.appendChild(root);\n\t\t\t_init();\n\t\t}\n\t\telse\n\t\t\tthen(self, _init);\n\t}\n\telse\n\t\t_init();\n\n\treturn self;\n}\n\nuPlot.assign = assign;\nuPlot.fmtNum = fmtNum;\nuPlot.rangeNum = rangeNum;\nuPlot.rangeLog = rangeLog;\nuPlot.rangeAsinh = rangeAsinh;\nuPlot.orient = orient;\nuPlot.pxRatio = pxRatio;\n\n{\n\tuPlot.join = join;\n}\n\n{\n\tuPlot.fmtDate = fmtDate;\n\tuPlot.tzDate = tzDate;\n}\n\n{\n\tuPlot.sync = _sync;\n}\n\n{\n\tuPlot.addGap = addGap;\n\tuPlot.clipGaps = clipGaps;\n\n\tlet paths = uPlot.paths = {\n\t\tpoints,\n\t};\n\n\t(paths.linear = linear);\n\t(paths.stepped = stepped);\n\t(paths.bars = bars);\n\t(paths.spline = monotoneCubic);\n}\n\nexport { uPlot as default };\n", "import { LineColor } from './color_wheel'\nimport uPlot from 'uplot'\n\nconst histBucket = (v, offset, incr) => incrRoundDn(v - offset, incr) + offset\nconst histSort = (a, b) => a - b\n\nfunction incrRoundDn(num, incr) {\n return Math.floor(num / incr) * incr\n}\n\nfunction reBin(histogram, sort) {\n let bins = [...histogram.values()]\n\n sort && bins.sort((a, b) => sort(a.value, b.value))\n\n let values = Array(bins.length)\n let counts = Array(bins.length)\n\n for (let i = 0; i < bins.length; i++) {\n values[i] = bins[i].value\n counts[i] = bins[i].count\n }\n\n return [values, counts]\n}\n\nconst getBucketSize = ({ bucketSize = 20 }) => +bucketSize\n\nexport class Histogram {\n constructor(chart, options) {\n this.chart = chart\n this.datasets = new Map();\n this.options = options\n this.bucketSize = getBucketSize(options)\n this.histOffset = 0\n // todo: enable pruning for histogram?\n }\n\n handleMeasurements(data) {\n data.forEach(({ y }) => {\n if (y == null) { return }\n y = histBucket(y, this.histOffset, this.bucketSize)\n\n let entry = this.datasets.get(y)\n\n if (entry) {\n entry.count++\n } else {\n this.datasets.set(y, { value: y, count: 1 })\n }\n })\n\n this.chart.setData(reBin(this.datasets, histSort))\n }\n\n static initialData() { return [[], []] }\n\n static getConfig(options) {\n let bucketIncr = getBucketSize(options)\n let bars = uPlot.paths.bars({ align: 1, size: [1, Infinity], gap: 4 })\n\n return {\n title: options.title,\n width: options.width,\n height: options.height,\n scales: {\n x: {\n time: false,\n auto: false,\n dir: 1,\n range: (u) => [\n u.data[0][0],\n u.data[0][u.data[0].length - 1] + bucketIncr,\n ]\n }\n },\n axes: [\n {\n incrs: () => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(mult => mult * bucketIncr),\n //\tspace: 0,\n splits: (u, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace) => {\n let minSpace = u.axes[axisIdx]._space\n let bucketWidth = u.valToPos(u.data[0][0] + bucketIncr, 'x') - u.valToPos(u.data[0][0], 'x')\n\n let firstSplit = u.data[0][0]\n let lastSplit = u.data[0][u.data[0].length - 1] + bucketIncr\n\n let splits = []\n let skip = Math.ceil(minSpace / bucketWidth)\n\n for (let i = 0, s = firstSplit; s <= lastSplit; i++, s += bucketIncr)\n !(i % skip) && splits.push(s)\n\n return splits\n }\n }\n ],\n series: [\n {\n label: options.label,\n value: (self, rawValue) => rawValue + `-${rawValue + bucketIncr} ${options.unit}`,\n },\n {\n paths: bars,\n points: { show: false },\n ...LineColor.at(1),\n width: 2,\n label: \"Events\"\n },\n ],\n }\n }\n}", "import { LineColor } from './color_wheel'\nimport { Histogram } from './histogram.js'\nimport uPlot from 'uplot'\n\nconst SeriesValue = (options) => {\n if (!options.unit) return {}\n\n return {\n value: (u, v) => v == null ? '--' : v.toFixed(3) + ` ${options.unit}`\n }\n}\n\nconst XSeriesValue = (options) => {\n return {\n value: '{YYYY}-{MM}-{DD} {HH}:{mm}:{ss}'\n }\n}\n\nconst YAxisValue = (options) => {\n if (!options.unit) return {}\n\n return {\n values: (u, vals, space) => vals.map(v => +v.toFixed(2) + ` ${options.unit}`)\n }\n}\n\nconst XAxis = (_options) => {\n return {\n space: 55,\n // [0]: minimum num secs in found axis split (tick incr)\n // [1]: default tick format\n // [2-7]: rollover tick formats\n // [8]: mode: 0: replace [1] -> [2-7], 1: concat [1] + [2-7]\n values: [\n // tick incr default year month day hour min sec mode\n [3600 * 24 * 365, \"{YYYY}\", null, null, null, null, null, null, 1],\n [3600 * 24 * 28, \"{MMM}\", \"\\n{YYYY}\", null, null, null, null, null, 1],\n [3600 * 24, \"{M}/{D}\", \"\\n{YYYY}\", null, null, null, null, null, 1],\n [3600, \"{h}{aa}\", \"\\n{M}/{D}/{YY}\", null, \"\\n{M}/{D}\", null, null, null, 1],\n [60, \"{h}:{mm}{aa}\", \"\\n{M}/{D}/{YY}\", null, \"\\n{M}/{D}\", null, null, null, 1],\n [1, \":{ss}\", \"\\n{M}/{D}/{YY} {h}:{mm}{aa}\", null, \"\\n{M}/{D} {h}:{mm}{aa}\", null, \"\\n{h}:{mm}{aa}\", null, 1],\n [0.001, \":{ss}.{fff}\", \"\\n{M}/{D}/{YY} {h}:{mm}{aa}\", null, \"\\n{M}/{D} {h}:{mm}{aa}\", null, \"\\n{h}:{mm}{aa}\", null, 1],\n ]\n }\n}\n\nconst YAxis = (options) => {\n return {\n show: true,\n size: 70,\n space: 15,\n ...YAxisValue(options)\n }\n}\n\nconst minChartSize = {\n width: 100,\n height: 300\n}\n\nconst cursorOpts = {\n sync: { key: 'metrics-live' }\n}\n\n// Limits how often a function is invoked\nfunction throttle(cb, limit) {\n let wait = false;\n\n return () => {\n if (!wait) {\n requestAnimationFrame(cb);\n wait = true;\n setTimeout(() => {\n wait = false;\n }, limit);\n }\n }\n}\n\nexport const newSeriesConfig = (options, index = 0) => {\n return {\n ...LineColor.at(index),\n ...SeriesValue(options),\n label: options.label,\n spanGaps: true,\n points: { show: false }\n }\n}\n\n/** Telemetry Metrics **/\n\n// Maps an ordered list of dataset objects into an ordered list of data points.\nconst dataForDatasets = (datasets) => datasets.slice(0).map(({ data }) => data)\n\n// Handler for an untagged CommonMetric\nfunction nextValueForCallback({ y, z }, callback) {\n this.datasets[0].data.push(z)\n let currentValue = this.datasets[1].data[this.datasets[1].data.length - 1] || 0\n let nextValue = callback.call(this, y, currentValue)\n this.datasets[1].data.push(nextValue)\n}\n\nconst findLastNonNullValue = (data) => data.reduceRight((a, c) => (c != null && a == null ? c : a), null)\n\n// Handler for a tagged CommonMetric\nfunction nextTaggedValueForCallback({ x, y, z }, callback) {\n // Find or create the series from the tag\n let seriesIndex = this.datasets.findIndex(({ key }) => x === key)\n if (seriesIndex === -1) {\n seriesIndex = this.datasets.push({ key: x, data: Array(this.datasets[0].data.length).fill(null) }) - 1\n this.chart.addSeries(newSeriesConfig({ label: x, unit: this.options.unit }, seriesIndex - 1), seriesIndex)\n }\n\n // Add the new timestamp + value, keeping datasets aligned\n this.datasets = this.datasets.map((dataset, index) => {\n if (index === 0) {\n dataset.data.push(z)\n } else if (index === seriesIndex) {\n dataset.data.push(callback.call(this, y, findLastNonNullValue(dataset.data) || 0))\n } else {\n dataset.data.push(null)\n }\n return dataset\n })\n}\n\nconst getPruneThreshold = ({ pruneThreshold = 1000 }) => pruneThreshold\n\n// Handles the basic metrics like Counter, LastValue, and Sum.\nclass CommonMetric {\n static __projections() {\n return {\n counter: (y, value) => value + 1,\n last_value: (y) => y,\n sum: (y, value) => value + y\n }\n }\n\n static getConfig(options) {\n return {\n class: options.kind,\n title: options.title,\n width: options.width,\n height: options.height,\n cursor: cursorOpts,\n series: [\n { ...XSeriesValue() },\n newSeriesConfig(options, 0)\n ],\n scales: {\n x: {\n min: options.now - 60,\n max: options.now\n },\n y: {\n min: 0,\n max: 1\n },\n },\n axes: [\n XAxis(),\n YAxis(options)\n ]\n }\n }\n\n static initialData() {\n return [[], []]\n }\n\n constructor(chart, options) {\n this.__callback = this.constructor.__projections()[options.metric]\n this.chart = chart\n this.datasets = [{ key: \"|x|\", data: [] }]\n this.options = options\n this.pruneThreshold = getPruneThreshold(options)\n\n if (options.tagged) {\n this.chart.delSeries(1)\n this.__handler = nextTaggedValueForCallback\n } else {\n this.datasets.push({ key: options.label, data: [] })\n this.__handler = nextValueForCallback\n }\n }\n\n handleMeasurements(measurements) {\n // prune datasets when we reach the max number of events\n measurements.forEach((measurement) => this.__handler.call(this, measurement, this.__callback))\n\n let currentSize = this.datasets[0].data.length\n if (currentSize >= this.pruneThreshold) {\n this.datasets = this.datasets.map(({ data, ...rest }) => {\n return { data: data.slice(-this.pruneThreshold), ...rest }\n })\n }\n\n this.chart.setData(dataForDatasets(this.datasets))\n }\n}\n\n// Displays a measurement summary\nclass Summary {\n constructor(options, chartEl) {\n // TODO: Get percentiles from options\n let config = this.constructor.getConfig(options)\n // Bind the series `values` callback to this instance\n config.series[1].values = this.__seriesValues.bind(this)\n\n this.datasets = [{ key: \"|x|\", data: [] }]\n this.chart = new uPlot(config, this.constructor.initialData(options), chartEl)\n this.pruneThreshold = getPruneThreshold(options)\n this.options = options\n\n if (options.tagged) {\n this.chart.delSeries(1)\n this.__handler = this.handleTaggedMeasurement.bind(this)\n } else {\n this.datasets.push(this.constructor.newDataset(options.label))\n this.__handler = this.handleMeasurement.bind(this)\n }\n }\n\n handleMeasurements(measurements) {\n measurements.forEach((measurement) => this.__handler(measurement))\n this.__maybePruneDatasets()\n this.chart.setData(dataForDatasets(this.datasets))\n }\n\n handleTaggedMeasurement(measurement) {\n let seriesIndex = this.findOrCreateSeries(measurement.x)\n this.handleMeasurement(measurement, seriesIndex)\n }\n\n handleMeasurement(measurement, sidx = 1) {\n let { z: timestamp } = measurement\n this.datasets = this.datasets.map((dataset, index) => {\n if (dataset.key === \"|x|\") {\n dataset.data.push(timestamp)\n } else if (index === sidx) {\n this.pushToDataset(dataset, measurement)\n } else {\n this.pushToDataset(dataset, null)\n }\n return dataset\n })\n }\n\n findOrCreateSeries(label) {\n let seriesIndex = this.datasets.findIndex(({ key }) => label === key)\n if (seriesIndex === -1) {\n seriesIndex = this.datasets.push(\n this.constructor.newDataset(label, this.datasets[0].data.length)\n ) - 1\n\n let config = {\n values: this.__seriesValues.bind(this),\n ...newSeriesConfig({ label }, seriesIndex - 1)\n }\n\n this.chart.addSeries(config, seriesIndex)\n }\n\n return seriesIndex\n }\n\n pushToDataset(dataset, measurement) {\n if (measurement === null) {\n dataset.data.push(null)\n dataset.agg.avg.push(null)\n dataset.agg.max.push(null)\n dataset.agg.min.push(null)\n return\n }\n\n let { y } = measurement\n\n // Increment the new overall totals\n dataset.agg.count++\n dataset.agg.total += y\n\n // Push the value\n dataset.data.push(y)\n\n // Push min/max/avg\n if (dataset.last.min === null || y < dataset.last.min) { dataset.last.min = y }\n dataset.agg.min.push(dataset.last.min)\n\n if (dataset.last.max === null || y > dataset.last.max) { dataset.last.max = y }\n dataset.agg.max.push(dataset.last.max)\n\n dataset.agg.avg.push((dataset.agg.total / dataset.agg.count))\n\n return dataset\n }\n\n __maybePruneDatasets() {\n let currentSize = this.datasets[0].data.length\n if (currentSize > this.pruneThreshold) {\n let start = -this.pruneThreshold;\n this.datasets = this.datasets.map(({ key, data, agg }) => {\n let dataPruned = data.slice(start)\n if (!agg) {\n return { key, data: dataPruned }\n }\n\n let { avg, count, max, min, total } = agg\n let minPruned = min.slice(start)\n let maxPruned = max.slice(start)\n\n return {\n key,\n data: dataPruned,\n agg: {\n avg: avg.slice(start),\n count,\n min: minPruned,\n max: maxPruned,\n total\n },\n last: {\n min: findLastNonNullValue(minPruned),\n max: findLastNonNullValue(maxPruned)\n }\n }\n })\n }\n }\n\n __seriesValues(u, sidx, idx) {\n let dataset = this.datasets[sidx]\n if (dataset && dataset.data && dataset.data[idx]) {\n let { agg: { avg, max, min }, data } = dataset\n return {\n Value: data[idx].toFixed(3),\n Min: min[idx].toFixed(3),\n Max: max[idx].toFixed(3),\n Avg: avg[idx].toFixed(3)\n }\n } else {\n return { Value: \"--\", Min: \"--\", Max: \"--\", Avg: \"--\" }\n }\n }\n\n static initialData() { return [[], []] }\n\n static getConfig(options) {\n return {\n class: options.kind,\n title: options.title,\n width: options.width,\n height: options.height,\n cursor: cursorOpts,\n series: [\n { ...XSeriesValue() },\n newSeriesConfig(options, 0)\n ],\n scales: {\n x: {\n min: options.now - 60,\n max: options.now\n },\n y: {\n min: 0,\n max: 1\n },\n },\n axes: [\n XAxis(),\n YAxis(options)\n ]\n }\n }\n\n static newDataset(key, length = 0) {\n let nils = length > 0 ? Array(length).fill(null) : []\n return {\n key,\n data: [...nils],\n agg: { avg: [...nils], count: 0, max: [...nils], min: [...nils], total: 0 },\n last: { max: null, min: null }\n }\n }\n}\n\nconst __METRICS__ = {\n counter: CommonMetric,\n last_value: CommonMetric,\n sum: CommonMetric,\n summary: Summary,\n distribution: Histogram\n}\n\nexport class TelemetryChart {\n constructor(chartEl, options) {\n if (!options.metric) {\n throw new TypeError(`No metric type was provided`)\n } else if (options.metric && !__METRICS__[options.metric]) {\n throw new TypeError(`No metric defined for type ${options.metric}`)\n }\n\n const metric = __METRICS__[options.metric]\n if (metric === Summary) {\n this.metric = new Summary(options, chartEl)\n this.uplotChart = this.metric.chart\n } else {\n this.uplotChart = new uPlot(metric.getConfig(options), metric.initialData(options), chartEl)\n this.metric = new metric(this.uplotChart, options)\n }\n\n // setup the data buffer\n let isBufferingData = typeof options.refreshInterval !== \"undefined\"\n this._isBufferingData = isBufferingData\n this._buffer = []\n this._timer = isBufferingData ? setInterval(\n this._flushToChart.bind(this),\n +options.refreshInterval\n ) : null\n }\n\n clearTimers() { clearInterval(this._timer) }\n\n resize(boundingBox) {\n this.uplotChart.setSize({\n width: Math.max(boundingBox.width, minChartSize.width),\n height: minChartSize.height\n })\n }\n\n pushData(measurements) {\n if (!measurements.length) return\n let callback = this._isBufferingData ? this._pushToBuffer : this._pushToChart\n callback.call(this, measurements)\n }\n\n _pushToBuffer(measurements) {\n this._buffer = this._buffer.concat(measurements)\n }\n\n _pushToChart(measurements) {\n this.metric.handleMeasurements(measurements)\n }\n\n // clears the buffer and pushes the measurements\n _flushToChart() {\n let measurements = this._flushBuffer()\n if (!measurements.length) { return }\n this._pushToChart(measurements)\n }\n\n // clears and returns the buffered data as a flat array\n _flushBuffer() {\n if (this._buffer && !this._buffer.length) { return [] }\n let measurements = this._buffer\n this._buffer = []\n return measurements.reduce((acc, val) => acc.concat(val), [])\n }\n}\n\n/** LiveView Hook **/\n\nconst PhxChartComponent = {\n mounted() {\n let chartEl = this.el.parentElement.querySelector('.chart')\n let size = chartEl.getBoundingClientRect()\n let options = Object.assign({}, chartEl.dataset, {\n tagged: (chartEl.dataset.tags && chartEl.dataset.tags !== \"\") || false,\n width: Math.max(size.width, minChartSize.width),\n height: minChartSize.height,\n now: new Date() / 1e3,\n refreshInterval: 1000\n })\n\n this.chart = new TelemetryChart(chartEl, options)\n\n window.addEventListener(\"resize\", throttle(() => {\n let newSize = chartEl.getBoundingClientRect()\n this.chart.resize(newSize)\n }))\n },\n updated() {\n const data = Array\n .from(this.el.children || [])\n .map(({ dataset: { x, y, z } }) => {\n // converts y-axis value (z) to number,\n // converts timestamp (z) from \u00B5s to fractional seconds\n return { x, y: +y, z: +z / 1e6 }\n })\n\n if (data.length > 0) {\n this.chart.pushData(data)\n }\n },\n destroyed() {\n this.chart.clearTimers()\n }\n}\n\nexport default PhxChartComponent\n", "/** LiveView Hook **/\n\nconst setCookie = (params) => {\n let cookie = `${params.key}=${params.value};path=/`\n if (window.location.protocol === \"https:\") {\n cookie += `;samesite=strict`\n }\n if (params.domain) {\n cookie += `;domain=${params.domain}`\n }\n document.cookie = cookie\n}\n\nconst removeCookie = (params) => {\n const pastDate = 'Thu, 01 Jan 1970 00:00:00 GMT'\n document.cookie = `${params.key}=; expires=${pastDate}`\n}\n\nconst isCookieEnabled = (hook) => {\n return hook.el.hasAttribute('data-cookie-enabled')\n}\n\nconst cookieParams = (hook) => {\n return {\n key: hook.el.getAttribute('data-cookie-key'),\n value: hook.el.getAttribute('data-cookie-value'),\n domain: hook.el.getAttribute('data-cookie-domain')\n }\n}\n\nconst PhxRequestLoggerCookie = {\n updated() {\n const loggerCookieParams = cookieParams(this)\n removeCookie(loggerCookieParams)\n\n if (isCookieEnabled(this)) {\n setCookie(loggerCookieParams)\n }\n },\n}\n\nexport default PhxRequestLoggerCookie\n", "/** LiveView Hook **/\n\nconst copyToClipboard = (textarea) => {\n if (!navigator.clipboard){\n // Deprecated clipboard API\n textarea.select()\n textarea.setSelectionRange(0, 99999)\n document.execCommand('copy')\n } else {\n // Modern Clipboard API\n const text = textarea.value\n navigator.clipboard.writeText(text)\n }\n }\n\nconst PhxRequestLoggerQueryParameter = {\n mounted() {\n this.el.querySelector('.btn-primary').addEventListener('click', e => {\n const textarea = this.el.querySelector('textarea')\n copyToClipboard(textarea)\n const copyIndicator = this.el.querySelector('.copy-indicator')\n copyIndicator.setAttribute('data-enabled', 'false')\n void copyIndicator.offsetWidth // Resets the animation to ensure it will be played again\n copyIndicator.setAttribute('data-enabled', 'true')\n })\n }\n}\n\nexport default PhxRequestLoggerQueryParameter\n", "/** LiveView Hook **/\n\nconst PhxRequestLoggerMessages = {\n updated() {\n if (this.el.querySelector('.logger-autoscroll-checkbox').checked) {\n const messagesElement = this.el.querySelector('#logger-messages')\n messagesElement.scrollTop = messagesElement.scrollHeight\n }\n }\n}\n\nexport default PhxRequestLoggerMessages\n", "const interactiveItemSelector = '.progress-bar, .color-bar-legend-entry'\nlet highlightedElementName\n\nconst highlightElements = (containerElement) => {\n containerElement.querySelectorAll(interactiveItemSelector).forEach((progressBarElement) => {\n if(highlightedElementName) {\n const isMuted = progressBarElement.getAttribute('data-name') !== highlightedElementName\n\n progressBarElement.setAttribute('data-muted', isMuted)\n } else {\n progressBarElement.removeAttribute('data-muted')\n }\n })\n}\n\nconst PhxColorBarHighlight = {\n mounted() {\n this.el.setAttribute('data-highlight-enabled', 'true')\n this.el.querySelectorAll(interactiveItemSelector).forEach((progressBarElement) => (\n progressBarElement.addEventListener('click', e => {\n const name = e.currentTarget.getAttribute('data-name')\n highlightedElementName = name === highlightedElementName ? null : name\n highlightElements(this.el)\n })\n ))\n },\n\n updated() {\n this.el.setAttribute('data-highlight-enabled', 'true')\n highlightElements(this.el)\n }\n}\n\nexport default PhxColorBarHighlight\n", "const REFRESH_DATA_COOKIE = \"_refresh_data\";\n\n/**\n * Stores refresh data in the `\"refresh_data\"` cookie.\n */\nexport function storeRefreshData(refreshData, path) {\n const json = JSON.stringify(refreshData);\n const encoded = encodeBase64(json);\n setCookie(REFRESH_DATA_COOKIE, encoded, path, 157680000); // 5 years\n}\n\n/**\n * Loads refresh data from the `\"refresh_data\"` cookie.\n */\nexport function loadRefreshData() {\n const encoded = getCookieValue(REFRESH_DATA_COOKIE);\n if (encoded) {\n const json = decodeBase64(encoded);\n return JSON.parse(json);\n } else {\n return null;\n }\n}\n\nfunction getCookieValue(key) {\n const cookie = document.cookie\n .split(\"; \")\n .find((cookie) => cookie.startsWith(`${key}=`));\n\n if (cookie) {\n const value = cookie.replace(`${key}=`, \"\");\n return value;\n } else {\n return null;\n }\n}\n\nfunction setCookie(key, value, path, maxAge) {\n const cookie = `${key}=${value};max-age=${maxAge};path=${path}`;\n document.cookie = cookie;\n}\n\nfunction encodeBase64(string) {\n return btoa(unescape(encodeURIComponent(string)));\n}\n\nfunction decodeBase64(binary) {\n return decodeURIComponent(escape(atob(binary)));\n}\n", "/** LiveView Hook **/\n\nimport { storeRefreshData, loadRefreshData } from \"../refresh\";\n\nconst PhxRememberRefresh = {\n updated() {\n let config = loadRefreshData() || {};\n config[this.el.dataset.page] = this.el.value\n storeRefreshData(config, this.el.dataset.dashboardMountPath);\n }\n}\n\nexport default PhxRememberRefresh\n"],
+ "mappings": "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",
"names": []
}
diff --git a/lib/phoenix/live_dashboard/layout_view.ex b/lib/phoenix/live_dashboard/layout_view.ex
index 03b9365e..f2d637fd 100644
--- a/lib/phoenix/live_dashboard/layout_view.ex
+++ b/lib/phoenix/live_dashboard/layout_view.ex
@@ -37,4 +37,20 @@ defmodule Phoenix.LiveDashboard.LayoutView do
)
end
end
+
+ defp custom_head_tags(assigns, key) do
+ case assigns do
+ %{^key => components} when is_list(components) ->
+ assigns = assign(assigns, :components, components)
+
+ ~H"""
+ <%= for component <- @components do %>
+ <%= component.(assigns) %>
+ <% end %>
+ """
+
+ _ ->
+ nil
+ end
+ end
end
diff --git a/lib/phoenix/live_dashboard/layouts/dash.html.heex b/lib/phoenix/live_dashboard/layouts/dash.html.heex
index 47f0999a..aa61160d 100644
--- a/lib/phoenix/live_dashboard/layouts/dash.html.heex
+++ b/lib/phoenix/live_dashboard/layouts/dash.html.heex
@@ -1,6 +1,15 @@
+
+ <%= custom_head_tags(assigns, :after_opening_head_tag) %>
@@ -8,6 +17,7 @@
<%= assigns[:page_title] || "Phoenix LiveDashboard" %>
+ <%= custom_head_tags(assigns, :before_closing_head_tag) %>
diff --git a/lib/phoenix/live_dashboard/page_builder.ex b/lib/phoenix/live_dashboard/page_builder.ex
index fcf84b57..611d74f6 100644
--- a/lib/phoenix/live_dashboard/page_builder.ex
+++ b/lib/phoenix/live_dashboard/page_builder.ex
@@ -96,7 +96,7 @@ defmodule Phoenix.LiveDashboard.PageBuilder do
We currently support `card/1`, `fields_card/1`, `row/1`,
`shared_usage_card/1`, and `usage_card/1`;
- and the live components `live_layered_graph/1`, `live_nav_bar/1`,
+ and the live components `live_layered_graph/1`, `live_nav_bar/1`,
and `live_table/1`.
## Helpers
@@ -105,6 +105,84 @@ defmodule Phoenix.LiveDashboard.PageBuilder do
helpers are: `live_dashboard_path/2`, `live_dashboard_path/3`,
`encode_app/1`, `encode_ets/1`, `encode_pid/1`, `encode_port/1`,
and `encode_socket/1`.
+
+ ## Custom Hooks
+
+ If your page needs to register custom hooks, you can use the `register_after_opening_head_tag/2`
+ function. Because the hooks need to be available on the dead render in the layout, before the
+ LiveView's LiveSocket is configured, your need to do this inside an `on_mount` hook:
+
+ ```elixir
+ defmodule MyAppWeb.MyLiveDashboardHooks do
+ import Phoenix.LiveView
+ import Phoenix.Component
+
+ alias Phoenix.LiveDashboard.PageBuilder
+
+ def on_mount(:default, _params, _session, socket) do
+ {:cont, PageBuilder.register_after_opening_head_tag(socket, &after_opening_head_tag/1)}
+ end
+
+ defp after_opening_head_tag(assigns) do
+ ~H\"\"\"
+
+ \"\"\"
+ end
+ end
+
+ defmodule MyAppWeb.MyCustomPage do
+ ...
+ end
+ ```
+
+ And then add it to the list of `on_mount` hooks in the `live_dashboard` router configuration:
+
+ ```elixir
+ live_dashboard "/dashboard",
+ additional_pages: [
+ route_name: MyAppWeb.MyCustomPage
+ ],
+ on_mount: [
+ MyAppWeb.MyLiveDashboardHooks
+ ]
+ ```
+
+ The LiveDashboard provides a function `window.LiveDashboard.registerCustomHooks({ ... })` that you can call
+ with an object of hook declarations.
+
+ Note that in order to use external libraries, you will either need to include them from
+ a CDN, or bundle them yourself and include them from your app's static paths.
+
+ > #### A note on CSPs and libraries {: .info}
+ >
+ > Phoenix LiveDashboard supports CSP nonces for its own assets, configurable using the
+ > `Phoenix.LiveDashboard.Router.live_dashboard/2` macro by setting the `:csp_nonce_assign_key`
+ > option. If you are building a library, ensure that you render those CSP nonces on any scripts,
+ > styles or images of your page. The nonces are passed to your custom page under the `:csp_nonces` assign
+ > and also available in the `after_opening_head_tag` component.
+ >
+ > You should use those when including scripts or styles like this:
+ >
+ > ```heex
+ >
+ >
+ >
+ >
+ > ```
+ >
+ > This ensures that your custom page can be used when a CSP is in place using the mechanism
+ > supported by Phoenix LiveDashboard.
+ >
+ > If your custom page needs a different CSP policy, for example due to inline styles set by scripts,
+ > please consider documenting these requirements.
"""
use Phoenix.Component
@@ -971,6 +1049,30 @@ defmodule Phoenix.LiveDashboard.PageBuilder do
live_dashboard_path(socket, route, node, old_params, new_params)
end
+ @doc """
+ Registers a component to be rendered after the opening head tag in the layout.
+ """
+ def register_after_opening_head_tag(socket, component) do
+ register_head(socket, component, :after_opening_head_tag)
+ end
+
+ @doc """
+ Registers a component to be rendered before the closing head tag in the layout.
+ """
+ def register_before_closing_head_tag(socket, component) do
+ register_head(socket, component, :before_closing_head_tag)
+ end
+
+ defp register_head(socket, component, assign) do
+ case socket do
+ %{assigns: %{^assign => [_ | _]}} ->
+ update(socket, assign, fn existing -> [component | existing] end)
+
+ _ ->
+ assign(socket, assign, [component])
+ end
+ end
+
# TODO: Remove this and the conditional on Phoenix v1.7+
@compile {:no_warn_undefined, Phoenix.VerifiedRoutes}
diff --git a/mix.exs b/mix.exs
index 6c39e046..68b0d015 100644
--- a/mix.exs
+++ b/mix.exs
@@ -65,6 +65,7 @@ defmodule Phoenix.LiveDashboard.MixProject do
{:stream_data, "~> 0.1", only: :test},
{:ecto_sqlite3, "~> 0.9.1", only: [:dev, :test]},
{:ex_doc, "~> 0.21", only: :docs},
+ {:makeup_eex, ">= 0.1.1", only: :docs},
{:esbuild, "~> 0.5", only: :dev},
{:dart_sass, "~> 0.7", only: :dev}
]
diff --git a/mix.lock b/mix.lock
index 726a55ad..8e9f4b4d 100644
--- a/mix.lock
+++ b/mix.lock
@@ -22,9 +22,11 @@
"file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"},
"floki": {:hex, :floki, "0.36.2", "a7da0193538c93f937714a6704369711998a51a6164a222d710ebd54020aa7a3", [:mix], [], "hexpm", "a8766c0bc92f074e5cb36c4f9961982eda84c5d2b8e979ca67f5c268ec8ed580"},
"jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"},
- "makeup": {:hex, :makeup, "1.1.2", "9ba8837913bdf757787e71c1581c21f9d2455f4dd04cfca785c70bbfff1a76a3", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cce1566b81fbcbd21eca8ffe808f33b221f9eee2cbc7a1706fc3da9ff18e6cac"},
- "makeup_elixir": {:hex, :makeup_elixir, "0.16.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"},
+ "makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"},
+ "makeup_eex": {:hex, :makeup_eex, "1.0.0", "436d4c00204c250b17a775d64e197798aaf374627e6a4f2d3fd3074a8db61db4", [:mix], [{:makeup, "~> 1.2.1 or ~> 1.3", [hex: :makeup, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_html, "~> 0.1.0 or ~> 1.0", [hex: :makeup_html, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "3bb699bc519e4f509f1bf8a2e0ba0e08429edf3580053cd31a4f9c1bc5da86c8"},
+ "makeup_elixir": {:hex, :makeup_elixir, "1.0.0", "74bb8348c9b3a51d5c589bf5aebb0466a84b33274150e3b6ece1da45584afc82", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "49159b7d7d999e836bedaf09dcf35ca18b312230cf901b725a64f3f42e407983"},
"makeup_erlang": {:hex, :makeup_erlang, "1.0.0", "6f0eff9c9c489f26b69b61440bf1b238d95badae49adac77973cbacae87e3c2e", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "ea7a9307de9d1548d2a72d299058d1fd2339e3d398560a0e46c27dab4891e4d2"},
+ "makeup_html": {:hex, :makeup_html, "0.1.2", "19d4050c0978a4f1618ffe43054c0049f91fe5feeb9ae8d845b5dc79c6008ae5", [:mix], [{:makeup, "~> 1.2", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "b7fb9afedd617d167e6644a0430e49c1279764bfd3153da716d4d2459b0998c5"},
"mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"},
"myxql": {:hex, :myxql, "0.6.3", "3d77683a09f1227abb8b73d66b275262235c5cae68182f0cfa5897d72a03700e", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:geo, "~> 3.4", [hex: :geo, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "af9eb517ddaced5c5c28e8749015493757fd4413f2cfccea449c466d405d9f51"},
"nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"},