3433 lines
251 KiB
HTML
3433 lines
251 KiB
HTML
<!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-color-highlight: #D04040;
|
|
--pin1-outline-color: #ffb629;
|
|
--pin1-outline-color-highlight: #b4ff03;
|
|
--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: 10px 10px 10px 0px;
|
|
}
|
|
|
|
.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: 5px;
|
|
}
|
|
|
|
.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;
|
|
}
|
|
|
|
.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 {
|
|
transition: background-color 0.2s;
|
|
}
|
|
|
|
.bom .numCol {
|
|
width: 25px;
|
|
}
|
|
|
|
.bom .Description {
|
|
width: 10%;
|
|
}
|
|
|
|
.bom .Part {
|
|
width: 10%;
|
|
}
|
|
|
|
.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;
|
|
}
|
|
|
|
.dark .statsbtn, .dark .savebtn, .dark .menubtn, .dark .iobtn {
|
|
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: 10px 10px 10px 0px;
|
|
}
|
|
|
|
.menu-content {
|
|
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;
|
|
}
|
|
|
|
.topmostdiv {
|
|
width: 100%;
|
|
height: 100%;
|
|
background-color: white;
|
|
transition: background-color 0.3s;
|
|
}
|
|
|
|
#top {
|
|
height: 78px;
|
|
border-bottom: 2px solid black;
|
|
}
|
|
|
|
.dark #top {
|
|
border-bottom: 2px solid #ccc;
|
|
}
|
|
|
|
#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;
|
|
}
|
|
|
|
</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": false, "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "extra_fields": []}
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var pcbdata = JSON.parse(LZString.decompressFromBase64("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xZwGVE5QDJs8IkFXcVdRVj5Q0VlxVhJaOpBxVhBB8VFOVfFawV6KUpFSAF+xX7SYCVbRX3FR0VZRVUFeMVVxVvFeAEQ+W1FUMVuRXJFfkVVwXXFRiEihVolacVwxWvRT8ViJV/FcpJBxUWmEQRgxUElRiV12XcZY0VVsU7+doVduWYBYSRBhUbWjiR/QYdBssVZhWs8RYVUIV1GWD5NhWCldsVLYW7FWRlkJVi8QKSOwFQFVkVjgXolfUVuBXPFdzlBRWSlVlQmRWfFfKV3xWKlf+ZLxUM5dAp12LqlcCVmpWglS0lh+XKldiVkpUriIaVaeXUlQqVbBXglY0FThWWlbuI12RUlbAV/BWPFcSVSpUcFWvl+pUX4K6V+JXulQ8VwBXxZXkVPRWcFaqV6VABlQLlxpVJFaZZDpWLed/l0CkHRniVMZW2lVqVCSVjFd6VnqVW+cfl3wWn5XwAWxEX5e9lxpE0kbfl+WW/ZQ/lKxXrFcKVmxW2Fa+ln+XjpaHlzMlBNJGGQRWs5UGVcJWeldqV/FnmlRopfAVslG2VspXbmbGVnRVelTqVfZWvFSYJBVAgJHKGGpXplSaVxaXsFTmVvpUo6TxmtxVGlQuVcZWIFViV/ZWvaeuV8QZulR4VXZUhlVdlO5XhlauV05UwFJGGR5WAFXAV3ZX2lbuVU5U0iaUASXA3lYGVx5VnFaeVCBUfhQmVFeWv+ftJrZUwlSCV25UcRXSVvxVH5VoVNKU6FQWVIABbEWNlJZWeKc4s4BHclcWZfJVP5YDltZWuwPWVikVilV/lTpUbyc76zOXzlZ2VX5UvRY1lE5U+leAVG8k5+MRVm5WkVYSVFFW9lVRVURURKbUoPpHtlYXlW5VjlT2VMlmklYQVnSlmcHRVNpUMVTSV55VNFciFglUGkMBVo5XwlRcVJJW6lf8V+0nrhD6Rt5W+MUAV5FXBJfSV/FXNFTRVPbDG5WmVolV2lWCVT5V6lZKVRFUyVdxVclWjFTdlEFV9lfxlCgWwVeyGQmWIVacY5LZ+UYUlGUmP5byVaxXlmRsV2FXClQ2VDhXilQbleqlUak8GK6QSFSeVmlUkpb+VplVKVSSpFzgs/HDsJIWtSB6V35WCFRUVOlWSVaCpteDM5ZFVJRXRVQGZRJW8VVblilVklS8p2nJyhgVV7RVkVcVVTFV8VeVVAlWgqVVVqJXmeZ+VjFVaVXZVLFUqlQqpeVVuhu1Vd5XpVTFVQyVxVReV1FWgqUlVNRWDVepV95UZVeEV2ZWMZX4VLym0MMblM1Wl0RpV9VVqFbZVClX2VXmVjlX25f8F2WUIBiGGC/qoVX9l1ZV+VVhVWxVBVcHl8mVpFTSJ6fDJrtuGQ0K8FUNVwZUjVSAVYZUSVQ9V256H6k8G0NQgVTxVj5XjVaxVJgng0BBCcoaA1bJVD5UmVaDVvVWPVd0S+eXQ1VZVsNWmlcuVS1W9FZolSNVuhkEaN7nXmUVVVRklVSDVP1UAVZolbjxz5XjVUVV1VUTVDVVlVZOVZlXg1cColNX6KkDV1lXjlcxVK5UTVUOWsPJzlpqwVNWFVTTVqhWxVSZlf5UTJZMVtuXTFSyVrIWX5cLIkYbthiYVlZWrFZdVWSkv5XWVgVW4VY2VnmXNlfgZsLzVValVm1W01V1Vu1U9VRaVtBlYpPnlNVWwlULVIxUc1Y1VDNUJVUqZQw761cpZw1VbVbFVQhWk1TrV1ple3ClVrtUfVe7Vo1We1UiVtBlkEnPl61UE1TbVxNVw1V7VdBVO1R4ObVXOeRtVc1WfVaGVmJXw1WbV+BkW1QNVSdWR1Z1VHtVZVU1VulW61dkY4dW51WlVAdVG1SLVB+UY1Qdl6qVRpVMVuhW7Mc5VCFVO5fvAI1HehqCFStU+VSrV22lq1QFVX1m3Vc/5TZVx1aCpZYhlUR3g5dWG1cLVQdWF1Q7VFVUkqa+aWFGT1f7VhNUz1V9V6dWx1UmVJKmg7JkVEdUV1WvVttWlVWaVptV7lSSpXdR71VPVKdWB1RvV8ZXxVQvVCqkX1bjV1NkjlajV81XlFdpVRdU5VVO+u9XP1WBZb9Wp1WeVY1Vb1QRVwGnLQlhR9JT/1UZVGZUx1SHVY9UUMmaGkDUAFbNVbtVV1aNVotW7lQ5VTIVOVU9xl+VNjjQoKsUmFRpaoulPWdN0N7lPMff5HfH7iF+pkvleJcHFFNDNjiQsPcVHOV/p7MiiBV05jTmE5dil0UCqJKfwhDXz+eGksoVsNerFHDX31R3FVY7gKCLSzDWsuaw1isDsNQ05tJWo8QyVK0XHpTGl5M4gTnMVpcUUqKLgw47gzjelYulj/Kzx9jn1xXFxHqBWpZRg8nCg5QJW1SVQKW1Z8wg5Sq4oI44HBZCxNDWPxS8JOrGKnkNZs7EjWTlxw1njWeGJTVmHWYmVnvF2NaTpEzyATg0lndm9Wa41QSXayR41fdnbWbVZvjXeNf41mVkHWfTlrVmzWSbJciiONeDOJVnRNfI12TlgVUo1XLF7Wftx2nGpNY1Z6TXi5TIFEtVTJRYlmSURKGyVPDX20vwhfFD5ZcY1hjVIfp01AfCmNQwxfpTMqlY1WtWZNaFV05UzeK4oc/n5NXLxhTX5KfE1cpmJNcRJC7ENWbMxgTUZNXdJoTUtNW2ykiHYiZLZBTUiNQo1pKUJmaU1fjVJNfBx9VmVNSs11TV95bU1DdWS1c5FngBsKMWVbdXvKOcozK6eVe5xPTXdIFNABjW9Ndq53vAfWaxMVqVT4TY1zykbNWUG1TgXKNI1DLF7NXEl7jUcsWjxJzWLNfkxh3GXNRPAQTX/lfaxozXfyWjmbzVTNfcJ+zXbiXM1W1kacT41ZzVjWd4xATVXNVPltjVZNdEW4gbxTpcoeLXTkCNgFMVEtQi1KTWnNR4xFTUUtWk1aLVrNeFZtLUyOFo8Sk5c2TC1JvkyyWy1XjVocWS1e1kTWXy1NTU+BWC1G+gknpC1orXTNQS17Dmp6VK12XEytYi1crW9sczp+1VqNXwAdKjNNVo2WzUISOf5HTU/NV81nzXFWflxZjVlZUN6gzWB5RfF91XpiUq1yTZJQXfwq06I2WK1LLVwtbqxxLXktUi1WPEXNb4xqzUKtRd5AHFXla01s04f9Ey1MTXsBfE5ijXP8dq1pLVctec1PLVVNfK11zUZ6VBVqjXPZQ81FM5bxd+u306q2gD5PkXfNSuk9cVGNTa19rV/cbnQe2ncPKDlwzXrNYK1zHT2WEMoTLp5aS41KHmStcc1HLWhtelZ4bWl0ZG1ebXRtZ61RMQxBPuG+mXYOf61RmUDtShxIbXlNVm1+1m5tdS1oLUdtaFuXbWp5PjVHrFJtXFlxElLtepxK7VpWdy167UGtcgVKslTtZjOzCGm6b21C7WXZdqx8LXptTtZyTXRsai1V7UEFTe127VrRGKEBzSRNfO16rVFuSe1O3Ekte+1urVDtfq12VnXtTS1WLVtceW1g2b+pbs1IHVbpZ4AYHVygAs1q7UhtTB1U1k/tfB1YAXagRBBt1mJtf21r7WDtdK1mbW4dZS1G7VwdVu1CHXEzkh1wUYHedC1aHUnuZh1msBntbtZerW0dd+1shUetX+1xSQAdTza1GVRNex1i7UUdcu1ZTXntWu1eHXotbQV/7G3tcx16fAMxW9VbHX4taB1UnWntTJ1PHXQdXx1sHUEdQx1RHVdtd32c7UQsU+163mzNdp14HXcdR+1KLURtVS19HWCdYx1zHQqdbShfrUSdc+1vLGcdc/AdnVQdZ+1jnV0dUZ1LnUmda6Gb1qZmFtlqrGadeh1coC+ddh1snU0dby1/HWpFaF1mAl3tRF1gY7qdaXRfbWeufF1EHWcteixSXU5tSl1EJVica51O7XhdVmoYGBkdXl1NnVYdQV1w7UXtfJ1/LW/tRV1YQDMdQGEQHUWdV51VnWyOcU1abWUdTq11HWytQZ1+HXwGVg1RbXkzh2ll+X8eUvOZ875ZTP2HHHkMTUZwAkmyq+x9DFAte5lILVpdRAVi84+6JqFcTHWMWplMslJWUN1GbVFdaN1u8kF0FG1YmlTtTRZrZh7zq/VR3WtMf2F3nV6dW+1hXV8sXJ1Xck3dRO1d3VCdWkR4QQHdcg1sDDHdSh5Z3XSdYi1OHVXdezJf3Wbtbt1Xgk3znroJxUvdQkxb3V9dd/ZA3XpGed1kHUjdbx113UlMU/pk3UNNbZZn2BwRa5VQbAYLhQ4B9ighZcxf2W3Mat1nskUNUwkrzGg5YPxdDUCte11dBLhAjT1dVBMteqx4YUNKfl1/nX49fp1WLHfmQtYCPWYtVUV1PXJWK5gULU5db1ZgvWphYG1njW49V91SzWjtWaxorG3deUp93U9AG/o7tCK9dF1cbFuBS+1QbXstVR1l3UE9TGxkvUWsc51MvXE5VAufPUm9R6xKvWFaXPFNlXgVTSFNXkJdXp1gXXa8bGxUvW4GST1RjnoMZmZmjXmOlCux1R09SQxvXFDJpJldSkqset1dDGuOU61o6UVZe61TvUkqS2YQK6iSfExYOUY9U8l24mQ9Tp10PWJdbD1NSnw9Y71oPHXBc9RNFjddahI4PWeuWX1tnW6dfZ1yzX8KTX1IXU59QqpgK6N9XVJr3UnddrJbfUNdaL1NvXi9XD1RPUCdX31j1Ux9W2YBfUt9VZ59Ok9ORr1TXU/dYT1/jGh9Ua1U3UmtfZZl+X3Ko/Y+t6LdbWFDPU/cbOQ9pks9S8xU6js9SH5O3Vz9UhpuDFLoGq1evSdOXE19XVcdR31AXUOdUH19vUKdYdlMbWgqXb2L/WedW/1Ngkf9Zb1n3Ub9cV1BLHB9Q71vfV19StVz/VAdI+1arG3eY/RErWf9X513/Vi9YH1OvVxsdL1SA0kqeSuoA1oDeANWQnbVT71DUApef71nfXa9QfVhA079QW1yGWk9RH1l1mX5Xeu8vUfrhWVxoRJ9SUZSH4hrJYV1YCnZB9ZB2yg5eDlIeXEDSYJXA2caIbh2RXp8ZGQ2MBsRWP1X/UV9QH1v/W3UL1ZkTBEDUp1gPUVzG+u3A10mdjA6PX51UU1WrXr9TD1tvWzMZJQt1mGtSwNlmWNNeJuUfU5mcY4t+YN6KCFdrXooNW14IW/NVkpLrVMJJY1rrVSJVINeg3c9TxoXmQ82GdltXVadVANlg2V9dYNQXWldY6VGAn3dTxujeRRDbVlqHUxdRx12A10DT/1XfVjtU51iA1hDbzlkQ10PK/1zLWSdXENUPVDtVYNU/VftYZ1s/XSDTSJ4oZ47hvmVSwxDbF169F5DY119Q2B9dr4TQ2pdY/18llqIb8w3b5dDbkNNQ3l9XUNCQ0NDUkNQw1lddNxrQ3pDY6U5G6VDYe1KbWHNSU1tQ3W9d91sA0LDeN1xhlh9fc103Wt1e5FdziBCOVcoIUFZMWZuNmBRXSZZEyvsTr0Eg14VSPVL5mJ/i/VsyH3ABCpPqC9WdmSD7kRGVw1kqWfDXxcrNpm1kv1WYApMDR5QI2tdYR16XXM1ZPml9lgDUb5LcWY9Rb16vW7DcN169GIAAUAR4BQAAcNkKnTkLoNITX6Dc3Y5XgA8lF1HrGJ+Zn173UfACL1uA04jXiN+QCEjWCJBZAkjakNZI0RbpPmSDqoGZNZcjV1ddMN7fXqDfSNuI34jayNO4GJ6Xr1M1nhDbCE9K6mbixkVI1QjUlG5HVCjeP1jI0gMWKNLI1V9RG14lkIDc0NHw2cVJ9B6TJUjVTpjuk3qb1lsI3SjSCNRo252Z/5ajFmjXdpenlWjf91aUWwhOm2ono7yQ6N35lOjSv1zNnWjSUFVdAejVNk5KmOjb9pzo3+ja6N3DVrRB6NQNoWCWGNMOnEpeYNa/Vf1bDZM/g4ec92dUlZWRgNR9UujRyN8dnkKIu5+Sq/Df6AjJDhGZGN+Y2G6QA6+7lp9NXJPvGLQNpFeY219R8NK9UXCEFuDbX1ifWNVQ3s1SIZqY2W2QGEOLiUjV1lajE0jej1knjljdQ5AY1EOQONTThubgcFo41F9eONPFVNjcT1u/VsDbsxI25mtZ4ppTqMkPo1vqCBRTZAWdGooMINy7G0MWH6kLEghMENCIWhDUHZn6V32nSIBth9eR71bjXG1TQN0QBi1YANmcna1lIQSdVgeeaxMzVp1am1RoULhe+NmDVrjeH1G40XiFuNA+jWgp922+4VuNa1yiQHjVJF+438lWD1M2AfWcCgQzXBVfhV87m47sQeOmCpVWIWkPxrQABNQDUJ+bbZSfnZVa25+E0Pbpcg5dXETYThwfHU+VQNQCUvxZRNAwWQVXU16WXrjdRxPu6ltQhFKFoy7vBN+gR7jTlwZDUoTdf5dUkYTY2FWE1XjbQ1q2UlBReoYEYT2r3+eWmMTdqS2yUsTQXVukUcTWI1REVCTcLWnGDOQkHp+NmaTdal2k3oNTXVTABBhWBNDg0jZVAlrbgOxZT1RkXoHghNVbW2wvwN24hZ0ahNGFVCMTJNz6X91PJNT/mc9UO5rk2qTURNZk2TuGRNP5UUTbZNGdUgZeFN+5j0TVOFUU2kTRq1gE3bDcwluk3xTRMVtzX1NRBNfE3c6S4NV7E4QctuBO5iTV5NN0w+TVJNS/UBTcUxQU3v5SFNik1EOdFFg9pqTQcFGk3RTRlN5E1RBXpNCU1ujW1NCHYpTS7paU3MTazF1dVZlflF/U15TY9lUxWnDXwAy7jQTUTQJPmJguVN3kWZ0Z5NyE13eb5N0k2jELJNjU0ilRzeLU1hTatN5lZ+QIRNqU3fmeZNtI2mxa+N0025TaPFu3lnTY5WMYgjTWbpY01W8ZZNt9VZTcBN7E2PTdbljJXQVbxNpLggJgJNKfAtHkq4mlGeDYwgVU2yCDVNPuUB8ZvQmE2HTcC1EOXpeZDNF00dTaZN103dTbC1902gxTNNT02EhZjNxk0MTZ9NWfHfTZlN2PV1BUTNgM0qNawNhU2gzWhleDXvHjB4nx6iTYhNgpX6wEeNR8V+TfBQFAXUNb1Zl41NTdkmJ01vuex4E6r68BzNEumY6Xe5z42KpTpNSAWgTQNN0Y14BS1knkUayIbFcs342QrNgWVANTulGVyXOfTNLaWMzQtNIACtuG9lbdV3jXyeRDUtZDWFnzQmNX81WFVMFFalOeBB5cPV2tU4mTbNPq6pVStgd9F9gqBVdPl70PpNb7k2zW/c5dX+zcSZgc3A1blFB+XoOB+N9dVzTXc1sFWRnuDNdMiFVgEm0Xju5VtNEk07TbVN5ynIzQdNF4VHTW21rU13PMbxYZ6jTbjN6U21pUuVNk0epZjV5aWEhWgyOLiVZNXNSbE3TUWlXGVsTRpldM1cTflNPE1MzRGezg2c+bjY454TOYhN4k2zkIeNkPyIzUd19U38ja21OE3vDaN56MSLuSnMHc2mgF3Nu2Wc5Q3NyWVc1RoltBmQ/Di4m80fTTXN403ojQYlU02EzQDNA83JzQVN5s2tuOcNWjWwMPheTHo5zbDN200IzSeN6E37TYFNJc1yZXsVT9mihIu5H83qTRTNaI0l9T9NXEX9zfPVAYXDuDi44C2dTZAtWCVXzZnFN81RhXAtp9UnDbBV33ioRk75M3j0dHvFn80u6C6Fk2BOzVkpUrCYTYywbs1ALSFVR2VkEhZsJC14eV/pes1HtbFN5vlfDTdMIDV4TXlIzC1Fzg85bC0YDYAl2U1IBdwtVE33zTblj814LYVe6c2SLp1ls2xigkgl4k0SxVLpY/xu9awEMsWOjtylbrXALUdluV6RXi0qcUV96ahZR03IgHTVEF5kKXCNrbmGLaleD7XShaYtN5nmLfElcc2YLQAx1i23dbgtgznfeBT1bdUV2U+06vIwzWQtR4UULWP8cXGPArJNtC0Z9e7Nei0hVfX1CAautBoUQi2hGewtri2mlVHNB81NzZeVoKnsUTnQ7hwCNcItMU3XzTtVNA0SLZxNe1X2TSflPi20+MtNR2h++BIG7zWfccZNDs0d8cONAs2RLc+l0S1h+rEte5jgUHdV+i0z5Z2ElLp++EPilLrkuUUt0LH9LbPVC4XlLaHNrbmq0K2McIF1PhiE/5YTLaktGA3j9qxNYi00hXMtCU3eLZgFbN7yLRTeeUibgiZBEOi8DRckDjSs8ScgP3H8zb1Ee/Dq8sUw6ymizcdND/UtDUOWTN6UcLzBCg1IzeUAqtDFLR918Q0aDYUNgw1HDUsNQA2fLactDJDnLe4VVjH/LXbAAbWiNb9N8zV9DXMNAw2ljeCtujlVLQJlmSUW3sctOt4zTsTRVrVVtdmc1y2CDfH19y3LqI8t2170gC8tR03WNejNIw3RqUStqGlL9QitS40TTaX1VVnArfQN2bWNDVitwTWcjbKNi/ZP5GaUWY1jjYCt+DkWDViNF3X7DTqNRQ3BdRN14E3mzVB0dS353vIS8YJFznuNtDEYRWEtfg3badQtUS1++fuIvS1sOPf1TK3h+UBEU1RF3ha5gjUvhewtXvV21UH4+2UtZZ+N6RUSAI5s5LbrLXfRjq1phfPF8c17LbNN0i1DzaqtdfG6pcfeDMVl5M76WBh35VctCtheWZStwAk0rV3F9K1ozTeNwq1gBSEwJ97BjFh0cK3N9RytUq1QddAN/Q2aDZitAA365csNeqU5rQYMMa2g9TrhAK09Tc7ZMq0zDXsNWvX8rYcNFa2pZdxNTJXDzdAgfNEErVDcXNE55LDRds0hLXqtbS0djUdxnS3FMd0tpq3prdn1o9V4WRIgw+IPoj6txJlpLZYtmS13ZafVz5XLrcOtGRRZ5Nl1PogbLUWtAa3uLbygrq2DZWH1TdXUcaas24WX5dg+tKxYZVW1bJSrJeotBdEWCVotzUU6Lf7FcS24TbrFVphAPgIgUflOLcPRTa2ZVbpFJalTjR+lQG3oPriRz3VPhWBt99H4zZNNpS35RdBt/3UHLVAlpqx+Le5FEJ5Pda5sRy6kLbqtUkX6re0tp41nhb1odC3bdZatTQUr1IpsHqG/Lc15ky11zQOp2628ZfAtNgVMGIxtxG2sLaetu82gRehtANZBrco1ps2ODbZZjT7LTT5SB9z1Pu5Nm01fROQtk62yzU45M63CzSataWgmYP0tns2Spb6se/yPBPks4y12raxtK0nTLTAtdPmibdRNltnVsMz8eITtNDyAP54pLb6tmy1mbdTNhs2WbVItQM2FtSDNsKyzFehl5z44dF3VyvjkrYmtC+i/zWdBupCprR3xDK1lzW11vOW/HBKti41nrZP1Ja3orWWt47WVjZCtow025BcgiW2NrahtyY2vJaltIK2jtWCtXa25lTitJ6WSbdgFJU0p8Fi+B14OhaStwW0Jrbct881hACmtzy3RbQutgy1TtUi+5mR3rObxha0QbUCtsq149ZP1GK0Zbc2NpI2yjX1tDW15bYitVM1Y9S2two2zDSVtHa2KrckNZoWVbca1uboqBQjF0r7SPkxt+86ITaRtd3nkbVOtHS1UbZ7sMS010RatGa26xQnsvG2HdSw1Am2UDUrNuy1Xrajlas2TILDCT22g9Setzm3v9VZNF60cbY2lnm0MzRJtMdGmrC/NglZyEg1sda1nMU1t8a2UYKFtdy3Jrc/MtK36MGmtPuHvLaUNQy3Rvt8ipWL1rUCA+W3itaP1PK2jbZr1yLWgreWtNi2I9dwZwb4Fwgjt8RVHdUNtBW2atSmNra3YjfKtiQ0bbYsN2K09rcDNfa25uuxGy01AoA1Mw3Ie0SRtrS1wzdl1Rq1dLRptCVn/ravNEpXMyW7RSXL9Uk5tG60YDektxaWg7ZilcDVOsertH1HTYKx1t7kmbUitaG3UDT1WHm2VLYLt3m1S1ThtI74RrbfQA77PQAhkNUWqLZ7FH63G+e6x360mBb+tUC3NTbjtQdmRwSq6pSCgbe0FLi2WLUvR6WlfbZKlYe0QBFupTMXIbc1Olu3A7cJtUYWYbfYN9u1mzXgtPhLLTdO++RKfvtLtSm2y7REtV21zrZptWfWDLSSpKVDnXiXt/G2A7YJt6vm27but321n5PrtunRJuPz1cs0W7b1lmZWZ7S6tzWXXrSqt+e0szZT1EnCjLcEtp21HjcptS1n5cWptFMBV7UrtfS3ugDptK6WDzqjgnIhLXjbePbWFLa9tpm3VEtTNFm2fbcCNK6X+/A5tfH4tZFft661mRY6trm0GzYGtZ+2/2dhteK0C4Zz55dDJIW9SlZyVtWspyO03LUmtnskdbXStXW047XRt021gBV/tEiHM1BWIg22SrcNtyTXFbXytl7X87UKt5XVQHWF+8WHuhvNtnK13TQc1NM3BtRqN7a2oHYKtnyUPzaGt4+2O5e5F3X4EdJCGca3OLC1tQB0maSAdWO1gHTQFIe2Zra9pFyoIArgdyW087Vb13O0kHS11MG3wjSjpPB35EuZ1Ba0IHezt/XXLbeqNIo0FDaVttO1eLWPtPi0y1ZT1zhIfvnVQOq0y7ZQthq3/gDQtiu0VWcH5sW2qhV3UOBI97Yr1AO3a7UDt5m1cLS/toh3ihdmkDe297VqF9q35BZst/q3e9b3NZS2OHVhtah2HLbemCMWE/jSu7uVkrUwdYW1oTRFtTy2gHYPV4B33bVWt7gZSYRxAfB2IHcWtvK1KHettZW107cytU7BSYWEdhc1s7WTthW2cRcgdWR2kHeVtiGXbbXv1sdE6/oOt0f5kChr+hVq6HWXt+h3Q8Uvt1G03bSVJZh1XxUHSDtwBhJr+C+3uHf3tQvW9TbMt/h2ZbSjpbfQ/TviQQx09yFrt9+1eHaItf00fbSPtTTlv7ZJtAEjLTYXabv6VZC+tQiXZ0UdFPu2Q8F+tOi0B7ctlfYgc9eLNV8VwlGn+I9wZ+ant5i1OrcfVse3WadktOsWG6X4IeILFUPsdke2L+c8d3h3GZdZN2e3MDbntkO27MR1aBC2Pre/+TAgQIXz50mxZSRStBqDhbQGUsnS6ns45wU1EvqFNYc2wnbahWQ1gcc5xWUiyHeMdSAWJzV6lhuk//rg6BJ0l0USdZY2LbT+Vhs3knRVt4J0OTXitnla1bTFa7AFiCOABnu3vrbLtmi3nHfkFge1oLfYVAy0MLa9p3J2ziG4dKe1R7WJVXEWgnSUNQdmAgL3AycXazRHFTx3ynf1lip3KrTUdPm2zOlbaLu3eAcIBpvwHHWtpim2hLfPtCx2L7ZXtxh39WTXtEp3THWaAxVCmnXftxsXsLVutbe2HzR0l05UgVG3ZqkhunYSlHp3bLasdfh3rHZA5mx1Q7QJFRp19AZCRkdqpGKXtlp3l7X81nR3XbT0t9C0AbV8dw/ge2QmdTe22HS3tXLlenR8dR80vlYtABZ5hxYGd8qXBnVbtvh027ZMdYJ2Dzb2tqq2uRTGdMoEPAY8wZwE9yHyddUUnHRKwZx1yRSKdkiU/WTcdPjkPhcCBm9CdnWbxQQWanQWd4/k6ncMNXDkEQTCBk50ACI8dcp2znYQdCp2eLQEdep3C7R1a1B2vze5WcYF9dBtNRSVHHWotAp39ndotlx1jpV7NfKVhNotOysRidUht651sbcFl850QrZ0lZU1PnVtlg9E6heYtKx11BR+dAu2NnULtzZ191q2dKHbZgbp0rqgRLImBKi38nfXFgp0DnTedDp2ZnZgJeDjgYQg6L6B5ganFGp2vnd0Nzq1WLcMpTh0TpUy5uYGRgVOd+F0And3Nq/UXrW8dw2l27aBdDu3gXTDtjKXp0JJkHADsdt2dxx2XnXWNQp0V0YOdlSUhDYut953HnQe0W4HWndRd/520XXvNwF3oHRWluDEngZJdVF2ynTRdG53andudOe3MXXntPi38xQ0dvCXBRmRBOqb5ZW+tPZ18XXlp/u3CnahdIl217eDVYYHS9tGQ3rb/HTJdG50J+fJdGLWLnUpdTl1QQYP5M51vnQllQ+3EXUepqh27nc2dNjoGXSRB/wgSQTxdF51IXVedP602XcOdnB1P2Q5d/vbRXYQua53qXQFd5Fl/HvMtZF3e5A54JkGZXdOdBF1opXWlQV0MXeVpJs1Hpbpdhy1xOpFdDEHZrflB+ZmmXeed3u0WXQcFVl2CXUldO04pXck5aV1EzM1dyUF+XWVdA+3opXldqs2SpXR4kfARyr5BWV2uXTldTCWhnRhtWl0NnRQdTZ14LcUIDR3s+ANBtSqxXR1d8V38XShdGfW3TSI4d22iXWNFkoGzbHc4BaX+XXH5722ZhR5dinWjeeksvnZ3XWNdYx2MnSCda12rjWFdW10wJTtd20F/QZPNr63tXf5FvZ0naAldFx2nXRmdKu2GRdno0zqTRfdd5V31zc9d7q34Ga/USN0uXf1FAF0hnUBdv126naydkCXsnTCIDR3RkgTmdJitHUmd7R02nUYdNG1KiNcd/V3QKZxgMmZ/RXmdSx12HSftDh3hnbkdOJlskuNwY2ZUrTYdnN0QDRnt1u0ibfWdf13E3bitWx0aNYQtH+4UyO7B7uVmXbxdR12WXQJdfDC9XfUAF112XcKJryYQ5NYdt9GLXQ9dMy0vxejdla19FV2FeyomLZ9dqvX43XOdhN3HDYEdOG2L0MtN5DzFwWad3IXg3WjFkN0ePNDd1l2w3T0dK813naN59MbgUDKdL53ZXabd9h1QbU7dn520GZu6nt043dPFgJ2AXY7dJF07nTLdVW1RnTF2kF2u0FvBGWYmXWDdaXDmXerdXV2a3bDKQd3hRSHdkqVkIW0oTBXSXbjd8p3uXfHdKQ3MZYXdbDpHCh9d0d2gVZpdmd3aXRtdYF0A3WxdvJZnwSNOkTDU3ROtyZ1ULYYdxq0M3Vcdut2OnXNZLujuupWdgaV+rZ6dUt0GjUHZbJLakmvdxm2H7eb1JS0S3a+WRZ111d2tOl0QnXetJbX53S7sXmTbZH/t5p3jrWRtVp2qXdOttp0L3R7NOJ2w2ffdEXAIkAoJfe1H3bHNGS3n3W6tlt0QFeyFbDq3/OvdDyXsLUfVg+2n3cPtjc0X3SydV91snVsdC+6cnQkh91gMIN/tAAgHXRDdnV1+7ZXdldHV3YvdvR3pebKgKk2MQViOC13N3WLdsd3m3W3dCl2EhanB6Ej4PXhdal0m3cfdGC2VXZNdwa1ebXVdrt0zdZT1LuxzoflaT91VhS/dZ21v3auddN3z3d0dHB0QHbPZ4j282njOdYkvbc3tJJ2cLRMdvN2kXQ2Z/ATqPVmoa2BYOTI1wD1crTAt7m3b3c7d/116XQUZstUwoach2yGczSXdXu1EPeXdJD0nXbotcOHM3cnxTj1/IfBG9D2p3fwdrx0CPcTN/j2K3QMmPd08PQydJ921naDFFt2X3UPdLF1bXRPtbdXMYeKhNybtNW49iF0aLQHdPV3kPbeda2VT8RKhSii23b3d413o1eE9Vm2r6SXmgSQp3f5leN01nTstT10sPeQdIa2bXfY9Vs3uRT6hAzZYjlPdr90z3QYdqZ0r7SYdrcUb7a1N2zAIMH6hv50Reu6dyx0EzWfdNj0J3XqZu4jSjrM9FG3m7RY99t0tPStdkt36PVnd6D0k3Zg9B5213ijQXTacPeJFbV2l3Wrd+T3HXdedRT3K7aHds9nV+F02GQ6NPfKlae1xPQtVq10D3VNtrz0XPS56B47BPU09oT2IPQk9We3tPeLVxz2y3VGdWWWX5behZ6EyxoQ9vt3EPWkJ3V1a3U89Ez0/3T45+ojIvU3122Uo3aU53N1x3f89Sp2KOcK1+jD3oRU9sT1fXfE9rT1/PSFdRz0pPcI97J3WhW+htPSQXqRheWUeTRad09203aptn91KPRQ9td0rpdMo0LhMngft2j0x3aS94i0rPe3dyTn80PZ4VCY0nVo9+Z1vbeLdkL3IPVktqD3VHdndlHHggEqAwQDVAMEAhkawQE4AXIAgAEpmJ4CQQBHx7UYEAJa9nFD3gAQAfYAGRnKAlICHgHgALDFCAJ4A3LEEQB8ARrpB5mQAKDiDPqcgmADdwJgAMdrqRqgAeACGRqgAjkD2AMuoMgBl/gxeFf6UgFAgSma3TkUAvgDwACCAaAD0pUm9sdHsVpp4sQCrAO4g5b1LEOtg1P6ZvfAA2LDMgK5G8ACtuGUAeAB4ALauFzStvd8ARb30pguw4ojlvSLtlnreiP29Pb1xrKIcO3rQ7d8A4JjDvdgFGyjTvdsRsaSicd940/D3CMO9RWETDqu9870TKOW9Zb28AMuoEWCNwbm6k454sHm9ANLXxuAxOkZdveO94m7rYMO97+YU+Le9pHpdkA+9cehjfru9sdFtuNpYV70L7j1yb727wZO92oJXvSJ2H3i3vSBOefggffYI4/YgfSHG6Si3vXI6sNCwfcu98bBXvRBdo8GwfQzYiVqwfaO9H+TIfdB9n3LbveW9+iCctvtBrd5QIEe9YSAnvRtgZ71EQKhAl72x0YDdTCggfQisTQHIfUx9jej4fbu9hH1ZviR9ZH20ABR9KgBUfRe9u73jvc7tqwhzvUx9T57jvXIt+jBxAOx9GrAyAMtRk34yAKR9tNDwbhJ0rAACfTR9Qn0DvS+9tG7CfW24UahzvS+9vOTjvQOtuTAbvUZ9CKCSfW24qkCyfUTQMgBxoUp9k46wyPQAeb0RFBp9YmDdvQXpUIIgfT6oe7KLvVBN8JAgfcMYOvg7vQjABH0pvd+hVv7Kfc59rn1YoO59tH0Iocu9uARfvaO9wOZXvfUdUvChfRW9HH3yfc+BTt4ZvU59qn1ufee9mn2ugHp9WbCmYHO9FX2Glou9ihF/CFl9WX2EfbLRDj4FfSp9Ln1qffF9Wn09vcF9G+AmfY+9IIAbvcF9XTq2feNkcQHcfW19sX3qfSV9Hn3IfcF9LhDIfS+9goANfeW9SFQ1DpNW2LA8fXx9nX1lffNIWbCwyP29LMgM2H2sO3osyHGsjbonfQXpOXQXfW24fAbXfSHGvCBvvVhI3wAKdhd9uCHJfdAlWbCXIAd9bt28APY4r31xrGl90CXDGOU9onHACN8Av7oXfRBdoxDffWVFnOyQ/XGslSqQ/cMY1diQ/XHo7RiQ/Qish3S2fVTACJbpsJt99DD8fdN9tH2TBdPwOmAHffd+SH1YBQuw2H1U/Vmw830gcOGtRDAnfXV9eH27vY199n1PNpSAG30voOR9BP3bfUW9LMjT8Fa+r30IrG84r30hxvjQtn1NffSOXP34/ae9RP1afdCIceg5rK999gik2pD90/C6iLZ9U7E0DnQOsv08/bx9fP0K/Tt9LMjDGE60I30c/cBWoFa1Ydz9inrwAOYAtAD8/dd9ceij4pD99gjLLtj9MgDS4Tb99v2MsLx9ETBYwO59tq5JANw8aAAMGK298ACpxjUAEAANRqeAEADIMYr9PFEbhCd9UX61YAd92AVLfY99h/k76Mz9lnparLn9cawxKrZ9SxCpnoeei01y/ZR9033wAFAgsgBBAAQxzdEbgGvRRb3Pzd8ALKQ7eq24WbBLgu39d72iADjA3f06Pv20/f0IrD21/f32CNaE/f0hxsYA/b38TRpgbxDd/bghI6AW/fCWin3l/RN9HX3G/c39mZmsxvP9WbBPjtr9MgDWrrCe8J6r/TF96/3Ufbm9Nf11/WeAAb1N/f39caz1WPv9fADyFgqAShZSECoWahaUgA/Ik4B2juUmU0A3Tlm9KgBoACoAEf1KZoGAEf3//ZLgYf34gJ29Wn000NPwZyBL/SAAl2YssDdmRWYlZp/9DUbnTioWAEDwAGwgaABwoCADs+UwAzt9NNAvvX39QzlMfd6Aj/0gcAHmQeYu6KHm6bC0A8HmDANFvTTQo70toNQDrObs5pzm3OaUgJgDAGZQIFNAFAC4AwlAaABrUCAD3XTEA6wDmZlHltQDbUYKZt8R9AAqZmpmfAPnTm1GKDj0AF5ZtH1RZv+9y327vVOxim5gFhAWtABQFk+4mAPqAwwAiIBx6NIDRI7aAHoDvUQyAPIDf6aBHEBmoGaqA+oDumAufVAWiIBCgFoDsAM6pZLY1APN5q3m7eZ8A5gDKhZSEPAAeiAFvaaghAOeEFIDO3pv0JO9ZkBS/Y4D9qatpk6mjgNf/UpmWMBeWUADCQOOMEOGxtiJA16WEESJA+GtA31yA6Um5SYiwFUmbzG1JvUmiIBNJk+4UCDeAIIAvwAFAFtu18b07i+AA4AoADdOrgCwAEeA8ADFJiUmPPoqALasSmbEACIDJ04+oBH9Uf1VALH9BQDx/aBA2o07fVTx0/ApA2z9K33jZHFRqgMCA4iAZ054AwQDbb1KZpIDcb1afS3V3wD5gjt6zlVZsI1ktwM8UX/4jwPbEUKA/b3wVd8AGeS3A+aR0eDfA5Z6ppZvvVsRcayVGLcD4a3ymKCDRI42EhCDDNgakhCDwINDwNQD9o6OjvaOLo5uju4DGgO0fU/IC7DReKkDJrVJxviulIDALvAAJSapxspuFABFZiSDTQN5vdOOwgNKZv7kEf0/pp1GsEC6RtHuRb36rt8An5I7euT1HIOWfXsx9ggIg9sDu73jZDBuCE5ITpSAUwNEAKnGYABJAJ1G1IPkfXSDxAgMg0yDqEBBtWyDAX3YAJjGXIM/fRqDrEDUAyKD6k4eeBKDUoMyg94AcoMufQqDyyBKg7kAKoOsg1qDIE78MHqDuU5wbi59l07XTndOD058AEaD0oMrA/b9047mgzEYVoPMg6qDWoNEjnK4joNHTmEgp04Ibm6DyG7ig8QAxoM+g3BuZ04WgxQAgYM2g7R93qjXA1sDYX36A0p9uU6IToQmEoOx/WhA4DFygyoAtq4Bg229jIPWgyyDGYNJTuFg9gPJvXwA1q62rvaulIDMzpou03p4jWhAtq7AQJUABABoAKpuIGYkuA1GU0DcABMDtACJrVigcoO8fUpm3zTzAyrAR4DBALaDezEM2AOYuINIA2ouHYOszlou7YMaLjuDXYMoAD2DSmZ9g0QAA4O2ruoDugATAxQAXN4TA6SDBYO0gwRRC4ObQEuDwYN7McMY5b4hgwisPID9vRgxk72NgwYDSm4qbmpuI4AoAJSAhgOqbupuKACFZvAADSbevc+ARACngCe99NjJEkHmgRxfppOAkf2Lg46Ab4OfYNPwktD4fb2AA4AEAK4A7gDGUL99mxUNsbwAFjXggMZGZX06/YwA5f4r/bm6Wb03Tjm9J70xAwl9RYWSDsX99n3ffixDdb0NvZ0Dzb1aACADHb0XAzt9Pb3LvV7Oen3ofXYDv71RfmO9u229vRmgfX3ofcUDykOjvWUDuboVA5nOVn3ofd1gVn2jvVu9goO9RPu9OKGHvQb9W30b/V+9FX1ffb+9Pf0bMA+9wX0g/V+9L70q/e+99gifve+90H3q/XR9FX0AfXR96H3Q/Q5DoH1w/XR9EH3P9IB90H38Psh9vn1k/Q5DF4G4wbB9FX3J/cW96H1p/YlDWH1z/cW9uH3RIBuDvQC1Qa19x71G/ef9XEP0fVIojH2Tvej9xb2sfbqDpkP7wLl9qb3jfSVD8v1lQ119In1xLH194n2B4FZ94n0yfQ1DRmAOfdAghX3tfcV97UOSQ159Yv10fb59nJKAfcu9EP10fcF9+1Abg6qh432n/eNDgn2TQ729730Ioal9vUN1Hb59s7Abg1Q+VL6OfWv9m0Olfd29936Vfb+95pGL0Bu9FX3C0AVD0H7MXtF9RX1xfTZDA709fQdDUm28MIN9k73DfQ1DnH15fQjRI0MXQ59DE0PXQzo+hgiGfYDDOUP4La392YPZfahIuX2FQ1F9o0OTfU79xb1zfb9DnVbSIABDVb2GNtz9rUOV/VDD1317fd5Dh33PfTlDp33PfQdDLMgIrFd980j2CLd980j3fVrQr30+qC990CXT8O990IiffVTD2oN/fdAlAP0Mw+22v30xkJD9PqiLQztwWbAhQ6D9B9p48bTDLZ2I/WxWyP1Sw2xWaP3kA1uF3wBY/Q1DOP3jljIAJMO8/W1DW0MC/UOGCUOg/RT9djAnfV6WNP3zsHT9DMOM/W2Auf10/flDwMMc/TL9xsMV/YT95MN9yJ8DvIPQiKL9rsPQJRL9skAFQ97DeP1WQ6VD5sOvfcr9OsMNXdgAfkM7cJr9bSDUA7r9632+w9jDpv3PfbnAiAN39tb9+v12/Q79OcNgza7AicMlvTCAHsM5gxZAMgCl/RQeq/2kw37DOkbV/bX9G4DX/Y39tH0t/S2AB0Md/a39msNpzb390/3lw4P9Fs0F6SP948PWfbyDTk2t/d5DM/1y5PP9+EMcAw1D42RnQyf9H0NTff7D8Hit/WUgO/0cg/nDDUNTsYf9cJ6UgJtuEMNbw63Dl/0dww390PpafZbNrf1UA0fDMgDP/YoWyhaqFuoWcFXf/b/9ZAD//VED+QOnA2ADbb0QA/iAUANkAAUDcAPfAAgDq8MyAMgDeWYFZmgDn8MPyOEDU0DqACIDzAD4AwlAcQPysBAj5cNdQxQDk71Pw7XDTYM0A4HmzANc/UwD9APaAwKe1eCcA2zmxAAc5i+gXOYMA0gD504HA5QA6CNiA4VAEgO1ULgjj72Hw8QjU7FOA4pmSgOqZsxe5gMaA34DJAPc6fcg1AOGA+AW6gCQFtAWsCNqA5Ij1gOJA+JudgNyA7+m/6auA2BmKiMeA6wgW26CA74Dwxg2AzFDAEMyAMEDWMChA7AjKCORA9EDZtq0ANgjwAMSQzYD6H3Iw+z9fAC0pi2mxgBtpu2D2QO5A4ADriPaA0UDtsOOMKUDvIMjEL29A0OCI44D1QPjA3UD9HgNA6wAjSbKI9AgbQMdA10DPQMEAH0DAwNDAxOOowPjA5MD0wPekGgAcwNtvQsDMf1x/Z1Gj8a0fRsDrf2WI3wASIPc+M6Oro6TVhIjZUVFvViD0/A4g57DeIMgLgSuAyPEg6SD03rkg4iAlIMNJnKDtIP0g1WDyoO1g1p97IO8AJyDezFx6MW0IYP8g42DwoP5g2KDMgBegyaDM4MVg4qDcyM1g7hD6oOagx/OInbeUOGDak4Fg4aD8YPeg7KDdyNHI5aDJyNBgyuDbChxrA6Dz8PQIE6DfoPRg0huHoPWvQ8jByPOgy8jqYNvI+mDiyPibmGDPyO5un8j04Oug4Cjx/3Ao5KDjyOmg0mD4KNpgwsjO32Zg9RDniMrfXmDEYMFgwh4RYNHgwOApYMko1ijkKM4o2qDed0Ng9QDLYN2rpNW24NEAK5Gh4PHg6eD54PXxsODo4NXgyg4U4NnTgWDs4Pzg5Uj2EPLg3WDlnrrg/0jm4OjgEzO+4Nso7uDjgMKo+yj3YMDgL2DKAD9g4ODSmaXg+ODtqy3g4iA94M0g7auT4Nioy+DOEMfI5mZn4N7Md+D3kN/g1EATSOOMEBDkEOgQ+BDSm4gQyeAMENwQ64ACENIQ/qAoXQzYGhDOgAYQ1hD5qMSo9CjC7AEQ9sD9GH/AI1DfAAKfW9DmMNn/XHDA70QfWT0fX0QfQ9Q5n2Aw+nDBsNe/cjhNWGy/UPi/v2ETUH9SmYh/ZIUUAO6YPMD0f1LAysDxP1J/UHDqf1Uwxn9msOU+lAjOsNrvfn9DP3bEUX9R8O7A92RfAD8A4IDRwOiAycDtq7nA5iDQ4Y3A3BV934PA7OjlnrPAwujXyPeQx8DDbE5Q0WVnwMHQ6yVDbGaw0CDnwPkA/oVDbGhw+flnwN7w3BVa72wgxej2xGDSIRD6kZwQEuD8ACmvbIAhkb+AK1xzQB4gHNdS3aeQXNdGzEOAEm9k9ZQNkBjwGOAQMkx44jLWuBjqXAPAOW9vvQaSC1dX6NSRThdJHZwXfmIQvh9/Z+g3KClYJhjEGP6IMkxKGNIYyB2aGMwYx0WP6PwY3HwYGMPAFBjWGPgY8Rj1GOUY9hjwQJSRXBjpGOkY8RjhGPIY0L4qGNSRXRjPGPzAWxjqGMcYxxjKE28Y1RjKP1oZgxjEmOzzWGYBGMCY0Akiblfo0hILGNSRSBjKmNQNsRjEGP0Y5BjwXBkbcxjumMQ/bBj36N6YzpjhmMmY7bDgGOqY0BjymMWYyBjZb0QSSAAKG7vo8+RMmPOYwrYTdH/o525GmMiY+PoR416Y4pj5ToeY6JjgWPeY9a4nGMuY0Rj5b0BYxJjWmNSY4Jj7GNyY525CmOJY+Rj5mPWY+hjUGBRY5pjuGMdlKZjCmPEY5pj+WMBTGdtvmO5Y7u9W3yyY+VjGEWpY8BjxGNVY5ZjO00sY3pjNWO1Y/k4eGOhY/hjcF26g3ZjfACOY/9AsWPlY3+j7UDqRmBDPWMV0WFjQmOZse5jGGNaY9NjWWMtan1jBGNpY35jOWPJY892XmM0Y6VjlmoZY1hjUmPFY2Rj/GNjY4Rj3GOeY8djwQL7Y+1jbWMo7fxUJ2PYY1LD4mPTY/RjMWNxYxVjtGNJY0pjd3nNYyCDU2MFYzhjxmNLY39jeWNrYw8Al2PrPX9jJWNlcfNjKGOVYx9jTWPNY8pjT2MyY5Z92WOg4y1dwmPXY+Bjt2Mg469jrBBZ0YDj22Mw47VjTGPLY6xjG2MQ45xjGEVbY8djAONo40DjiGPnY7FjaWPU49Rjs2MHY7JjnWPqRtuAoAAfo2KAZGMNY0ZgUeZJvd/x92O8Y79jWOP6Y1Hs8OMdYyLjPOMZOhFjd2PfY4xj3TVzYxLj2c2JuYzj8wFMY+VjYWMvY9Lj36OIY0LjlOMbY2rjqXDM43TjcWNpY6bjrOO04xdj9OO2Y+pG8MCc43iApONemFOx/OMAY5tj+uMK461jTuNdQ3LjXmNSY7zj/2Oy4+7j8uPBY1MaQWPo49rjAeMRynDjmuOQ4+pjigMJ44njVmPNY8RjRONwYxqAPmNp42LjIePo41LjAeO24wNjowBc49vNuOM6BG5jsaPa8Ubj2mMMJRbjC2OR47tjwOMU46JjtGNV4ztjseMXYy3j4eMPY3W1LOM4XflDdmOHAA7jYoCi435jheMC42VjLOPk4x7j2GNU413jhWNe48rjuoGG44njK+NtMgvj7eNL46rjc+Pq4wwl0+PrY2Vxi+OHY3d5h+OoY2dj1uNH4z5NUeP5QZ3jTeOh4x9jDOOr4yvjeeO+Y7PjFOPA41fjI13a8d7j3yRZ0ffj+ONVYyhNH+OqQylj1mOexefjrONn46TjUkVV4+ioZb0xvYZGxeOrbLXjrmOu45Fj0+NSY73jHWM34+gTPePIE30jZX2+49djMWPQ48vjj+MJ48/jpmOv4/rj7+MN4/5jE+MW41DjKeMk4x9jMeOT48RjQBMV4D5NpeMY4xwTxSA4463j/+OpY4TjyOPE4+DjJ+NT4znj0GMbY5IT8+MhY97jD+NkE4oDVuPyE9gTIeMYE3vj0GNwE/hACBNOY3gTY+Nu4/fjyhOH42ljhhP1Y7QTe8P0E+ATjBO1Y1QT32M0E1njZmMlCooTa+NI4yPjqhN+48njNhNB46YTFGOl43ljHBNGExvjPuNOE84TgRMHY4tjreN64zITnMOosJgTwOMn4zhdkBPK49xjI+MRyu4TRBPQE9vjxuPx484TLhMSAKkTV30GYyITW2BoxcUTS3auwyATFmNgEyoTWhPZMToTU1FxE/oTX+MsEzXj4BN148wTsOOK43ETNcMGEy0TvhNq4/4T5hNhE6bjDONZE9Xj6+PhE/XjRONRE34TG2Ol457jJBBlE0hISRPt40djYxO9Q7ETehM7TdwT6RNBY49jQRPj/aagBRPA43/jhuNjEyr0meNLE4MTWeMUE/9jHRME4+9j0OO1Eywm9ROmgG0TKGNNE4sTBRO3E2DjlePnEybj7xNEYyTj4hM/Ey1dBePwlq8T02yl458T+lUHE8MT5+NpYwkTCa1yE8YTWX3a8XgTQMYTEyMTqeOAk5iT0eqk4xYT6WN747NjBxOJE3MTxxNSRecTFROCwI0TZ23f4+CTqUCQk+FkgJMwkz4TrhM6444TphMsPrMTYhMHE7FAmxOAk9cTZRNcCQITG2MYk+XARxMck2kTpBO5E1wJxxO7E5JjIpPrE2iTlROqYzMTAxPSEwETrRMqE2cTt+MXEyiTQROLYxSTu+PREwqT0WPCEwUTKxNhY2sTt+MbEzSTWxNcE2rjGOPzE3fj4hNTEyITnhNVY+pj/xOgk5/jRROi476TdBOE4J0Tv+NPE3ZjIAgjY1CTauMwkw4TxsK4E4CThJPREyjt+JPK44ST3+OLBTmAzRMhk1GT2+PsE+YTfBNjzkAT7BPf456TqWPFkyfjnsVLE8bCeZMOEzaT6BOCE6ATx+Oxk9ST6ZPqk7mT0hPcE/CTNuNik1WTsWhYkwiTOROykyaTPJMJY1KTK2P5kw20aBNqE3WTahNWk+djlZMFE9STSJMnEyQTW+O2k5STY5PPA5KTH+NSRRoT+f3faLkTuGOcJuiTvZMZ4ymT7eP94+pGiICvE99wWRMu45NjweMiYyUT+qCnkyt9QIClE4uTDJOuAEyTpJMoEw+TLpP+4/mTZpPd46+W8pNB4wBTpZPWY4OToRNFYw4TthO8Y/YTVxPAk3yTkFMWYw2TVRPvY26TG2O8E6jj2+M8E/mTM5N+4+hTapNNk72TNWMgk8OTGpO/xZ2T2pOokzKTMFP9k92Ta5M4E5RTuZPPE8XjQ+MTwHgTfOMPkxOTgZNi44eTPehdk2bj8FPHY8DjSZM1k0sTwlMQExtjv5OIU24TzxNxvSNjt0iHkzCTEFO0U4aTwFPbY/xTAoMEE4+TGROYU3yT7pOvY6hTqmPek3qTs2O8E6JTomPyUxyT5FMoU48TTBPg430T/pM648RTKmPSU3Xj3hMuU6YA5hOSUyPjplMqY8RjVJM6U8Rje5OWU0BT+gNK4xeTgVM2Y1FTepNBDJfjflPxUxoT5OPik2zjMgAm0JGT/RXRkxNjFePskwHj8ZMEk1pTO+PfNd0Tc5MXY4ATyVPMU9OThlNsE/RTihOxU9VjmpNDE45TNhP3EwATdVMME/5THJNVU1nj5ZNwk/5FuJPBE8NTSsD8E8qT2FMEU6RTlpMdU0ITrFMU40KTAZMaU5MTDVNkE55TWBNzE5ET81P64xVT42NZ0ROTVAN2YwXA2VMhU3lTZX3a8QdToVOzU42TlxNuExtjl1PLU9iT11MYU4xTIlPPE4hAnFNB0hWTZ1Pj45gQ3xOwU0hTZXEwEwCTNRNCfZYTfWN6rZFTQNM+k49TA5Pkk5uTSbHLkyVTCuOEE3sTbGPNk3KTm5MMk5exiBO3pJITMJMPU69TMlPOU9mTmON2U0HjhNMFUy/jz1MkU0TTXlN2Y1AgN5MEIKgTPpQaExaTY5MDUyzjbZMLU8hTk+PrU0CT1FNOk/zTm+N/ExZT3NM7U/DTO5PH43JTyNOh472TGOPLk9UTdFMH43JTrBPdU5tT6xOUkwlTxlM847uTcRPmU8STPePWUzdjRVOpk/ZTfNNdE9xTnNMW40bTG2OnUwVlppPPE3Ag2VPhUzCTwNNq01YTOtNvY6GTTlNTkx4TANN3UyrTtJNZ0VSTu1MX44WTtBOy01Jj4VNe08xjttPQ02LTltMJk4tTOuOm0xeT7lMgY/HT2vE4U3d5MdPYUyWTd3nHE4jjsJNc04XT2tOTU7WTAdN2UzTTHlNtU16TLVM3E11TntO6k4bTTdMQ07HTuuNmE/1TGtPrk9sTTpNh01xj/kWvk/dTqtN3eQBTUdPs01fjHdOKY+LT32MG0znjINPK09tlWpN00xtTJNMPE/0T7ZNlcTnT+1PNk9bT4BOEU0QT+9N9YwuTY5PUkzvTV2N4UxnTwGN9U2UTKdO84x7T7dPPE6YgTJOjUzCTSZNp02FjiZM0U1nRglMxE+LjhpMa4/rTLdML07PTvGMT07DTTFMXUxjTkDNvU3ZjliAu09ETalPGk6vTAtPok8NToGMGkytTv8Ur09yTVFNf4xRTu9NkUxXTUlNj0/KT+dPfU2jFGDPH009jG5NFkyQzAVO506aTNdOZ010T99NGY0nTxVMgM2tjR5PRU1/T09PR42wzPdMsUw7TI5MCk1AThdObk8XTitNt009jxdPqU46TV9OS0w3jStOaU9wzaOOzY82T1JNSM1wgH5Nn09fTdWNUMzqT29NTU4ozb+M0M/1jsjPPY88ToRBMk0XTMZOnk7hT5jM9k4uTwtMHMEHjCVNH2GVTVtMuM2fTTjPUExYzMmOf0+djl5MyAKVmylN8MyEzalNV47wz5VPCMyHjs2Pj08ozy2M5MEQzM1NA04eTfiyb0zzTZXEwM6gzItPg07QzsDPE09nTpjN4M1vT2dMF02kzHNN203qTujOo05JjwVN1M8EzF2OhM3wAtdCIM9CTP1O9E6TTVlMsMzfTxTNeU2DT+RN+M10TqVMD0zhdmRMWU00zbNN3ecDTDJPv0J0zuVPl4+dTXxNjky0zHGOEk2/TnDNm074zV+MZ46qTQVMN08KTddNlk/0zhjOFM89jDDO9U13Td9MUM4NTRjNL019TDzMNM9FjPVOFU9NTNTPr051T2TMS0zgzrVP5M8ET8tNuM4iTo9O/M3PT91N5M2szU9PPE84wSzPb4wTTYLM5kzkzftMGU2VT0FONUzsz6dPHM0tT3jPJ0+czUDZZ01TTpmO7k8wz29NVMxHTaeOBMx8TdJMn4+8zvmOP03Iz6NO9kyCz1LOcY6yzzxOPUPCzFOME03kz55P8M7UzszN4s1wzCdOt04CzGVN8AHTQ3LP646yTfRP8syEzOJPyExszhGOEk+7TQjMZM6pTTDNiM/pTexNa0xoTEzPIk9Jj6tNB0w6TrzMPYxAz1TNT08kzHpPbUxCzorOgM4Mza9PL0wCzWDNPU98zc1Pgs+Az1zMfM5azu2Nss3iKY9Oik+SzlDPPcMYzpTOV00lT3dPuszdTlzMI4+wzJmNNU0Bj89M8M4mzamPWsyZTVjNxs/Ez/tORs3czJrMsk0NTNRN2Y3kWETNNACzTeNNrY/UzkTNw07kzw1P+M3YTKpM6sxJji9NqMzVTXmOxMz4zvJOl08KzuzMmMxGzx5PPM92zyLN/M7e5zTOSM/QzK7ljs7dT1dPBsy8zRrPN032zpDO5s6Lj5tM2033TSjNts9djs2MSU88TD8hM090TMJOj066zNbOjs3vjXCDxWt6zDLO2s16z/zON0+NTtpOKs4fjKRNY0+oz4ePPsx/jjbNQs9WzUDMHk84TWTPlMyizZrNYY7NjSNMj05gTUzPEkwazV1Obs0FjJJPAMxqzf7OgYwOzIzNX48qzqGNpk5Qz8rOtM/SzJLPqs6ezOeNVszLTdtMI01XT+ePEc1LTv9P/EzMzBHNAM3gTOHN/Y2AzBuNds2uz4rOp4yyzjrPhY3ZjJLj7s9EzYxMts9gzqLOwc2hzfeOPs0ETwnPGVKuzB9N4c8SzDHO50/BzlTMhsxWz1OPUc5WzjLNXM5OzZ7OqMwJzg7Msc9uTDeP0cwpjtHOCk7zTunOrY/gzobNPsxxzBTNNs1pj/HPYk88TVABMk+lTvHO9076zy2MCMytjnjP/0wozx7M/s/aTBbOes0xzgnOKk58zVrMwcyFzrHPPEykAP5O0kyszv1Nsk2TTZHPRsy9TvnNvU8MzPnOJc9TT4XPmk9LT8nN6c9MT17NBc19jKbNWc8ETH9OlcyYThDMAcyOzhzOsM25zyOMMk3RDn1N4LLQT79O4M75TUbPBczlzy7NuU+BTW1Osc9mzaLNYc5szBnMo41iz/DPPEzzm0rPfY4izwdPVc3azleOCU6yzOLOp0xVzBjOEs4VzzeOXs7hz9XNJY/6zSFT3s/WT9zNDsyETihOjc55Bp9P7M+tzLWMWc62zzrN3s5fTzjP2syVzPXO84x5zJxNYU9lzIFM+0+1T+bMSM0eN9JNgc6azLXNUs4NzurNas+ZzJGMqM9JzRJMOsz2z2LPMc1YT4nMq4wpzDzOAJs8TbUav0wXTcXNu415zyPNpk3Kz37Mqs42zarMDc89zGjP48wyTBABOcxgzLnMiM6lzJTNAc6VTMnO5Y31zmtPjcwqzQPMBc8hzGXN50/JjJHPos2DzEXPDc8TzQvPdc8Ozc9PPE9CAzXOnUzjzF1NIs2ZzFTP5czazZPPoM0qza3Mrcw/Tm3Mz4yZzSPO5c3RzuvMQ04fTaNOa8xwzv9OCU6Jz4RMQcwvTGLNrU3MzVHNi899zL5Ofk1zz/3OPcwEzrvPJE7czK7OO89pTpzNQU6tTj+PQc2rzxhPB865TWvM/c16TzxPpxqWz3FN08wkzy3Nfc8BzlPNs87fj27McEypzaONVszozjbPnE1WzcRPWc3nzKfN2Y9fGTNN8U90zXXNO80TzjPM2c99zIvPoc/GzS2PQExbzslPB0/XzInOt88DzBfPuM3ZjJSY/k0gzFfPQs7tjlPOCs/jTa3NB4/bT7fMSc5Cz7HORc3ZjzKYnU1Izs3PA83/T13OYM6dzZBONs3jzGvO5M44zHPPYc8dzpnPd8xKzIAAd5idTCVMwkxfT1fPtE0nzzPPX806zTPOe41PzOIN2Y+pmi/NAEzCT2/Pw8wKzu/OuMzvzqPPds8/zbTMgAABmNPPq83Lzj/Oh48fzFrNACwyTYGals/Hz7bOJ85XzyfP78yNzE/NTswzzN/Oi03vjanNxsxgLmnNoC6Lzt/NKYFpz9nN2Y0pmPHOD87XzqAuq85ALHbP4s4jzJ9NECw3z23Oyc4Lzs7Mnc3zz+HOqc+OzkdOj87wL07NJcwALpnPpk+dz2OPh841jhvNFM2YzHvMkC0+EsgsNs88Ts3oIC9QLOjO30z7zi7OMM4oLCFP7c2NTt3Pac0pz4eNVs/MzAgtZ88bzjTOH81Jzu3N7Y2wLhnPa8/vjBDNzs9ALvvPLWnZzJ7P0CyPzt7MnM9/znPPJcypjZ5OZkyzzY3OiM5Dz2zMh01IzegtkbYDzWgs3M5HzZzP+CyBjBzPzs+3TpvMJs97zblOuC6QLGQtvc88TEFYRM+XzEAt/U+szLAsd8+Tz4ePuC35z6gu0swcTUQv/8/9gvgvYc88TA4B2Mxfz1AsZcy4L8guHjbALQeN/05dzu2Mtk1Vz9/PhY8MzrZOkc1lzKAt386vzzxPnTvuzcfPUC3yzwwsYc2jzSwviC5wTyHNF83JzBvMruQLzwQt+kyDzKvPFcxozmfPGC0ZzpONrCwWTivOAcykLMgtYCw/zKHPD8//zv7OKE/+zVws1czQLbgtnC8rjUHP289MznvOx42HzHwvZCwVleXMb86vjWTPIc4sL5VPPE3aOcwsJk4gLW7PIC54LpQvT8xpzNHNPC0YLUWO6Mz0LdmPwAFjz31NFC9ax6VN1C3cLnHPqRjdOMXNbE0ULGXM582kLTfM5C41jQeNX850LkwsLE8ML1nMKM7ALdgshCziLFgDqRgQAsb3wAPdOR9H6Rg5j9ibhsAKjihYQAHQAAAA6KG4WAEAAAA"))
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* 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 copyToClipboard() {
|
|
var text = '';
|
|
for (var node of bomhead.childNodes[0].childNodes) {
|
|
if (node.firstChild) {
|
|
text = text + node.firstChild.nodeValue;
|
|
}
|
|
if (node != bomhead.childNodes[0].lastChild) {
|
|
text += '\t';
|
|
}
|
|
}
|
|
text += '\n';
|
|
for (var row of bombody.childNodes) {
|
|
for (var cell of row.childNodes) {
|
|
for (var node of cell.childNodes) {
|
|
if (node.nodeName == "INPUT") {
|
|
if (node.checked) {
|
|
text = text + '✓';
|
|
}
|
|
} else if (node.nodeName == "MARK") {
|
|
text = text + node.firstChild.nodeValue;
|
|
} else {
|
|
text = text + node.nodeValue;
|
|
}
|
|
}
|
|
if (cell != row.lastChild) {
|
|
text += '\t';
|
|
}
|
|
}
|
|
text += '\n';
|
|
}
|
|
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 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,
|
|
}
|
|
|
|
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.*)?$", "");
|
|
for (var bom_type of ["both", "F", "B"]) {
|
|
for (var row of pcbdata.bom[bom_type]) {
|
|
row.push(parseValue(row[1], row[3][0][0]));
|
|
}
|
|
}
|
|
}
|
|
|
|
function parseValue(val, ref) {
|
|
var inferUnit = (unit, ref) => {
|
|
if (unit) {
|
|
unit = unit.toLowerCase();
|
|
if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
|
|
unit = 'r';
|
|
}
|
|
unit = unit[0];
|
|
} else {
|
|
ref = /^([a-z]+)\d+$/i.exec(ref);
|
|
if (ref) {
|
|
ref = ref[1].toLowerCase();
|
|
if (ref == "c") unit = 'f';
|
|
else if (ref == "l") unit = 'h';
|
|
else if (ref == "r" || ref == "rv") unit = 'r';
|
|
else unit = null;
|
|
}
|
|
}
|
|
return unit;
|
|
};
|
|
val = val.replace(/,/g, "");
|
|
var match = units.valueRegex.exec(val);
|
|
var unit;
|
|
if (match) {
|
|
val = parseFloat(match[1]);
|
|
if (match[2]) {
|
|
val = val * units.getMultiplier(match[2]);
|
|
}
|
|
unit = inferUnit(match[3], ref);
|
|
if (!unit) return null;
|
|
else return {
|
|
val: val,
|
|
unit: unit,
|
|
extra: match[4],
|
|
}
|
|
}
|
|
match = units.valueAltRegex.exec(val);
|
|
if (match && (match[1] || match[4])) {
|
|
val = parseFloat(match[1] + "." + match[4]);
|
|
if (match[3]) {
|
|
val = val * units.getMultiplier(match[3]);
|
|
}
|
|
unit = inferUnit(match[2], ref);
|
|
if (!unit) return null;
|
|
else return {
|
|
val: val,
|
|
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 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]);
|
|
}
|
|
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;
|
|
setDarkMode(settings.darkMode);
|
|
document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
|
|
setHighlightPin1(settings.highlightpin1);
|
|
document.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1;
|
|
writeStorage("boardRotation", settings.boardRotation);
|
|
document.getElementById("boardRotation").value = settings.boardRotation / 5;
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
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: "default",
|
|
bomlayout: "default",
|
|
bommode: "grouped",
|
|
checkboxes: [],
|
|
checkboxStoredRefs: {},
|
|
darkMode: false,
|
|
highlightpin1: false,
|
|
redrawOnDrag: true,
|
|
boardRotation: 0,
|
|
renderPads: true,
|
|
renderReferences: true,
|
|
renderValues: true,
|
|
renderSilkscreen: true,
|
|
renderFabrication: true,
|
|
renderDnpOutline: false,
|
|
renderTracks: true,
|
|
renderZones: true,
|
|
}
|
|
|
|
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 (!["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;
|
|
|
|
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("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
|
|
initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1);
|
|
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;
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* 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
|
|
];
|
|
// Adding half a line height here is technically a bug
|
|
// but pcbnew currently does the same, text is slightly shifted.
|
|
point[0] -= (point[1] + text.height * 0.5) * tilt;
|
|
return point;
|
|
}
|
|
|
|
function drawtext(ctx, text, color, flip) {
|
|
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 (text.svgpath) {
|
|
ctx.stroke(new Path2D(text.svgpath));
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
ctx.translate(...text.pos);
|
|
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) / 2;
|
|
var txt = text.text.split("\n");
|
|
// KiCad ignores last empty line.
|
|
if (txt[txt.length - 1] == '') txt.pop();
|
|
ctx.rotate(deg2rad(angle));
|
|
for (var i in txt) {
|
|
var offsety = (-(txt.length - 1) + i * 2) * interline + text.height / 2;
|
|
var lineWidth = 0;
|
|
for (var c of txt[i]) {
|
|
if (c == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
lineWidth += fourSpaces - lineWidth % fourSpaces;
|
|
} else {
|
|
lineWidth += pcbdata.font_data[c].w * text.width;
|
|
}
|
|
}
|
|
var offsetx = 0;
|
|
switch (text.horiz_justify) {
|
|
case -1:
|
|
// Justify left, do nothing
|
|
break;
|
|
case 0:
|
|
// Justify center
|
|
offsetx -= lineWidth / 2;
|
|
break;
|
|
case 1:
|
|
// Justify right
|
|
offsetx -= lineWidth;
|
|
break;
|
|
}
|
|
for (var c of txt[i]) {
|
|
if (c == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
offsetx += fourSpaces - offsetx % fourSpaces;
|
|
continue;
|
|
}
|
|
for (var line of pcbdata.font_data[c].l) {
|
|
ctx.beginPath();
|
|
ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
|
|
for (var i = 1; i < line.length; i++) {
|
|
ctx.lineTo(...calcFontPoint(line[i], text, offsetx, offsety, tilt));
|
|
}
|
|
ctx.stroke();
|
|
}
|
|
offsetx += pcbdata.font_data[c].w * text.width;
|
|
}
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawedge(ctx, scalefactor, edge, color) {
|
|
ctx.strokeStyle = color;
|
|
ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
|
|
ctx.lineCap = "round";
|
|
if (edge.svgpath) {
|
|
ctx.stroke(new Path2D(edge.svgpath));
|
|
} else {
|
|
ctx.beginPath();
|
|
if (edge.type == "segment") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.lineTo(...edge.end);
|
|
}
|
|
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);
|
|
}
|
|
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 (shape.svgpath) {
|
|
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, shape, color) {
|
|
ctx.save();
|
|
ctx.fillStyle = color;
|
|
if (!shape.svgpath) {
|
|
ctx.translate(...shape.pos);
|
|
ctx.rotate(deg2rad(-shape.angle));
|
|
}
|
|
ctx.fill(getPolygonsPath(shape));
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawDrawing(ctx, layer, scalefactor, drawing, color) {
|
|
if (["segment", "arc", "circle", "curve"].includes(drawing.type)) {
|
|
drawedge(ctx, scalefactor, drawing, color);
|
|
} else if (drawing.type == "polygon") {
|
|
drawPolygonShape(ctx, drawing, color);
|
|
} else {
|
|
drawtext(ctx, drawing, color, layer == "B");
|
|
}
|
|
}
|
|
|
|
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, hole) {
|
|
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);
|
|
}
|
|
if (pad.type == "th" && hole) {
|
|
if (pad.offset) {
|
|
ctx.translate(-pad.offset[0], -pad.offset[1]);
|
|
}
|
|
ctx.fillStyle = "#CCCCCC";
|
|
if (pad.drillshape == "oblong") {
|
|
ctx.fill(getOblongPath(pad.drillsize));
|
|
} else {
|
|
ctx.fill(getCirclePath(pad.drillsize[0] / 2));
|
|
}
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawModule(ctx, layer, scalefactor, module, padcolor, outlinecolor, highlight, outline) {
|
|
if (highlight) {
|
|
// draw bounding box
|
|
if (module.layer == layer) {
|
|
ctx.save();
|
|
ctx.globalAlpha = 0.2;
|
|
ctx.translate(...module.bbox.pos);
|
|
ctx.rotate(deg2rad(-module.bbox.angle));
|
|
ctx.translate(...module.bbox.relpos);
|
|
ctx.fillStyle = padcolor;
|
|
ctx.fillRect(0, 0, ...module.bbox.size);
|
|
ctx.globalAlpha = 1;
|
|
ctx.strokeStyle = padcolor;
|
|
ctx.strokeRect(0, 0, ...module.bbox.size);
|
|
ctx.restore();
|
|
}
|
|
}
|
|
// draw drawings
|
|
for (var drawing of module.drawings) {
|
|
if (drawing.layer == layer) {
|
|
drawDrawing(ctx, layer, scalefactor, drawing.drawing, padcolor);
|
|
}
|
|
}
|
|
// draw pads
|
|
if (settings.renderPads) {
|
|
for (var pad of module.pads) {
|
|
if (pad.layers.includes(layer)) {
|
|
drawPad(ctx, pad, padcolor, outline, true);
|
|
if (pad.pin1 && settings.highlightpin1) {
|
|
drawPad(ctx, pad, outlinecolor, true, false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawEdgeCuts(canvas, scalefactor) {
|
|
var ctx = canvas.getContext("2d");
|
|
var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
|
|
for (var edge of pcbdata.edges) {
|
|
drawedge(ctx, scalefactor, edge, edgecolor);
|
|
}
|
|
}
|
|
|
|
function drawModules(canvas, layer, scalefactor, highlight) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.lineWidth = 3 / scalefactor;
|
|
var style = getComputedStyle(topmostdiv);
|
|
var padcolor = style.getPropertyValue('--pad-color');
|
|
var outlinecolor = style.getPropertyValue('--pin1-outline-color');
|
|
if (highlight) {
|
|
padcolor = style.getPropertyValue('--pad-color-highlight');
|
|
outlinecolor = style.getPropertyValue('--pin1-outline-color-highlight');
|
|
}
|
|
for (var i = 0; i < pcbdata.modules.length; i++) {
|
|
var mod = pcbdata.modules[i];
|
|
var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
|
|
if (!highlight || highlightedModules.includes(i)) {
|
|
drawModule(ctx, layer, scalefactor, mod, padcolor, outlinecolor, highlight, outline);
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
|
|
var ctx = canvas.getContext("2d");
|
|
for (var d of pcbdata[layername][layer]) {
|
|
if (["segment", "arc", "circle", "curve"].includes(d.type)) {
|
|
drawedge(ctx, scalefactor, d, edgeColor);
|
|
} else if (d.type == "polygon") {
|
|
drawPolygonShape(ctx, d, polygonColor);
|
|
} else {
|
|
drawtext(ctx, d, textColor, layer == "B");
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawTracks(canvas, layer, color, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.strokeStyle = color;
|
|
ctx.lineCap = "round";
|
|
for(var track of pcbdata.tracks[layer]) {
|
|
if (highlight && highlightedNet != track.net) continue;
|
|
ctx.lineWidth = track.width;
|
|
ctx.beginPath();
|
|
ctx.moveTo(...track.start);
|
|
ctx.lineTo(...track.end);
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
|
|
function drawZones(canvas, layer, color, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.strokeStyle = color;
|
|
ctx.fillStyle = color;
|
|
ctx.lineJoin = "round";
|
|
for(var zone of pcbdata.zones[layer]) {
|
|
if (!zone.path2d) {
|
|
zone.path2d = getPolygonsPath(zone);
|
|
}
|
|
if (highlight && highlightedNet != zone.net) continue;
|
|
ctx.lineWidth = zone.width ? zone.width : 0;
|
|
ctx.fill(zone.path2d);
|
|
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 {
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawNets(canvas, layer, highlight) {
|
|
var style = getComputedStyle(topmostdiv);
|
|
if (settings.renderTracks) {
|
|
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
|
|
drawTracks(canvas, layer, trackColor, highlight);
|
|
}
|
|
if (settings.renderZones) {
|
|
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
|
|
drawZones(canvas, layer, zoneColor, highlight);
|
|
}
|
|
if (highlight && settings.renderPads) {
|
|
var padColor = style.getPropertyValue('--pad-color-highlight');
|
|
var ctx = canvas.getContext("2d");
|
|
for (var mod of pcbdata.modules) {
|
|
// draw pads
|
|
for (var pad of mod.pads) {
|
|
if (highlightedNet != pad.net) continue;
|
|
if (pad.layers.includes(layer)) {
|
|
drawPad(ctx, pad, padColor, false, true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawHighlightsOnLayer(canvasdict, clear = true) {
|
|
if (clear) {
|
|
clearCanvas(canvasdict.highlight);
|
|
}
|
|
if (highlightedModules.length > 0) {
|
|
drawModules(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);
|
|
drawModules(canvasdict.bg, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom, false);
|
|
|
|
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s);
|
|
|
|
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);
|
|
var fontsize = 1.55;
|
|
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));
|
|
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) {
|
|
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));
|
|
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 bbox = applyRotation(pcbdata.edges_bbox);
|
|
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;
|
|
var flip = (layerdict.layer == "B");
|
|
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 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 (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
|
|
return track.net;
|
|
}
|
|
}
|
|
}
|
|
// Check pads
|
|
if (settings.renderPads) {
|
|
for (var mod of pcbdata.modules) {
|
|
for(var pad of mod.pads) {
|
|
if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
|
|
return pad.net;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function pointWithinModuleBbox(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.modules.length; i++) {
|
|
var module = pcbdata.modules[i];
|
|
if (module.layer == layer) {
|
|
if (pointWithinModuleBbox(x, y, module.bbox)) {
|
|
result.push(i);
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function handlePointerDown(e, layerdict) {
|
|
if (e.button != 0) {
|
|
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;
|
|
if (layerdict.layer == "B") {
|
|
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);
|
|
if ("nets" in pcbdata) {
|
|
var net = netHitScan(layerdict.layer, ...v);
|
|
if (net !== highlightedNet) {
|
|
netClicked(net);
|
|
}
|
|
}
|
|
if (highlightedNet === null) {
|
|
var modules = bboxHitScan(layerdict.layer, ...v);
|
|
if (modules.length > 0) {
|
|
modulesClicked(modules);
|
|
}
|
|
}
|
|
}
|
|
|
|
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 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);
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* 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 moduleIndexToHandler = {};
|
|
var netsToHandler = {};
|
|
var highlightedModules = [];
|
|
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();
|
|
}
|
|
|
|
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 getStoredCheckboxRefs(checkbox) {
|
|
function convert(ref) {
|
|
var intref = parseInt(ref);
|
|
if (isNaN(intref)) {
|
|
for (var i = 0; i < pcbdata.modules.length; i++) {
|
|
if (pcbdata.modules[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 createCheckboxChangeHandler(checkbox, references) {
|
|
return function() {
|
|
refsSet = getStoredCheckboxRefs(checkbox);
|
|
if (this.checked) {
|
|
// checkbox ticked
|
|
for (var ref of references) {
|
|
refsSet.add(ref[1]);
|
|
}
|
|
} else {
|
|
// checkbox unticked
|
|
for (var ref of references) {
|
|
refsSet.delete(ref[1]);
|
|
}
|
|
}
|
|
settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
|
|
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
|
|
updateCheckboxStats(checkbox);
|
|
}
|
|
}
|
|
|
|
function clearHighlightedModules() {
|
|
if (currentHighlightedRowId) {
|
|
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
|
|
currentHighlightedRowId = null;
|
|
highlightedModules = [];
|
|
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;
|
|
highlightedModules = refs ? refs.map(r => r[1]) : [];
|
|
highlightedNet = net;
|
|
drawHighlights();
|
|
}
|
|
}
|
|
|
|
function entryMatches(entry) {
|
|
if (settings.bommode == "netlist") {
|
|
// entry is just a net name
|
|
return entry.toLowerCase().indexOf(filter) >= 0;
|
|
}
|
|
// check refs
|
|
for (var ref of entry[3]) {
|
|
if (ref[0].toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
}
|
|
// check extra fields
|
|
for (var i in config.extra_fields) {
|
|
if (entry[4][i].toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
}
|
|
// check value
|
|
if (entry[1].toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
// check footprint
|
|
if (entry[2].toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function findRefInEntry(entry) {
|
|
return entry[3].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 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) {
|
|
var th = document.createElement("TH");
|
|
th.innerHTML = name;
|
|
th.classList.add(cls);
|
|
th.style.cursor = "pointer";
|
|
var span = document.createElement("SPAN");
|
|
span.classList.add("sortmark");
|
|
span.classList.add("none");
|
|
th.appendChild(span);
|
|
th.onclick = function() {
|
|
if (currentSortColumn && this !== currentSortColumn) {
|
|
// Currently sorted by another column
|
|
currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
|
|
currentSortColumn.childNodes[1].classList.add("none");
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
}
|
|
if (currentSortColumn && this === 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 = this;
|
|
currentSortColumn.childNodes[1].classList.remove("none");
|
|
currentSortColumn.childNodes[1].classList.add("asc");
|
|
currentSortOrder = "asc";
|
|
}
|
|
populateBomBody();
|
|
}
|
|
return th;
|
|
}
|
|
|
|
function populateBomHeader() {
|
|
while (bomhead.firstChild) {
|
|
bomhead.removeChild(bomhead.firstChild);
|
|
}
|
|
var tr = document.createElement("TR");
|
|
var th = document.createElement("TH");
|
|
th.classList.add("numCol");
|
|
tr.appendChild(th);
|
|
var checkboxCompareClosure = function(checkbox) {
|
|
return (a, b) => {
|
|
var stateA = getCheckboxState(checkbox, a[3]);
|
|
var stateB = getCheckboxState(checkbox, b[3]);
|
|
if (stateA > stateB) return -1;
|
|
if (stateA < stateB) return 1;
|
|
return 0;
|
|
}
|
|
}
|
|
if (settings.bommode == "netlist") {
|
|
th = createColumnHeader("Net name", "bom-netname", (a, b) => {
|
|
if (a > b) return -1;
|
|
if (a < b) return 1;
|
|
return 0;
|
|
});
|
|
tr.appendChild(th);
|
|
} else {
|
|
for (var checkbox of settings.checkboxes) {
|
|
th = createColumnHeader(
|
|
checkbox, "bom-checkbox", checkboxCompareClosure(checkbox));
|
|
th.onclick = fancyDblClickHandler(
|
|
th, th.onclick.bind(th), checkboxSetUnsetAllHandler(checkbox));
|
|
tr.appendChild(th);
|
|
}
|
|
tr.appendChild(createColumnHeader("References", "References", (a, b) => {
|
|
var i = 0;
|
|
while (i < a[3].length && i < b[3].length) {
|
|
if (a[3][i] != b[3][i]) return a[3][i] > b[3][i] ? 1 : -1;
|
|
i++;
|
|
}
|
|
return a[3].length - b[3].length;
|
|
}));
|
|
// Extra fields
|
|
if (config.extra_fields.length > 0) {
|
|
var extraFieldCompareClosure = function(fieldIndex) {
|
|
return (a, b) => {
|
|
var fa = a[4][fieldIndex];
|
|
var fb = b[4][fieldIndex];
|
|
if (fa != fb) return fa > fb ? 1 : -1;
|
|
else return 0;
|
|
}
|
|
}
|
|
for (var i in config.extra_fields) {
|
|
tr.appendChild(createColumnHeader(
|
|
config.extra_fields[i], "extra", extraFieldCompareClosure(i)));
|
|
}
|
|
}
|
|
tr.appendChild(createColumnHeader("Value", "Value", (a, b) => {
|
|
return valueCompare(a[5], b[5], a[1], b[1]);
|
|
}));
|
|
tr.appendChild(createColumnHeader("Footprint", "Footprint", (a, b) => {
|
|
if (a[2] != b[2]) return a[2] > b[2] ? 1 : -1;
|
|
else return 0;
|
|
}));
|
|
if (settings.bommode == "grouped") {
|
|
tr.appendChild(createColumnHeader("Quantity", "Quantity", (a, b) => {
|
|
return a[3].length - b[3].length;
|
|
}));
|
|
}
|
|
}
|
|
bomhead.appendChild(tr);
|
|
}
|
|
|
|
function populateBomBody() {
|
|
while (bom.firstChild) {
|
|
bom.removeChild(bom.firstChild);
|
|
}
|
|
highlightHandlers = [];
|
|
moduleIndexToHandler = {};
|
|
netsToHandler = {};
|
|
currentHighlightedRowId = null;
|
|
var first = true;
|
|
if (settings.bommode == "netlist") {
|
|
bomtable = pcbdata.nets.slice();
|
|
} else {
|
|
switch (settings.canvaslayout) {
|
|
case 'F':
|
|
bomtable = pcbdata.bom.F.slice();
|
|
break;
|
|
case 'FB':
|
|
bomtable = pcbdata.bom.both.slice();
|
|
break;
|
|
case 'B':
|
|
bomtable = pcbdata.bom.B.slice();
|
|
break;
|
|
}
|
|
if (settings.bommode == "ungrouped") {
|
|
// expand bom table
|
|
expandedTable = []
|
|
for (var bomentry of bomtable) {
|
|
for (var ref of bomentry[3]) {
|
|
expandedTable.push([1, bomentry[1], bomentry[2], [ref], bomentry[4], bomentry[5]]);
|
|
}
|
|
}
|
|
bomtable = expandedTable;
|
|
}
|
|
}
|
|
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 : "<no net>");
|
|
tr.appendChild(td);
|
|
} else {
|
|
if (reflookup) {
|
|
references = findRefInEntry(bomentry);
|
|
if (references.length == 0) {
|
|
continue;
|
|
}
|
|
} else {
|
|
references = bomentry[3];
|
|
}
|
|
// Checkboxes
|
|
for (var checkbox of settings.checkboxes) {
|
|
if (checkbox) {
|
|
td = document.createElement("TD");
|
|
var input = document.createElement("input");
|
|
input.type = "checkbox";
|
|
input.onchange = createCheckboxChangeHandler(checkbox, references);
|
|
setBomCheckboxState(checkbox, input, references);
|
|
td.appendChild(input);
|
|
tr.appendChild(td);
|
|
}
|
|
}
|
|
// References
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
|
|
tr.appendChild(td);
|
|
// Extra fields
|
|
for (var i in config.extra_fields) {
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(bomentry[4][i]);
|
|
tr.appendChild(td);
|
|
}
|
|
// Value
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(bomentry[1]);
|
|
tr.appendChild(td);
|
|
// Footprint
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(bomentry[2]);
|
|
tr.appendChild(td);
|
|
if (settings.bommode == "grouped") {
|
|
// Quantity
|
|
td = document.createElement("TD");
|
|
td.textContent = bomentry[3].length;
|
|
tr.appendChild(td);
|
|
}
|
|
}
|
|
bom.appendChild(tr);
|
|
var handler = createRowHighlightHandler(tr.id, references, netname);
|
|
tr.onmousemove = handler;
|
|
highlightHandlers.push({
|
|
id: tr.id,
|
|
handler: handler,
|
|
});
|
|
if (references !== null) {
|
|
for (var refIndex of references.map(r => r[1])) {
|
|
moduleIndexToHandler[refIndex] = handler;
|
|
}
|
|
}
|
|
if (netname !== null) {
|
|
netsToHandler[netname] = handler;
|
|
}
|
|
if ((filter || reflookup) && first) {
|
|
handler();
|
|
first = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
function modulesClicked(moduleIndexes) {
|
|
var lastClickedIndex = moduleIndexes.indexOf(lastClicked);
|
|
for (var i = 1; i <= moduleIndexes.length; i++) {
|
|
var refIndex = moduleIndexes[(lastClickedIndex + i) % moduleIndexes.length];
|
|
if (refIndex in moduleIndexToHandler) {
|
|
lastClicked = refIndex;
|
|
moduleIndexToHandler[refIndex]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function netClicked(net) {
|
|
if (net in netsToHandler) {
|
|
netsToHandler[net]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
} else {
|
|
clearHighlightedModules();
|
|
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.modules.length; i++) {
|
|
if (pcbdata.bom.skipped.includes(i)) continue;
|
|
var mod = pcbdata.modules[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 " +
|
|
/^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("bot").style.height = "";
|
|
break;
|
|
case 'top-bottom':
|
|
document.getElementById("tb-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("bot").style.height = "calc(100% - 80px)";
|
|
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("bot").style.height = "calc(100% - 80px)";
|
|
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");
|
|
switch (mode) {
|
|
case 'grouped':
|
|
document.getElementById("bom-grouped-btn").classList.add("depressed");
|
|
break;
|
|
case 'ungrouped':
|
|
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
|
|
break;
|
|
case 'netlist':
|
|
document.getElementById("bom-netlist-btn").classList.add("depressed");
|
|
}
|
|
writeStorage("bommode", mode);
|
|
if (mode != settings.bommode) {
|
|
settings.bommode = mode;
|
|
bomSortFunction = null;
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
clearHighlightedModules();
|
|
}
|
|
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 checkbox = bomrow.childNodes[checkboxnum].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 checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
|
|
checkbox.checked = true;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
|
|
function setBomCheckboxes(value) {
|
|
writeStorage("bomCheckboxes", value);
|
|
settings.checkboxes = value.split(",").filter((e) => e);
|
|
prepCheckboxes();
|
|
populateBomTable();
|
|
}
|
|
|
|
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 updateCheckboxStats(checkbox) {
|
|
var checked = getStoredCheckboxRefs(checkbox).size;
|
|
var total = pcbdata.modules.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) + "%)";
|
|
}
|
|
|
|
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;
|
|
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));
|
|
}
|
|
}
|
|
}
|
|
|
|
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";
|
|
}
|
|
|
|
window.onload = function(e) {
|
|
initUtils();
|
|
initRender();
|
|
initStorage();
|
|
initDefaults();
|
|
cleanGutters();
|
|
populateMetadata();
|
|
dbgdiv = document.getElementById("dbg");
|
|
bom = document.getElementById("bombody");
|
|
bomhead = document.getElementById("bomhead");
|
|
filter = "";
|
|
reflookup = "";
|
|
if (!("nets" in pcbdata)) {
|
|
hideNetlistButton();
|
|
}
|
|
initDone = true;
|
|
prepCheckboxes();
|
|
// Triggers render
|
|
changeBomLayout(settings.bomlayout);
|
|
}
|
|
|
|
window.onresize = resizeAll;
|
|
window.matchMedia("print").addListener(resizeAll);
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
</script>
|
|
</head>
|
|
|
|
<body>
|
|
<div id="topmostdiv" class="topmostdiv">
|
|
<div id="top">
|
|
<div style="float: right; height: 100%;">
|
|
<div class="hideonprint menu" style="float: right; top: 8px;">
|
|
<button class="menubtn"></button>
|
|
<div class="menu-content">
|
|
<label class="menu-label menu-label-top">
|
|
<input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
|
|
Dark mode
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
|
|
Show footprint pads
|
|
</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">
|
|
<input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
|
|
DNP components outlined
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">
|
|
Highlight first pin
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
|
|
Continuous redraw on drag
|
|
</label>
|
|
<label class="menu-label">
|
|
<span>Board rotation</span>
|
|
<span style="float: right"><span id="rotationDegree">0</span>°</span>
|
|
<input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">
|
|
</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">
|
|
<span class="shameless-plug">
|
|
<span>Created using</span>
|
|
<a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
|
|
</span>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="button-container hideonprint"
|
|
style="float: right; position: relative; top: 8px">
|
|
<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"
|
|
style="float: right; position: relative; top: 8px">
|
|
<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"
|
|
style="float: right; position: relative; top: 8px">
|
|
<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" style="float: right; top: 8px;">
|
|
<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" style="float: right; top: 8px;">
|
|
<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>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="fileinfodiv" style="overflow: auto;">
|
|
<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>
|
|
<div id="bot" class="split" style="height: calc(100% - 80px)">
|
|
<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="copyToClipboard()"></button>
|
|
</div>
|
|
</div>
|
|
<div id="dbg"></div>
|
|
<table class="bom">
|
|
<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>
|