projet crepp_git/crepp-projects/station-meteo/hardware/transmetteur/base/v1.0 · branche main
ibom.html Voir sur GitLab
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Interactive BOM for KiCAD</title>
  <style type="text/css">
:root {
  --pcb-edge-color: black;
  --pad-color: #878787;
  --pad-hole-color: #CCCCCC;
  --pad-color-highlight: #D04040;
  --pad-color-highlight-both: #D0D040;
  --pad-color-highlight-marked: #44a344;
  --pin1-outline-color: #ffb629;
  --pin1-outline-color-highlight: #ffb629;
  --pin1-outline-color-highlight-both: #fcbb39;
  --pin1-outline-color-highlight-marked: #fdbe41;
  --silkscreen-edge-color: #aa4;
  --silkscreen-polygon-color: #4aa;
  --silkscreen-text-color: #4aa;
  --fabrication-edge-color: #907651;
  --fabrication-polygon-color: #907651;
  --fabrication-text-color: #a27c24;
  --track-color: #def5f1;
  --track-color-highlight: #D04040;
  --zone-color: #def5f1;
  --zone-color-highlight: #d0404080;
}

html,
body {
  margin: 0px;
  height: 100%;
  font-family: Verdana, sans-serif;
}

.dark.topmostdiv {
  --pcb-edge-color: #eee;
  --pad-color: #808080;
  --pin1-outline-color: #ffa800;
  --pin1-outline-color-highlight: #ccff00;
  --track-color: #42524f;
  --zone-color: #42524f;
  background-color: #252c30;
  color: #eee;
}

button {
  background-color: #eee;
  border: 1px solid #888;
  color: black;
  height: 44px;
  width: 44px;
  text-align: center;
  text-decoration: none;
  display: inline-block;
  font-size: 14px;
  font-weight: bolder;
}

.dark button {
  /* This will be inverted */
  background-color: #c3b7b5;
}

button.depressed {
  background-color: #0a0;
  color: white;
}

.dark button.depressed {
  /* This will be inverted */
  background-color: #b3b;
}

button:focus {
  outline: 0;
}

button#tb-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}

button#lr-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}

button#bom-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
}

button#bom-grouped-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}

button#bom-ungrouped-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}

button#bom-netlist-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
}

button#copy {
  background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
  background-position: 6px 6px;
  background-repeat: no-repeat;
  background-size: 26px 26px;
  border-radius: 6px;
  height: 40px;
  width: 40px;
  margin: 10px 5px;
}

button#copy:active {
  box-shadow: inset 0px 0px 5px #6c6c6c;
}

textarea.clipboard-temp {
  position: fixed;
  top: 0;
  left: 0;
  width: 2em;
  height: 2em;
  padding: 0;
  border: None;
  outline: None;
  box-shadow: None;
  background: transparent;
}

.left-most-button {
  border-right: 0;
  border-top-left-radius: 6px;
  border-bottom-left-radius: 6px;
}

.middle-button {
  border-right: 0;
}

.right-most-button {
  border-top-right-radius: 6px;
  border-bottom-right-radius: 6px;
}

.button-container {
  font-size: 0;
  margin: 0.4rem 0.4rem 0.4rem 0;
}

.dark .button-container {
  filter: invert(1);
}

.button-container button {
  background-size: 32px 32px;
  background-position: 5px 5px;
  background-repeat: no-repeat;
}

@media print {
  .hideonprint {
    display: none;
  }
}

canvas {
  cursor: crosshair;
}

canvas:active {
  cursor: grabbing;
}

.fileinfo {
  width: 100%;
  max-width: 1000px;
  border: none;
  padding: 3px;
}

.fileinfo .title {
  font-size: 20pt;
  font-weight: bold;
}

.fileinfo td {
  overflow: hidden;
  white-space: nowrap;
  max-width: 1px;
  width: 50%;
  text-overflow: ellipsis;
}

.bom {
  border-collapse: collapse;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 10pt;
  table-layout: fixed;
  width: 100%;
  margin-top: 1px;
  position: relative;
}

.bom th,
.bom td {
  border: 1px solid black;
  padding: 5px;
  word-wrap: break-word;
  text-align: center;
  position: relative;
}

.dark .bom th,
.dark .bom td {
  border: 1px solid #777;
}

.bom th {
  background-color: #CCCCCC;
  background-clip: padding-box;
}

.dark .bom th {
  background-color: #3b4749;
}

.bom tr.highlighted:nth-child(n) {
  background-color: #cfc;
}

.dark .bom tr.highlighted:nth-child(n) {
  background-color: #226022;
}

.bom tr:nth-child(even) {
  background-color: #f2f2f2;
}

.dark .bom tr:nth-child(even) {
  background-color: #313b40;
}

.bom tr.checked {
  color: #1cb53d;
}

.dark .bom tr.checked {
  color: #2cce54;
}

.bom tr {
  transition: background-color 0.2s;
}

.bom .numCol {
  width: 30px;
}

.bom .value {
  width: 15%;
}

.bom .quantity {
  width: 65px;
}

.bom th .sortmark {
  position: absolute;
  right: 1px;
  top: 1px;
  margin-top: -5px;
  border-width: 5px;
  border-style: solid;
  border-color: transparent transparent #221 transparent;
  transform-origin: 50% 85%;
  transition: opacity 0.2s, transform 0.4s;
}

.dark .bom th .sortmark {
  filter: invert(1);
}

.bom th .sortmark.none {
  opacity: 0;
}

.bom th .sortmark.desc {
  transform: rotate(180deg);
}

.bom th:hover .sortmark.none {
  opacity: 0.5;
}

.bom .bom-checkbox {
  width: 30px;
  position: relative;
  user-select: none;
  -moz-user-select: none;
}

.bom .bom-checkbox:before {
  content: "";
  position: absolute;
  border-width: 15px;
  border-style: solid;
  border-color: #51829f transparent transparent transparent;
  visibility: hidden;
  top: -15px;
}

.bom .bom-checkbox:after {
  content: "Double click to set/unset all";
  position: absolute;
  color: white;
  top: -35px;
  left: -26px;
  background: #51829f;
  padding: 5px 15px;
  border-radius: 8px;
  white-space: nowrap;
  visibility: hidden;
}

.bom .bom-checkbox:hover:before,
.bom .bom-checkbox:hover:after {
  visibility: visible;
  transition: visibility 0.2s linear 1s;
}

.split {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  overflow-y: auto;
  overflow-x: hidden;
  background-color: inherit;
}

.split.split-horizontal,
.gutter.gutter-horizontal {
  height: 100%;
  float: left;
}

.gutter {
  background-color: #ddd;
  background-repeat: no-repeat;
  background-position: 50%;
  transition: background-color 0.3s;
}

.dark .gutter {
  background-color: #777;
}

.gutter.gutter-horizontal {
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
  cursor: ew-resize;
  width: 5px;
}

.gutter.gutter-vertical {
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');
  cursor: ns-resize;
  height: 5px;
}

.searchbox {
  float: left;
  height: 40px;
  margin: 10px 5px;
  padding: 12px 32px;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 18px;
  box-sizing: border-box;
  border: 1px solid #888;
  border-radius: 6px;
  outline: none;
  background-color: #eee;
  transition: background-color 0.2s, border 0.2s;
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNklEQVQ4T8XSMUvDQBQH8P/LElFa/AIZHcTBQSz0I/gFstTBRR2KUC4ldDxw7h0Bl3RRUATxi4iiODgoiLNrbQYp5J6cpJJqomkX33Z37/14d/dIa33MzDuYI4johOI4XhyNRteO46zNYjDzAxE1yBZprVeZ+QbAUhXEGJMA2Ox2u4+fQIa0mPmsCgCgJYQ4t7lfgF0opQYAdv9ABkKI/UnOFCClXKjX61cA1osQY8x9kiRNKeV7IWA3oyhaSdP0FkAtjxhj3hzH2RBCPOf3pzqYHCilfAAX+URm9oMguPzeWSGQvUcMYC8rOBJCHBRdqxTo9/vbRHRqi8bj8XKv1xvODbiuW2u32/bvf0SlDv4XYOY7z/Mavu+nM1+BmQ+NMc0wDF/LprP0DbTWW0T00ul0nn4b7Q87+X4Qmfiq2wAAAABJRU5ErkJggg==');
  background-position: 10px 10px;
  background-repeat: no-repeat;
}

.dark .searchbox {
  background-color: #111;
  color: #eee;
}

.searchbox::placeholder {
  color: #ccc;
}

.dark .searchbox::placeholder {
  color: #666;
}

.filter {
  width: calc(60% - 64px);
}

.reflookup {
  width: calc(40% - 10px);
}

input[type=text]:focus {
  background-color: white;
  border: 1px solid #333;
}

.dark input[type=text]:focus {
  background-color: #333;
  border: 1px solid #ccc;
}

mark.highlight {
  background-color: #5050ff;
  color: #fff;
  padding: 2px;
  border-radius: 6px;
}

.dark mark.highlight {
  background-color: #76a6da;
  color: #111;
}

.menubtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
  background-position: center;
  background-repeat: no-repeat;
}

.statsbtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
  background-position: center;
  background-repeat: no-repeat;
}

.iobtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
  background-position: center;
  background-repeat: no-repeat;
}

.visbtn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='none' stroke='%23333' d='M2.5 4.5h5v15h-5zM9.5 4.5h5v15h-5zM16.5 4.5h5v15h-5z'/%3E%3C/svg%3E");
  background-position: center;
  background-repeat: no-repeat;
  padding: 15px;
}

#vismenu-content {
  left: 0px;
  font-family: Verdana, sans-serif;
}

.dark .statsbtn,
.dark .savebtn,
.dark .menubtn,
.dark .iobtn,
.dark .visbtn {
  filter: invert(1);
}

.flexbox {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
}

.savebtn {
  background-color: #d6d6d6;
  width: auto;
  height: 30px;
  flex-grow: 1;
  margin: 5px;
  border-radius: 4px;
}

.savebtn:active {
  background-color: #0a0;
  color: white;
}

.dark .savebtn:active {
  /* This will be inverted */
  background-color: #b3b;
}

.stats {
  border-collapse: collapse;
  font-size: 12pt;
  table-layout: fixed;
  width: 100%;
  min-width: 450px;
}

.dark .stats td {
  border: 1px solid #bbb;
}

.stats td {
  border: 1px solid black;
  padding: 5px;
  word-wrap: break-word;
  text-align: center;
  position: relative;
}

#checkbox-stats div {
  position: absolute;
  left: 0;
  top: 0;
  height: 100%;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}

#checkbox-stats .bar {
  background-color: rgba(28, 251, 0, 0.6);
}

.menu {
  position: relative;
  display: inline-block;
  margin: 0.4rem 0.4rem 0.4rem 0;
}

.menu-content {
  font-size: 12pt !important;
  text-align: left !important;
  font-weight: normal !important;
  display: none;
  position: absolute;
  background-color: white;
  right: 0;
  min-width: 300px;
  box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
  z-index: 100;
  padding: 8px;
}

.dark .menu-content {
  background-color: #111;
}

.menu:hover .menu-content {
  display: block;
}

.menu:hover .menubtn,
.menu:hover .iobtn,
.menu:hover .statsbtn {
  background-color: #eee;
}

.menu-label {
  display: inline-block;
  padding: 8px;
  border: 1px solid #ccc;
  border-top: 0;
  width: calc(100% - 18px);
}

.menu-label-top {
  border-top: 1px solid #ccc;
}

.menu-textbox {
  float: left;
  height: 24px;
  margin: 10px 5px;
  padding: 5px 5px;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 14px;
  box-sizing: border-box;
  border: 1px solid #888;
  border-radius: 4px;
  outline: none;
  background-color: #eee;
  transition: background-color 0.2s, border 0.2s;
  width: calc(100% - 10px);
}

.menu-textbox.invalid,
.dark .menu-textbox.invalid {
  color: red;
}

.dark .menu-textbox {
  background-color: #222;
  color: #eee;
}

.radio-container {
  margin: 4px;
}

.topmostdiv {
  display: flex;
  flex-direction: column;
  width: 100%;
  background-color: white;
  transition: background-color 0.3s;
  min-height: 100%;
}

#top {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  align-items: center;
}

#topdivider {
  border-bottom: 2px solid black;
  display: flex;
  justify-content: center;
  align-items: center;
}

.dark #topdivider {
  border-bottom: 2px solid #ccc;
}

#topdivider>div {
  position: relative;
}

#toptoggle {
  cursor: pointer;
  user-select: none;
  position: absolute;
  padding: 0.1rem 0.3rem;
  top: -0.4rem;
  left: -1rem;
  font-size: 1.4rem;
  line-height: 60%;
  border: 1px solid black;
  border-radius: 1rem;
  background-color: #fff;
  z-index: 100;
}

.flipped {
  transform: rotate(0.5turn);
}

.dark #toptoggle {
  border: 1px solid #fff;
  background-color: #222;
}

#fileinfodiv {
  flex: 20rem 1 0;
  overflow: auto;
}

#bomcontrols {
  display: flex;
  flex-direction: row-reverse;
}

#bomcontrols>* {
  flex-shrink: 0;
}

#dbg {
  display: block;
}

::-webkit-scrollbar {
  width: 8px;
}

::-webkit-scrollbar-track {
  background: #aaa;
}

::-webkit-scrollbar-thumb {
  background: #666;
  border-radius: 3px;
}

::-webkit-scrollbar-thumb:hover {
  background: #555;
}

.slider {
  -webkit-appearance: none;
  width: 100%;
  margin: 3px 0;
  padding: 0;
  outline: none;
  opacity: 0.7;
  -webkit-transition: .2s;
  transition: opacity .2s;
  border-radius: 3px;
}

.slider:hover {
  opacity: 1;
}

.slider:focus {
  outline: none;
}

.slider::-webkit-slider-runnable-track {
  -webkit-appearance: none;
  width: 100%;
  height: 8px;
  background: #d3d3d3;
  border-radius: 3px;
  border: none;
}

.slider::-webkit-slider-thumb {
  -webkit-appearance: none;
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
  margin-top: -4px;
}

.dark .slider::-webkit-slider-thumb {
  background: #3d3;
}

.slider::-moz-range-thumb {
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
}

.slider::-moz-range-track {
  height: 8px;
  background: #d3d3d3;
  border-radius: 3px;
}

.dark .slider::-moz-range-thumb {
  background: #3d3;
}

.slider::-ms-track {
  width: 100%;
  height: 8px;
  border-width: 3px 0;
  background: transparent;
  border-color: transparent;
  color: transparent;
  transition: opacity .2s;
}

.slider::-ms-fill-lower {
  background: #d3d3d3;
  border: none;
  border-radius: 3px;
}

.slider::-ms-fill-upper {
  background: #d3d3d3;
  border: none;
  border-radius: 3px;
}

.slider::-ms-thumb {
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
  margin: 0;
}

.shameless-plug {
  font-size: 0.8em;
  text-align: center;
  display: block;
}

a {
  color: #0278a4;
}

.dark a {
  color: #00b9fd;
}

#frontcanvas,
#backcanvas {
  touch-action: none;
}

.placeholder {
  border: 1px dashed #9f9fda !important;
  background-color: #edf2f7 !important;
}

.dragging {
  z-index: 999;
}

.dark .dragging>table>tbody>tr {
  background-color: #252c30;
}

.dark .placeholder {
  filter: invert(1);
}

.column-spacer {
  top: 0;
  left: 0;
  width: calc(100% - 4px);
  position: absolute;
  cursor: pointer;
  user-select: none;
  height: 100%;
}

.column-width-handle {
  top: 0;
  right: 0;
  width: 4px;
  position: absolute;
  cursor: col-resize;
  user-select: none;
  height: 100%;
}

.column-width-handle:hover {
  background-color: #4f99bd;
}

.help-link {
  border: 1px solid #0278a4;
  padding-inline: 0.3rem;
  border-radius: 3px;
  cursor: pointer;
}

.dark .help-link {
  border: 1px solid #00b9fd;
}

.bom-color {
  width: 20%;
}

.color-column input {
  width: 1.6rem;
  height: 1rem;
  border: 1px solid black;
  cursor: pointer;
  padding: 0;
}

/* removes default styling from input color element */
::-webkit-color-swatch {
  border: none;
}

::-webkit-color-swatch-wrapper {
  padding: 0;
}

::-moz-color-swatch,
::-moz-focus-inner {
  border: none;
}

::-moz-focus-inner {
  padding: 0;
}

  </style>
  <script type="text/javascript" >
///////////////////////////////////////////////
/*
  Split.js - v1.3.5
  MIT License
  https://github.com/nathancahill/Split.js
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});

///////////////////////////////////////////////

///////////////////////////////////////////////
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
// This work is free. You can redistribute it and/or modify it
// under the terms of the WTFPL, Version 2
// For more information see LICENSE.txt or http://www.wtfpl.net/
//
// For more information, the home page:
// http://pieroxy.net/blog/pages/lz-string/testing.html
//
// LZ-based compression algorithm, version 1.4.4
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
///////////////////////////////////////////////

///////////////////////////////////////////////
/*!
 * PEP v0.4.3 | https://github.com/jquery/PEP
 * Copyright jQuery Foundation and other contributors | http://jquery.org/license
 */
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
for(var b=a;b.parentNode;)b=b.parentNode;
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
//
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
var b=x(a,this.findElements,this);
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
b=!1;else if("XY"===c)
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
vacuumTouches:function(a){var b=a.touches;
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
if(this.isPrimaryTouch(c)){
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});

///////////////////////////////////////////////

///////////////////////////////////////////////
var config = {"dark_mode": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": "none", "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Lien plac\u00e9", "bom_view": "left-right", "layer_view": "FB", "offset_back_rotation": false, "kicad_text_formatting": true, "fields": ["Value", "Footprint", "Description", "Reference"]}
///////////////////////////////////////////////

///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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fcuOg3tCqV2QXBB9eSykg2ldcP1+nW3UWH1vQAaDZMNkAAGDbL1lNNK9dYN6vXTta4N+HYeDaf10YBX9Yr19/XmEEd1z3xv9ey5d3XUtYx1mrViWXIueQ2A9cUNmA2VDZTGNQ3mlQ0NksAtDdj1hSrx2gBMtmADDbK1xw3awAINrfWLDfbaqw2B9fIN/PWGdcL16g3NvqcNlw3r9YENlg3jdbYN+fWODYsAbw2SBl8Nq3X+DcCNwQ3gjc/1kQ2v9aS1//XIjd0N7VrBZNAN8A29ACUNsOYZjf9uUPXg8Hk+VI3TDc0N6PXtDYigxrWAvWShWiMcDdqNwo20jbJxEo2gdbKNwvWjjbsN6o3DDYKNwWl6jaYNxo2Z9d0AOfWTtdr1ogALtZ8N37W/DZf1oLW7jaEN0I3Bjfd4kAAIjakNrI3ojeShWI2wDYUNtmy5jdX1ww3FjcQNusZkDYyNnQ3gTf3yUE28jYcNvY3BaWQN8w2KjabAk42bDaINltl7DbYODE3WdfH11w2P03cN5o3PDeeN143OjfeN7o2AjZAAQ3WfjbIQb/WQyoEAQE2yEDj1qzRdbjUucE34jchNxI2W9ZhNlI2kDbG5dI21jcyNma4kWT8eemFdjeMN/Y2VjeKNnE3LDaz1/vXTjZVNyg3QdZqNhU3rjbJNho3ejaaN2fWWjaeNzg2XjdjGLo2+DcZN5k3+jeENuHZRDZbixgBOTc91ma5Y0llNvk2pjdcAKE2GAChNtE3kjYzW5Y2etaV2RE2NjfS1htJ3Tb9N8g4STYON7E3bDZbZPE2yDbjN9U3T9cuN6M3GABuNoJcp9dv1jw2+dZpNi036TatNr43DTYGAFk3YtcGNvHgOTZGNoE3XTZBNoQZ2IEmNiE3ZjaFNzvA4DdhN9Q3TDeq11Y2QgDQN0M3kTcvgOLCiMZbN1M3dTeUq4nXt9aSy0o21TYP1xM2CTeTNqg3hzbwNxU3nDf1N243izbv19g2vDfNN7g2Czf8Nos2mTaCNxgAQjdZNwY2viUrNyQ2uTb7NsH056AbNgU2mzeUN4U2ytbbNwM3jLij17s31jaiAF021BlrN3shIzaMNxc3MTaJ1l7WSdc1N442pzdINlXWQLfONlM38jbTN5c2r9dXN/c3szapN3M2zTdpNh/XBgA+Nno3ELft1203fjftNr/WIDLPNgA2xj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S2TndJxDh2rXbUdnh3bXZudte2VLaPNhB2t7bPvN12wzflM5bHvXYFN0Jk9Ll62Sp2ZDucWLzSlTfvturXmLbT3Ht3dFzZ2HV3MoQBt8d2S3YIGBl3pXeNdu9z9P2xdtJ3JnYydig3hLentpbXDrkaty12DTcJdq52c7dCtvO3XTYKbMNkitbhdhd2WbaXd2l293c5t0x3/HcrdwJ3WnaPdvq2F7YJdpZ3O7aidpX4DTN7doV2JYFOtx939Xd2dj935Xb/YJp35rc/d5nXv3brd093/3Ycdkp2KhgtMkD3frdcAMD3sAEXdyD3Djfg9mD30nYrdl92q3YPdh7WkPY5dlD303eWd9C3eDcRtu53X7fgd1G2XdYrNlB33nYM2PJrTn0FdgB2A9dsId23VxGLtzYWhBhKthE2Krd7NrR3uPZ91At3EseZcgj3l3eTeVd30XdldgXAt3d71nd3SPY5t8j3snZXBRu35PdTdrl3VXeWd3O3h5TIdtQWePYpd5nXVaXk9qO3Y3dLduXX1Pdg9hO3E3frt2a59Pfntmx2/3do9gD30PacefR98rew98HWbPf9uOz32bfqdiZ24PY1ttz3U7bntusZDPZVd9u26Pb89qh55mkOfXj2erZC9su2KxUI95W3HPci9lz2iPZadme2PPfi9393FnZ89hx27Xcit1t2YrfMADG3xDa/tnN3Qaey+Qmzs2X5NiA2ibeAd4CHQ9bJt3y2KbY7FKm3J3aDt89GJwnJ9DZ3I3Yq1iD2yJq8d3E3y3Ynt6D3ivZXBRJZ1vqVdmj3jPc7t0z2BHYUq4YhC9wGdoL36rfltnZ3cvbGd/L2E3aK9pN2Z7ZW92kaEvetd9R34bebd+12cLcddi23zACedve2u3ayN0z5HPmEyU+2vTaf/H02xyQLdt74idkUSxJ2hvYst0h3PrcNCUTqD8wO9yuF5rgVtwb2oPZXdqV2VPeIx541zXdxdk92ELdQ94l2r3ZCfXK2BlFAdxc1RkGO9xT3DXbXd8sYN3b5hLH2obfK9zO2NvY0dlL2ChhbA+T5pchJ944AyfZGdk73kXbR9mV2MfYEnOn3qPdx9yr31XdZ9on3oUE59xH3yfefdpT3+ffXdzF3afdut7H3bvYbdol3APYl9wF0CoXIued3Sfem95H3efbpd5T2BfZNd2K5hvmF9tb3RfaZ98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"))
///////////////////////////////////////////////

///////////////////////////////////////////////
/* Utility functions */

var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
  pcbdata.metadata.revision + '__#';
var storage;

function initStorage(key) {
  try {
    window.localStorage.getItem("blank");
    storage = window.localStorage;
  } catch (e) {
    // localStorage not available
  }
  if (!storage) {
    try {
      window.sessionStorage.getItem("blank");
      storage = window.sessionStorage;
    } catch (e) {
      // sessionStorage also not available
    }
  }
}

function readStorage(key) {
  if (storage) {
    return storage.getItem(storagePrefix + key);
  } else {
    return null;
  }
}

function writeStorage(key, value) {
  if (storage) {
    storage.setItem(storagePrefix + key, value);
  }
}

function fancyDblClickHandler(el, onsingle, ondouble) {
  return function () {
    if (el.getAttribute("data-dblclick") == null) {
      el.setAttribute("data-dblclick", 1);
      setTimeout(function () {
        if (el.getAttribute("data-dblclick") == 1) {
          onsingle();
        }
        el.removeAttribute("data-dblclick");
      }, 200);
    } else {
      el.removeAttribute("data-dblclick");
      ondouble();
    }
  }
}

function smoothScrollToRow(rowid) {
  document.getElementById(rowid).scrollIntoView({
    behavior: "smooth",
    block: "center",
    inline: "nearest"
  });
}

function focusInputField(input) {
  input.scrollIntoView(false);
  input.focus();
  input.select();
}

function saveBomTable(output) {
  var text = '';
  for (var node of bomhead.childNodes[0].childNodes) {
    if (node.firstChild) {
      var name = node.firstChild.nodeValue ?? "";
      text += (output == 'csv' ? `"${name}"` : name);
    }
    if (node != bomhead.childNodes[0].lastChild) {
      text += (output == 'csv' ? ',' : '\t');
    }
  }
  text += '\n';
  for (var row of bombody.childNodes) {
    for (var cell of row.childNodes) {
      let val = '';
      for (var node of cell.childNodes) {
        if (node.nodeName == "INPUT") {
          if (node.checked) {
            val += '✓';
          }
        } else if ((node.nodeName == "MARK") || (node.nodeName == "A")) {
          val += node.firstChild.nodeValue;
        } else {
          val += node.nodeValue;
        }
      }
      if (output == 'csv') {
        val = val.replace(/\"/g, '\"\"'); // pair of double-quote characters
        if (isNumeric(val)) {
          val = +val;                     // use number
        } else {
          val = `"${val}"`;               // enclosed within double-quote
        }
      }
      text += val;
      if (cell != row.lastChild) {
        text += (output == 'csv' ? ',' : '\t');
      }
    }
    text += '\n';
  }

  if (output != 'clipboard') {
    // To file: csv or txt
    var blob = new Blob([text], {
      type: `text/${output}`
    });
    saveFile(`${pcbdata.metadata.title}.${output}`, blob);
  } else {
    // To clipboard
    var textArea = document.createElement("textarea");
    textArea.classList.add('clipboard-temp');
    textArea.value = text;

    document.body.appendChild(textArea);
    textArea.focus();
    textArea.select();

    try {
      if (document.execCommand('copy')) {
        console.log('Bom copied to clipboard.');
      }
    } catch (err) {
      console.log('Can not copy to clipboard.');
    }

    document.body.removeChild(textArea);
  }
}

function isNumeric(str) {
  /* https://stackoverflow.com/a/175787 */
  return (typeof str != "string" ? false : !isNaN(str) && !isNaN(parseFloat(str)));
}

function removeGutterNode(node) {
  for (var i = 0; i < node.childNodes.length; i++) {
    if (node.childNodes[i].classList &&
      node.childNodes[i].classList.contains("gutter")) {
      node.removeChild(node.childNodes[i]);
      break;
    }
  }
}

function cleanGutters() {
  removeGutterNode(document.getElementById("bot"));
  removeGutterNode(document.getElementById("canvasdiv"));
}

var units = {
  prefixes: {
    giga: ["G", "g", "giga", "Giga", "GIGA"],
    mega: ["M", "mega", "Mega", "MEGA"],
    kilo: ["K", "k", "kilo", "Kilo", "KILO"],
    milli: ["m", "milli", "Milli", "MILLI"],
    micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
    nano: ["N", "n", "nano", "Nano", "NANO"],
    pico: ["P", "p", "pico", "Pico", "PICO"],
  },
  unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
  unitsLong: [
    "OHM", "Ohm", "ohm", "ohms",
    "FARAD", "Farad", "farad",
    "HENRY", "Henry", "henry"
  ],
  getMultiplier: function (s) {
    if (this.prefixes.giga.includes(s)) return 1e9;
    if (this.prefixes.mega.includes(s)) return 1e6;
    if (this.prefixes.kilo.includes(s)) return 1e3;
    if (this.prefixes.milli.includes(s)) return 1e-3;
    if (this.prefixes.micro.includes(s)) return 1e-6;
    if (this.prefixes.nano.includes(s)) return 1e-9;
    if (this.prefixes.pico.includes(s)) return 1e-12;
    return 1;
  },
  valueRegex: null,
  valueAltRegex: null,
}

function initUtils() {
  var allPrefixes = units.prefixes.giga
    .concat(units.prefixes.mega)
    .concat(units.prefixes.kilo)
    .concat(units.prefixes.milli)
    .concat(units.prefixes.micro)
    .concat(units.prefixes.nano)
    .concat(units.prefixes.pico);
  var allUnits = units.unitsShort.concat(units.unitsLong);
  units.valueRegex = new RegExp("^([0-9\.]+)" +
    "\\s*(" + allPrefixes.join("|") + ")?" +
    "(" + allUnits.join("|") + ")?" +
    "(\\b.*)?$", "");
  units.valueAltRegex = new RegExp("^([0-9]*)" +
    "(" + units.unitsShort.join("|") + ")?" +
    "([GgMmKkUuNnPp])?" +
    "([0-9]*)" +
    "(\\b.*)?$", "");
  if (config.fields.includes("Value")) {
    var index = config.fields.indexOf("Value");
    pcbdata.bom["parsedValues"] = {};
    var allList = getBomListByLayer('FB').flat();
    for (var id in pcbdata.bom.fields) {
      var ref_key = allList.find(item => item[1] == Number(id)) || [];
      pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index], ref_key[0] || '');
    }
  }
}

function parseValue(val, ref) {
  var inferUnit = (unit, ref) => {
    if (unit) {
      unit = unit.toLowerCase();
      if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
        unit = 'r';
      }
      return unit[0];
    }

    var resarr = /^([a-z]+)\d+$/i.exec(ref);
    switch (Array.isArray(resarr) && resarr[1].toLowerCase()) {
      case "c": return 'f';
      case "l": return 'h';
      case "r":
      case "rv": return 'r';
    }
    return null;
  };
  val = val.replace(/,/g, "");
  var match = units.valueRegex.exec(val);
  if (Array.isArray(match)) {
    var unit = inferUnit(match[3], ref);
    var val_i = parseFloat(match[1]);
    if (!unit) return null;
    if (match[2]) {
      val_i = val_i * units.getMultiplier(match[2]);
    }
    return {
      val: val_i,
      unit: unit,
      extra: match[4],
    }
  }

  match = units.valueAltRegex.exec(val);
  if (Array.isArray(match) && (match[1] || match[4])) {
    var unit = inferUnit(match[2], ref);
    var val_i = parseFloat(match[1] + "." + match[4]);
    if (!unit) return null;
    if (match[3]) {
      val_i = val_i * units.getMultiplier(match[3]);
    }
    return {
      val: val_i,
      unit: unit,
      extra: match[5],
    }
  }
  return null;
}

function valueCompare(a, b, stra, strb) {
  if (a === null && b === null) {
    // Failed to parse both values, compare them as strings.
    if (stra != strb) return stra > strb ? 1 : -1;
    else return 0;
  } else if (a === null) {
    return 1;
  } else if (b === null) {
    return -1;
  } else {
    if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
    else if (a.val != b.val) return a.val > b.val ? 1 : -1;
    else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
    else return 0;
  }
}

function validateSaveImgDimension(element) {
  var valid = false;
  var intValue = 0;
  if (/^[1-9]\d*$/.test(element.value)) {
    intValue = parseInt(element.value);
    if (intValue <= 16000) {
      valid = true;
    }
  }
  if (valid) {
    element.classList.remove("invalid");
  } else {
    element.classList.add("invalid");
  }
  return intValue;
}

function saveImage(layer) {
  var width = validateSaveImgDimension(document.getElementById("render-save-width"));
  var height = validateSaveImgDimension(document.getElementById("render-save-height"));
  var bgcolor = null;
  if (!document.getElementById("render-save-transparent").checked) {
    var style = getComputedStyle(topmostdiv);
    bgcolor = style.getPropertyValue("background-color");
  }
  if (!width || !height) return;

  // Prepare image
  var canvas = document.createElement("canvas");
  var layerdict = {
    transform: {
      x: 0,
      y: 0,
      s: 1,
      panx: 0,
      pany: 0,
      zoom: 1,
    },
    bg: canvas,
    fab: canvas,
    silk: canvas,
    highlight: canvas,
    layer: layer,
  }
  // Do the rendering
  recalcLayerScale(layerdict, width, height);
  prepareLayer(layerdict);
  clearCanvas(canvas, bgcolor);
  drawBackground(layerdict, false);
  drawHighlightsOnLayer(layerdict, false);

  // Save image
  var imgdata = canvas.toDataURL("image/png");

  var filename = pcbdata.metadata.title;
  if (pcbdata.metadata.revision) {
    filename += `.${pcbdata.metadata.revision}`;
  }
  filename += `.${layer}.png`;
  saveFile(filename, dataURLtoBlob(imgdata));
}

function saveSettings() {
  var data = {
    type: "InteractiveHtmlBom settings",
    version: 1,
    pcbmetadata: pcbdata.metadata,
    settings: settings,
  }
  var blob = new Blob([JSON.stringify(data, null, 4)], {
    type: "application/json"
  });
  saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
}

function loadSettings() {
  var input = document.createElement("input");
  input.type = "file";
  input.accept = ".settings.json";
  input.onchange = function (e) {
    var file = e.target.files[0];
    var reader = new FileReader();
    reader.onload = readerEvent => {
      var content = readerEvent.target.result;
      var newSettings;
      try {
        newSettings = JSON.parse(content);
      } catch (e) {
        alert("Selected file is not InteractiveHtmlBom settings file.");
        return;
      }
      if (newSettings.type != "InteractiveHtmlBom settings") {
        alert("Selected file is not InteractiveHtmlBom settings file.");
        return;
      }
      var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
      if (metadataMatches) {
        for (var k in pcbdata.metadata) {
          if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
            metadataMatches = false;
          }
        }
      }
      if (!metadataMatches) {
        var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
        var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
        if (!confirm(
          `Settins file metadata does not match current metadata.\n\n` +
          `Page metadata:\n${currentMetadata}\n\n` +
          `Settings file metadata:\n${fileMetadata}\n\n` +
          `Press OK if you would like to import settings anyway.`)) {
          return;
        }
      }
      overwriteSettings(newSettings.settings);
    }
    reader.readAsText(file, 'UTF-8');
  }
  input.click();
}

function resetSettings() {
  if (!confirm(
    `This will reset all checkbox states and other settings.\n\n` +
    `Press OK if you want to continue.`)) {
    return;
  }
  if (storage) {
    var keys = [];
    for (var i = 0; i < storage.length; i++) {
      var key = storage.key(i);
      if (key.startsWith(storagePrefix)) keys.push(key);
    }
    for (var key of keys) storage.removeItem(key);
  }
  location.reload();
}

function overwriteSettings(newSettings) {
  initDone = false;
  Object.assign(settings, newSettings);
  writeStorage("bomlayout", settings.bomlayout);
  writeStorage("bommode", settings.bommode);
  writeStorage("canvaslayout", settings.canvaslayout);
  writeStorage("bomCheckboxes", settings.checkboxes.join(","));
  document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
  for (var checkbox of settings.checkboxes) {
    writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
  }
  writeStorage("markWhenChecked", settings.markWhenChecked);
  padsVisible(settings.renderPads);
  document.getElementById("padsCheckbox").checked = settings.renderPads;
  fabricationVisible(settings.renderFabrication);
  document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
  silkscreenVisible(settings.renderSilkscreen);
  document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
  referencesVisible(settings.renderReferences);
  document.getElementById("referencesCheckbox").checked = settings.renderReferences;
  valuesVisible(settings.renderValues);
  document.getElementById("valuesCheckbox").checked = settings.renderValues;
  tracksVisible(settings.renderTracks);
  document.getElementById("tracksCheckbox").checked = settings.renderTracks;
  zonesVisible(settings.renderZones);
  document.getElementById("zonesCheckbox").checked = settings.renderZones;
  dnpOutline(settings.renderDnpOutline);
  document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
  setRedrawOnDrag(settings.redrawOnDrag);
  document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
  setHighlightRowOnClick(settings.highlightRowOnClick);
  document.getElementById("highlightRowOnClickCheckbox").checked = settings.highlightRowOnClick;
  setDarkMode(settings.darkMode);
  document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
  setHighlightPin1(settings.highlightpin1);
  document.forms.highlightpin1.highlightpin1.value = settings.highlightpin1;
  writeStorage("boardRotation", settings.boardRotation);
  document.getElementById("boardRotation").value = settings.boardRotation / 5;
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
  setOffsetBackRotation(settings.offsetBackRotation);
  document.getElementById("offsetBackRotationCheckbox").checked = settings.offsetBackRotation;
  initDone = true;
  prepCheckboxes();
  changeBomLayout(settings.bomlayout);
}

function saveFile(filename, blob) {
  var link = document.createElement("a");
  var objurl = URL.createObjectURL(blob);
  link.download = filename;
  link.href = objurl;
  link.click();
}

function dataURLtoBlob(dataurl) {
  var arr = dataurl.split(','),
    mime = arr[0].match(/:(.*?);/)[1],
    bstr = atob(arr[1]),
    n = bstr.length,
    u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new Blob([u8arr], {
    type: mime
  });
}

var settings = {
  canvaslayout: "FB",
  bomlayout: "left-right",
  bommode: "grouped",
  checkboxes: [],
  checkboxStoredRefs: {},
  darkMode: false,
  highlightpin1: "none",
  redrawOnDrag: true,
  boardRotation: 0,
  offsetBackRotation: false,
  renderPads: true,
  renderReferences: true,
  renderValues: true,
  renderSilkscreen: true,
  renderFabrication: true,
  renderDnpOutline: false,
  renderTracks: true,
  renderZones: true,
  columnOrder: [],
  hiddenColumns: [],
  netColors: {},
}

function initDefaults() {
  settings.bomlayout = readStorage("bomlayout");
  if (settings.bomlayout === null) {
    settings.bomlayout = config.bom_view;
  }
  if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
    settings.bomlayout = config.bom_view;
  }
  settings.bommode = readStorage("bommode");
  if (settings.bommode === null) {
    settings.bommode = "grouped";
  }
  if (settings.bommode == "netlist" && !pcbdata.nets) {
    settings.bommode = "grouped";
  }
  if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
    settings.bommode = "grouped";
  }
  settings.canvaslayout = readStorage("canvaslayout");
  if (settings.canvaslayout === null) {
    settings.canvaslayout = config.layer_view;
  }
  var bomCheckboxes = readStorage("bomCheckboxes");
  if (bomCheckboxes === null) {
    bomCheckboxes = config.checkboxes;
  }
  settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
  document.getElementById("bomCheckboxes").value = bomCheckboxes;

  var highlightpin1 = readStorage("highlightpin1") || config.highlight_pin1;
  if (highlightpin1 === "false") highlightpin1 = "none";
  if (highlightpin1 === "true") highlightpin1 = "all";
  setHighlightPin1(highlightpin1);
  document.forms.highlightpin1.highlightpin1.value = highlightpin1;

  settings.markWhenChecked = readStorage("markWhenChecked") || "";
  populateMarkWhenCheckedOptions();

  function initBooleanSetting(storageString, def, elementId, func) {
    var b = readStorage(storageString);
    if (b === null) {
      b = def;
    } else {
      b = (b == "true");
    }
    document.getElementById(elementId).checked = b;
    func(b);
  }

  initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
  initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
  initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
  initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
  initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible);
  if ("tracks" in pcbdata) {
    initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
    initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
  } else {
    document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
    tracksVisible(false);
    zonesVisible(false);
  }
  initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
  initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
  initBooleanSetting("highlightRowOnClick", false, "highlightRowOnClickCheckbox", setHighlightRowOnClick);
  initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);

  var fields = ["checkboxes", "References"].concat(config.fields).concat(["Quantity"]);
  var hcols = JSON.parse(readStorage("hiddenColumns"));
  if (hcols === null) {
    hcols = [];
  }
  settings.hiddenColumns = hcols.filter(e => fields.includes(e));

  var cord = JSON.parse(readStorage("columnOrder"));
  if (cord === null) {
    cord = fields;
  } else {
    cord = cord.filter(e => fields.includes(e));
    if (cord.length != fields.length)
      cord = fields;
  }
  settings.columnOrder = cord;

  settings.boardRotation = readStorage("boardRotation");
  if (settings.boardRotation === null) {
    settings.boardRotation = config.board_rotation * 5;
  } else {
    settings.boardRotation = parseInt(settings.boardRotation);
  }
  document.getElementById("boardRotation").value = settings.boardRotation / 5;
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
  initBooleanSetting("offsetBackRotation", config.offset_back_rotation, "offsetBackRotationCheckbox", setOffsetBackRotation);

  settings.netColors = JSON.parse(readStorage("netColors")) || {};
}

// Helper classes for user js callbacks.

const IBOM_EVENT_TYPES = {
  ALL: "all",
  HIGHLIGHT_EVENT: "highlightEvent",
  CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
  BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent",
}

const EventHandler = {
  callbacks: {},
  init: function () {
    for (eventType of Object.values(IBOM_EVENT_TYPES))
      this.callbacks[eventType] = [];
  },
  registerCallback: function (eventType, callback) {
    this.callbacks[eventType].push(callback);
  },
  emitEvent: function (eventType, eventArgs) {
    event = {
      eventType: eventType,
      args: eventArgs,
    }
    var callback;
    for (callback of this.callbacks[eventType])
      callback(event);
    for (callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
      callback(event);
  }
}
EventHandler.init();

///////////////////////////////////////////////

///////////////////////////////////////////////
/* PCB rendering code */

var emptyContext2d = document.createElement("canvas").getContext("2d");

function deg2rad(deg) {
  return deg * Math.PI / 180;
}

function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
  var point = [
    linepoint[0] * text.width + offsetx,
    linepoint[1] * text.height + offsety
  ];
  // This approximates pcbnew behavior with how text tilts depending on horizontal justification
  point[0] -= (linepoint[1] + 0.5 * (1 + text.justify[0])) * text.height * tilt;
  return point;
}

function drawText(ctx, text, color) {
  if ("ref" in text && !settings.renderReferences) return;
  if ("val" in text && !settings.renderValues) return;
  ctx.save();
  ctx.fillStyle = color;
  ctx.strokeStyle = color;
  ctx.lineCap = "round";
  ctx.lineJoin = "round";
  ctx.lineWidth = text.thickness;
  if ("svgpath" in text) {
    ctx.stroke(new Path2D(text.svgpath));
    ctx.restore();
    return;
  }
  if ("polygons" in text) {
    ctx.fill(getPolygonsPath(text));
    ctx.restore();
    return;
  }
  ctx.translate(...text.pos);
  ctx.translate(text.thickness * 0.5, 0);
  var angle = -text.angle;
  if (text.attr.includes("mirrored")) {
    ctx.scale(-1, 1);
    angle = -angle;
  }
  var tilt = 0;
  if (text.attr.includes("italic")) {
    tilt = 0.125;
  }
  var interline = text.height * 1.5 + text.thickness;
  var txt = text.text.split("\n");
  // KiCad ignores last empty line.
  if (txt[txt.length - 1] == '') txt.pop();
  ctx.rotate(deg2rad(angle));
  var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
  offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
  for (var i in txt) {
    var lineWidth = text.thickness + interline / 2 * tilt;
    for (var j = 0; j < txt[i].length; j++) {
      if (txt[i][j] == '\t') {
        var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
        lineWidth += fourSpaces - lineWidth % fourSpaces;
      } else {
        if (txt[i][j] == '~') {
          j++;
          if (j == txt[i].length)
            break;
        }
        lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
      }
    }
    var offsetx = -lineWidth * (text.justify[0] + 1) / 2;
    var inOverbar = false;
    for (var j = 0; j < txt[i].length; j++) {
      if (config.kicad_text_formatting) {
        if (txt[i][j] == '\t') {
          var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
          offsetx += fourSpaces - offsetx % fourSpaces;
          continue;
        } else if (txt[i][j] == '~') {
          j++;
          if (j == txt[i].length)
            break;
          if (txt[i][j] != '~') {
            inOverbar = !inOverbar;
          }
        }
      }
      var glyph = pcbdata.font_data[txt[i][j]];
      if (inOverbar) {
        var overbarStart = [offsetx, -text.height * 1.4 + offsety];
        var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]];

        if (!lastHadOverbar) {
          overbarStart[0] += text.height * 1.4 * tilt;
          lastHadOverbar = true;
        }
        ctx.beginPath();
        ctx.moveTo(...overbarStart);
        ctx.lineTo(...overbarEnd);
        ctx.stroke();
      } else {
        lastHadOverbar = false;
      }
      for (var line of glyph.l) {
        ctx.beginPath();
        ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
        for (var k = 1; k < line.length; k++) {
          ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt));
        }
        ctx.stroke();
      }
      offsetx += glyph.w * text.width;
    }
    offsety += interline;
  }
  ctx.restore();
}

function drawedge(ctx, scalefactor, edge, color) {
  ctx.strokeStyle = color;
  ctx.fillStyle = color;
  ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
  ctx.lineCap = "round";
  ctx.lineJoin = "round";
  if ("svgpath" in edge) {
    ctx.stroke(new Path2D(edge.svgpath));
  } else {
    ctx.beginPath();
    if (edge.type == "segment") {
      ctx.moveTo(...edge.start);
      ctx.lineTo(...edge.end);
    }
    if (edge.type == "rect") {
      ctx.moveTo(...edge.start);
      ctx.lineTo(edge.start[0], edge.end[1]);
      ctx.lineTo(...edge.end);
      ctx.lineTo(edge.end[0], edge.start[1]);
      ctx.lineTo(...edge.start);
    }
    if (edge.type == "arc") {
      ctx.arc(
        ...edge.start,
        edge.radius,
        deg2rad(edge.startangle),
        deg2rad(edge.endangle));
    }
    if (edge.type == "circle") {
      ctx.arc(
        ...edge.start,
        edge.radius,
        0, 2 * Math.PI);
      ctx.closePath();
    }
    if (edge.type == "curve") {
      ctx.moveTo(...edge.start);
      ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
    }
    if("filled" in edge && edge.filled)
      ctx.fill();
    else
      ctx.stroke();
  }
}

function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
  // chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
  var path = new Path2D();
  var width = size[0];
  var height = size[1];
  var x = width * -0.5;
  var y = height * -0.5;
  var chamfOffset = Math.min(width, height) * chamfratio;
  path.moveTo(x, 0);
  if (chamfpos & 4) {
    path.lineTo(x, y + height - chamfOffset);
    path.lineTo(x + chamfOffset, y + height);
    path.lineTo(0, y + height);
  } else {
    path.arcTo(x, y + height, x + width, y + height, radius);
  }
  if (chamfpos & 8) {
    path.lineTo(x + width - chamfOffset, y + height);
    path.lineTo(x + width, y + height - chamfOffset);
    path.lineTo(x + width, 0);
  } else {
    path.arcTo(x + width, y + height, x + width, y, radius);
  }
  if (chamfpos & 2) {
    path.lineTo(x + width, y + chamfOffset);
    path.lineTo(x + width - chamfOffset, y);
    path.lineTo(0, y);
  } else {
    path.arcTo(x + width, y, x, y, radius);
  }
  if (chamfpos & 1) {
    path.lineTo(x + chamfOffset, y);
    path.lineTo(x, y + chamfOffset);
    path.lineTo(x, 0);
  } else {
    path.arcTo(x, y, x, y + height, radius);
  }
  path.closePath();
  return path;
}

function getOblongPath(size) {
  return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
}

function getPolygonsPath(shape) {
  if (shape.path2d) {
    return shape.path2d;
  }
  if ("svgpath" in shape) {
    shape.path2d = new Path2D(shape.svgpath);
  } else {
    var path = new Path2D();
    for (var polygon of shape.polygons) {
      path.moveTo(...polygon[0]);
      for (var i = 1; i < polygon.length; i++) {
        path.lineTo(...polygon[i]);
      }
      path.closePath();
    }
    shape.path2d = path;
  }
  return shape.path2d;
}

function drawPolygonShape(ctx, scalefactor, shape, color) {
  ctx.save();
  if (!("svgpath" in shape)) {
    ctx.translate(...shape.pos);
    ctx.rotate(deg2rad(-shape.angle));
  }
  if("filled" in shape && !shape.filled) {
    ctx.strokeStyle = color;
    ctx.lineWidth = Math.max(1 / scalefactor, shape.width);
    ctx.lineCap = "round";
    ctx.lineJoin = "round";
    ctx.stroke(getPolygonsPath(shape));
  } else {
    ctx.fillStyle = color;
    ctx.fill(getPolygonsPath(shape));
  }
  ctx.restore();
}

function drawDrawing(ctx, scalefactor, drawing, color) {
  if (["segment", "arc", "circle", "curve", "rect"].includes(drawing.type)) {
    drawedge(ctx, scalefactor, drawing, color);
  } else if (drawing.type == "polygon") {
    drawPolygonShape(ctx, scalefactor, drawing, color);
  } else {
    drawText(ctx, drawing, color);
  }
}

function getCirclePath(radius) {
  var path = new Path2D();
  path.arc(0, 0, radius, 0, 2 * Math.PI);
  path.closePath();
  return path;
}

function getCachedPadPath(pad) {
  if (!pad.path2d) {
    // if path2d is not set, build one and cache it on pad object
    if (pad.shape == "rect") {
      pad.path2d = new Path2D();
      pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
    } else if (pad.shape == "oval") {
      pad.path2d = getOblongPath(pad.size);
    } else if (pad.shape == "circle") {
      pad.path2d = getCirclePath(pad.size[0] / 2);
    } else if (pad.shape == "roundrect") {
      pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
    } else if (pad.shape == "chamfrect") {
      pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
    } else if (pad.shape == "custom") {
      pad.path2d = getPolygonsPath(pad);
    }
  }
  return pad.path2d;
}

function drawPad(ctx, pad, color, outline) {
  ctx.save();
  ctx.translate(...pad.pos);
  ctx.rotate(-deg2rad(pad.angle));
  if (pad.offset) {
    ctx.translate(...pad.offset);
  }
  ctx.fillStyle = color;
  ctx.strokeStyle = color;
  var path = getCachedPadPath(pad);
  if (outline) {
    ctx.stroke(path);
  } else {
    ctx.fill(path);
  }
  ctx.restore();
}

function drawPadHole(ctx, pad, padHoleColor) {
  if (pad.type != "th") return;
  ctx.save();
  ctx.translate(...pad.pos);
  ctx.rotate(-deg2rad(pad.angle));
  ctx.fillStyle = padHoleColor;
  if (pad.drillshape == "oblong") {
    ctx.fill(getOblongPath(pad.drillsize));
  } else if (pad.drillshape == "rect") {
    ctx.fill(getChamferedRectPath(pad.drillsize, 0, 0, 0));
  } else {
    ctx.fill(getCirclePath(pad.drillsize[0] / 2));
  }
  ctx.restore();
}

function drawFootprint(ctx, layer, scalefactor, footprint, colors, highlight, outline) {
  if (highlight) {
    // draw bounding box
    if (footprint.layer == layer) {
      ctx.save();
      ctx.globalAlpha = 0.2;
      ctx.translate(...footprint.bbox.pos);
      ctx.rotate(deg2rad(-footprint.bbox.angle));
      ctx.translate(...footprint.bbox.relpos);
      ctx.fillStyle = colors.pad;
      ctx.fillRect(0, 0, ...footprint.bbox.size);
      ctx.globalAlpha = 1;
      ctx.strokeStyle = colors.pad;
      ctx.lineWidth = 3 / scalefactor;
      ctx.strokeRect(0, 0, ...footprint.bbox.size);
      ctx.restore();
    }
  }
  // draw drawings
  for (var drawing of footprint.drawings) {
    if (drawing.layer == layer) {
      drawDrawing(ctx, scalefactor, drawing.drawing, colors.pad);
    }
  }
  ctx.lineWidth = 3 / scalefactor;
  // draw pads
  if (settings.renderPads) {
    for (var pad of footprint.pads) {
      if (pad.layers.includes(layer)) {
        drawPad(ctx, pad, colors.pad, outline);
        if (pad.pin1 &&
          (settings.highlightpin1 == "all" ||
            settings.highlightpin1 == "selected" && highlight)) {
          drawPad(ctx, pad, colors.outline, true);
        }
      }
    }
    for (var pad of footprint.pads) {
      drawPadHole(ctx, pad, colors.padHole);
    }
  }
}

function drawEdgeCuts(canvas, scalefactor) {
  var ctx = canvas.getContext("2d");
  var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
  for (var edge of pcbdata.edges) {
    drawDrawing(ctx, scalefactor, edge, edgecolor);
  }
}

function drawFootprints(canvas, layer, scalefactor, highlight) {
  var ctx = canvas.getContext("2d");
  ctx.lineWidth = 3 / scalefactor;
  var style = getComputedStyle(topmostdiv);

  var colors = {
    pad: style.getPropertyValue('--pad-color'),
    padHole: style.getPropertyValue('--pad-hole-color'),
    outline: style.getPropertyValue('--pin1-outline-color'),
  }

  for (var i = 0; i < pcbdata.footprints.length; i++) {
    var mod = pcbdata.footprints[i];
    var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
    var h = highlightedFootprints.includes(i);
    var d = markedFootprints.has(i);
    if (highlight) {
      if(h && d) {
        colors.pad = style.getPropertyValue('--pad-color-highlight-both');
        colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-both');
      } else if (h) {
        colors.pad = style.getPropertyValue('--pad-color-highlight');
        colors.outline = style.getPropertyValue('--pin1-outline-color-highlight');
      } else if (d) {
        colors.pad = style.getPropertyValue('--pad-color-highlight-marked');
        colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-marked');
      }
    }
    if( h || d || !highlight) {
      drawFootprint(ctx, layer, scalefactor, mod, colors, highlight, outline);
    }
  }
}

function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
  var ctx = canvas.getContext("2d");
  for (var d of pcbdata.drawings[layername][layer]) {
    if (["segment", "arc", "circle", "curve", "rect"].includes(d.type)) {
      drawedge(ctx, scalefactor, d, edgeColor);
    } else if (d.type == "polygon") {
      drawPolygonShape(ctx, scalefactor, d, polygonColor);
    } else {
      drawText(ctx, d, textColor);
    }
  }
}

function drawTracks(canvas, layer, defaultColor, highlight) {
  ctx = canvas.getContext("2d");
  ctx.lineCap = "round";

  var hasHole = (track) => (
    'drillsize' in track &&
    track.start[0] == track.end[0] &&
    track.start[1] == track.end[1]);

  // First draw tracks and tented vias
  for (var track of pcbdata.tracks[layer]) {
    if (highlight && highlightedNet != track.net) continue;
    if (!hasHole(track)) {
      ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
      ctx.lineWidth = track.width;
      ctx.beginPath();
      if ('radius' in track) {
        ctx.arc(
          ...track.center,
          track.radius,
          deg2rad(track.startangle),
          deg2rad(track.endangle));
      } else {
        ctx.moveTo(...track.start);
        ctx.lineTo(...track.end);
      }
      ctx.stroke();
    }
  }
  // Second pass to draw untented vias
  var style = getComputedStyle(topmostdiv);
  var holeColor = style.getPropertyValue('--pad-hole-color')

  for (var track of pcbdata.tracks[layer]) {
    if (highlight && highlightedNet != track.net) continue;
    if (hasHole(track)) {
      ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
      ctx.lineWidth = track.width;
      ctx.beginPath();
      ctx.moveTo(...track.start);
      ctx.lineTo(...track.end);
      ctx.stroke();
      ctx.strokeStyle = holeColor;
      ctx.lineWidth = track.drillsize;
      ctx.lineTo(...track.end);
      ctx.stroke();
    }
  }
}

function drawZones(canvas, layer, defaultColor, highlight) {
  ctx = canvas.getContext("2d");
  ctx.lineJoin = "round";
  for (var zone of pcbdata.zones[layer]) {
    if (highlight && highlightedNet != zone.net) continue;
    ctx.strokeStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
    ctx.fillStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
    if (!zone.path2d) {
      zone.path2d = getPolygonsPath(zone);
    }
    ctx.fill(zone.path2d, zone.fillrule || "nonzero");
    if (zone.width > 0) {
      ctx.lineWidth = zone.width;
      ctx.stroke(zone.path2d);
    }
  }
}

function clearCanvas(canvas, color = null) {
  var ctx = canvas.getContext("2d");
  ctx.save();
  ctx.setTransform(1, 0, 0, 1, 0, 0);
  if (color) {
    ctx.fillStyle = color;
    ctx.fillRect(0, 0, canvas.width, canvas.height);
  } else {
    if (!window.matchMedia("print").matches)
      ctx.clearRect(0, 0, canvas.width, canvas.height);
  }
  ctx.restore();
}

function drawNets(canvas, layer, highlight) {
  var style = getComputedStyle(topmostdiv);
  if (settings.renderZones) {
    var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
    drawZones(canvas, layer, zoneColor, highlight);
  }
  if (settings.renderTracks) {
    var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
    drawTracks(canvas, layer, trackColor, highlight);
  }
  if (highlight && settings.renderPads) {
    var padColor = style.getPropertyValue('--pad-color-highlight');
    var padHoleColor = style.getPropertyValue('--pad-hole-color');
    var ctx = canvas.getContext("2d");
    for (var footprint of pcbdata.footprints) {
      // draw pads
      var padDrawn = false;
      for (var pad of footprint.pads) {
        if (highlightedNet != pad.net) continue;
        if (pad.layers.includes(layer)) {
          drawPad(ctx, pad, padColor, false);
          padDrawn = true;
        }
      }
      if (padDrawn) {
        // redraw all pad holes because some pads may overlap
        for (var pad of footprint.pads) {
          drawPadHole(ctx, pad, padHoleColor);
        }
      }
    }
  }
}

function drawHighlightsOnLayer(canvasdict, clear = true) {
  if (clear) {
    clearCanvas(canvasdict.highlight);
  }
  if (markedFootprints.size > 0 || highlightedFootprints.length > 0) {
    drawFootprints(canvasdict.highlight, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom, true);
  }
  if (highlightedNet !== null) {
    drawNets(canvasdict.highlight, canvasdict.layer, true);
  }
}

function drawHighlights() {
  drawHighlightsOnLayer(allcanvas.front);
  drawHighlightsOnLayer(allcanvas.back);
}

function drawBackground(canvasdict, clear = true) {
  if (clear) {
    clearCanvas(canvasdict.bg);
    clearCanvas(canvasdict.fab);
    clearCanvas(canvasdict.silk);
  }

  drawNets(canvasdict.bg, canvasdict.layer, false);
  drawFootprints(canvasdict.bg, canvasdict.layer,
    canvasdict.transform.s * canvasdict.transform.zoom, false);

  drawEdgeCuts(canvasdict.bg, canvasdict.transform.s * canvasdict.transform.zoom);

  var style = getComputedStyle(topmostdiv);
  var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
  var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
  var textColor = style.getPropertyValue('--silkscreen-text-color');
  if (settings.renderSilkscreen) {
    drawBgLayer(
      "silkscreen", canvasdict.silk, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom,
      edgeColor, polygonColor, textColor);
  }
  edgeColor = style.getPropertyValue('--fabrication-edge-color');
  polygonColor = style.getPropertyValue('--fabrication-polygon-color');
  textColor = style.getPropertyValue('--fabrication-text-color');
  if (settings.renderFabrication) {
    drawBgLayer(
      "fabrication", canvasdict.fab, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom,
      edgeColor, polygonColor, textColor);
  }
}

function prepareCanvas(canvas, flip, transform) {
  var ctx = canvas.getContext("2d");
  ctx.setTransform(1, 0, 0, 1, 0, 0);
  ctx.scale(transform.zoom, transform.zoom);
  ctx.translate(transform.panx, transform.pany);
  if (flip) {
    ctx.scale(-1, 1);
  }
  ctx.translate(transform.x, transform.y);
  ctx.rotate(deg2rad(settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
  ctx.scale(transform.s, transform.s);
}

function prepareLayer(canvasdict) {
  var flip = (canvasdict.layer === "B");
  for (var c of ["bg", "fab", "silk", "highlight"]) {
    prepareCanvas(canvasdict[c], flip, canvasdict.transform);
  }
}

function rotateVector(v, angle) {
  angle = deg2rad(angle);
  return [
    v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
    v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
  ];
}

function applyRotation(bbox, flip) {
  var corners = [
    [bbox.minx, bbox.miny],
    [bbox.minx, bbox.maxy],
    [bbox.maxx, bbox.miny],
    [bbox.maxx, bbox.maxy],
  ];
  corners = corners.map((v) => rotateVector(v, settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
  return {
    minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
    miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
    maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
    maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
  }
}

function recalcLayerScale(layerdict, width, height) {
  var flip = (layerdict.layer === "B");
  var bbox = applyRotation(pcbdata.edges_bbox, flip);
  var scalefactor = 0.98 * Math.min(
    width / (bbox.maxx - bbox.minx),
    height / (bbox.maxy - bbox.miny)
  );
  if (scalefactor < 0.1) {
    scalefactor = 1;
  }
  layerdict.transform.s = scalefactor;
  if (flip) {
    layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
  } else {
    layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
  }
  layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
  for (var c of ["bg", "fab", "silk", "highlight"]) {
    canvas = layerdict[c];
    canvas.width = width;
    canvas.height = height;
    canvas.style.width = (width / devicePixelRatio) + "px";
    canvas.style.height = (height / devicePixelRatio) + "px";
  }
}

function redrawCanvas(layerdict) {
  prepareLayer(layerdict);
  drawBackground(layerdict);
  drawHighlightsOnLayer(layerdict);
}

function resizeCanvas(layerdict) {
  var canvasdivid = {
    "F": "frontcanvas",
    "B": "backcanvas"
  } [layerdict.layer];
  var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
  var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
  recalcLayerScale(layerdict, width, height);
  redrawCanvas(layerdict);
}

function resizeAll() {
  resizeCanvas(allcanvas.front);
  resizeCanvas(allcanvas.back);
}

function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
  var A = x - x1;
  var B = y - y1;
  var C = x2 - x1;
  var D = y2 - y1;

  var dot = A * C + B * D;
  var len_sq = C * C + D * D;
  var dx, dy;
  if (len_sq == 0) {
    // start and end of the segment coincide
    dx = x - x1;
    dy = y - y1;
  } else {
    var param = dot / len_sq;
    var xx, yy;
    if (param < 0) {
      xx = x1;
      yy = y1;
    } else if (param > 1) {
      xx = x2;
      yy = y2;
    } else {
      xx = x1 + param * C;
      yy = y1 + param * D;
    }
    dx = x - xx;
    dy = y - yy;
  }
  return dx * dx + dy * dy <= d * d;
}

function modulo(n, mod) {
  return ((n % mod) + mod) % mod;
}

function pointWithinDistanceToArc(x, y, xc, yc, radius, startangle, endangle, d) {
  var dx = x - xc;
  var dy = y - yc;
  var r_sq = dx * dx + dy * dy;
  var rmin = Math.max(0, radius - d);
  var rmax = radius + d;

  if (r_sq < rmin * rmin || r_sq > rmax * rmax)
    return false;

  var angle1 = modulo(deg2rad(startangle), 2 * Math.PI);
  var dx1 = xc + radius * Math.cos(angle1) - x;
  var dy1 = yc + radius * Math.sin(angle1) - y;
  if (dx1 * dx1 + dy1 * dy1 <= d * d)
    return true;

  var angle2 = modulo(deg2rad(endangle), 2 * Math.PI);
  var dx2 = xc + radius * Math.cos(angle2) - x;
  var dy2 = yc + radius * Math.sin(angle2) - y;
  if (dx2 * dx2 + dy2 * dy2 <= d * d)
    return true;

  var angle = modulo(Math.atan2(dy, dx), 2 * Math.PI);
  if (angle1 > angle2)
    return (angle >= angle2 || angle <= angle1);
  else
    return (angle >= angle1 && angle <= angle2);
}

function pointWithinPad(x, y, pad) {
  var v = [x - pad.pos[0], y - pad.pos[1]];
  v = rotateVector(v, pad.angle);
  if (pad.offset) {
    v[0] -= pad.offset[0];
    v[1] -= pad.offset[1];
  }
  return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
}

function netHitScan(layer, x, y) {
  // Check track segments
  if (settings.renderTracks && pcbdata.tracks) {
    for (var track of pcbdata.tracks[layer]) {
      if ('radius' in track) {
        if (pointWithinDistanceToArc(x, y, ...track.center, track.radius, track.startangle, track.endangle, track.width / 2)) {
          return track.net;
        }
      } else {
        if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
          return track.net;
        }
      }
    }
  }
  // Check pads
  if (settings.renderPads) {
    for (var footprint of pcbdata.footprints) {
      for (var pad of footprint.pads) {
        if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
          return pad.net;
        }
      }
    }
  }
  return null;
}

function pointWithinFootprintBbox(x, y, bbox) {
  var v = [x - bbox.pos[0], y - bbox.pos[1]];
  v = rotateVector(v, bbox.angle);
  return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
    bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
}

function bboxHitScan(layer, x, y) {
  var result = [];
  for (var i = 0; i < pcbdata.footprints.length; i++) {
    var footprint = pcbdata.footprints[i];
    if (footprint.layer == layer) {
      if (pointWithinFootprintBbox(x, y, footprint.bbox)) {
        result.push(i);
      }
    }
  }
  return result;
}

function handlePointerDown(e, layerdict) {
  if (e.button != 0 && e.button != 1) {
    return;
  }
  e.preventDefault();
  e.stopPropagation();

  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  layerdict.pointerStates[e.pointerId] = {
    distanceTravelled: 0,
    lastX: e.offsetX,
    lastY: e.offsetY,
    downTime: Date.now(),
  };
}

function handleMouseClick(e, layerdict) {
  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  var x = e.offsetX;
  var y = e.offsetY;
  var t = layerdict.transform;
  var flip = layerdict.layer === "B";
  if (flip) {
    x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
  } else {
    x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
  }
  y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
  var v = rotateVector([x, y], -settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0));
  if ("nets" in pcbdata) {
    var net = netHitScan(layerdict.layer, ...v);
    if (net !== highlightedNet) {
      netClicked(net);
    }
  }
  if (highlightedNet === null) {
    var footprints = bboxHitScan(layerdict.layer, ...v);
    if (footprints.length > 0) {
      footprintsClicked(footprints);
    }
  }
}

function handlePointerLeave(e, layerdict) {
  e.preventDefault();
  e.stopPropagation();

  if (!settings.redrawOnDrag) {
    redrawCanvas(layerdict);
  }

  delete layerdict.pointerStates[e.pointerId];
}

function resetTransform(layerdict) {
  layerdict.transform.panx = 0;
  layerdict.transform.pany = 0;
  layerdict.transform.zoom = 1;
  redrawCanvas(layerdict);
}

function handlePointerUp(e, layerdict) {
  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  e.preventDefault();
  e.stopPropagation();

  if (e.button == 2) {
    // Reset pan and zoom on right click.
    resetTransform(layerdict);
    layerdict.anotherPointerTapped = false;
    return;
  }

  // We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
  var ptr = layerdict.pointerStates[e.pointerId];
  ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);

  if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
    if (Object.keys(layerdict.pointerStates).length == 1) {
      if (layerdict.anotherPointerTapped) {
        // This is the second pointer coming off of a two-finger tap
        resetTransform(layerdict);
      } else {
        // This is just a regular tap
        handleMouseClick(e, layerdict);
      }
      layerdict.anotherPointerTapped = false;
    } else {
      // This is the first finger coming off of what could become a two-finger tap
      layerdict.anotherPointerTapped = true;
    }
  } else {
    if (!settings.redrawOnDrag) {
      redrawCanvas(layerdict);
    }
    layerdict.anotherPointerTapped = false;
  }

  delete layerdict.pointerStates[e.pointerId];
}

function handlePointerMove(e, layerdict) {
  if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
    return;
  }
  e.preventDefault();
  e.stopPropagation();

  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  var thisPtr = layerdict.pointerStates[e.pointerId];

  var dx = e.offsetX - thisPtr.lastX;
  var dy = e.offsetY - thisPtr.lastY;

  // If this number is low on pointer up, we count the action as a click
  thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);

  if (Object.keys(layerdict.pointerStates).length == 1) {
    // This is a simple drag
    layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
    layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
  } else if (Object.keys(layerdict.pointerStates).length == 2) {
    var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];

    var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
    var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2));

    var scaleFactor = newDist / oldDist;

    if (scaleFactor != NaN) {
      layerdict.transform.zoom *= scaleFactor;

      var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
      layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
      layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
    }
  }

  thisPtr.lastX = e.offsetX;
  thisPtr.lastY = e.offsetY;

  if (settings.redrawOnDrag) {
    redrawCanvas(layerdict);
  }
}

function handleMouseWheel(e, layerdict) {
  e.preventDefault();
  e.stopPropagation();
  var t = layerdict.transform;
  var wheeldelta = e.deltaY;
  if (e.deltaMode == 1) {
    // FF only, scroll by lines
    wheeldelta *= 30;
  } else if (e.deltaMode == 2) {
    wheeldelta *= 300;
  }
  var m = Math.pow(1.1, -wheeldelta / 40);
  // Limit amount of zoom per tick.
  if (m > 2) {
    m = 2;
  } else if (m < 0.5) {
    m = 0.5;
  }
  t.zoom *= m;
  var zoomd = (1 - m) / t.zoom;
  t.panx += devicePixelRatio * e.offsetX * zoomd;
  t.pany += devicePixelRatio * e.offsetY * zoomd;
  redrawCanvas(layerdict);
}

function addMouseHandlers(div, layerdict) {
  div.addEventListener("pointerdown", function(e) {
    handlePointerDown(e, layerdict);
  });
  div.addEventListener("pointermove", function(e) {
    handlePointerMove(e, layerdict);
  });
  div.addEventListener("pointerup", function(e) {
    handlePointerUp(e, layerdict);
  });
  var pointerleave = function(e) {
    handlePointerLeave(e, layerdict);
  }
  div.addEventListener("pointercancel", pointerleave);
  div.addEventListener("pointerleave", pointerleave);
  div.addEventListener("pointerout", pointerleave);

  div.onwheel = function(e) {
    handleMouseWheel(e, layerdict);
  }
  for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
    element.addEventListener("contextmenu", function(e) {
      e.preventDefault();
    }, false);
  }
}

function setRedrawOnDrag(value) {
  settings.redrawOnDrag = value;
  writeStorage("redrawOnDrag", value);
}

function setBoardRotation(value) {
  settings.boardRotation = value * 5;
  writeStorage("boardRotation", settings.boardRotation);
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
  resizeAll();
}

function setOffsetBackRotation(value) {
  settings.offsetBackRotation = value;
  writeStorage("offsetBackRotation", value);
  resizeAll();
}

function initRender() {
  allcanvas = {
    front: {
      transform: {
        x: 0,
        y: 0,
        s: 1,
        panx: 0,
        pany: 0,
        zoom: 1,
      },
      pointerStates: {},
      anotherPointerTapped: false,
      bg: document.getElementById("F_bg"),
      fab: document.getElementById("F_fab"),
      silk: document.getElementById("F_slk"),
      highlight: document.getElementById("F_hl"),
      layer: "F",
    },
    back: {
      transform: {
        x: 0,
        y: 0,
        s: 1,
        panx: 0,
        pany: 0,
        zoom: 1,
      },
      pointerStates: {},
      anotherPointerTapped: false,
      bg: document.getElementById("B_bg"),
      fab: document.getElementById("B_fab"),
      silk: document.getElementById("B_slk"),
      highlight: document.getElementById("B_hl"),
      layer: "B",
    }
  };
  addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
  addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
}

///////////////////////////////////////////////

///////////////////////////////////////////////
/*
 * Table reordering via Drag'n'Drop
 * Inspired by: https://htmldom.dev/drag-and-drop-table-column
 */

function setBomHandlers() {

  const bom = document.getElementById('bomtable');

  let dragName;
  let placeHolderElements;
  let draggingElement;
  let forcePopulation;
  let xOffset;
  let yOffset;
  let wasDragged;

  const mouseUpHandler = function(e) {
    // Delete dragging element
    draggingElement.remove();

    // Make BOM selectable again
    bom.style.removeProperty("userSelect");

    // Remove listeners
    document.removeEventListener('mousemove', mouseMoveHandler);
    document.removeEventListener('mouseup', mouseUpHandler);

    if (wasDragged) {
      // Redraw whole BOM
      populateBomTable();
    }
  }

  const mouseMoveHandler = function(e) {
    // Notice the dragging
    wasDragged = true;

    // Make the dragged element visible
    draggingElement.style.removeProperty("display");

    // Set elements position to mouse position
    draggingElement.style.left = `${e.screenX - xOffset}px`;
    draggingElement.style.top = `${e.screenY - yOffset}px`;

    // Forced redrawing of BOM table
    if (forcePopulation) {
      forcePopulation = false;
      // Copy array
      phe = Array.from(placeHolderElements);
      // populate BOM table again
      populateBomHeader(dragName, phe);
      populateBomBody(dragName, phe);
    }

    // Set up array of hidden columns
    var hiddenColumns = Array.from(settings.hiddenColumns);
    // In the ungrouped mode, quantity don't exist
    if (settings.bommode === "ungrouped")
      hiddenColumns.push("Quantity");
    // If no checkbox fields can be found, we consider them hidden
    if (settings.checkboxes.length == 0)
      hiddenColumns.push("checkboxes");

    // Get table headers and group them into checkboxes, extrafields and normal headers
    const bh = document.getElementById("bomhead");
    headers = Array.from(bh.querySelectorAll("th"))
    headers.shift() // numCol is not part of the columnOrder
    headerGroups = []
    lastCompoundClass = null;
    for (i = 0; i < settings.columnOrder.length; i++) {
      cElem = settings.columnOrder[i];
      if (hiddenColumns.includes(cElem)) {
        // Hidden columns appear as a dummy element
        headerGroups.push([]);
        continue;
      }
      elem = headers.filter(e => getColumnOrderName(e) === cElem)[0];
      if (elem.classList.contains("bom-checkbox")) {
        if (lastCompoundClass === "bom-checkbox") {
          cbGroup = headerGroups.pop();
          cbGroup.push(elem);
          headerGroups.push(cbGroup);
        } else {
          lastCompoundClass = "bom-checkbox";
          headerGroups.push([elem])
        }
      } else {
        headerGroups.push([elem])
      }
    }

    // Copy settings.columnOrder
    var columns = Array.from(settings.columnOrder)

    // Set up array with indices of hidden columns
    var hiddenIndices = hiddenColumns.map(e => settings.columnOrder.indexOf(e));
    var dragIndex = columns.indexOf(dragName);
    var swapIndex = dragIndex;
    var swapDone = false;

    // Check if the current dragged element is swapable with the left or right element
    if (dragIndex > 0) {
      // Get left headers boundingbox
      swapIndex = dragIndex - 1;
      while (hiddenIndices.includes(swapIndex) && swapIndex > 0)
        swapIndex--;
      if (!hiddenIndices.includes(swapIndex)) {
        box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
        if (e.clientX < box.left + window.scrollX + (box.width / 2)) {
          swapElement = columns[dragIndex];
          columns.splice(dragIndex, 1);
          columns.splice(swapIndex, 0, swapElement);
          forcePopulation = true;
          swapDone = true;
        }
      }
    }
    if ((!swapDone) && dragIndex < headerGroups.length - 1) {
      // Get right headers boundingbox
      swapIndex = dragIndex + 1;
      while (hiddenIndices.includes(swapIndex))
        swapIndex++;
      if (swapIndex < headerGroups.length) {
        box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
        if (e.clientX > box.left + window.scrollX + (box.width / 2)) {
          swapElement = columns[dragIndex];
          columns.splice(dragIndex, 1);
          columns.splice(swapIndex, 0, swapElement);
          forcePopulation = true;
          swapDone = true;
        }
      }
    }

    // Write back change to storage
    if (swapDone) {
      settings.columnOrder = columns
      writeStorage("columnOrder", JSON.stringify(columns));
    }

  }

  const mouseDownHandler = function(e) {
    var target = e.target;
    if (target.tagName.toLowerCase() != "td")
      target = target.parentElement;

    // Used to check if a dragging has ever happened
    wasDragged = false;

    // Create new element which will be displayed as the dragged column
    draggingElement = document.createElement("div")
    draggingElement.classList.add("dragging");
    draggingElement.style.display = "none";
    draggingElement.style.position = "absolute";
    draggingElement.style.overflow = "hidden";

    // Get bomhead and bombody elements
    const bh = document.getElementById("bomhead");
    const bb = document.getElementById("bombody");

    // Get all compound headers for the current column
    var compoundHeaders;
    if (target.classList.contains("bom-checkbox")) {
      compoundHeaders = Array.from(bh.querySelectorAll("th.bom-checkbox"));
    } else {
      compoundHeaders = [target];
    }

    // Create new table which will display the column
    var newTable = document.createElement("table");
    newTable.classList.add("bom");
    newTable.style.background = "white";
    draggingElement.append(newTable);

    // Create new header element
    var newHeader = document.createElement("thead");
    newTable.append(newHeader);

    // Set up array for storing all placeholder elements
    placeHolderElements = [];

    // Add all compound headers to the new thead element and placeholders
    compoundHeaders.forEach(function(h) {
      clone = cloneElementWithDimensions(h);
      newHeader.append(clone);
      placeHolderElements.push(clone);
    });

    // Create new body element
    var newBody = document.createElement("tbody");
    newTable.append(newBody);

    // Get indices for compound headers
    var idxs = compoundHeaders.map(e => getBomTableHeaderIndex(e));

    // For each row in the BOM body...
    var rows = bb.querySelectorAll("tr");
    rows.forEach(function(row) {
      // ..get the cells for the compound column
      const tds = row.querySelectorAll("td");
      var copytds = idxs.map(i => tds[i]);
      // Add them to the new element and the placeholders
      var newRow = document.createElement("tr");
      copytds.forEach(function(td) {
        clone = cloneElementWithDimensions(td);
        newRow.append(clone);
        placeHolderElements.push(clone);
      });
      newBody.append(newRow);
    });

    // Compute width for compound header
    var width = compoundHeaders.reduce((acc, x) => acc + x.clientWidth, 0);
    draggingElement.style.width = `${width}px`;

    // Insert the new dragging element and disable selection on BOM
    bom.insertBefore(draggingElement, null);
    bom.style.userSelect = "none";

    // Determine the mouse position offset
    xOffset = e.screenX - compoundHeaders.reduce((acc, x) => Math.min(acc, x.offsetLeft), compoundHeaders[0].offsetLeft);
    yOffset = e.screenY - compoundHeaders[0].offsetTop;

    // Get name for the column in settings.columnOrder
    dragName = getColumnOrderName(target);

    // Change text and class for placeholder elements
    placeHolderElements = placeHolderElements.map(function(e) {
      newElem = cloneElementWithDimensions(e);
      newElem.textContent = "";
      newElem.classList.add("placeholder");
      return newElem;
    });

    // On next mouse move, the whole BOM needs to be redrawn to show the placeholders
    forcePopulation = true;

    // Add listeners for move and up on mouse
    document.addEventListener('mousemove', mouseMoveHandler);
    document.addEventListener('mouseup', mouseUpHandler);
  }

  // In netlist mode, there is nothing to reorder
  if (settings.bommode === "netlist")
    return;

  // Add mouseDownHandler to every column except the numCol
  bom.querySelectorAll("th")
    .forEach(function(head) {
      if (!head.classList.contains("numCol")) {
        head.onmousedown = mouseDownHandler;
      }
    });

}

function getBoundingClientRectFromMultiple(elements) {
  var elems = Array.from(elements);

  if (elems.length == 0)
    return null;

  var box = elems.shift()
    .getBoundingClientRect();

  elems.forEach(function(elem) {
    var elembox = elem.getBoundingClientRect();
    box.left = Math.min(elembox.left, box.left);
    box.top = Math.min(elembox.top, box.top);
    box.width += elembox.width;
    box.height = Math.max(elembox.height, box.height);
  });

  return box;
}

function cloneElementWithDimensions(elem) {
  var newElem = elem.cloneNode(true);
  newElem.style.height = window.getComputedStyle(elem).height;
  newElem.style.width = window.getComputedStyle(elem).width;
  return newElem;
}

function getBomTableHeaderIndex(elem) {
  const bh = document.getElementById('bomhead');
  const ths = Array.from(bh.querySelectorAll("th"));
  return ths.indexOf(elem);
}

function getColumnOrderName(elem) {
  var cname = elem.getAttribute("col_name");
  if (cname === "bom-checkbox")
    return "checkboxes";
  else
    return cname;
}

function resizableGrid(tablehead) {
  var cols = tablehead.firstElementChild.children;
  var rowWidth = tablehead.offsetWidth;

  for (var i = 1; i < cols.length; i++) {
    if (cols[i].classList.contains("bom-checkbox"))
      continue;
    cols[i].style.width = ((cols[i].clientWidth - paddingDiff(cols[i])) * 100 / rowWidth) + '%';
  }

  for (var i = 1; i < cols.length - 1; i++) {
    var div = document.createElement('div');
    div.className = "column-width-handle";
    cols[i].appendChild(div);
    setListeners(div);
  }

  function setListeners(div) {
    var startX, curCol, nxtCol, curColWidth, nxtColWidth, rowWidth;

    div.addEventListener('mousedown', function(e) {
      e.preventDefault();
      e.stopPropagation();

      curCol = e.target.parentElement;
      nxtCol = curCol.nextElementSibling;
      startX = e.pageX;

      var padding = paddingDiff(curCol);

      rowWidth = curCol.parentElement.offsetWidth;
      curColWidth = curCol.clientWidth - padding;
      nxtColWidth = nxtCol.clientWidth - padding;
    });

    document.addEventListener('mousemove', function(e) {
      if (startX) {
        var diffX = e.pageX - startX;
        diffX = -Math.min(-diffX, curColWidth - 20);
        diffX = Math.min(diffX, nxtColWidth - 20);

        curCol.style.width = ((curColWidth + diffX) * 100 / rowWidth) + '%';
        nxtCol.style.width = ((nxtColWidth - diffX) * 100 / rowWidth) + '%';
        console.log(`${curColWidth + nxtColWidth} ${(curColWidth + diffX) * 100 / rowWidth + (nxtColWidth - diffX) * 100 / rowWidth}`);
      }
    });

    document.addEventListener('mouseup', function(e) {
      curCol = undefined;
      nxtCol = undefined;
      startX = undefined;
      nxtColWidth = undefined;
      curColWidth = undefined
    });
  }

  function paddingDiff(col) {

    if (getStyleVal(col, 'box-sizing') == 'border-box') {
      return 0;
    }

    var padLeft = getStyleVal(col, 'padding-left');
    var padRight = getStyleVal(col, 'padding-right');
    return (parseInt(padLeft) + parseInt(padRight));

  }

  function getStyleVal(elm, css) {
    return (window.getComputedStyle(elm, null).getPropertyValue(css))
  }
}

///////////////////////////////////////////////

///////////////////////////////////////////////
/* DOM manipulation and misc code */

var bomsplit;
var canvassplit;
var initDone = false;
var bomSortFunction = null;
var currentSortColumn = null;
var currentSortOrder = null;
var currentHighlightedRowId;
var highlightHandlers = [];
var footprintIndexToHandler = {};
var netsToHandler = {};
var markedFootprints = new Set();
var highlightedFootprints = [];
var highlightedNet = null;
var lastClicked;

function dbg(html) {
  dbgdiv.innerHTML = html;
}

function redrawIfInitDone() {
  if (initDone) {
    redrawCanvas(allcanvas.front);
    redrawCanvas(allcanvas.back);
  }
}

function padsVisible(value) {
  writeStorage("padsVisible", value);
  settings.renderPads = value;
  redrawIfInitDone();
}

function referencesVisible(value) {
  writeStorage("referencesVisible", value);
  settings.renderReferences = value;
  redrawIfInitDone();
}

function valuesVisible(value) {
  writeStorage("valuesVisible", value);
  settings.renderValues = value;
  redrawIfInitDone();
}

function tracksVisible(value) {
  writeStorage("tracksVisible", value);
  settings.renderTracks = value;
  redrawIfInitDone();
}

function zonesVisible(value) {
  writeStorage("zonesVisible", value);
  settings.renderZones = value;
  redrawIfInitDone();
}

function dnpOutline(value) {
  writeStorage("dnpOutline", value);
  settings.renderDnpOutline = value;
  redrawIfInitDone();
}

function setDarkMode(value) {
  if (value) {
    topmostdiv.classList.add("dark");
  } else {
    topmostdiv.classList.remove("dark");
  }
  writeStorage("darkmode", value);
  settings.darkMode = value;
  redrawIfInitDone();
  if (initDone) {
    populateBomTable();
  }
}

function setShowBOMColumn(field, value) {
  if (field === "references") {
    var rl = document.getElementById("reflookup");
    rl.disabled = !value;
    if (!value) {
      rl.value = "";
      updateRefLookup("");
    }
  }

  var n = settings.hiddenColumns.indexOf(field);
  if (value) {
    if (n != -1) {
      settings.hiddenColumns.splice(n, 1);
    }
  } else {
    if (n == -1) {
      settings.hiddenColumns.push(field);
    }
  }

  writeStorage("hiddenColumns", JSON.stringify(settings.hiddenColumns));

  if (initDone) {
    populateBomTable();
  }

  redrawIfInitDone();
}


function setFullscreen(value) {
  if (value) {
    document.documentElement.requestFullscreen();
  } else {
    document.exitFullscreen();
  }
}

function fabricationVisible(value) {
  writeStorage("fabricationVisible", value);
  settings.renderFabrication = value;
  redrawIfInitDone();
}

function silkscreenVisible(value) {
  writeStorage("silkscreenVisible", value);
  settings.renderSilkscreen = value;
  redrawIfInitDone();
}

function setHighlightPin1(value) {
  writeStorage("highlightpin1", value);
  settings.highlightpin1 = value;
  redrawIfInitDone();
}

function setHighlightRowOnClick(value) {
  settings.highlightRowOnClick = value;
  writeStorage("highlightRowOnClick", value);
  if (initDone) {
    populateBomTable();
  }
}

function getStoredCheckboxRefs(checkbox) {
  function convert(ref) {
    var intref = parseInt(ref);
    if (isNaN(intref)) {
      for (var i = 0; i < pcbdata.footprints.length; i++) {
        if (pcbdata.footprints[i].ref == ref) {
          return i;
        }
      }
      return -1;
    } else {
      return intref;
    }
  }
  if (!(checkbox in settings.checkboxStoredRefs)) {
    var val = readStorage("checkbox_" + checkbox);
    settings.checkboxStoredRefs[checkbox] = val ? val : "";
  }
  if (!settings.checkboxStoredRefs[checkbox]) {
    return new Set();
  } else {
    return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
  }
}

function getCheckboxState(checkbox, references) {
  var storedRefsSet = getStoredCheckboxRefs(checkbox);
  var currentRefsSet = new Set(references.map(r => r[1]));
  // Get difference of current - stored
  var difference = new Set(currentRefsSet);
  for (ref of storedRefsSet) {
    difference.delete(ref);
  }
  if (difference.size == 0) {
    // All the current refs are stored
    return "checked";
  } else if (difference.size == currentRefsSet.size) {
    // None of the current refs are stored
    return "unchecked";
  } else {
    // Some of the refs are stored
    return "indeterminate";
  }
}

function setBomCheckboxState(checkbox, element, references) {
  var state = getCheckboxState(checkbox, references);
  element.checked = (state == "checked");
  element.indeterminate = (state == "indeterminate");
}

function createCheckboxHandlers(input, checkbox, references, row) {
  var clickHandler = () => {
    refsSet = getStoredCheckboxRefs(checkbox);
    var markWhenChecked = settings.markWhenChecked == checkbox;
    eventArgs = {
      checkbox: checkbox,
      refs: references,
    }
    if (input.checked) {
      // checkbox ticked
      for (var ref of references) {
        refsSet.add(ref[1]);
      }
      if (markWhenChecked) {
        row.classList.add("checked");
        for (var ref of references) {
          markedFootprints.add(ref[1]);
        }
        drawHighlights();
      }
      eventArgs.state = 'checked';
    } else {
      // checkbox unticked
      for (var ref of references) {
        refsSet.delete(ref[1]);
      }
      if (markWhenChecked) {
        row.classList.remove("checked");
        for (var ref of references) {
          markedFootprints.delete(ref[1]);
        }
        drawHighlights();
      }
      eventArgs.state = 'unchecked';
    }
    settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
    writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
    updateCheckboxStats(checkbox);
    EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
  }

  return [
    (e) => {
      clickHandler();
    },
    (e) => {
      e.preventDefault();
      if (row.onmousemove) row.onmousemove();
    },
    (e) => {
      e.preventDefault();
      input.checked = !input.checked;
      input.indeterminate = false;
      clickHandler();
    }
  ];
}

function clearHighlightedFootprints() {
  if (currentHighlightedRowId) {
    document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
    currentHighlightedRowId = null;
    highlightedFootprints = [];
    highlightedNet = null;
  }
}

function createRowHighlightHandler(rowid, refs, net) {
  return function () {
    if (currentHighlightedRowId) {
      if (currentHighlightedRowId == rowid) {
        return;
      }
      document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
    }
    document.getElementById(rowid).classList.add("highlighted");
    currentHighlightedRowId = rowid;
    highlightedFootprints = refs ? refs.map(r => r[1]) : [];
    highlightedNet = net;
    drawHighlights();
    EventHandler.emitEvent(
      IBOM_EVENT_TYPES.HIGHLIGHT_EVENT, {
      rowid: rowid,
      refs: refs,
      net: net
    });
  }
}

function updateNetColors() {
  writeStorage("netColors", JSON.stringify(settings.netColors));
  redrawIfInitDone();
}

function netColorChangeHandler(net) {
  return (event) => {
    settings.netColors[net] = event.target.value;
    updateNetColors();
  }
}

function netColorRightClick(net) {
  return (event) => {
    if (event.button == 2) {
      event.preventDefault();
      event.stopPropagation();

      var style = getComputedStyle(topmostdiv);
      var defaultNetColor = style.getPropertyValue('--track-color').trim();
      event.target.value = defaultNetColor;
      delete settings.netColors[net];
      updateNetColors();
    }
  }
}

function entryMatches(entry) {
  if (settings.bommode == "netlist") {
    // entry is just a net name
    return entry.toLowerCase().indexOf(filter) >= 0;
  }
  // check refs
  if (!settings.hiddenColumns.includes("References")) {
    for (var ref of entry) {
      if (ref[0].toLowerCase().indexOf(filter) >= 0) {
        return true;
      }
    }
  }
  // check fields
  for (var i in config.fields) {
    var f = config.fields[i];
    if (!settings.hiddenColumns.includes(f)) {
      for (var ref of entry) {
        if (String(pcbdata.bom.fields[ref[1]][i]).toLowerCase().indexOf(filter) >= 0) {
          return true;
        }
      }
    }
  }
  return false;
}

function findRefInEntry(entry) {
  return entry.filter(r => r[0].toLowerCase() == reflookup);
}

function highlightFilter(s) {
  if (!filter) {
    return s;
  }
  var parts = s.toLowerCase().split(filter);
  if (parts.length == 1) {
    return s;
  }
  var r = "";
  var pos = 0;
  for (var i in parts) {
    if (i > 0) {
      r += '<mark class="highlight">' +
        s.substring(pos, pos + filter.length) +
        '</mark>';
      pos += filter.length;
    }
    r += s.substring(pos, pos + parts[i].length);
    pos += parts[i].length;
  }
  return r;
}

function getBomListByLayer(layer) {
  switch (layer) {
    case 'F': return pcbdata.bom.F.slice();
    case 'B': return pcbdata.bom.B.slice();
    case 'FB': return pcbdata.bom.both.slice();
  }
  return [];
}

function getSelectedBomList() {
  if (settings.bommode == "netlist") {
    return pcbdata.nets.slice();
  }
  var out = getBomListByLayer(settings.canvaslayout);

  if (settings.bommode == "ungrouped") {
    // expand bom table
    var expandedTable = [];
    for (var bomentry of out) {
      for (var ref of bomentry) {
        expandedTable.push([ref]);
      }
    }
    return expandedTable;
  }

  return out;
}

function checkboxSetUnsetAllHandler(checkboxname) {
  return function () {
    var checkboxnum = 0;
    while (checkboxnum < settings.checkboxes.length &&
      settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
      checkboxnum++;
    }
    if (checkboxnum >= settings.checkboxes.length) {
      return;
    }
    var allset = true;
    var checkbox;
    var row;
    for (row of bombody.childNodes) {
      checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
      if (!checkbox.checked || checkbox.indeterminate) {
        allset = false;
        break;
      }
    }
    for (row of bombody.childNodes) {
      checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
      checkbox.checked = !allset;
      checkbox.indeterminate = false;
      checkbox.onchange();
    }
  }
}

function createColumnHeader(name, cls, comparator, is_checkbox = false) {
  var th = document.createElement("TH");
  th.innerHTML = name;
  th.classList.add(cls);
  if (is_checkbox)
    th.setAttribute("col_name", "bom-checkbox");
  else
    th.setAttribute("col_name", name);
  var span = document.createElement("SPAN");
  span.classList.add("sortmark");
  span.classList.add("none");
  th.appendChild(span);
  var spacer = document.createElement("div");
  spacer.className = "column-spacer";
  th.appendChild(spacer);
  spacer.onclick = function () {
    if (currentSortColumn && th !== currentSortColumn) {
      // Currently sorted by another column
      currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
      currentSortColumn.childNodes[1].classList.add("none");
      currentSortColumn = null;
      currentSortOrder = null;
    }
    if (currentSortColumn && th === currentSortColumn) {
      // Already sorted by this column
      if (currentSortOrder == "asc") {
        // Sort by this column, descending order
        bomSortFunction = function (a, b) {
          return -comparator(a, b);
        }
        currentSortColumn.childNodes[1].classList.remove("asc");
        currentSortColumn.childNodes[1].classList.add("desc");
        currentSortOrder = "desc";
      } else {
        // Unsort
        bomSortFunction = null;
        currentSortColumn.childNodes[1].classList.remove("desc");
        currentSortColumn.childNodes[1].classList.add("none");
        currentSortColumn = null;
        currentSortOrder = null;
      }
    } else {
      // Sort by this column, ascending order
      bomSortFunction = comparator;
      currentSortColumn = th;
      currentSortColumn.childNodes[1].classList.remove("none");
      currentSortColumn.childNodes[1].classList.add("asc");
      currentSortOrder = "asc";
    }
    populateBomBody();
  }
  if (is_checkbox) {
    spacer.onclick = fancyDblClickHandler(
      spacer, spacer.onclick, checkboxSetUnsetAllHandler(name));
  }
  return th;
}

function populateBomHeader(placeHolderColumn = null, placeHolderElements = null) {
  while (bomhead.firstChild) {
    bomhead.removeChild(bomhead.firstChild);
  }
  var tr = document.createElement("TR");
  var th = document.createElement("TH");
  th.classList.add("numCol");

  var vismenu = document.createElement("div");
  vismenu.id = "vismenu";
  vismenu.classList.add("menu");

  var visbutton = document.createElement("div");
  visbutton.classList.add("visbtn");
  visbutton.classList.add("hideonprint");

  var viscontent = document.createElement("div");
  viscontent.classList.add("menu-content");
  viscontent.id = "vismenu-content";

  settings.columnOrder.forEach(column => {
    if (typeof column !== "string")
      return;

    // Skip empty columns
    if (column === "checkboxes" && settings.checkboxes.length == 0)
      return;
    else if (column === "Quantity" && settings.bommode == "ungrouped")
      return;

    var label = document.createElement("label");
    label.classList.add("menu-label");

    var input = document.createElement("input");
    input.classList.add("visibility_checkbox");
    input.type = "checkbox";
    input.onchange = function (e) {
      setShowBOMColumn(column, e.target.checked)
    };
    input.checked = !(settings.hiddenColumns.includes(column));

    label.appendChild(input);
    if (column.length > 0)
      label.append(column[0].toUpperCase() + column.slice(1));

    viscontent.appendChild(label);
  });

  viscontent.childNodes[0].classList.add("menu-label-top");

  vismenu.appendChild(visbutton);
  if (settings.bommode != "netlist") {
    vismenu.appendChild(viscontent);
    th.appendChild(vismenu);
  }
  tr.appendChild(th);

  var checkboxCompareClosure = function (checkbox) {
    return (a, b) => {
      var stateA = getCheckboxState(checkbox, a);
      var stateB = getCheckboxState(checkbox, b);
      if (stateA > stateB) return -1;
      if (stateA < stateB) return 1;
      return 0;
    }
  }
  var stringFieldCompareClosure = function (fieldIndex) {
    return (a, b) => {
      var fa = pcbdata.bom.fields[a[0][1]][fieldIndex];
      var fb = pcbdata.bom.fields[b[0][1]][fieldIndex];
      if (fa != fb) return fa > fb ? 1 : -1;
      else return 0;
    }
  }
  var referenceRegex = /(?<prefix>[^0-9]+)(?<number>[0-9]+)/;
  var compareRefs = (a, b) => {
    var ra = referenceRegex.exec(a);
    var rb = referenceRegex.exec(b);
    if (ra === null || rb === null) {
      if (a != b) return a > b ? 1 : -1;
      return 0;
    } else {
      if (ra.groups.prefix != rb.groups.prefix) {
        return ra.groups.prefix > rb.groups.prefix ? 1 : -1;
      }
      if (ra.groups.number != rb.groups.number) {
        return parseInt(ra.groups.number) > parseInt(rb.groups.number) ? 1 : -1;
      }
      return 0;
    }
  }
  if (settings.bommode == "netlist") {
    tr.appendChild(createColumnHeader("Net name", "bom-netname", (a, b) => {
      if (a > b) return -1;
      if (a < b) return 1;
      return 0;
    }));
    tr.appendChild(createColumnHeader("Color", "bom-color", (a, b) => {
      return 0;
    }));
  } else {
    // Filter hidden columns
    var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
    var valueIndex = config.fields.indexOf("Value");
    var footprintIndex = config.fields.indexOf("Footprint");
    columns.forEach((column) => {
      if (column === placeHolderColumn) {
        var n = 1;
        if (column === "checkboxes")
          n = settings.checkboxes.length;
        for (i = 0; i < n; i++) {
          td = placeHolderElements.shift();
          tr.appendChild(td);
        }
        return;
      } else if (column === "checkboxes") {
        for (var checkbox of settings.checkboxes) {
          th = createColumnHeader(
            checkbox, "bom-checkbox", checkboxCompareClosure(checkbox), true);
          tr.appendChild(th);
        }
      } else if (column === "References") {
        tr.appendChild(createColumnHeader("References", "references", (a, b) => {
          var i = 0;
          while (i < a.length && i < b.length) {
            if (a[i][0] != b[i][0]) return compareRefs(a[i][0], b[i][0]);
            i++;
          }
          return a.length - b.length;
        }));
      } else if (column === "Value") {
        tr.appendChild(createColumnHeader("Value", "value", (a, b) => {
          var ra = a[0][1], rb = b[0][1];
          return valueCompare(
            pcbdata.bom.parsedValues[ra], pcbdata.bom.parsedValues[rb],
            pcbdata.bom.fields[ra][valueIndex], pcbdata.bom.fields[rb][valueIndex]);
        }));
        return;
      } else if (column === "Footprint") {
        tr.appendChild(createColumnHeader(
          "Footprint", "footprint", stringFieldCompareClosure(footprintIndex)));
      } else if (column === "Quantity" && settings.bommode == "grouped") {
        tr.appendChild(createColumnHeader("Quantity", "quantity", (a, b) => {
          return a.length - b.length;
        }));
      } else {
        // Other fields
        var i = config.fields.indexOf(column);
        if (i < 0)
          return;
        tr.appendChild(createColumnHeader(
          column, `field${i + 1}`, stringFieldCompareClosure(i)));
      }
    });
  }
  bomhead.appendChild(tr);
}

function populateBomBody(placeholderColumn = null, placeHolderElements = null) {
  const urlRegex = /^(https?:\/\/[^\s\/$.?#][^\s]*|file:\/\/([a-zA-Z]:|\/)[^\x00]+)$/;
  while (bom.firstChild) {
    bom.removeChild(bom.firstChild);
  }
  highlightHandlers = [];
  footprintIndexToHandler = {};
  netsToHandler = {};
  currentHighlightedRowId = null;
  var first = true;
  var style = getComputedStyle(topmostdiv);
  var defaultNetColor = style.getPropertyValue('--track-color').trim();

  bomtable = getSelectedBomList();

  if (bomSortFunction) {
    bomtable = bomtable.sort(bomSortFunction);
  }
  for (var i in bomtable) {
    var bomentry = bomtable[i];
    if (filter && !entryMatches(bomentry)) {
      continue;
    }
    var references = null;
    var netname = null;
    var tr = document.createElement("TR");
    var td = document.createElement("TD");
    var rownum = +i + 1;
    tr.id = "bomrow" + rownum;
    td.textContent = rownum;
    tr.appendChild(td);
    if (settings.bommode == "netlist") {
      netname = bomentry;
      td = document.createElement("TD");
      td.innerHTML = highlightFilter(netname ? netname : "&lt;no net&gt;");
      tr.appendChild(td);
      var color = settings.netColors[netname] || defaultNetColor;
      td = document.createElement("TD");
      var colorBox = document.createElement("INPUT");
      colorBox.type = "color";
      colorBox.value = color;
      colorBox.onchange = netColorChangeHandler(netname);
      colorBox.onmouseup = netColorRightClick(netname);
      colorBox.oncontextmenu = (e) => e.preventDefault();
      td.appendChild(colorBox);
      td.classList.add("color-column");
      tr.appendChild(td);
    } else {
      if (reflookup) {
        references = findRefInEntry(bomentry);
        if (references.length == 0) {
          continue;
        }
      } else {
        references = bomentry;
      }
      // Filter hidden columns
      var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
      columns.forEach((column) => {
        if (column === placeholderColumn) {
          var n = 1;
          if (column === "checkboxes")
            n = settings.checkboxes.length;
          for (i = 0; i < n; i++) {
            td = placeHolderElements.shift();
            tr.appendChild(td);
          }
          return;
        } else if (column === "checkboxes") {
          for (var checkbox of settings.checkboxes) {
            if (checkbox) {
              td = document.createElement("TD");
              var input = document.createElement("input");
              input.type = "checkbox";
              [input.onchange, td.ontouchstart, td.ontouchend] = createCheckboxHandlers(input, checkbox, references, tr);
              setBomCheckboxState(checkbox, input, references);
              if (input.checked && settings.markWhenChecked == checkbox) {
                tr.classList.add("checked");
              }
              td.appendChild(input);
              tr.appendChild(td);
            }
          }
        } else if (column === "References") {
          td = document.createElement("TD");
          td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
          tr.appendChild(td);
        } else if (column === "Quantity" && settings.bommode == "grouped") {
          // Quantity
          td = document.createElement("TD");
          td.textContent = references.length;
          tr.appendChild(td);
        } else {
          // All the other fields
          var field_index = config.fields.indexOf(column)
          if (field_index < 0)
            return;
          var valueSet = new Set();
          references.map(r => r[1]).forEach((id) => valueSet.add(pcbdata.bom.fields[id][field_index]));
          td = document.createElement("TD");
          var output = new Array();
          for (let item of valueSet) {
            const visible = highlightFilter(String(item));
            if (typeof item === 'string' && item.match(urlRegex)) {
              output.push(`<a href="${item}" target="_blank">${visible}</a>`);
            } else {
              output.push(visible);
            }
          }
          td.innerHTML = output.join(", ");
          tr.appendChild(td);
        }
      });
    }
    bom.appendChild(tr);
    var handler = createRowHighlightHandler(tr.id, references, netname);
    if (settings.highlightRowOnClick) {
      tr.onmousedown = handler;
    } else {
      tr.onmousemove = handler;
    }
    highlightHandlers.push({
      id: tr.id,
      handler: handler,
    });
    if (references !== null) {
      for (var refIndex of references.map(r => r[1])) {
        footprintIndexToHandler[refIndex] = handler;
      }
    }
    if (netname !== null) {
      netsToHandler[netname] = handler;
    }
    if ((filter || reflookup) && first) {
      handler();
      first = false;
    }
  }
  EventHandler.emitEvent(
    IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, {
    filter: filter,
    reflookup: reflookup,
    checkboxes: settings.checkboxes,
    bommode: settings.bommode,
  });
}

function highlightPreviousRow() {
  if (!currentHighlightedRowId) {
    highlightHandlers[highlightHandlers.length - 1].handler();
  } else {
    if (highlightHandlers.length > 1 &&
      highlightHandlers[0].id == currentHighlightedRowId) {
      highlightHandlers[highlightHandlers.length - 1].handler();
    } else {
      for (var i = 0; i < highlightHandlers.length - 1; i++) {
        if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
          highlightHandlers[i].handler();
          break;
        }
      }
    }
  }
  smoothScrollToRow(currentHighlightedRowId);
}

function highlightNextRow() {
  if (!currentHighlightedRowId) {
    highlightHandlers[0].handler();
  } else {
    if (highlightHandlers.length > 1 &&
      highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
      highlightHandlers[0].handler();
    } else {
      for (var i = 1; i < highlightHandlers.length; i++) {
        if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
          highlightHandlers[i].handler();
          break;
        }
      }
    }
  }
  smoothScrollToRow(currentHighlightedRowId);
}

function populateBomTable() {
  populateBomHeader();
  populateBomBody();
  setBomHandlers();
  resizableGrid(bomhead);
}

function footprintsClicked(footprintIndexes) {
  var lastClickedIndex = footprintIndexes.indexOf(lastClicked);
  for (var i = 1; i <= footprintIndexes.length; i++) {
    var refIndex = footprintIndexes[(lastClickedIndex + i) % footprintIndexes.length];
    if (refIndex in footprintIndexToHandler) {
      lastClicked = refIndex;
      footprintIndexToHandler[refIndex]();
      smoothScrollToRow(currentHighlightedRowId);
      break;
    }
  }
}

function netClicked(net) {
  if (net in netsToHandler) {
    netsToHandler[net]();
    smoothScrollToRow(currentHighlightedRowId);
  } else {
    clearHighlightedFootprints();
    highlightedNet = net;
    drawHighlights();
  }
}

function updateFilter(input) {
  filter = input.toLowerCase();
  populateBomTable();
}

function updateRefLookup(input) {
  reflookup = input.toLowerCase();
  populateBomTable();
}

function changeCanvasLayout(layout) {
  document.getElementById("fl-btn").classList.remove("depressed");
  document.getElementById("fb-btn").classList.remove("depressed");
  document.getElementById("bl-btn").classList.remove("depressed");
  switch (layout) {
    case 'F':
      document.getElementById("fl-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.collapse(1);
      }
      break;
    case 'B':
      document.getElementById("bl-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.collapse(0);
      }
      break;
    default:
      document.getElementById("fb-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.setSizes([50, 50]);
      }
  }
  settings.canvaslayout = layout;
  writeStorage("canvaslayout", layout);
  resizeAll();
  changeBomMode(settings.bommode);
}

function populateMetadata() {
  document.getElementById("title").innerHTML = pcbdata.metadata.title;
  document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
  document.getElementById("company").innerHTML = pcbdata.metadata.company;
  document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
  if (pcbdata.metadata.title != "") {
    document.title = pcbdata.metadata.title + " BOM";
  }
  // Calculate board stats
  var fp_f = 0,
    fp_b = 0,
    pads_f = 0,
    pads_b = 0,
    pads_th = 0;
  for (var i = 0; i < pcbdata.footprints.length; i++) {
    if (pcbdata.bom.skipped.includes(i)) continue;
    var mod = pcbdata.footprints[i];
    if (mod.layer == "F") {
      fp_f++;
    } else {
      fp_b++;
    }
    for (var pad of mod.pads) {
      if (pad.type == "th") {
        pads_th++;
      } else {
        if (pad.layers.includes("F")) {
          pads_f++;
        }
        if (pad.layers.includes("B")) {
          pads_b++;
        }
      }
    }
  }
  document.getElementById("stats-components-front").innerHTML = fp_f;
  document.getElementById("stats-components-back").innerHTML = fp_b;
  document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
  document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
  document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
  document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
  document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
  document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
  document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
  document.getElementById("stats-th-pads").innerHTML = pads_th;
  // Update version string
  document.getElementById("github-link").innerHTML = "InteractiveHtmlBom&nbsp;" +
    /^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
}

function changeBomLayout(layout) {
  document.getElementById("bom-btn").classList.remove("depressed");
  document.getElementById("lr-btn").classList.remove("depressed");
  document.getElementById("tb-btn").classList.remove("depressed");
  switch (layout) {
    case 'bom-only':
      document.getElementById("bom-btn").classList.add("depressed");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      document.getElementById("frontcanvas").style.display = "none";
      document.getElementById("backcanvas").style.display = "none";
      document.getElementById("topmostdiv").style.height = "";
      document.getElementById("topmostdiv").style.display = "block";
      break;
    case 'top-bottom':
      document.getElementById("tb-btn").classList.add("depressed");
      document.getElementById("frontcanvas").style.display = "";
      document.getElementById("backcanvas").style.display = "";
      document.getElementById("topmostdiv").style.height = "100%";
      document.getElementById("topmostdiv").style.display = "flex";
      document.getElementById("bomdiv").classList.remove("split-horizontal");
      document.getElementById("canvasdiv").classList.remove("split-horizontal");
      document.getElementById("frontcanvas").classList.add("split-horizontal");
      document.getElementById("backcanvas").classList.add("split-horizontal");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      bomsplit = Split(['#bomdiv', '#canvasdiv'], {
        sizes: [50, 50],
        onDragEnd: resizeAll,
        direction: "vertical",
        gutterSize: 5
      });
      canvassplit = Split(['#frontcanvas', '#backcanvas'], {
        sizes: [50, 50],
        gutterSize: 5,
        onDragEnd: resizeAll
      });
      break;
    case 'left-right':
      document.getElementById("lr-btn").classList.add("depressed");
      document.getElementById("frontcanvas").style.display = "";
      document.getElementById("backcanvas").style.display = "";
      document.getElementById("topmostdiv").style.height = "100%";
      document.getElementById("topmostdiv").style.display = "flex";
      document.getElementById("bomdiv").classList.add("split-horizontal");
      document.getElementById("canvasdiv").classList.add("split-horizontal");
      document.getElementById("frontcanvas").classList.remove("split-horizontal");
      document.getElementById("backcanvas").classList.remove("split-horizontal");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      bomsplit = Split(['#bomdiv', '#canvasdiv'], {
        sizes: [50, 50],
        onDragEnd: resizeAll,
        gutterSize: 5
      });
      canvassplit = Split(['#frontcanvas', '#backcanvas'], {
        sizes: [50, 50],
        gutterSize: 5,
        direction: "vertical",
        onDragEnd: resizeAll
      });
  }
  settings.bomlayout = layout;
  writeStorage("bomlayout", layout);
  changeCanvasLayout(settings.canvaslayout);
}

function changeBomMode(mode) {
  document.getElementById("bom-grouped-btn").classList.remove("depressed");
  document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
  document.getElementById("bom-netlist-btn").classList.remove("depressed");
  var chkbxs = document.getElementsByClassName("visibility_checkbox");

  switch (mode) {
    case 'grouped':
      document.getElementById("bom-grouped-btn").classList.add("depressed");
      for (var i = 0; i < chkbxs.length; i++) {
        chkbxs[i].disabled = false;
      }
      break;
    case 'ungrouped':
      document.getElementById("bom-ungrouped-btn").classList.add("depressed");
      for (var i = 0; i < chkbxs.length; i++) {
        chkbxs[i].disabled = false;
      }
      break;
    case 'netlist':
      document.getElementById("bom-netlist-btn").classList.add("depressed");
      for (var i = 0; i < chkbxs.length; i++) {
        chkbxs[i].disabled = true;
      }
  }

  writeStorage("bommode", mode);
  if (mode != settings.bommode) {
    settings.bommode = mode;
    bomSortFunction = null;
    currentSortColumn = null;
    currentSortOrder = null;
    clearHighlightedFootprints();
  }
  populateBomTable();
}

function focusFilterField() {
  focusInputField(document.getElementById("filter"));
}

function focusRefLookupField() {
  focusInputField(document.getElementById("reflookup"));
}

function toggleBomCheckbox(bomrowid, checkboxnum) {
  if (!bomrowid || checkboxnum > settings.checkboxes.length) {
    return;
  }
  var bomrow = document.getElementById(bomrowid);
  var childNum = checkboxnum + settings.columnOrder.indexOf("checkboxes");
  var checkbox = bomrow.childNodes[childNum].childNodes[0];
  checkbox.checked = !checkbox.checked;
  checkbox.indeterminate = false;
  checkbox.onchange();
}

function checkBomCheckbox(bomrowid, checkboxname) {
  var checkboxnum = 0;
  while (checkboxnum < settings.checkboxes.length &&
    settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
    checkboxnum++;
  }
  if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
    return;
  }
  var bomrow = document.getElementById(bomrowid);
  var childNum = checkboxnum + 1 + settings.columnOrder.indexOf("checkboxes");
  var checkbox = bomrow.childNodes[childNum].childNodes[0];
  checkbox.checked = true;
  checkbox.indeterminate = false;
  checkbox.onchange();
}

function setBomCheckboxes(value) {
  writeStorage("bomCheckboxes", value);
  settings.checkboxes = value.split(",").map((e) => e.trim()).filter((e) => e);
  prepCheckboxes();
  populateMarkWhenCheckedOptions();
  setMarkWhenChecked(settings.markWhenChecked);
}

function setMarkWhenChecked(value) {
  writeStorage("markWhenChecked", value);
  settings.markWhenChecked = value;
  markedFootprints.clear();
  for (var ref of (value ? getStoredCheckboxRefs(value) : [])) {
    markedFootprints.add(ref);
  }
  populateBomTable();
  drawHighlights();
}

function prepCheckboxes() {
  var table = document.getElementById("checkbox-stats");
  while (table.childElementCount > 1) {
    table.removeChild(table.lastChild);
  }
  if (settings.checkboxes.length) {
    table.style.display = "";
  } else {
    table.style.display = "none";
  }
  for (var checkbox of settings.checkboxes) {
    var tr = document.createElement("TR");
    var td = document.createElement("TD");
    td.innerHTML = checkbox;
    tr.appendChild(td);
    td = document.createElement("TD");
    td.id = "checkbox-stats-" + checkbox;
    var progressbar = document.createElement("div");
    progressbar.classList.add("bar");
    td.appendChild(progressbar);
    var text = document.createElement("div");
    text.classList.add("text");
    td.appendChild(text);
    tr.appendChild(td);
    table.appendChild(tr);
    updateCheckboxStats(checkbox);
  }
}

function populateMarkWhenCheckedOptions() {
  var container = document.getElementById("markWhenCheckedContainer");

  if (settings.checkboxes.length == 0) {
    container.parentElement.style.display = "none";
    return;
  }

  container.innerHTML = '';
  container.parentElement.style.display = "inline-block";

  function createOption(name, displayName) {
    var id = "markWhenChecked-" + name;

    var div = document.createElement("div");
    div.classList.add("radio-container");

    var input = document.createElement("input");
    input.type = "radio";
    input.name = "markWhenChecked";
    input.value = name;
    input.id = id;
    input.onchange = () => setMarkWhenChecked(name);
    div.appendChild(input);

    // Preserve the selected element when the checkboxes change
    if (name == settings.markWhenChecked) {
      input.checked = true;
    }

    var label = document.createElement("label");
    label.innerHTML = displayName;
    label.htmlFor = id;
    div.appendChild(label);

    container.appendChild(div);
  }
  createOption("", "None");
  for (var checkbox of settings.checkboxes) {
    createOption(checkbox, checkbox);
  }
}

function updateCheckboxStats(checkbox) {
  var checked = getStoredCheckboxRefs(checkbox).size;
  var total = pcbdata.footprints.length - pcbdata.bom.skipped.length;
  var percent = checked * 100.0 / total;
  var td = document.getElementById("checkbox-stats-" + checkbox);
  td.firstChild.style.width = percent + "%";
  td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
}

function constrain(number, min, max) {
  return Math.min(Math.max(parseInt(number), min), max);
}

document.onkeydown = function (e) {
  switch (e.key) {
    case "n":
      if (document.activeElement.type == "text") {
        return;
      }
      if (currentHighlightedRowId !== null) {
        checkBomCheckbox(currentHighlightedRowId, "placed");
        highlightNextRow();
        e.preventDefault();
      }
      break;
    case "ArrowUp":
      highlightPreviousRow();
      e.preventDefault();
      break;
    case "ArrowDown":
      highlightNextRow();
      e.preventDefault();
      break;
    case "ArrowLeft":
    case "ArrowRight":
      if (document.activeElement.type != "text") {
        e.preventDefault();
        let boardRotationElement = document.getElementById("boardRotation")
        settings.boardRotation = parseInt(boardRotationElement.value);  // degrees / 5
        if (e.key == "ArrowLeft") {
          settings.boardRotation += 3;  // 15 degrees
        }
        else {
          settings.boardRotation -= 3;
        }
        settings.boardRotation = constrain(settings.boardRotation, boardRotationElement.min, boardRotationElement.max);
        boardRotationElement.value = settings.boardRotation
        setBoardRotation(settings.boardRotation);
      }
      break;
    default:
      break;
  }
  if (e.altKey) {
    switch (e.key) {
      case "f":
        focusFilterField();
        e.preventDefault();
        break;
      case "r":
        focusRefLookupField();
        e.preventDefault();
        break;
      case "z":
        changeBomLayout("bom-only");
        e.preventDefault();
        break;
      case "x":
        changeBomLayout("left-right");
        e.preventDefault();
        break;
      case "c":
        changeBomLayout("top-bottom");
        e.preventDefault();
        break;
      case "v":
        changeCanvasLayout("F");
        e.preventDefault();
        break;
      case "b":
        changeCanvasLayout("FB");
        e.preventDefault();
        break;
      case "n":
        changeCanvasLayout("B");
        e.preventDefault();
        break;
      default:
        break;
    }
    if (e.key >= '1' && e.key <= '9') {
      toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
      e.preventDefault();
    }
  }
}

function hideNetlistButton() {
  document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
  document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
  document.getElementById("bom-netlist-btn").style.display = "none";
}

function topToggle() {
  var top = document.getElementById("top");
  var toptoggle = document.getElementById("toptoggle");
  if (top.style.display === "none") {
    top.style.display = "flex";
    toptoggle.classList.remove("flipped");
  } else {
    top.style.display = "none";
    toptoggle.classList.add("flipped");
  }
}

window.onload = function (e) {
  initRender();
  initStorage();
  initDefaults();
  initUtils();
  cleanGutters();
  populateMetadata();
  dbgdiv = document.getElementById("dbg");
  bom = document.getElementById("bombody");
  bomhead = document.getElementById("bomhead");
  filter = "";
  reflookup = "";
  if (!("nets" in pcbdata)) {
    hideNetlistButton();
  }
  initDone = true;
  setBomCheckboxes(document.getElementById("bomCheckboxes").value);
  // Triggers render
  changeBomLayout(settings.bomlayout);

  // Users may leave fullscreen without touching the checkbox. Uncheck.
  document.addEventListener('fullscreenchange', () => {
    if (!document.fullscreenElement)
      document.getElementById('fullscreenCheckbox').checked = false;
  });
}

window.onresize = resizeAll;
window.matchMedia("print").addListener(resizeAll);

///////////////////////////////////////////////

///////////////////////////////////////////////

///////////////////////////////////////////////
  </script>
</head>

<body>

<div id="topmostdiv" class="topmostdiv">
  <div id="top">
    <div id="fileinfodiv">
      <table class="fileinfo">
        <tbody>
          <tr>
            <td id="title" class="title" style="width: 70%">
              Title
            </td>
            <td id="revision" class="title" style="width: 30%">
              Revision
            </td>
          </tr>
          <tr>
            <td id="company">
              Company
            </td>
            <td id="filedate">
              Date
            </td>
          </tr>
        </tbody>
      </table>
    </div>
    <div id="bomcontrols">
      <div class="hideonprint menu">
        <button class="menubtn"></button>
        <div class="menu-content">
          <label class="menu-label menu-label-top" style="width: calc(50% - 18px)">
            <input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
            Dark mode
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
            <input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
            Full Screen
          </label>
          <label class="menu-label" style="width: calc(50% - 18px)">
            <input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
            Fab layer
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
            <input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
            Silkscreen
          </label>
          <label class="menu-label" style="width: calc(50% - 18px)">
            <input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
            References
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
            <input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
            Values
          </label>
          <div id="tracksAndZonesCheckboxes">
            <label class="menu-label" style="width: calc(50% - 18px)">
              <input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
              Tracks
            </label><!-- This comment eats space! All of it!
            --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
              <input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
              Zones
            </label>
          </div>
          <label class="menu-label" style="width: calc(50% - 18px)">
            <input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
            Pads
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
            <input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
            DNP outlined
          </label>
          <label class="menu-label">
            <input id="highlightRowOnClickCheckbox" type="checkbox" checked onchange="setHighlightRowOnClick(this.checked)">
            Highlight row on click
          </label>
          <label class="menu-label">
            <input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
            Continuous redraw on drag
          </label>
          <label class="menu-label">
            Highlight first pin
            <form id="highlightpin1">
              <div class="flexbox">
                <label>
                  <input type="radio" name="highlightpin1" value="none" onchange="setHighlightPin1('none')">
                  None
                </label>
                <label>
                  <input type="radio" name="highlightpin1" value="all" onchange="setHighlightPin1('all')">
                  All
                </label>
                <label>
                  <input type="radio" name="highlightpin1" value="selected" onchange="setHighlightPin1('selected')">
                  Selected
                </label>
              </div>
            </form>
          </label>
          <label class="menu-label">
            <span>Board rotation</span>
            <span style="float: right"><span id="rotationDegree">0</span>&#176;</span>
            <input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">
          </label>
          <label class="menu-label">
            <input id="offsetBackRotationCheckbox" type="checkbox" onchange="setOffsetBackRotation(this.checked)">
            Offset back rotation
          </label>
          <label class="menu-label">
            <div style="margin-left: 5px">Bom checkboxes</div>
            <input id="bomCheckboxes" class="menu-textbox" type=text
                   oninput="setBomCheckboxes(this.value)">
          </label>
          <label class="menu-label">
            <div style="margin-left: 5px">Mark when checked</div>
            <div id="markWhenCheckedContainer"></div>
          </label>
          <label class="menu-label">
            <span class="shameless-plug">
              <span>Created using</span>
              <a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
              <a target="blank" title="Mouse and keyboard help" href="https://github.com/openscopeproject/InteractiveHtmlBom/wiki/Usage#bom-page-mouse-actions" style="text-decoration: none;"><label class="help-link">?</label></a>
            </span>
          </label>
        </div>
      </div>
      <div class="button-container hideonprint">
        <button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
                title="Front only">F
        </button>
        <button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
                title="Front and Back">FB
        </button>
        <button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
                title="Back only">B
        </button>
      </div>
      <div class="button-container hideonprint">
        <button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
                title="BOM only"></button>
        <button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
                title="BOM left, drawings right"></button>
        <button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
                title="BOM top, drawings bot"></button>
      </div>
      <div class="button-container hideonprint">
        <button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
                title="Grouped BOM"></button>
        <button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
                title="Ungrouped BOM"></button>
        <button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
                title="Netlist"></button>
      </div>
      <div class="hideonprint menu">
        <button class="statsbtn"></button>
        <div class="menu-content">
          <table class="stats">
            <tbody>
              <tr>
                <td width="40%">Board stats</td>
                <td>Front</td>
                <td>Back</td>
                <td>Total</td>
              </tr>
              <tr>
                <td>Components</td>
                <td id="stats-components-front">~</td>
                <td id="stats-components-back">~</td>
                <td id="stats-components-total">~</td>
              </tr>
              <tr>
                <td>Groups</td>
                <td id="stats-groups-front">~</td>
                <td id="stats-groups-back">~</td>
                <td id="stats-groups-total">~</td>
              </tr>
              <tr>
                <td>SMD pads</td>
                <td id="stats-smd-pads-front">~</td>
                <td id="stats-smd-pads-back">~</td>
                <td id="stats-smd-pads-total">~</td>
              </tr>
              <tr>
                <td>TH pads</td>
                <td colspan=3 id="stats-th-pads">~</td>
              </tr>
            </tbody>
          </table>
          <table class="stats">
            <col width="40%"/><col />
            <tbody id="checkbox-stats">
              <tr>
                <td colspan=2 style="border-top: 0">Checkboxes</td>
              </tr>
            </tbody>
          </table>
        </div>
      </div>
      <div class="hideonprint menu">
        <button class="iobtn"></button>
        <div class="menu-content">
          <div class="menu-label menu-label-top">
            <div style="margin-left: 5px;">Save board image</div>
            <div class="flexbox">
              <input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
                  style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
              <span>X</span>
              <input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
                  style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
            </div>
            <label>
              <input id="render-save-transparent" type="checkbox">
              Transparent background
            </label>
            <div class="flexbox">
              <button class="savebtn" onclick="saveImage('F')">Front</button>
              <button class="savebtn" onclick="saveImage('B')">Back</button>
            </div>
          </div>
          <div class="menu-label">
            <span style="margin-left: 5px;">Config and checkbox state</span>
            <div class="flexbox">
              <button class="savebtn" onclick="saveSettings()">Export</button>
              <button class="savebtn" onclick="loadSettings()">Import</button>
              <button class="savebtn" onclick="resetSettings()">Reset</button>
            </div>
          </div>
          <div class="menu-label">
            <span style="margin-left: 5px;">Save bom table as</span>
            <div class="flexbox">
              <button class="savebtn" onclick="saveBomTable('csv')">csv</button>
              <button class="savebtn" onclick="saveBomTable('txt')">txt</button>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
  <div id="topdivider">
    <div class="hideonprint">
      <div id="toptoggle" onclick="topToggle()">︽</div>
    </div>
  </div>
  <div id="bot" class="split" style="flex: 1 1">
    <div id="bomdiv" class="split split-horizontal">
      <div style="width: 100%">
        <input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
               oninput="updateRefLookup(this.value)">
        <input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
               oninput="updateFilter(this.value)">
        <div class="button-container hideonprint" style="float: left; margin: 0;">
          <button id="copy" title="Copy bom table to clipboard"
               onclick="saveBomTable('clipboard')"></button>
        </div>
      </div>
      <div id="dbg"></div>
      <table class="bom" id="bomtable">
        <thead id="bomhead">
        </thead>
        <tbody id="bombody">
        </tbody>
      </table>
    </div>
    <div id="canvasdiv" class="split split-horizontal">
      <div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
        <div style="position: relative; width: 100%; height: 100%;">
          <canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
          <canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
          <canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
          <canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
        </div>
      </div>
      <div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
        <div style="position: relative; width: 100%; height: 100%;">
          <canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
          <canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
          <canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
          <canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
        </div>
      </div>
    </div>
  </div>
</div>

</body>

</html>