mirror of
https://github.com/marqs85/ossc_pcb
synced 2025-04-18 02:52:38 +03:00
3611 lines
276 KiB
HTML
3611 lines
276 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.checked {
|
|
color: #aaa;
|
|
}
|
|
|
|
.dark .bom tr.checked {
|
|
color: #666;
|
|
}
|
|
|
|
.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;
|
|
}
|
|
|
|
.radio-container {
|
|
margin: 4px;
|
|
}
|
|
|
|
.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("N4IgpgJg5mDOD6AjRB7AHiAXAAlAWwEsA7DHAdgDoBmARjIE56AOR1tgVgBpsRCiBPLNhoA2CvRENG3XgEM0pYbXFMALAAZ1NGXnmCcTdhSY0NmtmwC+MyDFhCA2qAAu/AA5ghIWGCh4wRM4gMrDOsgBOQTgO7EzUhhaJItwmFGRkIgBMALo2RBCOIuoUmsnYqelZuTwA7gQQzgAWQjQUmda4IK4eXj5+AUEhYZGFmeKqZRnUZOyJFtXg+aPjk3F0Igt1Dc04re3cLu6eON6+/oHBPKERUdgxRqoT3FNUM3NsCwEF0ewPT9hkNYZTb1JotNodQ49E59c6DK7DW4OVRUeKzd6MMoVDI5PLfO6qIylFKtSq42qgnbCCEHLpHXpnAaXbyIxyqSj0f4vN4Y+ifJbRdkrZ5AjYyLZg3Y0zrdY5XRkXIY3NnFR6TMSvdEY/n45GqrmikHbcH7GX0mEK+Es5XRTJxKhMLGknE6xxUYrE8rOqriykmyF06Hy/qKhE2u5UMac9XTLXvV3RSPCgGG33GqWmqFy04hq3XEa2v5xuZMZ4annavGOTJF3nMEUUdZGyXUzOB7OwplKgt3OhtLR10vYKioqiqJgJ3v0fs0QfcEfUcfNqmtdQB2UM3PM/NIzJ7Ae8oeZSgicd1siThx7mdz7CZaenli8i9plur9fm4Nw7es6I0IyZOomQiGUx4UI+56Xv+/bAaBD5ns+y7gmutIbhaW7dkiNDumk6iTKoJQTlWf44WQeHPEYsRIVKKFmkGObfphjg0Ha1DqMWFhDlM6hETwXzMax7ocWwXGUFRr4riUH70Z2obWj2DgsWMTDkQCYg8VBmTKap6QUOJFLptStFZpujFhgp2HFCI9bDgR9DAVBOHWUOVBiKoNZ1uw1FGdJHaWj+4aKVpaT0FIGLzmI9nCRwmljAwYXvPOcTudFrBeRJyG+aZXbmVhrH3i5kUeby6V8QKvb5TZDoUClnnee+qGfgxOXyUiIhrKedYpEYGSqJelCuQliXlD1p7eR6dYWFl6Fma1hQdaoXXlGMNaXu1jadby3VpGNGU4BNk2sNNX4tTujhkHsjwpCtpWLLq62iItW3LW0t0SlSB2HfQx3NXJZ3RBdbRXSNO19cRdyA5kwNMDd40lF9jA/bJea/hVqr0NoIO9f1l2qNt2N7dgn2HUj/lMX+gE1Rj11A0NiSaejmOGKDcPqAj32NTJZO5QJqK/DTUN0/M4NBYzAvsnWrPs6TGE8xTfNcFju1lbqLEK+LQsfITxOTTLs3/XcwVAXa3B9lovF3ed1CSJNpuUObUsI3rp2o1eYzG0eq6/NZGIW/xtru1pQ5mzQFvvUIOt1s7f2u6e4GAvQ3DXux7A++8fvlW7JRB0nXup4ejtfdHKOBXHkgsHbJSh2tBHl4nd552nJaFyTnN+bLc0A9bmtsPjyuW13g228I9vV9r8NO232Ux4Fat6YrzMEyrzHKPQY592DBktpHvLFwFFmr+vI9VxnquH3jSubyA4f7RPRdTzNLul7XCeVw7IvYa0a8XyHYd+rfbMnYLFgAQAANgAa1gAAY3CGAAIQhQAADFHCgDcCgew0RUjsioM8Vo7AHIyGcGANAtwQAAHkADKFCADC2AABupJmSNDAAQKAjRbh4MJpwngjQUDhAIAAL3gAAKwAK6hAIAAM30ETQhjQCBQPAUQOAGCibUBkLIZwzhwiOAWLIIgUBQFyg9AGNBqiHCvDaGoHBw5KI8SoAsIhJCvAAE0aBMJYWw24xQe6JHHr4iwMheH8KEWIiR0iI5yIUUolREdGyKxAJo7RuiNEGKMUIegHoZCwMkS0Pe5MIxEjIISecqI2bsAcSLTIo5MmKwXOUypW8PrxPyXLQ2NT2KlPhhUy81TqC1O4I8NIDBGnX3/mo/8rTO4RjELMQwgyCLpDXpeVyelmB1NrrOe8GIxRNLiZMh+J0Z4KSoEUkp2AJhsRHL0uyphFaXPdNc8eBy6LZgiFA/eSJTklGKfcxZIyFjhFkBAAg4jwT4Ivq1fRhjjElDxNC9JOBMlwr2bfF5JkTjvM+dWW55yhlLNGUCkFYKpQQswgiuUyL1DwrSXKUOWTUUTPYD9LFBSLFnI2eBLZvJdkgCJaC1ReCobktpUIY8DK7oUqEK5CVN8mWmPQQJdSVBh4iFRCiRxxDSEUIAOqqA8aw9hyEuEopAMEwRIjxHOCkTI6lPAmjROUbAVRxR/waK0To6IejRUAOyWAXJuwpkG0UqvbgIgAK3X9hVB8YaI1w3Re2aeJcD5fzDZQBOksP6huwOG168bmWHN+smvKMac3pqfLyRyqay1pArZWRlrqC2vKTdiimYxTxhriOkWK4EL5x2PPmoNrslK9rDQRAdH97zgTHW0F8DaWmFuRq26N06c3jrnQPFdZR1rdueU2jFRzi0CXbX2rtG6o1BVLTujdcrG0KvMewAis4bHBRhnyQhWqvAAEVMgGq8caxlq4gl8ItWE61ET9pRMUU6l18T3XJK9akmFcS7V8v9Xkxd3NpkxDsvgusoFIps0vI+8QeGeVJyMKFd986WJDsCiR+gZGdlJ1RMU6jm6cOke2cxu8L92O3sbG2NCh7l2ccY9x94oFWOLWI6SNeLG0gyeeUJpqS62UMaY5JpOhH2MXoqVTCTcxFbAXEER5T97mKUBoEBW8wV2q3ScaQgAIu4oJnijU0RNah81oSrU2sifa+R0HYlooSUkz1dxvXIaRRKnJGHm2P2OVhMS7ktKVxhnaHup9mJiBMOoMg6Wg5ZcHZhjuwa+x0GwsHNYjoaBQSsxdB0ldCSEj/oZO9pX9bDoa1V3Ovb2L1cbI1o8xRMksDa9vBdCWRNsr7CpfBScrKEkG/NzIpsu2PEgnuujFlZn4N8SN3tkbM6iHnseQ863FNPQxDe8ZHXOhmOYpRDNz1gpkGqZq5xJwnO/rc4ajhpq5VAZ4SB3z4TbVQZic6/ZYWPUpJ4FKmLpq4uBs60/CylGlJrePhlpgxWP5GHpQVnHRXfYlem0W0T0FH3YSy5d0OIg6sE70qoWnvtmuPv0mM9rU2D2U9m5RVnrx2cN368d1Wgu2fp0W6Z8b5O+dqbaYpMQdAFt3iW+LnLQ21ehyu1tmj+7E2JaPX+OyWkAky9PJr034hzdLV18U677xbs84TY9v81OLpLWsm0QzcxPukIAKpMD/R5oyXngMhMteDgLXQgtQ9g26hHcPEMI59dgKlfqA3CB+lAgg4QoHpNm9hcQ72001QtvyklaiazbbR0l5iphe1NzmLg+eTv/cfyb1kbHgNfgd/pnXinivsPWdmaFNv/fM3Lz/HhcCaWAR4MfdP7nk2E3Cf50rsfazicgVM9b3sc+e9hsI29O7vOjcza393iQ3ujBMFGRemgN+W9+MX+3lfAn1+qaw+Vufsxd9T8oJ/8J938p9K0h9UFFUAZR5VJKZHpRAA8vBA9n9Q8AdUMgdTUfNo9wMIdAtHUQsmV4MIsHAotEUM9Yt0NUdh9f9XYZhxBTBAFhpdcJABsRZ6CMYNBXtWgZUz9XdDcN8R9g0ODGDuDrY2CZ8IYrJTBMZrxeD5dL9N9sMyIuVWc+t5D2DpC1DhA4hWC+C18BCf8ys6CtDMYWCigD8HARCuDwodDxALCFCN9WUld3tFwLoyhzCgJAVgUBVwRhcoZMYoV096VqBRBH0VJ2Rjx3RsdJV09xVQjw1xx1BIiyAbFV9mlv96JnDlCxgNATBsdPDyQ+UfDq8eCGAAiRVos7wfd2oxx2BZx9tgJGMaUqjTkHwH9CQGjjwmiEkv9Dd3cIZKANAL4TMawmD04kCTgAAFVzHhdzdAiPEHKPMDfzSDfA4LaHULYg+HRJdPTPHgFHHPevE3O4UKW3YzB4S8ZgPSAjEoU5RwowrrQKM4qKSuJZQcK4uIVOSuO5B4rmYwwKQEYwGYN4gJZgfqOIYVY+X4yAxQoQuguIPHC4mqCEoGbTO4/QjIww/4p4hSR0KmAfQJaE5bEWfExaQk3uY+d4guWEwQ2gwKMkzke3dNME7LAGREkEqk1kv49uXEpEIEpE0EyaNkiGDk5Eq+PonbfksUijFEkWF42vO8S42kx49HJEBU8Uq4jkRUvsaksnFUnEtUxwDUoUj4+U4od0Ck1gU0mkg3KU40i05I5k4ZYUq4x0q06QYkzEmHe06Ia474r01EqEirEku0440TIEqEkzdQe4+Ur424mM700LX004+M9ExMz4m4n40M9In08MtlSMkY5VSwws7MpM+VfMpXRjYwZgHiU2B8PcD089TOas2cRjarM7RAg03ko0v0wnRgWIS7X4PcXlC9TkKmQwFVZghs0wRCbsltNlccxaSc2w2cefWcm7K4+/Ws4OGcpsnkrwPPAvIva/QTQ6GXVKESbw4lVRFaR0eck4I8wvTwYvM84eGGNoa83wnAO8soXM5MwtJ8k80fSqW8D8ooqvW8qxP8yUwC/PZ8qnUCi7dXNZV07JEoqCu0GC8/N3aAw2J9RUxaRsGzXkK+RzZA/VP7f9TzQDLA0HHA1Y2RdYhPGHbY1PXYqo/YtDbPGgXPeC4C4NMCZ9P3NgYnIUWIPUxIK+SClDdmB8q/bDMCYpSMZCoUB/SSiwK+C9MCKGFSkXNS14XxCUnC7EnshvW0dNFEES1gIcdgHxV4EUq8SyvS6XC5SgdSoyg843UTHSqy5CuytIBy3pZy6yxgWy+ywELyhSwSygXS0KmyAyjStgLSzOXylyksbgAK1IyK2EgYxSKzCwriOyUKdqSYngAAKVmLNXmIA3/PDyWNAz8wgyYrjwIM2KIOTwQ0iyQ3IMoJ4pTKziAmXxu2eFRGsgqQgMkMGprCbMGWUkYynPeHLPuwV3pIUiNhmufFGvAgWsmo4yGMJEVlSJ2omvrTqpWrhLWv5JqkOu2vGsWs7ymoOv5guXmtOqWqiqUOEJupevchrPeqM16UDmGudzmv+oesSGWovzyrHBuJGP+TQvtU/ROED3YDQNqswO83opWOatQwdQ2MT1hy6tIJ6thVQ0ON4srOw1husi0lAnvzHBhhWVrmBhrGMEZqKNgpoIBPWshIDJM3wXYGbN1Hyn5vvyhnDX1LDO5r5OrD5vpuMAltSkctYjssWmxzZphgmGVs+vhMChpvsmAllI6KZpFlhpYHvA1oZvHE5pMoGvNvsnsmNo5uZprMtvRIqViF5S5qgPMT+rVueB8TYz2vIpRroHRporquBzNWxqarwNaoJtYs6pILIMpT6viz5yApfKVyGT3FmGx3WgkA+3QpvLiRHGYCa2ltWp5qRACuAhsR93CJXz02KHrtjQnl1qurZD5mwjb3yxSt1BRD0l7pzSJEYAULyrOPmTcvEDKpAEDyoAjvqqjrouWLjtj3xpYq2OTp2MRwoORyoKOIpyzqpy0EbBYgDJIx4iUwOIwriUJH7qHHOovzpJruYk0EE0Vl+B+Q9IkGANG0VO/v7vw07rftn1dUIp8VWg/g/teIuSgahsyLMpOMUib3ZHuQQaghL0kAwbSGgarsurAd7DQc5KAeDp2SwbGtIbORAfkq+uHQ/ovsypoZ5X/s/syvXUQdMoXOvwInQeYZ/toamufz4dIc4dAdlo91Edwfe0sJEZqk5NZz0nwefqQZ4dH0Ycgbwbkc0fuSFS4YGuswAa/pYYoZgeMcyo1F/s5AnrwqsOUhAmeEWXvDnvKsXqorD2jsxsj0apjzWITq3o6sSRT26rT04vTuoOrskbuHWmAnvAvkXjVTtBxl9wkCxBWgkDoDOp9sIeiYcFid+EjAFhUhsfYL2GPBYj7n7okd7LRmUa2XxkBHwU0h7qT3ApmEdBqfMrqfqPcmenaZHCKKfz6TsuwgSdGliDbMetUe4e8rZViceEvMaZYjWkhMWf6ZWgultv4MMZGdMHSdnRWcnR7v+EXi2a6ZQbnl6axB6nOZFgWcJH6duaOYIdfrychnWdsLOZef2txiWZegqe2YMIGuOoSAOcBdWaBkea+c2Z+ZybedqasNRDBYFjuaeuRdmHwkVufz2vhdVO6aReMExacexamemafz7DaKxZhhxeybtqpvK0peJYBAIhpbJcH2EaZYkFRbhfpZlsRefwGmZfaZ+eGZOfBbRZmd2eKGuZ5aGZO0pllaxklZybyqMcCsvPrmUHm31y6GRp4F1XcbmP+wxvGWjuwJxvjs3pgyTuCeJtTpQyzwztyYFZYkbFoHnB8TYc/k9bSAuapzdZ9bsOFsbzGCDdIn9dm0YY9eDawbDZjYd0ja32jcxgjfMfdbMK7U+pPqjZVxjahj9ZLu/IuT0gYE6QIbVZM3bKWh0tvznKRq+wNZ1V+2NeouXu8YarB1wI3vjxte3rtZTtJsdYOMPspv5YJZYluQt2HC9a7yjCyeejTdefxcuYLYxmncTcnSnaWiXalYZeHTdfXftyza3YYI3ZPeXcNIncPYXdsN3YpfnfPcLcvezBzev10NveGgLY3RkpwAIiFoGQrbsb33dHrgFPqJX1DoqpbeqpNcjo7ZjrXr8ZautcIMbTYtCY4vIK4opoGoLYaLAtuZ9CmrjlnBueGWI73fHZQdI+5YBCI/lfuifTo7Oco7xavZQfw8Y1vHoLJBrkbDo945dDob1vWuY81aHFY8Y5xQE4k4ogo6BaxPtoIhVSxFRE5Be3JczlhtU/xgqTUCTepqjFOfU/ZDrQ5Y4x05Y9M804s/Y+QdEyTGjD7jGxWWM7U/GFs+FhffUeDX0wHM8hc40hFn8+45KhSBs/M+86o6icRdC81YXki72r0z+A8406i61h87maV2/rVAi884y9YGI1S704dGMp2f3f1pU/alSIxAXh6mqVcldteAdHZY4HxhlW9r5di4Jac4mCPgfy43BLNuq7xwhva6xka664q+o8c+M5YnI+KR72a8Z0qfKHU8BAdEM784IiAny2x0G9CliHG6K5C4eGsyZh6mwkU7zNm/U3U9CgSC0yxliAxjOpS5qgu/y7Cpd2BdpDyr6RjNkKMFoA3Sg5AHKrRo8fQNEC81h87YYtxshz7ZrxjJiPC13r2IiaPp68udXC0GMyfXHFFZO3x6TwXFnLxzMfnVa5Bb0i0GF1sPw+J+k67lGcZ+Ggp+XJ7mm8m1p8q4UjEgZ98S6Up556BpKGNgvi5+YHF/Hn57u6VyNil9F+5+p442V60nhsbBZ7hgV9x58vdhV94x1/yP6np6ly/aJ7N/l5MAs2iHWlpvrIE6KPB+oWsxg+YTg7UViFZ2HmfrsqfotfXv8dQ/aogeJwHcx6qOx7Hd9sKGnHJPUMZznvZFESXplbUDa7fwD7rIR8tZ7basT2PAw5JrCd6tNToVkFAWdY3zfew3WnZBjJ7md4YDVV5V/YmRL/nUATwgGvWlmHHBO89MpkMHiuG5I6+M5Af1XOnHSFjJ78YD74F7ajiAsNb7VTHH6gtIfw35HHK8m175EBBYtLXnh7XPn5LNP9oFAmKDH7NMX8yWP5X/Omv/h+vEdF00zhUJVRv6TmM8MCOxl+ivZQjvxfRRgvao5TOI73LbBR2yIEIAc/xAHBoB+0/YfvXDgHjhLCqAofkz1aCf9EB9vO4Ppj96BdR6bQMLmdTd4XQM+ekLPv7wEyB8fGXbRinjV7ZodBMkfDHuxT3qx8iBMQPmJXTVTxJf6ZFfViADT60Dfe2fIkrnyD6x1kObAovvsm75R8eB6eCVFXxr6RNFC9fHbjcVEAF1FkZHaSnfTRSqCBMR/AaiRhRDuEw0Y1NVMRj4avB4eccYpFDFxbn4rBL/H4Hw275uD8EkteMCFxPT1wAhwEVKIQJ8HED20DoGfktRnTuCPSxGWIUwHiFGZ7B4ERwePG8HIDXY+CcCHEPQGKwsgvaENj8FSHpDIaYaPBJIA9JQ1chBvdTKEJqHzxUi6AqAbqBsH+Cl87Q9XpYKX5ICmhOXZwXYJzS1DyGgNELqMNcEnpfuzSRoSABhqQksghXAcmGmnCPo+mVA8QQACVKKrbMPJn1IHPQ5BzAxHla3YHh9OBpfB1r6hHb9V/udjaqHEzWHNEa0F0EGtM3B4zApBefZ+oSDLz58Q+KHK4YnlMBpFuBmHXgZX2r618V2jnacMkUqDl486JPXUCqhKDsgMgJ+GqJGAmwZFn0TAe2kiOxHbpIS/4NISslJEoic0uhZgDdzRREj7aQxQEMkVRH/h0RboVkREVxFWUCR+yZkdEIsQ8j2RdI8QAyJWSijT0bQSkQKKZFrxiRwoyxHZTZh8iawY8KapiKAgIQEhOaNyBqPlETIhReQ/WkiKhhvCShSI9iKbS1FC81ROaa0bEEZHGjFR/AhjPeRZa9pXeewqHocO8R0CThthM4cCMUHI8OBLELgSEzL5Yc06B9R4Q9jsb6Y6A3fYpD8ltF6tG2IAX4dDziRMD50gImIsHzDHMUUerqCEbcKHZI5UMWg+ERx1Ez6ZJA7oIqsYDVTsR3umcGwf3hJaOghIdLV3CaOGHYYChkgapL3lZZtjIhIXfAWBwnF9jghNGQcS6wJaNjUiefY6veH35OCao3YgEKiE3Fb9nkS4hFiuJnHbUDxA9RwCOPexFM9xFArcUeLdHCibBbY3vKOEMHbj+uQEHsRoBdHlinxpohSPUWMAwxK6aYtQF4WnEgTqkXEd8WxxwpLi8qqcRWm3gtpz1dhIgKQfQKWghjEOvjbtqHzBEqCox9rKsWonJqjt3RAEFSJaOeBxQyITOBtqQhzH+i8x/wgTIWPOEF9CJygpkSiErHl8yaMgWsToJPEoMbBrBC+BuLIgSwFxHGCSUUCkm7d9snggcQBKHH6DFoikuiW0Gshe45JemPhpJLbzjhik8aY8QiPUzqRw0OIu8eKlklacuh1koWli3YjnZ+xa+CyfWKsklAbJkwVoKZMvE/BnJtk1wk0X0nTMv8Xkhzj5OSJ2hyMXovCHFO3H1E0h4XRKYpL/Hn11Jy48Sf+1Di0T38EsJKuPRC7qR3Ibw/yQo1Cg9xzJOUpCW5AYCB1oKkHPYWQCwlBjhouE4sQRNBG8Su+JEwdoJOHbcVnWSEokATw2HWxw0c9FibBzbYyt2J5+TiaGN6lKDE6fEyEdGLuHkThJcI0SZZJy49RexqUEoYiRAhcifgx0tVKdM7SEQtuj4h0NYOultE9RPuR0O1Ecrf1AQN0urs1M6hZScWT058eOlEAdpxRH0y6cQNBkgQZR9iI0f+OBmATa6MM8GSoQBnbiRy4M96SBCpGPSlRyMq8eOhVRnSfkjOL6aNFOR3T8s5MuqUjI0n5DKZR1KyKnAzGGS2gJM/6azMBmISkxbkFEPhnLzZCmJXgXYSHlzG3xpBDA8/PmLwksCkepYiMaoKhExiYRFEhMfH18ESjACtaBzOILmle8Fp9PJ+hxKFpFiFBa08MdcJEZbTSJw0+4SABEk49cpDY46aHFun6irEEwVnsQLdlPcMh5AuylpFUmeScpYk12bWndl/Sa0dofTsV0jn+zqh4ovCLukXFhzDpw40GY2VxF2hvZmMliKYHbpBz4qdMgmQzPoxZzC5ycyQOUOhmyjs5McycgjOyn0yXZ6mYmSUIeDRgKZaQWYO3XJKlV8Zz03uWELiD5YKkMgr/l0I7nUyZgtADyYSPql2MNA8MKqYBEYmZjSEuw+gB1MnnWl50ssnqawKtnF9Bp0fCvurLGnLzXUYo46gT1ml+j5pRw42ePBWlyyLhhfDacaP4k711BMfWEdoOdnhy2UK8tIWkMmBjBrmPsvUCBPAVt5UixdNOa3OAU507+YCyYD3TjkixQF6CklveAyAhzF5yCjOcGkxHzyq5rhKBdSNCKcF4FkYUZFFPTneSlcZC2cBQvHQlVku2nacOQqkmYKHpSCsuW3JYU8L3I8CiWrVOwV39HG7+d7BMEkWCKBqoCmRWmKEiRhqFY4ccWxAqQ8yl55iSxOOEyqXQweew1AhLJ97YTThjA/4UfIVkBMyxNw3+dCKx7xir5+i6yeP3uRz8vOFgXlODzwTgI/hJs5aWbK4kgj1pgTcsT/LUHOLwmACusTFJYWzJN+PcL+jKzVSdMzaA0QEZlXSUOheeRCoRSgupqUQsgjOaOQFVTj5LXabImxJUoyUFLBRTCxJdTWSUjhUlgyekULgxBBSIw2SoWp0olHdL3gB/Qpcp1rQxlBljAYZXMF6XsobiwESefci6XYQelpclkdQAqS3iiKWgV/L4qlGbLBmuSlnBvMYXELmF1Nf5MBHConKal72dqIMiRGiAhGqjXmeYjezWQjFgVH0VmN2EsRd50snnIfItnHzFZ1s5WdtLIk4dKJTw95bXFOS2VSQp4UZODy0jqAglr80JatNBX2KIxFYpxarJcU1j9pQCkha7Hw6nIxF2AAKlRkeC9JRwFScYokBuW0rRlTS85S0sEqE5XIocY5ayt6SY41A/lUbAwDpVDzhRFKx9NjgKHL4uyU1PpKclA4i4ZVi0OVa8uaW+dyVgqj0rZUgWqrOh1YbleTMyp6qMYjShURys1WBQFVLWXVco2Fka9Rwtqr5ZoEQXqrLV2XRSpRkWWTzicwE11Y/lSrerVuI1alZAvrrrLYVboHhcTkxEwx3s6E7CACpwnWL5BSHS2WCtPkCTYxI03DlGsTAxrBkrQcNH4vEErRAl5ixacEp5xvzbFlw/qVEttlDSc1Dsp2XH2EXU0vihgVZc9z+r/gMlKyLtfUQ6Fg1FR8w9lUUrJX60h1PauYGUCUb/hU40C6qLEGHU8YV5LXBhQhI1Werg0K8/8OOHnVhsqljlfdeESPXiAHQ46i1ZOouV7rG0h6wZBaXaGXgz1j6i5K0EXXwS1JHq6Kq7H3XbL3O6is2mvzz5/VowwGxRcqNA1DgN1Ja09a6m2UWl4NkaxMX7X/YRTnu5tN1eDz+UHCn5AYqWSmplk2KQVdisPlmoJU7S+B+agkHZBjarIigparMeWoxUFisV787iX1K/mNrs1asvaYAvbXFK91V3L2hFGIpLrX1omz0d8noXxVzVro39fQ0CiEg0glIsoJYjHwCKOMqmz4TJvcppDr1im29Zyv/VE9GcxQ8TdZkk3YLzNs6pObJrHGsNxVhMwUHZss3DgDNeOV9e5ujmaa8I2ms5SZqtUKQhkzy+cCD37WnqjA1kGxLJqi2oby5oWmLfJk801k1Uk8g1W5o2hat3KEgeeZJkS1LDl5uWNVElBKCzBE1j8w2c/KI1WKSNaa/CTioo3ES+NGg1xToLyqqbGcWQecN4t+Bz1WNlal+exqBGcbwlJ8wUdEpVnUb4lB0u9WZvZpjMn1s6WIKetZa0Aj4SjG0boqU2ickQQyB/MtuHDThjw9RaBYds23S9ko9kXxIg2ikhaDtbkLQKpBXlna8ZU1S5BoDHxFqKtGYoLUoue0/bhwN29yR9WwVA7VImIs7byx/XBbd1/68sDDF+14RJmdXHzUSypXbbw0JgdHS5qS0HbWWUq8rVgM1E6akd2OaqKTublAyhFk9U/uDKnQgQHVuG6pMmvq1ArSN6a5rURPMFny/52HGjWhuNIrQawGtB8CBBRVlrqtNVSWUtJrUca61n8yJefWm2Qr7Z+9YlYJoGr2RtGg5GdjuOfw615SfMfLG8N9adF/wUtd1fDr/XPFSQFoynaqHqJW6Ji5pcYIqRwiW7jdUG1zacTig1h9drENIRCOt1jlTdPi/ecHpMACy3dvugnQ6Q93GZESMe9AY5Qxh4MbaScFPaHrj026ddmCtXKxEyQaoTdw9YchbrtBbq4dOu0bIzRb4G6Kpga3UMim/hU8v2uhZItXtDmty1Wp2C6HvPrhC1jAEwOsGIN+U1h2dwY1NWEpLG4rwV/O2JRfKdada7Gz+MQLFoEaZM56zkNjQCMV1kb61PG1XU2vPlCSeAbawxtBDGz2aiSyEiYFViwaUYeIt+yksPt0pGbEZtu5TRZGv0v70BAjCYHhGgVG7Zcr+/eSRnLjd6xlwowVgoyaa2F79FmxynAexGJy79sVWwUVuE0HtWRCB4aJAc25YM8D6Bt/Q8CY27bv9+2xvEMRerv7h1IB6/TG3oPXdsDU63/ZRmYMvw8IKBvsLdWpXcHB58e4reYj3zGrqiLOC2KzvFmsTJZli6fQ1tn0Zr59lGmJYSv/mXzV9ohjfWzHipJx4VF0OetZgrWyGfe8uybLWsP3K6HFNstrRoYE0JLHthQAaJyHf5PpBo0CyQP0lZxSZNlYq4QzgdLguGfDspWnEuHubBH3+mOCfvnuFG5otarNdw6OLWji1HgIxBlf4diN+78mqR1mtEccrxGoYeR91sUhp0PaEdpce/JEVexOry4a0AaFsxqOLg6j+OjtSgIaMsRXs3q4pJPIKNVH3sXR23D0et0A7aN+TSEkbQkMVITFE+necNrq0KHOdjW+WUfpV2Ri7Dy+h4W4vmi+4F8BbTqFIfEHGG99pssbUrp4nH7bDVGsiZoJJVCb2DbUa0WRFAhE9OQnhp43AVHCSBTl26vbV3Qd4fGFa/4d+CR0BOyk14Hgzcq0cCMKQvDtg8ulbx15vH6jeIvoV+y+OGHoTDx5w6iYROt4lSl6yE87hRPwmADBJ4E2TtGPZG4TRQDWgyo05h7oBuhNQHSc2UMm89VJhPQ72ZNUq2anILQJ4aGK0nwT32yg/wPemLQPaMwdCe6Cn1dSZ92K8jbzoGkbHz9o0rQwn3Zr1F9DvaGI/4vUAmGCNbE6tRYYP3c6lTDak/aqZGmX7hR6MtsqlB1Ozl3I2/LlAF3RPdwfjNeu09IXdP4m2aFJxyvab9Nv4+TkYfcliYW2lwkRQc7Xs6feMVadRCmQaF6Z71UH/jMTGM0mYJMQmIzoJxM1GUJyjMyjO6u3bCaRGpFZC9JhycytdMAEqzbJms5xDYNRnBeMrUKMD3GACm1oFZ/NpRlFNFa8qgMR4EeCFa6i5gMxrebQDlP4nupVhi42sYhV2yW1u0rYxqYBgBTDFBJwIRvP1OGmathG8w80ksPmnVjNh/FWodm1a7HDFRwXitHxEK0hqCa9gveawo6ndK6AmI5ybaN0FXzno6MsBHCNPU/ztxGiQdhbOmbASVkDLSMSJA1hnzT1aC7QG14fnbSWRrk1ISyHIX0SYFtCxenRkwX0ygFks38aIZWErIpBokgW2qRC0gzK0WQh3JyoBHsTAMeizhYQJQnEL4ESi5SRMwmBTwvqwc3Yzvm9js9dAoQ5vNFmRgZzOfBU+Nrn0ta+d1ph2XmuF0AwykoliQx0yMMGmTjISs4/Oe41rGLzM2m43NtJWtn+SyLAfbcXguUd8L1l9fbKXQbxVP9Lc9M2RdBY2Wk4sVY7kGccvv8x5GgPZTZQgtOHWLbEUwEWVejCdgLkV4oy5frboWfzgJMYO6CitiXkieEPC9/zStaBWavlh/CRY8vvM0rulZy5IBth56HLI+3fgSfkVVXm4kZyC4L2RZD9MrQ/aBa4XDMvogrD+MU2MamBBsC2ntB/pJZOC7CRwMl2QXJfONGWbDS55tXvWhUayRD50cdJuJ1PhE95hxrMccfmNHn76ZpprRacuMmX1dK5riraeyNpiBjDygkyOHdBZaIYlENbmzUet4Qwrt5qy3gwtqykPrz1+xisAVoA2vrZZ/ks4wkBHhWMm/OZfQXO0KYMgD45i5ZfOjudfDSNw8ei1+tO07wMN5G8lZhP8lXrRdRG7ViSv4WSbvWh6x7zBs/7+SUYB0DZHeu02Xzl68bGTfKWcXkreVXNHaCZWhmApQQ63bhrHDTXKSc5089YaVmL71Dgujrc7N5tWZki/za8L8F3PiD2QelhXQZalsLnzzau5c8tduPa64jOh1LDLgyCM45lhR2cJbYulsqb1/fE8E6UOxW3TAkLK9S+h8QO26b1Bh3ubb2NpWEVgN22xgODte0/bGZ8Y/EFSL/9qAIdlE4pOZsR3MlKNlq21HvymATYd4NK9hBSPGBs7bttKWhe/NE2djKqdWpbZLuMn7o9oJkhrTzvQGJ1/Atckbr6wOEP0vy05OLf3mS2TrZ5mW8pdXPqnFba+6cFbud7WQNbWYkcOioOsmnjzx1lY9LetnnWjb7W68/NozvMR7QPRkYq6gxjaan8e91nAfdLyuQkrZdli72FPtVy27T/EA3fZ/jJR7EUdsi2uU5D5KZcbC4+ydmnBf3/zIqy+9zevuo2/wADlEJ6N1x5Fm9zESB9/eEAT3H779vJp/b3Ay5mArBj+PXeJyUwsHkGwmzfcUi4PLsZgRq7WY/gAOMHdhch/jmEMA87+7YraqLk7siyJrrkXu56X7sr39bQ964xrqF2azDYPiB0WuXaghXQrXd0hHPe1umndbA91e+CMNtLXN7Dh7e+FanC24ZlzKn+2Nx7i1zFI1DnR5xEwd6TUHArYx+AbCrO8GcXNpq8Iysdp6yHXeixwS2vCLQHQytPR9lW5vaUApio7xyhVvxuXadeHAJ145FwwPXHVSCJzxZsht3IZIx34yVcRYeOLomD+fiAcgd4ORVCCtx5cxyeXZVOEl/xwo0zb9JcZQlh9ByDevto8cPyreceC4f1weHH8vhwvuHtCO1rPwWpxrXynMbSEWthe5ioUe8P5reKlR2fptN3HrBVmCprBarhqp6H8k+ZxdEWcMBvNzVzRzEDWdVyC2BPey52L2fpGOZTydOzs9iA7V7MPS2Urso56UOpqVz6yDc5GWylNnoT8o+DavFr8obqUU541zgc/Bfnrz2ZTqcOcDXsjzz4pMbQC3QLh9SeTWnC4KcNirMxmfcTWFKedi1+MLvG77lZnVO3Qu3L3JlU2GuRJHf9aR1JZafjxgVetiZ504EeXXunMNZ/fllJd6RyXzm9hzwANmy6zDi9o62M/acMvlHp+gXXGK3sWWd7iYSHUOCKDUA86gNzTR0TDQWklXKLtlN8jMC3iFXkYfta7UZwBISh6rg19s++tug5XmVLtKlPQFzKVXR8K5zMFDh2vNXLCzZMa+te9yXXays2g8E0C3inXtr31xc4teJgrMGMb8dSrPSj71eF6TTZG4Lqt1Zebry5VyhjLyvk3WzrUZsgzdev0gsbwra0b70b6whX8GriVDnqIJPe/L44YPtaezXDLESha7LavMr7pXOz1A6UcdPUqHwqnRg6yKwGIHESZsyt+a++ce5B38TtV/1j/uqw+D3b2wozhqjm5U3jLZ/WuoIN9ui6T+/fNY6H0juBjeO0NxO+IYbv93rQ1LIY9AO1IL3OaJbBm7XcHtvVtlRElpN4O0HpVb7qG0+9nh8G1cy7lEED2PccYb3OdwD48iWWEuKY0F4eLMDlI8uQA+wmXd7zreArJsdLxRx09UOmXBHCt9tZWyshD6xIqfNIPudrcjb99wrrjc28mfiul9ap66xhaCgBTF3BByKJiBAPpOh37H2UUe5GW/uLI3H6d9G8l6PvJ0rHnj/iadfxrBPWET++xDvfITWARz+dwA8U9knkJe4fj7Mrk+N51Pm76T12lk9d4DPSnseQG+KtX7qHtlMQIBB/cSedx0quz2zAktgOZXFUAKWrideZICtun0z7blfchRgPAn4t2vpYIXx4PrOdCRMBpcHyudWH0V61qZf8a1zY98xM/l0Lj9iPekUj2QHI+ofKPpx82fS9o9r2pnErmZ6beyM4s1N765T5x6wZz9TAnorTymNIp6ePczX+rxZ/E+ctuvrX4zxOhPf03G8awTopF4487uu8433ppYz4/xVHbxmq/bN6rkyfhvoH3XHcjW+9fAtKTlbxtGnZafXPvBh8LjeO8OeRv/t4hmd6/fBe/PUlLBh1CO9dpfPk8pb1/v4F/V7wmMB6CwDnrUIjWRpuQ51NnONvSvk2pSyl6JXtuCP18ypx6XJFDYmiOwva+nxGejaSviXsr2K+HtXXZnwo0BVDZ553TGMMwQG0oxtgF1dCQtVOJ14jDTgWAIa57oXVp/KuJ7vWcUWT7p/jvRvgoO/sT54xeGr1BnbBcWvKLl4RfH39yySPPpCCBoeOUX1qMZ+ZNMtkvxX9L7CeE/i1joZHTWlZzZWOxg9HX+1Gp+XrC3kU/b8qInt4RP2FgUmd/ApfUKx8dvibnCbHyEKW7Yx8cFkIFuaUSW1TKlycGoT4aDzeY+Q/KcUOKnB7jLy81CpZdJiZWocJSb5MGdeAaA6P0w1WtGdY/xnOPqbfR7luSv1HHbsN8QI9D0o3xViERq+tO2nIKXfC6vx7d5/XeYgq4UOICHPEmBm/Tz/AVoExgbju/mvr53z/L8nwo34EwPhT7r/5xbnXowwDxAU2ffnxff5/D2Kn+yYT4nf+fxv5b/R2iKQcdcay2SbYLTt/N2CWxGH+lnR/bf4wDxCBHHVLSm/sC1ophhWexjNKmyGFKyCtSsx1CFD0bILGkfksZKGPOpabrG0PnEqaG6XleLKQKUDpJa8Rhpn7A+Arjn6gBp1sZYVeDHhkgm2N5qe4xAaVu5C0sYLkVIqoPfvJJL4VGDxjDmZAVf6kWeTPpiaKaQiZK0B24hfS94AUqwF7+ZFgUKaKxAVJTbUmgOAqb+vwFQHPcd8jxBp2RDuA51y7AYIGSBgNowEVSF/kIFSB7npc5L4e4FxBRg8TqVK9+nZFxBC2kLsx4kY13Ljp6iw5qp5Ey7rHaBLKOkusif4VvmpZj+6yM1K/8v/qQjUImEvMYR+YPlH7yWyhopYqmkAfLbQBcPg+jKQdAH74qebgULQz2pCBn5yOS9tR4TamagX54+uARo5l+BAQkRAijdO9hQwIgWOB9omwgUF0BqTiuLvixSCT6OipbIgHTCE8HdpTSZsoUHcBDAXnajibeDISUu+gRUjAwgMN0FL+MviDKNB6UgMF+8igVUFNmbAFVKDB9Prf6BCJUu8IDBbCiIHAQSwVaJrI9RPMGmB/dAXSbCjGBvLsy1mO4JdBqwWF4Poo2Bb5zq5eKFAA+7Uj4Gg+slv4FzW+flD5x+GuitbbGFQoXZkQCUutA2in5kgFJBQrrn4iubwd/KF+O0vj7VeJgR0F5BsVKkSPoRQcDBeGURMiFtBcXFME1BaIUiFzKV9IwBNBMcniE7B8IWb7WIBCL0HFBd0hSFDBWvlC67chIelLrQtIcRjYhQvm+6RgdISP6t+wEosEdKEMoBBAhUEvyHRyaIflqe+TtiMEnBVKuKFqoXCtPLEUpwYKExkkoct5jGcaiA5C+o4A97+eiHu7xVUYfiD71utLgl55+kPsEEfBK5gn5+0FpMdz/BeCIp5juiHjQBEAIIbfAnm2PhaG8aIQYx4E+2RgupWU26PjzE8IHheiBhXITO5aQKjOoHZBEYZMalCmgL8CpKr6p+pBhYaHFBU88wZiJC0lKq0KaAoYeDrK+pbHmH3uuxvdrX+rfjmF4hGYbWgMA1CrmGPotYUmEAcRYdIEeeFiAcHyhQvq3QtePcHMoLqgEH2i9hpkiG7thOzoOFiipQgwDq2cbtwprI3YSz5xQjGBBxFuDDsvJPoGThlLRBp3PqH/KjwSaHxeyxuCHehjilaHG2+Hl955WO4esIZSaficCJBGPlR5ghNHqeFXG54TD4X6/ocx5/UKkJbxJyk/ov6vqfMOpTr+QEZiEEsSjCpC2+0coBFSB4Ye35vo1AUTrgRV3vv7aQ/4fb5d+NftgogRrwNhHkBsYfgHbaocPJoERA4X34wRFgfuJD+8wUPSzAn8NQGjgyRMBFrIjEeIHH+7/gGHt+PBj2In+n2jxH3Wj/ixEXBRLiPplA39KtwA+SageHoezSJh7mhaQe8G4e1oZeEahrLECLD6rOFzj+KboU+HFe6ATH64+voVV54BN/t8jwaEkZFAHqy6jFqsyVke6y0A2YXZESOmVLU60yfruBD2RXrs5CI+2Ybtx44a3tZFSqrtPf5BRjkamYwG2RrDRhRkXr85Cqc4RiIBR6zm5EMEHkWhFkWsNGv7UqKuDNRy8WojFqOuuUY+j5R44dkEWRjrl2i2+y6k+iYwTrtVHQeEYO35rcJGKDzSRDwVn6Bih4W06vhSkZaEqRF4WEH8CSYFULPcrUXQA6WekZ1GyyBkdH5KO6QSZHViJfvcYyBFiE6rN8PGN/QXc8TpYRZR5uAIzbRp0tmHB2pNtSqE45sEdFm0vQvFS2U50VHJthREeZHrRDzr4qZUggo2Su0SkH6rvRhEU4HMeygMmE3Rb0Zy4fRZtCdHU2+mDoq/R3ptFHuGaPMDG/Au0XDGBuRSPxh/RKVich4I77gIz5YU8m6BYxUNgjEDaokYmAbuJqqRjxBXgO7xzG00b4HPBIAXNHYeyXh+FQBsPsNEAQ6QF8p2g4/OPpDOaQFNEoB2fpj6GR80ZtIZB5litEdhsNJUAQx6MDHorID3NsJjRcsdDFpm9tLcypENysuTkB8bntigEAVNrHlB4yjLHSq7sOXCpQyrorFkRYar5L4Gc6tmF6xfqmbF2xSQCsgaxldAUIpy8TtyGVh0dguDMAuMuTHJEv9LtHqcH0jcr4IkUV77RRySpWYVKMrHuArIscbqETcnsZtjOhPNs8LFqjADtaPKwyG8I9B41jwDUIgEHF49RqQSobMxA0Z+Gj24QW6B8wOdkRTpABcfeE8ArqMgFGhqAcLGMxSXmLGLRmustHjKQEEVbHKJ6sq6ssJwaPENK2YWUjHgssTcTVKYMUDAVIU8YvEZReTDFFV6sGisquuI3IXbsuFyDvFjhj0VWErQhIDYg++0yvu72us8TiBTKrhrvHrxiLObQuu2ODsrPK3LpZwTx/VqPHReEESgxJg1SBkARxf8VqL3mwCXnG7KLyt+Yw0G1pjBCgOcQD5s6skcRoMxAQWAGXGi1tM5LRaXnXGyuvkm/ErCeslmLtx7oWoiehikZXF9xLMaEGDxyoqUqGCgyEMR/h9rgjQXxzCflYOxCypXRCgSRDrHac2StcGvRM9HwlGx9CQYLU2OysuSXRObi6QXxpIg4EPR6MeXbhui4EIkzBkCdIlhh2nMkowSmiYolTCT8b1z/IogDUE7KG3vG4mJFDsIniUMZNmFCsY4kwn08QLn0qbKjiRcjminznorVgG+ksGEhHDF5EBIvMVTFQwZceD5ehfURHxdOakc4FXgYgGRB9yNsbUpGGAsZ3FCxz4SLFMx1CdXH2GX4bCEYxu4N6rWYzjtSo0RPBgKq24xScqq7cP/hnEnx0dnyZ7gqoa5QFC7ktAqNJVSS0kBOwIP/E+UQxJkgVgujqUlWI5SVUj9J48tUkEJdUL0lsoYEItATJXSVTA9J8quMmDJpjjbFtJ8wXMk2wASfljAGFSV/ZD6xLvskzJSvP2YqoXyghClR2lEKZNS1KgFJPgpUTAl2Ma7ESag0w4GGz1hQfsXHTmKCRzoYeZoSeGRJZ4TkmbGtcfwImYVuPOA8E+dt8kgA1mB3EUeM0fpYvhFcUEE+hNCX6H5JKiYbBDEBUEE44Q+RFYEWUK7gYlDJOEDGQkUxJqcmKUeKWSnrJ2rNhBzu1YHSnxOLkJApk+WyffhFA+7i5B38C3O0ncpDPCLgUp0RFfbKJxDprQ8pJSUmCzAQtBUmOgwqa5SMpI4FxHMemtHVYUpdNCs43JNUAfFap6wck4wx6qUMT6p7aDGSEO2lPfiap5qYMyNRORizixq9FoPqtxIACH5A+aSV1FyRxppkm9x/URdape4KWMZ74dqDFFz0pCfpEopvqRCEYpoKVilmRrfnviAg76guBPQxKTEzxJagDJpxQdAM3ZSh1Jpmkpp/7JZ5rQhaTJrUSG3vUlkWfNpyJkmqaY173MAELWl3sOaakTzBNaYZ5v43yNzGGOHaXe6w0qont7GpBSYUAAQldEmB/BWLvdDxJ1NhOkne7aTOmU6AEL56eGY6S5DLpaPPanvSdoC5ByYk0JOZUxsXn8mLGAKceG9RVCf6kb2rMbgnimY8tCkhQ+6eGmNgiKYV7IpOtqikKWyprGkBpNcUx4jpDvP0mnRygATz8J06Wppx2w4O369M7aV8QBuDesBmciNtqdowwFLvekgZYidSaAZs6ZApZpodvEm5p84DhmHq7achko+nPERnwRTJvTwbR5GYGJqBEqatFJprnvBmQK6afkzxJzGXeyrgQ6WrFxGp2iuloZzKQCYUC8MR8kLKW6bXCcgAjDPwA+wzrTFPBM1i8FNub4VgmVeOCUGmxJYhlvpPpj4dNGHWHocvZApF6d+lXptCXkkJp0diGmceB0YhkF2oPHUqE4tmTSntGxFHm5nR59NBkRG0En6qOZnmUYk0c6kNZk5R3FsRmNpoRBBnIS7UKFn+ZomF4ZpC3fJFm4ZKJkYwexG+klnOZscCDwne83iBCrpbEITHuZj+hllBGNZKJlbRQmTEx5aZWRvrfqvGZpkUi9cHNgA++CGElKZEPsCkQBmKbmowqmmbMhDhl2CzpHGL6YAH6Z5CYZnnp6KVab9xmQaX74BuaEiFNhSDu6x9eHGPNmnIi2Z/YLc4qcOk4pDqQtkv2Z5GxlrZu4pSzYI7aQNBuSPbm3aPIBRhdmC0s/AwRkZE5udnaKxUPianZbaV5lCQb2W/hbe94LVlRRzHmiFa0zvPZCbpYWR0w/w1DuDkxZ8zD1C+8lcOXTWJV5F5ncxP8ANCqcKzs8nmI45MkSdGTPF5quWzWQAG1adMYploJrwSpmtu8fjEnCODgLrp7gbyaGaE5SVuDwRpemYK4GZKQZ+ngB69qo7Xpjst+H/ppxKSAFyGtMrbFBbpLbjM2EuZkZVpeTLrpbMzAXeCy5cymvBUwReqrnzBGelsxvWOLjfxS5jtEeD65aqvLmIs6uYtBF6JuYDaK5LEMrmsQTYqbkMZHYa3paQvKneBr8QcjlYt6ADFoE+WgmA6pm5BLOrlByevkJQRqZeqHka0nuVSkOOmceYgsA9hFqyCCrqV4Hz28md1HhJlCZNmdZcaTgG05PTncBpC2cKmzqoepuILs5gsUV5RpPcTGlTZXWepl/pu2cXmRx46eOhv+gNonmPIqGbZBWIWFPMF44yjMAbzg7ef3mkk8SQ6Bxao+fRk7ZxDi3l7g46TmmbaiUY4Bd5MZD3kTpn8B0ID5E+Talqay+WuEcYg+fgjD5YmY1j7uPsfQGIsXec/i3iE6U1ykkPCrfmU646JfkVBKDPiRriyOfvKw0lIUfkT5Kci2mBUb+fwLF5D+qlH/gAPuGitZFOcpkdZqmdgEqWPWXTkt5AjFLokJz6WQnO63OYEFfp9eXnmtqQuc3npozaQQb34JaaSQkFnaXfqzIKGZ/FB5H+VQVKeiyA2lTUg+Z8LMFVcJ9mw5SuInm5yrXuQUrZF6HwW4Z83s6IUuIBcKIiF9Xrty5pl4NIWteLBdN48F2GHwUQx4+DDlH56aKllrImhQwWiY7BR7G7cnGYfnCFp2hDHGFEgE8noxfemPKfmnpEPShwPzG7wmAMBaenRpVOdElDRYxpl53Ew8KppaAOmcNm1ao2dgUfpuBbzlYBRfqZFZB+AXAaB6Vcqpr1EQhaTy+Wc3hch2e9kBIXzB8RerYXwQyHZTKFm3mkWJFrGFEQ5FuuFrSeiSRcUm8GiJBaLzqmRU9muxxWb/r1F76kPTvY3BZt7tF1RcWlFF+hcXiIkB4LYQPIAbgO6zo07GMV6FzuZ259gx4FMWsYZHHUV3+g+oMhLFl3vHmWuO4iMSJ8dwXCnUIa8G4XyRgKRNl4FueT+m5JGmXTmrIGgHUgwpASLtYJB6gMEWHmnOWNk4FGCZgFQhZllK6SxOziq70pGiQbomAGQL0YHKocECUxBBuomR5p6odFFWY42BbH3pJgOpS123Io2BIlPGEmBFAhvofmDFLCjFrry0vPylgl6JaTHz4+Vr6ywlzkZSVVyOJaUCfx8bkSVUlkGYXZolHJrMXlRMWj/JapwCRCWSA1JXPFqpwuSKKHehGeBD2Itkb2hxa5qf1b2pwEozjt0BNtQLp5VeUAF+BsBe1nGZIKZcVgpqlnTnASSNpkLjmbYfqapJSKaEU7inxRgEG2PxXh5/F1gnqo/StYcwCZM2iV0LOlnoqUKAQ3RQSXDiXpdugPcNGYYnySgZYkJdFOwSKomAI6jmg6B7pW2Et0peDGVC+K0Plhwly/lC7RlF+RGUWJnYtmWxlwgkvwvRMUK0W10ZPLWFtk3+dMopCyjCUJhsmIP2GkhdZYkIqQlqZ2IVla6BMqEO2OdWAxmX9H4KNOVMe9jHFPqbXmeF02QXkA8E9o8BAxNsegzEJpCJXmepb6fI7hFXxXaVeFdCdkaCQg/JF5RgHTCrT2ge5cDEdMe8hWFX57jseWcgkXl/DOu7SdeXAwwElsgilu2VOiO08PAUJHcH2hrzUOZqqeVo6IHv6WCUf5Z+Wfq9kCrSgVEkXeXnaWyep61JLSTDbOivSPaAZYLDvpgZAyFWWVy08QMHKhqz5d2ophVSPBVzlBFfUREV64eho7i9ZTYEvK1At4EZ53qXLpnpaKecUIF0RUgWrWXWnZ41g8rnsCwVcKcuWWl7xWEUeFHWXznYJI9k3nEOQoC9rC2AgWWEzAPEBdqwE8lf769u9hIALYVgoKpX/OrQs65c44YbpVz+pQlsqVSdEX8Bsww4b3LKVUmjdRWVHLn84WV9lVJlxlnLkzYr5goJZWuVy7gZWvlMleQYexADkUDt69sRDoqA2/vB6sEoVS0UqFe6pFCK+tYTTjNM2CoFXyueqv+DGBhebf6ZMM7pGABIqeUYyjlzFWJU6lFxaZlqmBpdlVEUrgeML4uTxV4BCVr6VaUUJRmTnkSVamVJVEFxDllTOQelYpUzU8Lj7ZQl0yo5VAeHXtpVj+BCvE59oDuulHySw1TNVJVPEBeXv5omAf6aAVcgq6yMLpqf79grJVFXjVx8VyXERp2ptV9okCitW1++1VtVzVlJidU3+B/tUiOVlKl9I+I7IC9XhEUZYpi74kCqID8BmlNdVaQDdH9XM+eoVsWCgX8GJo5oOofYWFVMZMVVdx6CbaX8ODeSPZVVXWlDXeljoauFmlFeZgWRp76aVXtVURW27mZsRY9VxQKIP8DLuBYeYGhl4YVTVjg26K3RaQq1UopM1NNUbzJhHpWyCc126JmFfJcVf+qfq2VB5q01yRPTWQ0qYUNgtcYoazUxhD1a34LqYtWKGC1eMZDWy1tXG9Lc1rYaGXAVItQJwyKCro2QxVgNdgoB6qkCbV9hx1bPmrRf1O9hW1y4bOGmFmcAuppMtYTOG41sVRDUzIitH4kSRDCfDUMV6pWTkS2WeW1VsV1OQ6VsxGoblgLFCUsPoqoIkS6HqAFpc1UiV1peuUo15XvaWqRjpcqLlS8TKlEsAZuknFYixdaJ6O5XCXFKuVyEqXWQSWokXV11KuDTITVwtfrQngC3BJFVZTFpZxd1sED5GVm9iVyiD1wWScEN+Byozhj19dZkiN1ZUfgEqiHNlXUqQCFpZwhSidWvyr1WVbtmrIqOr4gORRjMFx2idAjZDISR9SKWVsiyB5W2EDAOlquMIdZ3FeMZrKvQRJZVUTT85+pcgWiln8MCSx6GVACBxQ6ZQqECQmwnZQ2IrhGRDa1ckvZyduU6L8CTKgDbhDQNjkqA2OpayTZQNguaUBYxcP9fA3Yi0UFxBAgjNFWimYjXK5RAk2DTTqzMcRavA6QSIi4khoX8DpB38GZS/TEOv9U/zNSD+MQb74S0CoQ8NInNHZwGtSPw2sNvDaI3PQd9XYlCNH9n2CSNt9Qw2kNXDQCBKNuVC8lnxcWmsxDlJwLqiGh/Ls/WGQ5rHAXv14sd4U1eiJZIG/a72CgaWNyuebTVlaUNtyuwa/PDwONxrr0gwpGmhOIeNsjXkyuN86g7qOUATSPmtivjVlz4BchPDxKMNjfIVcogTb9bON1ql42hNjoOE0a8KTR+qJN6jX7QgRvhtZpjW4PE5gUI+jd7yGNb4K/XZ55xR/WSV3Tm+XtoMwBrRewJyfKoNNOuPbDZWmvjQ03+ccMpU52ycHZRHZAUTnDHwjJV0398xLtTYDNw8RLyVWucaLjsQMzX42IsvTXfGjNeEIDZ2YZJVE4dNCAss3uOo4NlR9YktcfWOq0wPhGi4a8AmVx5sDdkF9IH0v8DXgVzfY6POZzQ82gQq4EkTUN/fIc09afWM83gl9zL83v8nzTRJJNsJspAP4n5sZigtpzReilCaQniYByTzapyAtETT03qoazU812Ul5CrT7iWLVDXMOnJTNx05BzkCKvoN9EXEgAAANJL05TZJBY02pTnk1NnVSYjBpDTbITKQf+eDwAAgnS2A4L9Yy1v1zLV4Wt2TeHhXPQpQuxhu8OLIjXpJlOfAXR1zLlOXheuRL94qci5V4ArQrxWOUZJ45eJWk1NOQXU1eN7CGVv4uaGMyUZ87mNRZFkrdyrRZC9Tf7P4zDdc3mt9rVa2N4n6t0R2t7rA60G1f7vOxmtRJMIKpwfmZt42tzRcG18w4aKrGA5P9c/icCehjDU3EYbRSwutLzVG0ptsbdHHMet+bhAhe+JiG1m1j3l3isYAbpPLt0z+DvUcNCbTiyONlbVDKoMn6mRwN6RbUEn2p1mGPIFxYQrkTdtmrcH4sQapSuVh1fdhHVnF4AexXQhNoe/QMNJQhq3StZam0A6tJVd3HI1RkQtFo1MIRZkf2PEJy4P6S7nzD72wBOmj4ISbSG1Htk1YpBswnLtMYHtpbGfZYMFpHQC74h7Q+2XtnbXu0ZtlJBa1QOgNicG9yErYW2E4v7RUVPtnMeQIQiHrbPhkut7cNA/ta8Y62t+/7Y7j1tEHYnEwMllPIp3tmLGPqgdirhPLYddbGOEUs6rgR1wdhOOh2UVaDeUiTGXupkhqq4POVQdRKAfS21UCraY2Tl5jbm3assMl0iFMn5n+34NgHQykKwSLT7W3NcRUJ2hULkKJ0CdmkGS4lUfWlXDT84LSWicuinSdrKdODU/jasX9tLxPKKnfs2XMunS5CM+yyaB4md96ZVaqdK8DOK7p8cH+1zYVUOL50h3TUh1Od9ndZ1d4eWqZ3AkrnVfo+dSnXjh/tlnZp3BdtjAnneKv9Asg7Uk0K6mB4NbmU0CtRjZU2R14ASy2IFA8TelwUx5NnSqFdnk9bS8x0oBAd8Zgj7yZIP3v8lKcUhayKcogtPIUag55L3n1dRnQYW1dASUiQNd/SHB4aRBjHEbzOA5cCTYCkJB13SmrXfMwDdoTS12T8bQFN2K1JLaKWD5/DM10qMwhe122I4EDZ0AZ7DCt3YCk3Rt3+d/XTt0kYnXV5lMMwyd801dCjIN2ndbBet36Yl3dkb4k9hZ6QDpq3ZnDPdTXamnzdf3LEmaa30RiRz0KBPy0YEgrcTXVNZjbHXH0/FHl33qNxGqiTeO4jZIgenfAnE/Se8uN0iKBgqlHyKr6shp1RtyVt0M+2PRcioggrHj3Ww8CWT0TRmPcOLqc1mGPrrF59IY7Ji2UY4U096LbyH09N4XXWE9IXNT0E9NUJIBE9nYST1aRwvWbSbCSpcFnM6uHbT1+c3PYz3UqfPU86K9pFDlkgQcvZz3R2/nAz3q9pPcz1shDBDz35F9PRS6lM2vZlFS9VPYb2S9JPUPRmqWvbg27ZcGoL249UipT35uu1UBwZekKfkUTirjKH4GNyXRU1CtVTel1bl2XTV7ZoqmkyQvKOndWjLuM0vL3Do2aEn1yMBbC91luXkSL2Ts3Xd7jFqGfSpxNdsfdYyHdNXpn0l9/ZnF3KNgyNX3QJ3XNlWDt59GgXWMwSd9jMdT9SH0Mt4PRH2cdUPbm3wEh4QUKZeKDfb4Mw2UktAyqmrIxi59Q/XB6QKM/XIziOWQCLw2xogdMmW9aDpTBftb+J7FL9E/bv136/7Af0p9s8Dv3D9J/ZNDL9D4Jf3zw1/bn3iOd/Rv0ZxFLLf0L9FWg/1n9v+u/1T97sKf3CMF/R/1EtQFY32Ee7rIMoP5iHk5iP1wfaD0pdYfWl2XGGXRxXo139btnN9ANfiZEUo/cUIT9WA2/hEUL/aAMLdGA/P1LQRAwAObeEumDrYDYDV/1b9ArEAMUDMZgwOgezA89B8hVAxJ1OtHA4gaUBm/dQNumU/QIN1JjfRgNP9cHqIO81XXsIPPQOytwPiDNbb/3yDrA4IPDMvpiwOf9gg6qxr6Z9HEz66PuLYGtBiHi4iJdbbKx2R07HSK39xXwRTVIdyRDtC7Kd0szUpVwjOxBVwjCeKIAEYgXZxKDq0dZqeD1NqgLxQRvu/QAQFhGSaF0jzOX25tHg8BDsQUQ7oQxDwBOdxThexes659Hgwb4lBSyaBnhDn3OkP/U9kFkNpDuQywD50qQ/2ChQUkgzpsNajNkGBD9nri4/8+WsAQTiquLfU+IJVIDJudwjTGRVwWgC4Pa0IBkBCF2s4K203aA6t/1YQYw936+DwbVMMVZV7axluSd0m3xRxAFDV5jDqcGsPiiGw8ARpWcyNuinaNtL0OGMYw20TelpwxliHDoRK4JnefdTwMODedg8M7UfdU/hjDBvioqH2qJVkNqtGzc1KzgfwzAztot+RW0AgMrA/qxDP9WMOrcKcfvIqEj6D1p3DmTGoDcNaTN80LAAAEIoIihGgigI/AFAAoAAsUrbKMd0tZA7SDgB6ALABI0SMkj5iA4CKQkVp0HYAAALQ+IFSJvyTUzI82LE4HI73I4Mc6LyNxBipAKOAg6QPu7UYvIxCYXJ7I3fzGDwowFJhEK8fKNDdkYJeTVAzI+5A2SQTgKNZFp4DeFajAUkHB0A3APqOiqseRyzajyIroHmj3GVZVGj3ALyP6SmMGyOrgTTFpW9g1sJORlA7o4RDkNxo4q5tEF8P6OZeWNsyMVM0RPaPusGnLsiRjYzEfBhjE3tKOfqpdfXDJj8TKmMlGrkDYhhjZ2j0jOjq4IbTZR/o2zB44ZmN6MpwI8eyNewt2pvDMjlKSOYxjAphdxBj5sEUYi4+o7iXTBmXI2Md+TOUST6j0YbxCNjKlOiNqjkMouGPUjY+iDgdAo6iUoge8u2OhQ+CuaM+IERPKlFjOvDWBjgz0OKNcjG5AuLMjwlEhHDQ4oyqi0DM48YpBsF4/FnZj6VqyMHjuY0CHZA2QD9B0jxI6SPAcYkGb6UjZEtSMlAtIygCEjX44yMWIuELSYlJAEMuRKx1o2W2fCdSr7jQRPIwhMSAkXrJynIwo2W0P40vUWbkk5IBBNkQRVugJ+qOvFVihUWozhNDw7yXBZaSwo1GAxkWHe8njoiza9zHjgtUiH6UhEI1haj9TiOBlaw4CoCjJhsKfUqQGmiBJ+ZV4PTzhoz1UJNhQpeqJN+UEGWUWEgWkHxM+jFmvOBeRD+HiWPO0k7QD3giDWNSaA3BdJMRCBUKGoKwSkFaTxjouoELaThRcDUaTWyJ2PKpCjNpFWkDExtBxBqbD9QtYLk5bqxqK7gkUuT2yDQ7qoktaONhsDRC5D9IHfjuF2TcvoUzaTDoPeCz+DjtJPOt2yKlPpA+cC5N1tuUzopJTRuloFWT0wC14FTgIHr5fGrOPE7eTxARJOnIs4BMBhTogMZMJ2XIYRNhs5uKaUiQqUxs031iQA1PVIEsNpPiotFpxZZTMEuOm+4CKg2M9T+SlqwbQ2kSNM8qcU2zA8QgRc6OLT+Oe8llIe3N1OCYhkxJPnV5ztNObTshIUKpEezd6PxZCyV+yFCLutmPIqYuknCFCmWDuFKjhQmk1XTFhFgJBjyzrmHvTcqY1yAzpyFoB4ONxPZByqzIxlrA64apOSETxah5A2Ej0+yDuQqcnDNkcg47xZ6pMwDfTYzdNO9MqUaRlLRwzqoR9V3gQMGPhfTQY4Px3JYbNTVx9z2duO+8FcNTPN81iOTN4IylJKbUgUUEOH0zSTMTh9+IEGZNL4quJ+amw3Fvvz0OzI6dRiiS+EkylQCs8eAZYMszqNkQyM+XrS9ewCuFjd3o+A0uCMs49DJS246qqAQisNxmQa2o+USu6w0KNh45rUxbM4MTpK5RB08UPGNeeRrorAsytFt9OLM+ItwAys+SkxbajEM+GghzK7gW5ydFs5tTRz4ZrZUWzpiWKKs1WYRbOSBDoq6h9Mm0HHo2js4AfEegNcinUyjjOEMPkSeOTI3ejtAY7S2EAo8kR1CjEryMh609A3PqULjNuP5K8iuuPEUe4w+NjcAZAKMnBeWNPgyjbMHtNDJw8/szqTXcyVRfCb+MPOdj4/EGN5EgCL3Ns4o4yaNzxG897De92o0QELzQ466i1KW80L3tQUbgKNWzsjKvOrjSeFfOXjCFZlN4I5dJPOLzrdOUSVjCswW6lj6rtPXNzKMxlg95Aow6DVjgM7r6ckAo48Dugfid9NzyeOKGNJ+7kCqhBjb6LVy9zg/N7MME3PL3NRZXuBpMvax2uKPdqGIaJNG6zkL3NM+/XBpNjiLUy2NbIEhOZO+e6if4m1jhECrYaTl47VVhjaQiVEaT6tCo3+jm4qvXkzOGTeWhjPBCuGNI0k+1DPoboxE6mTGkwQrOQoav6Orqo1vnPKQJ+SYAxjo4qzhHTEFVwQxjjTXXP1o0k2FT5Wqi/gL10bKVRO+SQEOlTrJ/oxbT5Y2EyfquV/ow3Y9BEE1bp1Wni6FBjgO4aONk97ZJAvuw62Z9bOjGLgziJT5o2bF8jdi0AlrcbI+7AjIwS0DBCBoY+7Aww+dFNM0RWS8tndqiS3hVxLAnHcjSLZPeUo6L7IzdBWzSU4tBKVkjvyNL419A2P4Cc9mJ39Tk41pIIju4cyPxq9yr3OsEj1qgsFSUc2wtuS1SLaT9LQgVXJhjKlJibej6QCOTm6bCyV1LTZi6SC0AauEItI2v9IDM3lt4v6NdT+kHDNRELC56THLEgFsr0zdlJUD7jXnlOSrz4s2KL+jy5BUxBjhlHr2uUai0ZOaikYzPzzjWMRJQ6zkJTukxj4RBjM8z3SNmZqLrkBMBvC7Y0Dz3Wai1ZXeLo2P+AMSDy0L1e4Tvs6MYr21tivyKKclqN38vwGAoxjOo+2KkrIUCYCJJxy28BmS+Kz9WxAN4TGP6uYJTSsXQIyBmN7AMMN2bMrpvvZ4xj5uLL35zC413ojgIq3PGa94q0w4ogUq2wuPobMI4vecDgEIvGwalV0tqLXBKqt9jGq3TR6j5THliETQi4Hr8zQi74vSjQi4zgIN2K5CVzIPI0ItCqeq/vJhjgMb4hajQi1FCljXrfR3xj3q2YC8rquqcverVPi2Murwo8cumTI9GWOs4jTV6s8E7EFkCILKgJr2Jr9ww5RDLjZB/HHjxy3QBvolC+gxEdM48cuO6Q4OKO4yJa9aPHLkYEHD7jFFuWPNzta+Gi9LNkAKNtiGQFGs8EjwIs0NrLOHELNrPBOdoVrqoD3jJ9dwMcusruLiAsILDY8cungmWL3ORguhtkXOjC6zVJ5jrdIusuzk62URQOisFfOQls4BmuGUj3BvOOgEwPOs8EERO7PnjrqFFnVz6qzeuRivRhvMxtp68F3d8w8xdDBxGa3cVyTw82kITAAa5wFjgkwk4u9hODEOvlOMwPyOt0w5Nm7Prw9BpxujjpHUTdrpbLiUZjyGnhC9jrAJhuGjECWqM6jUMJeSgb++VKM4bVMPlqXkmG+UQn5XY5nx7cwoXuvAkuk6mvizI4JqPrr5bswAJR9604PxrTq2bEgQQ82SuIt862GwXzcy6NjlKmGjWubM3G/Iu+SMMwGtpW/K4JNhjUgG4PqrarYut+jewLOQS9k6+GohVwa1yHjUImx9MAclK81OhkemxqyZYVi+p3m9o4ykvs0MqCw7+j8ocpTWbtrVqHDTxi8zUp8662Uj7M4Ms4szTAa2UhojEi6Zhibpq2T3ETHM54ta0pi/pNsj+4q1w6eFgPyP/9/dPOv7iNQ3mMxTZuvWzqrTqqtilLhggKuTro4CwBWUpS0KHxQXq+qj2e4yx5s0W+CO5vqo7kF3rNbobdavqoJ+X6MrQkuhOuVbTnqBLNbkgIothbQvUYw1BXW1kBCQbWwowlMvqs1tmcGMOtujMeiTUu+4WQKGs90P0qFT5b1Q+pR7bXazsvHqTpNItZbxsudpdj2S4NPrbluZtWlLGzbVjvbZEDfyqL7sD4aLLU2yiC9Mh69zUzh628nV0A8W2FxKqeazqHmbMYyXpLI62+iFArI+rUVOr+4halQk/owQr6L62wtyQzui6I0xbFdWOBbbbCxYSW0XqxAL4pEK9nZ07RLL2LY4by/Sgnr663FBzjbOw8Ujm1m35LK5lq/PLM7w5KPoxjBTfvMeb44E9DxbzfKYnM7DlLQBvrao4YsPbmzNpGHrCo3TTq7stSV29zXuLmPM7NMplW4LQ4Z3NsbFdHUL9rO5uxN5rM4qeBH9ly6qCvAGohmt0rEw8utbCVo3lsZrxSMmupr6s5toZrTYh4K9zHW0LXIbFmmvB+jOcyUO8bC8cru9zbMHBvXryjFbP/MDc1PjubATitWjr2cIND/rMkpfMegQEJHtvLm/FXKl7izNl6qzby+A0BkFfpKO/0Oe0Nhn82OE3vrOD/MhtZMI5NHOWLCmfqui1ze0xuS8YzNYyt7quOYDJ788i90UblWBqLJ7SlX1NqrYY2JupaS82Aqmrn6qtzFtlJMPNmq+G30vurqUmv1Xztq8TFsbfYf8AgLrkCYAZr2dkqmCb2kSmsP79m7HtUwWQKXP5jb6Bj1qjLkm8AP7I5CAPvzXkcviT7mVdoQXjwBp6sJ7DPYzSULAbnbulrn6llYlM9c9IrxS1q8WPccbOxitW4PG2xuueFqUMv50KCwnsqryYUMuNbGUygfww1SA7NTz+PBPKt7uhm2Qtj+3NCz27hEOyAor+POAqYbwBgJP0LyKxms6iZEGysTLRut4sWjYRGfvt+4qO5tOz7oOWxlj2EOGh17/KZOTNLVcNAuIr66z4j0o2plIeDNza1ZAM8wMGofDkrG+qtjr/K4LImHR2l6tPtagFuZWHkogYccyvnoevt+8Y6YR5jvhzSvW241EMudQPPTStjYhlKEfzJY8xiuYgqy2WP4KyyMyucgfQSpsTzqcA2OjYagJ9L2rZnLjN9L+PEvzBruaa5A6zeydPtrLpR0GNjMn0iKuHU+8/uDVIjjcGvwW7gtCsLOgpWstcjWMz2tZWhm2c6SBny4HxUyay7nImb2o/+BM2Eu8ws6zIG/nQS7dU4goKzjcz/JljKGRLPKMLABc1WHQqvTNlcefPqNN8sMy/MBEH++3pS11o3giTsW64XY1yq81IA0OB4/yZtLeIjdIf7fwQo3Xj8QCuta78cJSlOjNc3uBrw8G96LlzPI/xW/ieB/PjgKAC7TA8p/a6sKvArx/Si2+ZuyCc1HgEAwe4LmM5fuNjk4rcea9AKNuOLNucrgvpAsTSkfccd6/ibij0YcfWATjGH5QG7MwFUoRH8Ft7WgHD+BNTCjGK+vnUbT4IZMRH9iPONybMRzyNaEIR6rthHsR6oSsL+o68BRZQRwEScnx81qYECgq6ZJFA/a7VzHcQR2kIFhuC6Mz7z71dZqZ76SrCc0rq9Snu9zDS8msVbaCoyp/7UCzKjpxa4YyeC05gBgf9ISNuZVUn1tmfvPqq9arOfNKYmhviEhnVWNqA+2Mutki2YziwILsZwWFCMJ4/X5DTkGwnYfS301Fbhaao4MySjNR4UVbhICxCKwp3o/2pvTao9zHqHNR7SZ22VZxDOCN5ZymvFnrqGlJejJ4wJZdHw850SvANK4+iPWF8En5sTzhz8ickO+wGejnN/FQdqI9kF454rk6y7t4YB9dHNtlZ4KOdSq1kB6TRzW56G2jn8ofDuOzC4YTN0nQtDxDPQValWtmLEq2RtlALu32ujnFY7fkXnlPSY77Knh47QS0L5yocMAZh8JNEB0cxaIcLFBwERulthK3RDU6B+Kurgq3OcgProC3XvFjpETYiIaVbWnvr68UNHNVJaM9wfqHm/P3v8WysD3upSqWsXOX28+zBYd7WIjeXz7fwXBd3ER2pqy0XXtEOfZwHZvYWYbBayBv971SMBdX7IyGtyd7R49Bc7iiZHedcFXe9MtXL09tJ397civlgZrLukGwBSya0hu/Ll49bMf4sM3CvLOHhLF1pSilzLuIN7S1YWIX9/XOcyzAS3USKXxE3rX+md8EIbIbkzOd30WtWGZezAeGyMSKu3J2nvog+/O9MVS8FiHv5YIjCLh/VtXNJ0h7F3MzZnY5K6eviYGtLFehrki0kReX3u0BbIbv/JUd/V6Ew9s3rOcZI5HgFeEDxrCmG/OfnnTPDHOKen61AkkzIVdpdlEg0KBB95a2uTMLrWQG9YCc+/GZdYTtWO9OOjoW2xv16xlyoC+Tp64OuNZrYrdpotmV9zG42pIICKc7Q1ymJKz8TUs1DXya/3PMEFeIKxp73GBS7Bwn3HhgZrO6Vkwyz6szBInXXa+8Jphx3HteS0Ixe9nKd1KwnuB6COWojjYFtE6uXQ+dKxc/SBua9evApkzuegSCl69fxS8PJnzJpmG27lIh0c+A0YwZl3nTL40c0uPq0J19Zizlic58LJX/YJ1DiXGo7oYnXG0f8zJuMC3tc6i3fB/OPgSN5qtBOH830xmXZHDoqAXZbOyAP70EU/Nv4ybkkQH1D+xNSasic0OHLJPe8JSsXlKtPzcuyG64vwWicx2b4M0tzun66+oB5efmUayKqntS0ItIdjTqxivVBKF/PDgKgJ7Yf/U82PDclMFuybfxqMMzueqiCFibfk+9ROJcFB7gvudFWxON0MXS1q9ITapq57FqjRq+1CMqoyuXXoNOo58Tyg8MswGqRLi5yu6trat1He0WlISbcaXXR8WOzzsd8COItyFHyttlsp43Opwos1Yh53EpxVps1NiHyvOt0i8XMfSml3EztkNK1ZW4T9uBzKPMWR2eRtlps6FCqhNKymLMsn6sOovMgE9GFh7RkMwAKrNKwsVt8Ud5XaETFpGlNbhGt/Ew0rv4s8bRzAyftwr3DEltcTmq51hNmToc7gfRzOIMJtmL0hP36YwFFipAmDgExfM3iO5+ocEDfS5yOrH8N99p6BgE6iWuQpN0L0GnfhyBLM10s+QkFh2wSkePAr8GogCTmVUiu044l3PHJHVY6e2JJrNaAuvHrnlTMnzSyKCtz2wMIho5xN0bWcXcVF860M4NR5aPIUE0PXSD6NRw06L3hEIsE0PvyJff0PyfjUcYwgUf3slj2Zw/E/3z+AWEBIbD3VN+z59FoErz24w0TA3XfINDcPCCuJeciwDRCczgiQ1hffwua8/N43RjC+ceChswmMwSKu0+0YwHPQmO1kPeaqBJhg15GPcxBcajft7l5CGccyBblRdyphgIQeRjvN8I9QNPK5suvQYOVRfW3Ad32N7Av66MejY/eOb1BjVelgJR3X168f/Z3F62CxyjdbyPljNdk9eu7tOJ8t8P3fDetwTx4zwTwPFdwsq9Hi4HPFF3ciowDSLw622JmEwJJiv2Pd++Bv9XQPBncujFQ8ZiCYOonCeDr2/qLqKqZ86pwpyJM4/dnzv4qOJhX8U+eerzW0yvtR6SPcmGrzNk+0/JFq/Qs8TyiV4UxP8Cz2uJpXn/PriTH8au9Plz9RPY9LHXN10vtoYxJVopz7QkA+xCasFgs+G/G4c/bL5B96MaAmF9TMCW98pnP5KiV4kQi3Kl4BB1W7aKG3fTKqI7U95IL0PxNLny+AquQhz2eBgvcGzIqpCip8MdhQhz1rzEcvI+Bu3i5qQFpgviQ3nP2XZss2IRPtNKASQKd+02eWP+dEVeeOxTzDsaHAV8guMvNtSTNsscJyrazPhk61wRHTc15djiswNXfsbkca9g7jZrncBB0DTkm2A7yIryd4M0O5ZfRnkeh/dWQiqmaPUgjW5CX9nozCPR9+HBaXej6TEzLNyKY4jSuXjGs9SCO7LUxa8j3NT7mHX3k9wBzjn9PICD2eZ9/tUoZms/MmMH1o42icik18HecivdycHVrv2Zsrogzcx6CWjP8MGMivNoi/pkCSa9fQJv6DLZJ8riojYceg2tGnfF3zSdee/D2d1E75v9haOcNEv5+deGPEx+KNvGdyV/BBwEYwuNdr7uUby1kf5yuHczlVyqsFSU02WPNi/5sj4FSD+y9pQzZGx/dr7S6u0+baP0iddAJ4HWlbVBWqwRtXX6DM1cVSBcqevPt9uQoyWkMG6chNJ6z2FGt7ip3AxUv1NdvvxTMu+K+yq3+5IuntIM4LS435c8COPvgeq3vR7sAmsidWUV0XQvoXkehNmXKa72+VXv69gfz4jTbJfUzS745c+b6U4PtFXBCkk8+bP5+9Pz8R9iHvK7R+4h8SjSvlHv78g78mm5Zfb8WqagHM8uEdbIewLKC31M3+GrCIexPJiikQaAswvCe2JuC0707/tYzPm6CU/Z6yXAEd5fu8bBXTgUTbB+7x4DbTivFaMh+kgrK9h/vTa8BDOXvoqnkQKfa4lMvUpbG+pS8RQkwODfPWn46ATy2k/tyPXmW1/AKrpn0SRk9Go2pdG81U9Lwzgydx5tbT2/vi2GAado5uGCWkqlMxt3y8NPM7u457TaTD+mlOK7Wwo5M2wuTzMHM72tHKnaT9mJoqi7X63UiF2+i1aTubHLcyzqcZey0+PbxE1OSDIEojjp171E56SOZm2KFQlfuEDSylXmVPEh6SD2whNyKdX1siJE6288YMidX1oFaS7X0lLgyY6fsxFbuEGbJkTY4kN8+wWzF1/10Fj49um+7fF1+L+J22AfnnLX1IBlnU20a68d1Kjrz90CilNtnnC1HV8TzTTHtuLqFy7ZR3E8K+TtqTbmXZCa9hY/VvxA20dxMW0+VVDuUpdyRPE93C21oH5EhX+9jrA6AkTs7pDorXDiowO49sWpuWYV+BCin8zuKfrrXluFfRAauPM7uk+lahqKnHbnNrAevlUXx+1SStc7ss6e8sT8SG2V17eqtxiFfL2oBA7hFP59yY52k3Otj9KOaZsUCikjKk2VTGszsgfcWj9MHvxu1FAYNmDUJPTG7vWz+lAM531vpAd75erZWG+T6Ogl7u6eAdMIqWxDJrM184srVek12lAwTRMp9Guln5SQhLWknTMJ7cip23aTmK5Owh7TJ3jhW/8Up0srvbH+T4Vz1PflaEbi61KNW/SYQ1dZCmNw5+AI/25p9R7q3IJPu/CQCHvHbcU+odOvbH+GjljVv0tzl7xavZiavGLliehUFG6OLLOav3PE0TrM2xs1ybdEJPcbgsCHs0suNjUjlKaezVzEzQk4SBNzbV9nErLjk1FYFH+xUX9Q26f/D2VAQnynsOf8I/xHIbMkljdCTVuCiPm/+9WsJxTkurP3m/0V5To7U+zJhsNLfQWr/T24v8hsMvyBwylYW8/2xvq0P3vF+jMjC28sVDEkx1edDIf+f+kvjkwnAPf2/yUxyjDcae0Ub6DOS7BfRrgE9hU/69Pbh//SDxyq/xTWuz054oRB+8pE3/W5Kyh0rd21mJHxXcogH/e/VlR+Ce0MoobTQ+RVlxu392qmaH1/WNL2OWS4wIUrlCpq1kG2my1xTgQThzSWgSRuNXGMO7aHLgMG2oBg72COFy04uIVR3ehTFoO/nwoO6E3pehgDUmYh0WUe+1merOHX0mh1Iw9iEheCdkpE86zv4WzE0woZlpgdl24Bsd2qmkxmk2rqiUOkEw9qnM2UovKVHO0z1dW+8mVGcQnbuyFjYwMsxTKpy1EcFTyumjZDR4U00bQRQnemoj1umJt1/EYRBYcoug7+hIXDuwcXzYeIitmfgPu+CL1hmaCjnqkhxPQYQJAkinykBjG1Vm4QLqEAVwDcNR3Tehz21Orx0MmmsSk+6s2Xev/23GktB7mtH1yBPumZGiojSanHxKB0K3KBXRzJ6HRAmOX8E92QkxdcW/2YapAOCmBa0C2KgP6WLj2EBVUA2gsEFKuqCwQanundYQtHZu24xj0luUXYq8hTc24wlGUMCX+hvkUmzI2qCs5RmBNmCz4QYwugbZUKuCnwqeHn2zilZkoBpeGWcQwIKB3JwU25z1IwjoBae4vkKKewOpmhyUgKBQIYkwLzl+tvkBmo4n2cDBE3OXwPSssr0kmYzxD+qf0TIyFC0WLACZW3oyCE5LSJYRukBmmCyhm8akM+0KyyB6Zyos/tRRB+cxUuyIyhmMM1OWOIKKBhzUuOsVW1GJ+Sd+NjlL+gIBdSDx2/gSbUOamSDAuYVTeea8Fau7kzSm2GxBBE5AkoqUyfAQ9wCcvCz/2NSHSsgc0JChRXcmwVgEBbMz240XQb+gzEOB9PAHOEkyb4Ov2bM0oLC4bf242WCxd06Vkcm84imm1x3zg9/zW05wKNmLU3J48TVEB9MzdyiSTGoWAmB2QqE648Xxq4mx3wQyJ2Wmeiz9eolGtBZgD8mm/zyBnf0AmDPEa48X04INb26S6/3cm/oPo2i/1DBK/z92t+TFENrQqe52wzW6EwiEG/1YARgMw26YIDBcU2refu0eYPfwLB5vzv2xL11+jtFFUilz2SMinU4SR18uBYVo65xAaIRex3I2kxLG63zeWjwEMEMwLBy4D3/W7EG1ovYNp+bgOjW+SgkmYOQ2ap6wzcMiifQ/dCMetaz+c1P0V8CtynWjILEoP9D/Cn61H0b8Qq0zM3/W2EEmY1P0q6Zl1nKgpBLYrqkAKRYW3+LzjZS7YPJ8B/23+hjzkm6nB62svzVolk3cmMewLk8ALuWgIyEmlYIt6I/zLB25wAh9YITB6+j5+WDjdOhf1D+KlHuQ9i1eeUe0IW9cHcMw5EveiwVcqrE0BEp4LZEHM2Jk/G29ul6iowqywIhBlw/O4LyZB+Jnp60QMywFQIAh6+hXuT1j8m1by4O3QItOnUHbBgrHv2zKwYkA2wYhUzCtO1yn5m9PWDkCQPGA52gV+GMFggtk3bGy+FGO9PVoASTwHuWyigh6h2Uhy8TPWd7GwWJx0Vc+i2WmnBGASBoMABUKQYhUqgtiq8wFkAm2ohaURt+Fs36s+qTSi7n3pm6ZXN6XEJPu9M0XUR8Hp6EEmzGyRTty7YMGYV429BFs3bIba3zBVSleOC5SwOYAIrol62hWak2KS1PxxYN9xNG1iHnUdxFhkq814q2yj8KX82HWNUn+YjIT2S9jynumr3cMEo3jO0ERjYT6AiIDQNtiDlRLYWgS5Cx7kZOlr13BGom2WXKxCc8CVnQEFQVebfHbEhX3Ow3YNahnI3yURUOgo6szGh4GVkYw0MRuS11vuY2C3CHCgxmQR0wqP8g4U6tgoqt90aa5UIoEEKHWh4qA6h7n0jaz93+ONkmGhbYiSesHiesw0OiIH2lvun0i6OzHGwQlE0FWz0I3BKew+kU50NGs4PhgP0gDWyGmCsGUJXW+InDurXAQhyFkb+G5zW0uLhU4Diyohgd24stNAQhscg94hb0Lsldj/2r+SBuawnEBoEknyV0OfQ4gKuamznkGXh3Ihh/zwhqEMph/3gT20CxpkV0P2wPVzdBckyx+fQTWEp6y+au4PsyeVyuQH0kK+7Sjf804PHByPyrulX3LeboOFI4sOfyrUOHm0sNvACMIWoIrxWkysJuWzKzVhn3Dlh14IVhGn1Uo2sOu48sKTWYsJLYogKNhusJNhgsLNh1U1HBXrV3GsGg22P0IoOOig3BZnAmBRB3MeCEOxE1ylHO6E2ysyP0aaKwKOOY4Hx+kRCCoFEJj03sJec6t2lyLzmR+OOhvu+o1cWAZD4Y3xmDhcgPX0SbVEYTV0fOvFRAORJD4YGWG0uw1UYwGUNVU6wLzWojj+2a/WLSE81NWD7jGmJbH8hWgNzCCSRh+BUifWAo38h2hH/Y9dCQhUCyhi+RRBiocOCBjNASk/7FzG9txAWS3AQht7Suesd0GgXC0x+LODbEREPhWZU3XUpbHKQ68L+hGULk+AYPEB8K3/BYP2H+0Fh1YhXx7wo4ysglZgrmAzjSYXK1gcw8JxaFQytO7ZD8+hA3gMyRhJOEMwcKN1BCq9jyt0lVm4mBvkAO24wmmkxhU45+SwWZYP1hQyRU4URA2Cq82Xw4oOGg66EMA300ZUHRV9wE3npmVtlVBlJFqhPhnseKawWGn8IomPfjhmBm16hKYl/O2wOfQtklBkrnknk2wLLYPCVbuiANQWeREYRev0V83jwq6boPuhjKyDGmTG1OFMN++jC3dgmK3ustUOcgO0LNicTA3B2dk34BCzCoNDgCi46xcm+Vkbi90lMmrUJimsMkdhTpFH0YUzuWx4P7UJU1jk9vwAhkbnI2YU04IpE3bBq2z2ePUxYS7YMFg0o0WmPKiZ+ZPkDBMUxUoS/1+m1kN92O02IoRdiZ+wmzN+okwC0CPW0m7rw2eIfykRxzz8mSIUCiIiLPOuLjLac8SiRZQPtBM/1DBVzXse7DxHoY1AqGOj3wEpdXk+4/yzS/hn6WyqwBouvyiywe0mBHS05+9mB3S2wIOBl/xXBlT2GQ4+1DBgCFTB8wOVW9JR2oEwW2BkcS3CNrSH4kAPmB8insaYyIZExkKSEs6W4sFY2zGmsWa+4/2yowl3fOSy2amPuxF+doJl+cC2V294Hi+8MjgWscho+h7SZOcJzkUocJmBQ8NY+Sy3XkAZHVQDTifWouUXWS/02wUQWhWjWDiCMwNSww6noRzYl+RyfiMepIC2mMmmmAJIL2RdSIsmuU3hR0X1CRlQD/CQsP+WkLSSk3sJosAinMW3fm38fcPGBeAyiWY5yp4l8KmW/4wjAQ2FKABjn++quDcB+4jiCr2jv8a2lVmOoW5Ou4K32ke3VQn8Beh9hFASEEySIhjyO+LUOlGfMC4IP8jHomij2+fMCyKwnVEoLX0b+NhzGoGr2lUmJV18VpA5RWQlAi23zdyiNzsW09n7UXXzVANLzLajyA1RmLgjGZbXkUX9Bis6S2eMiMJaSQMHHulEzfGH4xAm9I2/Gohl/GFI3Ywe9CDBwE1AmDI0cATI1nifHyC27IwiGZSijWZPX24AYL9GMaPWCROwTRyJXZGrGDBKNqOzgkaKR+GaIo4YzDsWxsE1Y/I2TRwvQ9RhaE/GJI2ZAQ5gnsYJBpCFsEDRNIxkAVaKIA4EwberXB3YIUBnCrxxvKpRjV+cGzns1QMyOtoO4sohHSRLxzV+kUOnGISO9GTJzxyav0xymx35M3r2aBS3HW+X8C8c3kPImKQO3GhtDByUn3zgEY0aBJeig+YIwtEvaOuUb3GIB8QEPUqUG+mioiaB95kUkOSKhqSkKhmg4Onq6SLnkKuwbeltF6R0/E1e1izBKZ8xhm3KxLerJ0lykwNKMVwMpILf1KMqCy70MUKGSKMxV+WC3dewSPWSxalxiqrxGeCf2sRSaz/eqQLHE4lxXCdxStODRBCenZHDmi0lMS9cBvkNsBFeDCLOhIvxnhTNljhQf3E2AD3Nmsd3wUxExFWX+2xeM8O1OlKxT2gYJdOPRgCOziVc84d0/4OFySAEK1H008ITiFT0kOOq1PAsgLhostyVW7UyEx7ZjPsFa0k8CSV1uXkRtE8h36QtgSIhsjBW+ayzf8wUP1W3Q1+QamNFq6DD9hmLgGUqu04Uy4woO2h1BO82ABmr12789K3bMelEUuquFQRtJztCr4j92OcUQa7czSYYj0t2QBguaOb1P2xu0MRBt0xWuOh5+4s0EmCG01i9Pxgkrh0TmlKmDhGuwkcoajAEw5AC+RAINu7UOtWZ8RecQS1RuyuwIRKnh5+GQBtE8N1KApq1SWmiiaW8N2/gRAO4O0/D3AzDwYks7wT2JTBdqADVJKiRG+uWQklof+zr05CkUuucldeWVnAaYWIN8k1w08QmLKIKYOegA9yB4e1ykA4UPOumXmDh+4DqmcbzHEnaOvOaYWFK510kBaexWqYJVNmZR0o6itx6sUdzVgHn31GkcTYh3NxH0Z/Ae2d/FEB09H0xQclHOy+0EulTmBG+52pB7wgQ2kYiJynhx7w9GPq+RQDBxdAnikcj02mM/Q3OX+3OREyEpummIFuWFw1GumygWc5yd2oBF7CoPD/O7kDuKBNwcoNJ26Bt+2vuN4XEu12B0eD82UWO5whMyHwgYsk2YehjzIBJtwJ454M/USkN2RaqxPm17xlmhRXr85MwtIVkMsB391VhZcIqu7yRimX9gMcQR1VSipDSsBxnEhOIFhBrKzLqzKzheE43ok/1WzGQgS+OigOjAUkxlxtgjX6AvTFWsEPKYg7T5+wJ1IixkJUO7EGCmT1ikAUzzqWwX3POroMego6KdugFnBmYuln+WyF6RupzgRe/2ImKwOsWc2zimBblSw1PB6B+/BV2yLFcWjlxnE+rgkmeWE0Ar6Ntw92O0hoQ2RCFaIpwraJrRwljrRqqBT0VI2bRPAFbR4E0PuYS1egKUAieaU1lBXW3MhQ+PS2RK0No+yzZmeOwCcWvDHmQqFDG7W2zGMEh8BGY2Xx4+LXxpS0D4Ctz7x4O2Nku+PU6kCw3xzKxmo5oxPxUrwHxlKynxspx5OPhwMwa+P7O4L33xg1S8gjeL5wzeJbRreLb23uA7xAEy7xxWhDRbaLDRjmzaIQ4S7GETltWAXzaIQIjeWS/AXhnnwf0l82uOOKON2vyCpUcKzL23mIl+wBnkxSqKVWuJQ7O/ixL0EK3b4oALM+wJEdxuiw8uyx3x2IyHH4xiwacKKIn4I/3Ow3603Rb/wTBMki+2TPld8UjjY21QSO0zW3SeUl2sW+zDdGJuIlgaexhm4Gxe2N1DnO9P3XyweIB2w9Gns96LTBfvApB7azBGQtEw2pdSz4pS1qIgfi0+wJzcOFH1IWI/zSMbWO0JgXlwmUf3nm+4zKQOwKHucBJTE5+NJSVH3OwFa3a2vC1NBI/zHUoEMe2FUh2BaYLYw3ZycJpiRx+1F2sQpS3b2HsM8+aInvRpS2mxUIM8+mmzG2amjXgX8y62NFlgJDTWV2gliJ+8+NjWDTS14vWIOhLjxUJGmPKUMX1KAGRI6u1VyJ+V6wixU83PRl1yJ+N0jFGHKWhGzO06Jh6wvxjmxtu+aL6Y8PyeOouQc2Hmz6JxixhIbPymJh21a4q4NyI4wM9EHmwWJ9P334AcPmJ7hAg2rP0c21ALZ2hARvEUl0+SqygOJirnHuUm3oOwM0O26s0AQxuzPAXoII2zW2AMXcPCWTW0O2vfEtuznwcoFqy/gsvHRB/BMc2+3Erqziz+2EuI82i6n2YjBPTK5RMyw3xmMWP3i4BuxOl25JBv24xPp+cxPx2MxMGJYxLq89PyGJcBPnx1m0ZUk5GvxRJOvORwz7BEBKpgPKjfx740rRXqK/GLePMQd9T4JiwxAkneKAmX+KAJ4ExBejBFq+bC3mOj0O0g7YhU2h6jZqoiyJYkC0dCqlw0mN5Wv+u9yVWD0ObmOgRpw9KIIJJXQXO5i3YuOh2tsv/DlJaTH10Pmy/2GVyjAY2EOOC113GQSzlJ3flUOcmD6+cpOqm1MDYWoqi2QcpN7WnyhdJiN2F++QNEmuvnbWzoCEC3kykAf2xc26BO8WYIyYIpOxcE3k2gWWemp25NmSEoSMtIJP0VJ+OyxOcuMBJaZU2mwaxGQeG0CmlKSp2ni0OmSZLIW3RHvxYVA/EoSKqwxpQ+Jc8ixmnyVwUh21OJz+BoWG/X3xFbxVJcKKKBo+N0MR0zCe84zzs55wWmcNCtspS2QsGbimmAehSh45JLUMELVBfpLuhh2wN8LkjlJZuggy0uyqUw3nMWdcAkJw9FVC0iwPKNBx4wHmzf+LRN2JZSFbWb83wJkxOWcaeIvJxFEeYpW0VoQcmbmsW3sg5yA82OcUxARaPIqJOMe2FJkkRgqKDk7hP4KhyN8BoSIgkDi3cJkMNqRykBHADOFUWDW3omSi2vomryCJRRjVuGk292GWzzRQRIRWPPlEmPKjdWI20pEXZJ9cTx3VQwuBpe4Swqe/I0imf4VmRd0wQUI+IZUN02+mY3C3x+aNNqeJ3wEG5LJ6/XD7O0GICWbO3jRVSkKuIiMbmMikh+kblSeC5LKBNBLdG8aIxhU5L3B5sHcJTKSrB1ZPpWyWzI20U02UApi+moFN4uh53kpf1RokRZIxcrBCSmJan24SFIE42CCSmcG1sCGlI62fhMiCZ4G8Jgw0MALyOkmOSx2J2qyjA5uG8mJTDix2kGkhR03rJmGKeJh2y9w1t0SRXkRgk6X0MJ+R3qWHZiRhN5JwyNO1UpaRn7xZ5xwiok0D0Ktm3x1mhFuBiKuapSxawtUE0WynVzG45MAxoGPO0VM1WJHglxi2INMwgb2EJyaTPmT4G0xXW3yqSG3wEJUQyp++3/6F/1QW41B1xtJwqR3YKKRopgGOjtSSkkpIC0cozUW11xHJpVIwJWMRGhLk3y03Z0dCKaOTJ0RBjYby0PKXZPHAGx0pWCPQjJXkX5JLmyFJE4Hfx+I0ZJ1aK/xLJLbxv+I5J/+K5J3eJepwBOiATI27hSUmSW5bkegkV08OxQW78X22/uYN14xQLyHm0m26If5yZSBUnHJXBEcascK3ybc0ICwsklxYoP3xa/zw+Dc3Yesq3rmbTX2Y5b0HB16LJprYhT2OSOHmBx3opdxBkk4gIKkZXA0pk5AsJV8wRWI1NYxNEQZ6XkynOr3BRWXxjmQOOJd0F80cJK7lTgkJRv+FFl8m7hMOodONjhtWAGMitKduBbw5xdelyygRKoppRlex5RFVe6+OmAQEBnRIUKv2UUEOOzKM2q1pNeuC2X6JhEGwcy1wSxyRJq4j0LLWpAMeBHmwlG+ZNQBnUOfJYm0SGYhxx02NKyEOLX5hgITOJRVkyq8AL24gz0O2TIRYJ+o2rYSlLUpHbysq9hQ0psMltmtbxumSbUe25uC8ciOLUUUtNGmWJw3OT0GsJxtOT82ng3OKcKAeAFJd05BNnR7gIWcCd3zRWVhambV2fUNXAKWFtDshi8NZki2W9piwKIuIC1lWiPm3xE1GsJscPeevpQSkqxIrotSKgWBbnAp8pw12l6w3Ok7Ei295iZIf53b4C3Bq2MkigGDt3b4zpIhJN0nphsd0M06s2a2BUjZJ4mIAYVbTOJEtCFOH5zLh7uVWJLuloJnzTPBlVKsKMd2luIdP3xgdMf+Za2HUAdIT+YDPyeSkIyJgtHwWdtObiZxOV2cPzgOz4OfJdyGuWwdMGYe5OHi6ZUfOqRy02WNVSkMOMHBn9M3RjuFjhgzQFMyOx60UX1CsT1I3wn+N+p71J/xkrT/xGuiDR3JO9RveIE4Me1IqZMjO0/ZxA2Z9Qq0+nAVeFY02cR3yyYSEK9aCKw3B3d0hB4C2fOFMMJRJ9LTKN4kdhcyCcK+iPzauZxU4PVjcW1vwfpGUN2UUDTsWtPgqYJ/3nkgtLJRhwTpW4027BjC3byv/Haev50XWWo3/Yn0k1eGTGgio43/YFtFgxI/Bis9axD+iyAyUefD4ptJjHmrLCO4k13O0VbU8ZQyhumpsxl2DYyJAwr2l6Ptk2cxtzHo5KwhGdoUvswo3Oivaw9un9DXiMQGIo09nD28TA/h8lJlRUFwDk3cI0A1l2dGRIFWEGwUoW1qObmRIEy8KxNQOjNGbm9GkVSAx0vGDPSSZJeg0W01ONkF9CSZ+kmqWznzRUJ9KLhCST3JqokRiSTPXk7QliJH4IqWtNOcG+aKV20VIgpNKLm2B8Ue2zojH4iS0tytkke23d0VESiz2p6pLZGCMJ3MnC06MTxwCZlukQxlWHNGrLHTKZ8wsmDoheZpeExc0bxrIs5Uz2GTKQOM0PJko4XrmRIDH4D9ItelKSeO50VECdPwMBoHGIGaZMcymXne8v0MWBpaOIo68iluHaxrhDdKKQMZSBhpWRwY5oyJAa73bq2/1cWAJLdWZuESI/MKPszrj+ZimBKo6mz1SLxNUWfcKJwaP1pMRpPHQ4cKg8P3xVejiPzRWRKkiC2zE2ZnHcJLklAej3yz4AVL5pT3ziEXq1qh8SNiJ7SlDWojE6IGY1yIPRhm+iyEBC2K2mUnRF1Zkk1/O0cnP+j4HnWE0l3GAoUSOMJK9WRIEMm5zLkBv/Hc2GTLYU+e392VzS9Zvkle4+eyY0w73XWZyC0hkWJ2KYzDJZVLOhq5+wUJYbNxi8Fm9OVWB4hk61rgP/iOWiGhD0drI0OTMJI2ARG/28Kj/paowvmy+GLZjZAXw4o2bifOPykHl0Mxukjb4pqw1awVg9k+O1QRdrP5JKxPos1IMa+IEkPBF20lotBJAiyIiMpHdJAgVuMe+cVHQpy+NYeC2yN08axVZQBgh+9TnRAXk3cJvC2+M0BJ8pbOyfQNcgUBQ+x2ge0K7GxfSkJJ11HE2/hBZ+cAk+MOLrWWhIzGkmS5c4d0jEh60WQmM0AZV8zSYw2LTJiyHAa8RIZpDlAYJ7I2A5Ux3/u7Ymh+kHJ+qjc09e6wVZZ0JRBZ2VFkmW9yu0PLIt+yx2gswBkz2lrJvE7dxjKABB5ZLoKRJTjWtxQuEgWtcCO0J9ObaQ81PhY+C2etIgfZymx1mN4g4+8HJSg2llCRmS27OCMLkUJUwGS37NlEf4SOmhQM626nFDh5YPNpEExWqF0ncJTGkNRZKPkUsclApwdzsW19ywochPUo/1SSZCgXvmuRCB4yzL0h2nmR2dUwDB0o2LSMkl521pUJm8KnAaoJzuRGV0tZtq1uOoO0e4czJdcKWPoOiviSZ930roVkCseJcmdGtcBxapF0Uw6tn8ZnLjE251zoh1nOmkg/FNe9iCMBiXP2YBX2pmK1xLKzvxpR903henz1cWfQPSWAHGVZunyYmbiywEFTHKmDPX+WsWw94fk0ReN9xBev5ySJQk35WV9Kymr3xoRsyxIR8WWHh+VQR6hZxpY3sOmUzBPEhYUKjc/7GJ4aj3H61uK5Ciqww08KzNxxSTapaCLWQ0YUkc/Z3Q+2cMlKqqmvhn3FvCmyGFKk9yhg/EM2QpvmlGHoFB4CEPJkQdM8OEwzKUl8PWAEP2fUwCQ3B1tlVUG5wlJH3P7oJ9I7W2tHrO/7CZO25MrWPKlAhGGk1iNLLAUTpBh+p7QX4Jt0d6qcJZwx3H5hQBjL2QsMU+J5zvKAWhoRwXWbppZTZ+aoEXUgUIhEQyLZ+2d2noY1AqYLP1y5U21sCdy2xKkxWmBN/zVRq3E4+QqiIJpnHIqA2Opmakzpofb1Ym2pz0uWDkaZmWz4YhglVGrHgy01qyW5Jr1nOk+SFRD7LBK1NgAYh6hsOILOCO2UWrhC4JZobuQNuizEjExbPZmBTPiQf20/M7mzzZm4mhO2bObWqMUzZgm1t56bPigFqxzeZXCYu6bJrkkOL1S8aj3kUazgs0YHEudKz/CTqzu+MOwKIXVzZqdrLcuMiiXwozFl52jDSkllwsRrj015/1T2MZPw6udrMCW6nM+eho2XpshUdufmkEwFtHJ2MbUWBjk0D4T9xkO+4kWYCyNu0FojauIpOVy46GTCObNAJ5DTnh5dEIpyGzpW7z3++wr1m557P5sz6G4mjtEJ2nhyWQ/M29Z+CgbhFeGDuZE33qw/wVh5SCO+UgBNOfDLKO/lEEZ0pieparEakl2AQeVLRcwQfSS68A1D6vfWQGpfF4A+eHCAfCEgAIACnaBeTfKMrGtm7RERoGvFf5l2DdUX+BUwAQxcMU9m7atjX6QlcDPZrzV/5hjAAFS2XagH/JPsirkAFH/IgFEqi/50AqAFUEBUGoanEcaAvMwYxhUgimGd4XpzQsRTVP5Fg276bHRMaNgzUMN/PCAd/NgQBQDJq1xVFKd9Vcqa5Cg6ReRMu9uEZ8dIT/5HYVSADSP9Mqf36gkDg7s3AtbsHgwfpP+Qw0c9CcwHqTgGixDXaosSCYKsmoFtAof5DAqqqGAw8GZCK7SZRXaGhEC6Qa9SQF2wxU49nWpp5JUPwlGHrRbJTMFxLTXwbYErYPBHN6YQgVg0kVEAcrUo81gyjq1/MIANAvv59AqNaA/Sb64jhNKDVQfCLxSwKWdUv53xW8Ft/L8Fj/ICF5NVmyTrTXIgCGCGr+QdaFLHtA7XiXc6QpnydWUH6N8jcy/aEfAgnTQU/glyFkhRNaSIiCypQnGo+7mX6WQty2wbXbQhwVJRHdSE8ZQt+qJ1HqF+A0s8tYTqFbQsQ6wjV1woHHus04QkFhcUyF+WTGFErOoe77VH4b3hyFNM2boCrAF8BbXNaraQb6w6QcFIArqqQOPBqMrT3A7goUiSA0XMsthUFcQqf5XHSCFmwm7a+lScFrqQRSEQtaq47TOsURQuFdAviFnwRmy/xUaGKQqZ8BdEX6GQtJ49oHTKSVXPUORUpgm0yEEQIrYFosGBI/glhFlQtza/wtOiCrnWQ18Se8bEAgy6Iu7Uj8SGFH9lH4XRRncGIvxFGg3hgRQuyO1BWSoFRUhI8R3zCa3Ndq87jpFBWVMqPZSVqwjVH4bZUBFIMQn6Bp11c+PAKqHbRMw2URwg5zmP5+4VMMlg2Xongr76VAp8Fqgv8F3wuf5HDSEoRXUVcmkDs8qbBB4gMh4FcDQ24w8Ec0mkFuQEWg1FOAor6Bop3YOopaYpeENF0m3jQeosaGaotNF7ZVVgzouHAyLFEFYxirYM/TEod5CB6ocBB68gtlFV/IJUHwrUFvxUCFdfBh6PlA4y+6V+0ik2KIpdAAQclEYG7jl8sMsKyaZOm0o8SRn6sGjTGIvR0oeYvK0/EQ14GYqVhBYpmGPiRHkt4BeEKtHLFyFDrFhYtzFmYoXUKtBbFtYshIj3TpyVbVtw8nGpRVLQwkJAtJyg+1HabWWFaXgrDFCosuFCQsYFfegbKAfgXae1k0AzwvGyrFUiKhfnDFSouVaxrRRFOvkR+lJHAkpRkc6TsyaFh4o0ifrQ5FcjRaFQbXPFf9ThFebUiIPeSPFl4rtqHYWda3FgPFiI2YiqbVJ4p4qTawkTDa/rV/0mLRYxnpEAl+Qw9wN4py54Ep/F2bXzSKIoF8VhVvqo4FLFJHRrIyEuGgk/jmF7Qvk8HyPWFRJGwlKwutaxVzbW21HBhJMWIY9sBn6U0gY6ewjVQxwtOK64swS5wunFnwvUF39T70VmEPCAjVCFPACKqhNTXKUQs3KU4tiF7EsjFiQt+FcRVOwym1qG0wCKKFLA1A9m2aCq4zVCmZRRFSkvSKgMFAWyw3X0Cdi0liNK8Sl5Tx4HIElqkwGfUCktSKpmHfUjdFUlC8hza8bVMl76lcIhgmvc8jTMlbeB0l/lQCGc2GYJnpEboTPl4MGoGUB5rVuFmxWAl8nmCl07Bclf2wmKIen4anyRmK2wr0GEuj6BYHA026EiyAjEpYqPORYlMQt8F4kuVF1wrVY+WHZow8G6sfEvhSK4sElyQWzq67WyS0Yi3FXwp3F25TiGGOVOix1Eeg8TmAIe2AgynUppu9koQlsI3tALTIv8XUqnE7gwns+0TvE40sGl8JTalCdg6leCEOCcym3wyYQgay0qAlV4rQc17S+ik+BWlwBBGlbmT7wB0vfa/+Gxi7+Hmqnw1mQF0s6l3vQJFO0onslqO2oTOxgYT0tEygMHmqvZUncdxHk4rz0HFjOGylwktRqygrYlEYpjqUfR7FFWAH8Y1B0sQ7WEqaAX1aZVQ6qdwCalDAukqPkry0zkrnBKRXncWMs9E4EhM8uEpoMELIJl75LYycBka2BMrzsfpW2lrrA1AnUNvqOMt0lMksZlWEtZYRMoel9Mvw6d7m6schS7wDMupF34ongAOQclEgysYLYlLqropJlDTh7EK6QqK7lAf8eVk2KiksXA2gWmFl9XC8HICsFuaFhpAMvhlr6RHa3DjHazErOF+UsVFzUr3obIzsGMAQ9wuWGcFFeDhlq4ptK9UshC5spnFGumtlPwoC6gAJhF3QsGFUwpTEPeVqFrQpIG+QvjaGoABF/QtDliZVJ4MWjBFblQGFYcrjaEgxcMRQoqFWIqDlkrQzl77WggRQBxFOcs5YkcrRFhcq5l17BqwomX7Qo4o1qxDArlurk2F9BTpl17EogjZSXcDcs8qZ7lQoqHSrlOEt9qqDG1IqqEPs6ElmAQMqRlOeXYqaMtnFGNXC89sv0qYJHb6/EuqlHOURlCgqySbstElBUvBlLUsklV+mLlwQ1YyUnh9qFLHjlOIoPl3sQVlvsvSqcNHPlM3mR8wcrPlFkNzle8qTcEol/F87hPlDdFGwp0uJlHuCBAYErCEX8rflJMuTqQgkAV8Evml8bRblmEsLaiEV3c6IG7lGVSd6EUrG8mJUrliCvbqPRVQVAopPg9qVe8povj2iHl2EsQFHlq8r9SUSQ3lFso4lXFTsY9RVCarZLhSuWAK8I2UzqLwtNlIkvlFYkq3lgaQxlLuToEh4RGiyxTiaXWLEyuOjc8Tco/yf2lNFOrmgUtwv4V/riSl4cubyGJHpKXLW6KwhWUV0vBMmAxXEVBhQ0VoTXLmywzsK6RVk0t2m1ye3Jk0WirYyD4A8lIivKKl7WsVRaXTcywwcV5aQsxRkrp04XjWQaUq1YGK2HlnfSRSRsobc44vD6eUooVHsu3lc4rsY3il9Yu2zhSRjCYVIRRYVa4tyl0QrCVhUoiVPCrmKiEKFB4vkH0bkuyVi7Bzm3kt4F1UnusOEEqmpJFKVnnSCZuXLLlePDLusaggYQCtnws6Dcy5So1EGGWY85hSAyTSsglReQrwKk16VnSthGrSvHS2cWBF87gaVVnWn4yItFK3StnS4yrhFyUDG40ytfF4crVYzHHpwTgsqlRCtgGhsurlQSq1KE4onarEs4V24sDS08oy8DNAIF2XkqljCudldUsUFJmRIIk8ohlguWxSHDQZZ6RV1weGCd2KBi+V99ksotMrfFnbgBVUOU5ct4tqVT+DBVMuCyBORQ30LXg8IXxH+yaLVA8CKvfUupDOy77XRVQDnAB17hxVHhDJckKpOZdSqpw4+AKI2hRVlJ2HaZwcEpVYipBVjQxpVsKqFCIBnJVzKoUVcbQ2VXKA7slMQmsvwBIVIYrNlaSq4VNcUuVWuEZ0vMznosjmPSwAXcKY8snFHCs3l5yt/S3VQCGGTJ8BR4FyI//yggebEH0mqqF6ZqiiENXgZZo00twYvJUBoHhNVR8GCgjzCNVubV1VtmBvh19Cgg6qp1UluAzxdqp/qExk5IO/Q9VH8CswW5l9VzqpyEgwkMYkJEVOlAKWJNcpIcDjzzBZqp56blkWEGAwDV+qtH0aqjgF5uGMwWqsNVIaqf4fFFy6VOEhIjcxKSwUEyZqKtR6Z4QGEeap8KL8DucC8qQ8j6AFVFAoVVoMrOVlsrUckMqb6GoAYsmJUG0+XgeVwMtzq7svSV3CtVV74vtg5LUhaVKolwkhnjsaUnpViis+Vs6vqsf20KJwjAnVVtAUYBEvNppKoFwdZW9+udhrIZ4v4Jlqv3VtzyoY2ioZVcRUogbMsRMF810lN6qFlUenIM/8uKVnbntgMyoUwNsAplH6vfUr6DsltgpTlHDV/V/5lo5uMssw8MD/VL6oOuHbRqwmYrAg7OML+g4oqQTaqZaLasalYMuVVAuTFVf4C+I4pH7aPAGPACSreKK8sFV7CtbVSqvbVAuUyVjQwzF91n2MP5SfwdGqPAWouraAQ0Z8LTI1orGvQFI+lEyDGrfVtGvbZL6AK6h8oXJoHiCsp0VGIjNB90u6q3wWZkroUmtE1rP1A8jPnyq6JFGmti3faEmqmaebKfVnf1A8sVCbEOpjE2+7ncVhjHk1R4F01pmp41/VjwcVmqYpfcrdYnpO+Q2bipaX6BJyCxFooiA1eFaxhQGryvzqUYo4aI23vSQtU28EohC1aMVdwjotoaO4lCaLMw7lV7QoEcWrL6DosMYwWt7y8WqZFK8Fi1veSN+eyNUY0Wqda6WuUAoWp06OWonSuotAKVMDEsSvjc1w4s81K9G81bCojEfmsw1VGrMyjAokGhQia6YEBzZYWrNp/pisYiApwohWtb8yyv9yfWvUVgavC5qWqkKFeAm1RwRbIn3AW1s2pNa3WuHgvWsW1qsBsBG2vcomwy74EKS/lzlhe6lUq/QsgrP5wYubVcooo1lCoklnWslSsn2T4vSGTcT2vNF6qUe1JvDcG4mrWQW1kq1Eqg+1I1naSAOvlRq2ve1vcle18qgB1GTFB12VSuc2yzIEr6A56bmtKapAvP5PfXlV12ow1baqoV27QYCYkH5o9spZ6+OoVoVhRh1u2WH03sERsQlKecxOuM1pNMA1Kgjmc88Axs1OtWyhh01YpzmyoZOp6qtOokMSjJC4TylAs+mqMFNxQIo1/XnAJ4AI1IAAAAMijrPGGQKrBldrQxYqrbtUVLAtatFlAOMc6cFmKGnJlpekMFVjtHGoMlBRVnepKkDdd5CuBR4ziKvYRDdV2hmdIWKAHP7trtIphG2prq0BFZM8UinVTdRrr9ZvGK0tPosPhtpwcMhLrPuOrMRerKkFqJTohiB7xWEpf5aebeFMRHW1H5WmKAEoJyc7InrkTrHqYFunrE+F0UpWSnrHOAjDsEH5pc9dVzY5RiIcMuB02xQD9+hP4MpYsHqddTXqstYmBfdeeBftAOM9dXQw9BK7BD4JmKyFF+RSiHpAcmigqoSFpFeVTwAXMB5rTWAgNB1YTRh1SKrsNegNlBoRA4PBSImvCvqp+hqAeegf8CtdKwayDlkttQJABfF65KOrvqfCuaI84teTpanCkXMOdrUdZdq0NZjriaP5qLlUvqAhpCQxKFwKbNU4LP9a2Judexqprm3r7klkJBsPrFBBW9qm+mzRzyW/hdIE2cJRXLqGtQhwyNS1r59VhqOtRoLVRROqSWLut2BirgU/DgaRdXg16etgbBOhtpypWnD/9e+K+kM6S0xDgaxWAwRPJZQa4GlgavRHQaFWCwa75DDqutAZ0HDoNwPYRKKDZffqvNbPrbWDdrwla/rVrC71GfAdwwRpNBX1LU5xdS9A6cXoEz9QGEJjCkAFRtdU9fHgL/tCNqIUpEFMhBbtj+TTEWOgrqZRUrrfNagb2tZVU39R2E+kNL1ShJkYynJ8cWHI4bNfKNqGkm29bwAq5+4NpQxqL94lsFwbhLMX1ypcixpBTIZTDWjryBY/rldWIaR1aKrbDTs5jqC9RODewR1YPP5DoEwbsgoDBOSGmJAbDkajqGUggjRl427FYK8BeKKimlPr4OGD0MdbEasdZRqrherr3xdBAB/KUEsGMqhngG0aIDRIM+aOVKujZywMcp0bS2FkbpJb0b+Gv0bMFbmiiSB+Rj1ZlxVDSiLCcEMatxpyxFjV6A7iMUbQ2DtRmpCFdsCVS13eNJYZVZqU5VaQq68uVUXlW1qcdeuZiGC0LUJJka4lWnUB1bUbUlSrrxDR2r3lbjrXWJi0lNYiNjOeBqPcF8aRPJ1LOZcgr/jR5NATZItLJSRKMZoCbpCMCrF1T5LmGnpqdJDq5eDIibeZXUDK0jori8GiayTPaY1FaTwcTbfUITaLKhpRIMG3mNL5ZaW0nPC9LKTT/LiGCNte8OYdp1Z61AvP9J50pRLUGDyUVJdJFfkoxVUEscbkDbH44jQvr0DZxLwvCaL38Fn1Joo8aTjW+EUZQ4AX9SqqPlT5KXPNuqfjRtBe5arLafmRLIRtdNHAlerkhf4boFTAb1XgI8qTeUpUOi5LlDRUUVcLa0uhlyhmlZ3KDfDBKwONIQtpQab3OnwxmEfabbVn0rUGNTzZja6aHTeAr1JZArChi6adJMn4HxadhWvlI0w2Olk6TagwvTV+LwJfGaJlY3gAzQBK0zXkLOVSlLdUWv00xKc0ZWrKZDjfTEBTRYaW3FYbGjZ2qSpe5QXugH5KpdZh06swrSNRWa6PFWbZxTRq4iqVKkcq/4ShT1K2hBA0JxGsqgNQENd2oEswJMOaHxbtLppeBJ+zWdL2pdTYNxN/LQPP/hricub3TfCb3xTObUxMVtHTVe0jpWBI9zSGbhgtsMbpQVlH/NmKTsOdKLzayx7pSCbD8O9LbxOBJ7pZ8MnzVX5aAJrKSjT1AU/N20lxZ4FOjKhrjlaEqXjfEbF9dQqSjRKa75P+b0/A8aapaCERDQ1Ln9RcbOzWOq5ikabLTWVZeDBhaG9KCxVTtFwHzagxVTTqa8LZqbSeMRaIRt1ZSxYRa82qv0AJdZZ0zVIw9UimawOAxaczWLKa2mkMIzXeIEFtGbbTf/LtqLxbZlRINkzU7sdJEJA/TbRbvWrfU8rJubRzc0auLbhbZLZJaYzXaasJcpbhlX3ofzZL4dGsXE7ckBaQlUKrQLSKa5QF7KVWpBaKtKiJdLVVLmzYkrWzTEbnjcKa0DaZat2vYNhhZKiWLdTIzJXGwL2We0LPCOaOLT5KT+sSrR5JLxGLZ3LBmMHL/LexbSTTW0PLWJbPZKDsVLXFBgQXB03IPZsKiiDxxUWla8RPub5GAg1uLXvgkrcMqJBtztjTcG03IIZVSeGVbu5RyBdDR6bhhSDwWmRCMvDB4cVjYuA1Tf5LKrV+bG8MdJlSoVVmnKWbycuWaHLZWbhVc5ahAGZbipeKbLLeQIcGuaUZTYKbjIsZaJrTgApra1L42sFbCrZJk8rdBBIrdnLuhSVa4rSzhPLV2U6hatK3WF2sz2jtaTzfSEURVtbW2nZ55ze1b9rUu4nrQFbYrT5KUrYGac5M9bw2idaErXvhiLMJbOLR1adTUDbq5bu4JzS1bjBAJrpJTVbW2rDafLW8Bu5XZ5IbRyaLIqOp63FLr3eFpADLacKxrStbrDd1kILWJFUITvs2BvqZl2kjVZorKaDWpuKULW8quzeZEYtKIUsmnNtlhhZE2bX9Q1JmZrxElFlqirB4ndrtFWbSmlGfA05G5Q1bMorVF0ipT4/to5QsoohkwaLzb/Ih5l6SuLbAzePE1bfkUhbfnrZNWm5OfDzbscZ3qColkI34lqrOrYXFCLRZFZ0mZ1mTYmB3DL50qeAurcze8oGtiHqxcq4L/FfsrM8sEqCbSDL6jarqAtTWaXku7aQdOMAa+vcbqbeklabUtaN2k5bibYQVlTXYaT2d8bWFpiIH6C6bNmqnb6pitoxxHzadyjna2uVTotJCbaNeEXaPdVkI4TfJadnKWqVpUp1M7dclUqBylZba3Q3vpe067cYqTwE2IJeHKl6SslBS7bXqpbXkw7MO7k3tJxqbkDuM87RPaO7UTwo9QB8p0tWAwRi5BJdeFKbCi8kp+DF0BkkD1vbUIbGtYhalBYHbXjVcUMDfRBu9dapX7HkrIEgxIB9bBht9eHU69bXaafHqrBlPytD9baBkoPhaulj7437YWLn7UrDvVGQCNeP/bVKPUUgHc8MGkp/aX7RchAHe/bDYCA79KLA6/7YbolYWA64HVeAoHQA7bcOA6wBs8IAHAVzVkOiAgeiYau+lEbFdaNaUDeNbE7WgNJDU1Bz7Sch2iPOp0lBBQyujvAT0tV0Awm3amHeADqFCkz4GDw6qxfz4OZBppo9RdouHSto36QXqtXHPwCHaI6Kes0cQ9RPypHVj0+HRupXdTI6RHaHqIugUNQ4bZRrRFjYqWigQqje2wajXTaOOkTbqzfdqz7TGKo2EZIgqq9ADHRWr77WOLSBhw1HBrpQgvObzX+teaJWfY6hQtC0shj2sPYlVFX2ToxfHZ46LUmINXHWOagnXo7+wKE7gCLE783JE7k5bdw4huE6OXP47vHdtqknRpUsnak6thlDK7IJF59HfWqUCHsq97Uga2zdbJWtdjqp5YkbHyDY7eGBvrOBqdo+grfbZKAjBBHfSaypVP0QnQE6qTT/839GdUEnd07UGFcFknaM7OWMix6zaJ4vHQU6KyCa0JnXk6UneXrG8Ms76olM7vdc0aZnXB4RnQM7OWBs79nVE7fuqS1PclfaBDMCR7ClLrA8BU75dWQ7zDRQ6anR2a3lafbX2E07FKJfagDVfQTBkmLi2Gw7ZVRw71Ugg7EKsMg5lKxATWf5RM0eM0JVCC6AGgFQxuOoNUqHC6hkhhUoQds6n7Sg7hVFc6kXSLQUXeskEXfHrKOco7PnVi7lVNC6UKmS6Wkn6ydBrg6WSWmMaPlc43SnYi4UigRzBvc6H9cBbLDVQ7LHW87DyB87hCCDwmuvB5wzKV1kxeRJUxRi7sjcB1V9WC78jTK6p+qdoluCL0wpF/QY3PK6kTH065XSq6boJk7lXWzZAGOq6VXQq7WnbOg2DbqBVXXq6CDXS7V8mSsJInPw16T+TWXTJEpRWYbjGk8659Ty76nbQ7rHQWq2UHgLPQCK7TaR06UxV06SXcIQ5+JfQbXFMaayuwRI3fa7XoDG6LelK78AlMAfKfm57ssR1v+PG6M3Um6YXTdZcsJfQ2nXm7+oIW6JItG7LyPm7mPHfVyfJk7M3aF4nqGW663SW7h9X6QAmZnTRPPlU6KuIIUCPVrp9RfynjTYZanQ0bvXWZF6HeqRWMJVFS2EKKi2NXgAXUcagXXMqPkXFFs4Onpl3V64etiL1kUPaFOBmPI0JS2R13aJ51rim6b/Nu6hnWV9kVenpM+B26rnMe6IHWRYLchOMrnJu73dDu7h3FsdtHQDAAHBbCPTPCC4UlMQ79Ry7hDYO7KHRY7R3W5bq0nmwN2PjrsBFB6a2DB0RenvhMIqGYEPewQU9NOx4GgvwT3a34BSN4qk4Kh6nqOh7nSBsyxnbh7oPfPBYPabxQBZftcGpPRLqnFo+tnDUAxYIagPfvaQPc86vXa86GnTwBx3caRqecCcmeGsBwXmK7/nXCjdxNh7o7EuRW1v7lqan7yriGnDVRmBAAOOcNhRMigXnjJ7KdhTYWyE+1FPWJByiFu6dPbKUvUglq1PVMcJSgLIVPdkYpPaqNZUiO0bcgp6jPRZ6t3Q56NPaOLDHKZ7dPXiI3Pc56hejZ6iMnvIbcoZ6JShqVUUeG7XYNZ6X0Hp6CFRxhqyIZ9ZXlF7LPaS0mZgXE/RefRpIvlh8bT5rCbQnbeXWKaMvAA5UITFNU+GQBo7cZ6qurq047cpEj7WBaOtczakOq/ZCKAdMc1Y44K8G/EmvU7kecEmqOGvXZTVVk03clBAevVtozSQXEGhKGrYDInw9fEowmkrVq4Bb+I9GLKJg1Y/xgBGDrdCfN7pveC70YI8VftOt7PVW+U8EMF0L1GFRcXdWB9vWOS+vafqq1ct7RSpTAGlkrD2vZs1eZoox7vbt66HQK7yVEvgr1kz0mUpRwK1Z1lLvUMJqqlfdgwnf5KbaYpMvc1qhTdV6TLSTbvggSAgfY5V5hmOEfhMY6Y7TXkzHSTUGbXU6mbWhbyoup5kThy4vmgSy7er55cXM85x7pLatzQCU8fbi4FXMTwQpawB7XNT7ZqrpJ/pYRalGNgh9hdCUovBZSs3cb5d3pz7MQD5FyfUPbKfXGFWPHUQhfHsB5QjLUOfemjafXSsmype12fYM0hfUMdifTPVfnGr7EzZiIDRq0IKmF/ad9QhFRLsD79fXrbvpQSB1IFuEEXFLrdhOy7CNIErTQjlKIiiBacvXdqcNRb7tBulImXS6aByA/JFrdU7lra77sfcnaJwhzF0ilc5bBMLa7KjDpIvJLqHvvraRNKto1vInxJ8ibrwwmH6tqqzU9ZWz7csCOZy3aiYo/eFVXDq144/fUMeQvv5c/TZKs/YY5LkMX6E3VA4XTezVCfPHUXUqlE0MYr7PtMulPXMr0yhI40jrfbUu/WQITalXoLtC36HDsP75Shyap0GkZ5vNTVE1Cx77fQcrHfQfbyFWB61dSHb9FJdALnZJFuWvrIUfdXkiaux7A/VD7VrVl13jRB6N4paSXTX6o7zSozmQZZxw1Bcs6OCd1RAdvlL2qRAfDCrsX/Xf6j5alQAHMK8Ouq/6RfTXbyolf71SffpO2sq5H/RIVZ/ZAG4KqRhUtBAHUIpZxTTn8rYA8gHrbVS93EshIdWUvEdFIG5hzfAHDgvdYTur4a//RTESA5HKerZghSQPY0n8jYK5uYQq3BUNaH7UcrDLdl6T/dQ7p2jQHa0CvaqYF7q9zP76PXfHbOA+jKcffgFUgOW1peBx5XVPIV8eNhZhwC55AOeJ0sTbwV5A/SUOQAMlgmuoHndfPx9taGbm8pAobGj25VkEvx56sIUjA7HI72EoG11omaPyGbIRPNVA9A/IVLA44HNA/OyE/S41F+uJpafnC0PuquBaOqqbTmoRbJA7R1jPCFcZBkXlvA+Ha2RDUqm/bEka3aAQyFDb7w6CwGXHSNauXRwHkLVj7g7ZErWGeJM+A/Ml61ftZl5au1KvevK1/bkG6vdHY8BQxEAwSHql+IHrdQLUGzVCYGz0E5FL2i0HPAZzwZA+YGPuu2Zug9RCbAxT6QA6m7zRHQs0tI0GgzOMHXKk4Hh6pe1pGqYSfA23UEtYsGJg6YG56mxqOwtI1mxjEHV6nrbhChacXIOEG4gwPkjg8sGhAkIKsRFuZVkL4HqAy9YV3HUpi1KAlBxYGK0g8bK/bVl6A7dkGR3Vx7SbTAQV9eTFhyI8LdLPBauco8q15c8rHAIqaritUHPLIrLEHPpg3JDEZ8LAiHWvDM74/YRbYDVDyg4qe0urGiHoKrpIVDViGt9W+cIDGUg8MEGZSQ0p4MQ2X7fYp5ZqQ5p4pfSob8LIyHEDP/1owvMEXgAlk2rLTt2CO5RjDg90+mFsGkjQKG6olL6g4KW7FXH6oJQ9Rb17Qnl7YCiANNER4UgyQ6AlUv6jwiv7dSj8Gg7RIbYfQ4BB8l3pQIOdJKOODxFkMRrdWrHaA/SIGdQ8fawUnCH/GnZ4JKCMR7QInCuurxVcXEp6OiNtlRfRIGnQ4mc7wDwoxNsE1/Q5kiilW8I4bTf5B8m/4BfRgJXQ1hU7uorRozgTk6BDvcLVSEH3KLnITA+GHvcqvlMw8mGv2EGGcdAPl3KMmt/crT5iue6H+LOWGOmFjlVA/l1q/MqH6vgb7DHNGGywwbp+1C2H7UhIAUUCMwOkXClbfQv7w/BqHy4ikqsg+cacg3qGrjfTl1IH1gD0g+ELQyu09Wuj7zivKaYQ/aHxA6e6m0kibRcFWUZFduG73Dd7shZp9PA88QDw2SZgoNqb09OeGmeDoFX1drky0h80+GVYrHwzLh41mjjEzT2HuqaBA7wzBr5SK+HD1VeGHwztANaGY9yrcpqxyGuk3wyYUbmvWHg0NWQDtnAJaTTF7F0vHZiyllUhzGJBagZuE+6qzoEDcOHfbWwH/bZD7bQzV6bDf8HBiDcQnUouAYLWELFwzTa0feUGoQ9EB1w/GkL/YiwpgO696SvgJD1Gur9qJmkG5MBlJdFyGBIyoqQccsNOIzSxNFYUIh+YTzTw4LxjygzgUSrxG/HN/xFIzJoYLoHk4IwiRNlEpGPRTJGKXCWR1Ixpo4Ag8yFg/aASccBkvaFSG7/LKCrI7r4RI7ZGd2GqiITKiQVKF0gDzhhHv8U5Ze8tu90JHjb3g4cqMg+wHvgxOHfg7kH3fVYQOfCZGaIzpZ6I6j7D/SuGNxS86qg5uGcPfaBldnWkeI+TYTw/hYMoz/6rPppG6Q8ZKIyPlH+0qZGJI2VG60mqjZI8S75I/yR1PIv5lIzlGkNfhZGoxpHU/MVG1qgWR2oxpoao4ZGrg3PVs0uJHIwzh6zOvZ0bRIvb2SH4Y0MtZGuQ8eVpI55Grg4lV9I0tGOTWcQJHJTodfDizZ0YOLQkoFHl/Uf6q4qIG3fXl7jSCeBbgfh6iWBJYzQ2R4hA5kH2zZx7UoyH7sgj2H6OloSro/X5XzS2RCMEylBPfe0bwqNHJPb9GPowbosJleaW9CDGso7GMdVNrlkoL+s4IJsordVNRriOyAEZl8QQ2UalfQ6e74Y8DplAKspYY3GRynFDo7QiET7FQPaw8vGRHwFcQioLyYqYzg1CLW9GK+WyVTAAPpVIy3oKY1tGdeGzGTw+b6iLWOcKBr8N/I3c7F/YRHgo8RGcPCdH1/XkHG8Mxx/CofZI7S6F4owf6hJUdGkLWFHdQ0qaPjdexLWW0rE+E5l2rTbRY1PrG5LYFadnbF1bbUddkrWew4tCbHbreX65GrrGeEtkdwrZybWvWJQXYzFaIFaVabYytpx7tGbkwZIlPYyDafJV3JRMivIWLU67DYwJlNOrYJaXcPbXWIxMCshnaffYb7qraZgCshHHlDbMqAeLtxrGHg5bmB/zweIgh8I8aEmKkjUmI9qGNY3aHyI9rHOOOZ90igWx0aUDqJIfs5MzaXZtI8k1W44s5nTSrQG4/s5+LQXb1UicxQNcxa2Mnsw/1e3GsY6MGb/BPH/zIPH6VMPQoNeGagY2RY+kKqogDfYbBFbE5NKl+rt44manmvRqKLeYKrwGXkLnaMRy2tPGHJZjU4aEPozNugVSEIghsRiLGCI+XH5WtaGqvaRHofZxU64+tVCAnEyxokTovqhbUaIz6Tn/YVEnhp3HQtP/GwExJEMWJERX1DAn00UiGjiQs6DAzJUNxoadLnS49tOm7VME2KJJIhHDEzSvI2RAQmnCfeS5I+GF8E5F54E4YKoEwdomHCTjJIi1gifZ9oyrDAKKlDyUacLbVsY8rV2E4VIkQyr8ENHf4mE5eSzOB21a2jLzEDNEsq3NiNS4xYoRwybKxw6FHoQ4zaIlXy6/hWXkDtgUIlQz0Ku8OugqZjomeVIMKaLW6x9VKbE3jnonOWNCjEA7kRjE2gnTzSiKtE0YVJeJHZ9E2a6b/a4mvY+gmETbhBEA8YU3E5yxciGappVAEnvE44nNrX3lA3GHFGGvIxuYoG4liS3EKitCjRAHapWsPH0CTbhBUk8DEK6BImd9nlqyvipd5wzwAn43b7X4/yaTik76NyiomWI2onBok0b0LRXhFRMcoe8FYnNvOuhNXgFRWkyYn6E5saLqfPFuk5EGm2pBM6lMFyF8g4m7rfG0Pkc0mbYkGzHOh0mnYmUtwk5MmyTSMnyYnMmfLf0mLExsnc5eugITOsmBxRSw9k4G4lsL/QQ480bs4rr4Wk/OTf/fO5LkyQHpNpFr1leF4d9pN6s7OPqQAE/G+3WXGKkxV6P45elq42RH88tcKJBmXlfHGgi4LNbYsGHsme8gEVFlP37mjcEm4OXCmoU13hxiRfFIU/bH6Q2g4S8A0tuLZchnHjIl2k31DYU+PhV1BMmHYzin0U4MgyUztFNky7SMilsE6U7smrEAgoaUyWFoU6yntlAyynkzPH3OtCjxZqMUeU1gwBU6h0CU9Xbr488ICqLGoTBUkm4Uk/H9/SF7hrZUmtQ2cbVE5OGEjT66pYtbQs7V0gfVPa4EVbUD9xLBdVbVC0ndn1HdJAVSv4hVoSkcamrU9badUzUFzaM2JlXIamZU+zQMA70mHbTamp8h6m4Rc6niKVhoNtJ6mE471wN9HFRUmn4GMROGn3iQuBc5KrajQzJ0vZKFElQy5B/mfcH/TTCdnSCCdrLfsIykz8nyvUuHK42qnakxqmT7WdHQTasJOBTtAQQ8rHVyrVLVU2uG6k28aHQ66wJeYg5KYLBAXTbwZ20/+ZQWkPHIk0LhoHOYUbNJyxe00ir5+V1Gr9HAEz7DLgu0zql0464d9nP2mKijOn77MsrxRQ+wR9LOmlshEISTd7Ga2g4w3IQs0tyZynk6jWwvYEkwKisX0eemQ5yfLwYj08exrui7bJUxl5YGMrldcJtNc0yiBwfcomSI4Cnv4zQ79Q+qwnnktk3uHFH7oyFGh1U9HR1S9Huzc6A3zChRNCSgYz6Mss+0zOAB05oKEM8OnPuLcDEncMhEM7rh2+FOnYDB/QhQoeHVQESI2GORmLw/uAkdTRayMyZzVyGvwjdumwaMw9lLOSKHGhmRn1AfuAz+CfGLuODrRcPZ5woTkVUM9bM1+FhQUM6zUJ06sIX00NKYaJFA21kdzy0JVKn47vaRxWLGVU2rGAU+qnwo/UnO1bvVSlOCsZ6E5oDU4uA1cEKAzM6ral1GtwrM6TMFYi6RYNLFQHM+/7jMy3zhihmDm9X7U6iIQkRE4miZ4k5nX7abTk9danbM35nr7gFn3/cFLuYoMolkJ5QzaDFnJvWkVV4xvFM0X7lTM3FczaOlmx7WehtBQz6t0tJgRvQphHdDKYNM6LG34x4L/k6v6g/RFGK0zEwiswjqikG5sjDHWmWqskrnfY5apY89Hf4/MxJ4ZE4v2M9hwU3Hl4Wv1mRPCZgYCe2kxsz24RrFbZPDNNmmeKxgv7O2kowAJZFnLoTu02tBVszumJswAQVs4Ki24yFBExfC1ts/s4MNLll9swHEEdRqBQ9vxwXdOiQl4Vxm5svlIGzIDCCjDoFzeui5a0FU4OTcmJvFV/Q5+Lv7u7BEbh2oonPgxD7JY1/HT/dwHiBAJTW/XVVCik7KwQx8UIQ2Qr8Ct1nYM71mcuEcMUonVUhAmxleAnEFrKnTR4qPEG4Qpspcc4mEVVl9Icc1tVlwvRmvU7DnbcK5E8c4v54XHWCWc8P6znnJHCLf5xrlALUQoEjq9MBznvSm28eMnymdetl84alGEGcDTn5JUP7ewg5HL2rwEwSDRUzsawn5JFLnx/cuF+Mw26+5d/RwDpkIkbN27flI8Bf051nxw3pnNY+Bb9QxhUaHMIJjc5/F9TEOGlw1aHhA+rGrczXHgUxtbydRi5T8nHBwiN1KQhHiI6rAHmLqRNL6o9YF9eTiFpubwswhldJJeF0CsIl2VA8xHnec37n95baLMRcHmG/a6VfzviLecxNIk8274DykfZefVHmF8jiFS89nnEzUYmrwQHJhBJtVjvT8EgPI4052vaodgr0zruDOhAhPHJ+/Lq4DpoPoyc9lVShD+7nuH0hMXLmmVUObnqk/+nPc0Cmf49OHR82ly6OGzRr6LqxBA8jnRKjpnmI6jLm07CG0o5ZlH2P+ZKINod2Y8sB12PPHu4JhniHFK0C1i8ZAxE7te0sfnfDNfcSM9SYe1imU3nNuYz87lHoBJ/nr4g9n7jpe1l3IMy7XApg382tAAC+AXPtTkc+I4RbQCy4a9RBNm55J4Z5qGcmHs6gX9s41sHDn0hRVFNGYmGUQeel9n8CxmnGxBc0uOPWr9hC7mFE1pm/k+7ndM6Wn9M5qnbcw8A8HNMjWs5BmJYzaGAM6f7XLUkLeQnd9JNaIw483/nFQh34X0CIX6pp3nS8G5km49VN1CWVIAOnZqnYYoXa80IWpmknG/TaYEVlYerGQVimSoz5JGmng4tC/iFLBXIXTCzsFNwgVk4BNLKtZFkx6NXwxCKZHngpE4M8Xk4XFAjOk+NYzYvI9+bY7KaKWAB8n9hPIm0PL8mi09Vmq4/PnAMzDm3Y9oRLEGvVbo/2qt85EKd8+jmoc1wGJYlfowfl3bZRJCbZY/PhjFelaJU59bmjdkX+7b7g/jcQwyi/p1JeJibQ03jxbTWnbctLkWKZapami+Jp4TDaaHKY4HrRHmV53I0XHAxMYVsqYmVcECJbiv9ke072hCoKSl5MwemgrVMWlOi9o7C8QxRi5TonlByrX093Re5BdUhevWr3eDPmc6pDneC9Q6bZXgkCQMpAcRV/KEi/jVdMuqV2sy7KnlWkXji5Y7W05BFDmqqkZc6NMMdF+p/gr2Evi0r7F3nExPiwY6jfardgSwimJwu8WhBLQGrZuXnstD8XJfbWhYS3rm2fctLEGr5V+Vv85EE9MAgS3VV3XgXCCs0r6T2Uco8S5UNbNBtASSybUBfkr79vYakWfG3avtaCWNjoiW3gL4W2QJb6Bc3HGM4m7x807QXKsycKvg3PmmC9bnRTRRHkQLlhSwuiKUAYh4mqi2aygxEX3wrVmDM+f6BC/v4McrRZwS6+o1gE4VNS0r7NJVG5rav8XO/WdgG/LqXiE+qXt/BiXkS+DVwwtqXqllaWCS7G7iE5RBYfiZUYS46Xk3eGF9SwXR3S1iWlfWsB4LD6WR5BdoAy1ioqS19q2fYLh8xOGWLtFGW8+L5UyS1R1BQBGiHDv5xKpdQgQc+qG6C+EWGCzVmMcywXpw0PQK3F76QeNcWMCrcWVyvcXUc6cam02WnavYfmyLGFpEWgKESMBJQ/TUMhu7p4m2yxCW4wnUDtmgHJWy4FEBwsZzVRoOXMhkSXNUY375vFFoiU+GE7IFA1py0PSKU9inEWDzblHuPUly2s7ky5iV+y0nJz6puX9aoznkQPOWf4uPUQS27UTywQGuUHRE0rCVRbKJshsS8J7bPL617UkRQq7MMl0JibnPAmqGfbfyWmJX+mji1EW+CzEW66AwH1Kt/RXdkEUuC4KXj/ekWXiw2WGAt0MgEnP4xy9oXeZoYmAmeOXiE3PwzVHYFLnd2XrquYBrYqhWey/gEsqHOd+wouXQXNfregtUEqK8ynsK5LxcKcIl9y9RXGAzpocK/bi9RKxWGKy4XiBLSW21ofVzy10IBK2r5LnYNc+K8iBrRNknxK+g6dlLspny4WiOTT75NqF77R4OmXrMAcXXZXmW4K+B7bZR77eaanFSy9ZbZS3Zb5S7mWni0BWTi97LCfOMkpy/hWhy1qXZ0AllMKwYXuoznQ3ILwSKlK5WBwj1AE5SRW6InZWWyyrgDyzRWdNB/qEsiFW2Kzzmjy7pp/K1FXeK16Wmk8Lb6K0Sm2fV2LLbUJWBwhlXBKwEkJK5GWLY/eXry6lVCq9OWDHXzGSBATzk8wi5GQdyXxBO7xvk3yWwixXGFSxPL981/UxS7sFpVMZWoK8kXWFQBWeC1ZWxA3Bmb/IwFKsB5oTuu4R2c+Fl6hbskvrjwmJczwEqgrNX3Mg05lhmNXGsBUoN9HwtlcxzKWc5NWqyU849q4oUV9Yt4rCyBJ9q9tX+DezJwFAIUEReLmzY5c5hzXNXUk0b1X2YL7LnS/pZiz4mOwowE59hr0GDnCW65JesAa22tNLc8JtyPN5ykNJFFUw77NQ6kWS03vm6y8X4N/WJF18gIwylL1XSg8uHi07WXmC9RqEK8/FJ4RkpAAwVHQvZZxItNYjv/RflAs57QLCpjsaa0vFUC4nVb/YzXtfcTWdCgb5/U5TW/VG5A4A+/7udmlyHIlzXLYje11CoUNlk5Snn4jqKpEzcFgsrgHTbQtyxK6QHSK+ZEqaqzIOumQGK9VFzKA/EAM0y5rp6A90dIvVXmA3ybC0y1WLK4jWFTe1WUazLHvU+jXLnazYXQrZaSNeZWHo9BnKg8qXXi6nrYuR7FlqwHLtODzXgYoziek/UXHOIIIl1MHXxq0MmJ0jopE6v7Xly4YX3XL7Wiq7dXlXEHXsE7r5zkwCVBa8RXjq6LW6a6EmLq5LWVy71wZa7lXsE1rW3QOXXlazqFFY5JWJ0o39bKHXWMk9rXfkCQHCAxjboo8cpLctZb3eJmXfy81X345bW2q8jWYfdOHE9Z+UyrPWrTK67WcawqW8ayKW2I6qWreqZgmozbEtaJzbeo8DEmNDfmNddvXgDaBI2Mjr78cy6ohcNmEyo/uVFaFA5B1NIC1vCZMTNg3XL62fWyzpZxn64fXmjk9nzIgtGd62TzqFCtHGxH/X3/eNGXVAJMFbT/XgDVD8yC5sh1k/PT1eDyWQi2V72HfQX3a4BXhS17nF8/pXOMHhNk3IPoZ6wTVsa27nUG4NX0GwvmuqiNWuei+TEipxXC/ar0qG/kVrRMxXya+nn6G8cpyiC6b8QsiwOlV8pxgXvXfq0K6miww3Bc7Q35JAI2lqh4kmK/JoZC5XZxG3yFqgvHIZG/1VyK8hWUS0eWIK0CJ5K69X+erVZIEgpWdgm1ZEVLjjBKwo3NIqJXgA5sWtZDdI6+idQkEryXQi+bXh68Q3P488XTo51WYGyIly8uWXSvfWmELQjXF6xg3yG1jm6eqw3GU4SECc1w3ZbVqLMQ2o2Im4kVNA0VYjejktEiuEHbA5JWIK9Px+qpcgwm/C4xG5k2om+/mTArk25/D742RKk2PuIo3im/E2HqyUXLnMZX2U76VHGpMEdG4ymGm9YUw6/dxmmyU3EWjk2cS3Fnum/altWHgSGUjFpU5HsbJ9AdH4a0lGXffmWbcxPWA9GmmsRCCGXa5aHGIwvX3hTbXvczvLlRKLo1ms6nkA/G5NzDZ7g0yXWk69TQMXDWM9m/6nZCvqljm9nXyojs3Z0nam/TcoAg5nqmTU+/7rm7GonmzfFkJuOlvm9mFOAsRs40zN7tOIC2ylemmE0y64xK+bQo02jWoW9iV8lgqVrPjIigqQlwkEi/GC08g2cy043GC0jX8a6KXbc0mtYNKi3BBmzkCG3cWklQ8XIQ5ZXSG4Bn+C1JLRq0w41mp0V+a084PQGLp9eiy2Q07wmden34axly24RTKoBkkz08AXc2yK0y3JEkzMrU0mUhqIt4waDIQ3K06VdCql6FW/iE+WzwkpW4q3nxE3sUWytNiMDq3YNKUj0mrzmOUqeWiy/9naymLTzbXq3lKzBNfOhKMkEuVnykw42qsyPXTlfi3ba5FGwtHRx2ffPUyWxWWEZW7WoM7BWXG9LHva+tVJMiTX+HUa52y2wWqq9CUV5DG3Va8rUbWpHXo25VhhywwRFubCatWwGFI2xq3MStFX2sSVWzODAHXqIW2b5cQn52Itz4zUW2o4zppU25K2K26FmCq+rzrW49A7Km22VtP3A2fYxMNa9G3M27UhdWx23lKylgW+SS26q3/47QFpXHi1bXWI5s27awSAGuKOok3Tvr/W942qy42n1m2PXG8oTXIIk2lTogK2KfKMIL4ksVuW4tW8mJcglmYa21NPs23ah01u+Ee3nKsCcm26q2MdPCZ5W6IDk22qXaiyq2v26+oeKrd9NW9+3Gy34JM49JsBwmB2ZEUa344zy3Gy7ARtlDB3snWyAEO+22e2/KG2QMDy9jInxMjDyWfy4AE4a6OGLczUm8W0vWF2162DRLIQcO8UGN25S3qy3Kbt2x62F2+G2QFEVBOfA7kGIg5qjKrhAKC57ky87zHYq4A6pmnx3rNSVWqsL1YAPqJ3iE2x3x0unNpC9gp00M3xfWEHB5O86X3WJqk5O2oWdNEJ2ndMhNVO5JWhQAPo78hBcKfCQVu8x7luLF/XlatyodPg7k2ZG7UbO2UqTOwqVrseLkdoK/W3eCWaza1i2Lazi2dK6G31E/VmpK7GARiOmgLNMCE+qx1nZ8yG2hq6haKG/v4xSFG5VaD0TsFGPJbtGJZkRh164O5e2zOhqWLO5l3FAizJqlsl3J/sQnEu1xrTgU4a3aml3u+FWxeoCB3EKzpNZCJFB6u1oa4NixrKuw13Vy1218xFWxGAAQ9Uu/Q88+KrQwZsrnoLFioRu5un8ymHTyWlN4Bu0mXDYMulJEvDkyy54EDjd53AXSg3g28dHdK38H9Q2zR/sm/ExIFIF/FLR37LX52aW6R2AmzZWdyupA8sG1yffIv5lhtGR7u5j9zpK5rCLS92CmixN7YEezekHd3vu4qSxiuKLPuy9mttF21phvKowe/kV3u3w3a7dD32U48hGGiNZb8vkVfu6OnJKyNZNFK/akbO0l1IM6Ice1emO7fj3JvZkUCXFUhJ4Vjoye99WIk4pmNuQ4d2fS0Z9QmLYJm0R3ouzt2Au1OGsG4Q6mG8CVMRBkovy+n4zu0G3uCx7naW9DnMi+IkLKTUWqsOam3Ynf4Y9OVo0zrSVpeytpVlFnb5e6r3+HWBiR6oZQZNE9KWo7cmMSnr2NNMeUtI+02WFA0YXStr3a6VkppgNb2ANCCdzGzU3yokKw6kCNKlc6bbdJg4dqoIzQaeysniHC5rTKQpibe65G7e+tk/Y9byBm2bFVRkRRFTsUm3Uj3ZWe0oniO0KWru2Q2Yi0mBUdOwlHUrRH+JcL3565bX/Gxn3Je9FE+VsHEnEsiJGS6C2RksDAr2xhz3/eX26+31Z93RiIm+zD2PU2K21a0SwCeNHJZKi5Y3OD33HiUdynrRGWjyyNFRmB7If7U9ZB+wv5h++8JHuzbRUs8/FVFRfEnQ7xytRCbC1+zFYucNbat+6/a0psupV+wf3bhspXIptLm0tP16Diq8AZ29S252xs3MG2cXkQLVMyBNqIcyKd3oKxDmSG+n3oi6X2fwjhlWSiupieUMn/aG4i0tDiApGwCW6BIAPNhOfFT1AAPEiuq5Rm2z7XjDJoviMAOty3RokTPpoQI5APiE6gPuHflUa/QQOlOpzhqm3MWOwmFp/5e8J4i8iN4B5KU4tCe0EVjeWGBxI6NXglqqB59m2B2R17/XzGAzPG2Rfi/6ffTjaHQLf20c/f2d20Bnpw/wO3NsDF9PlS0A2xnVzu9t2xez/2Je7uLrvV6aG5DKoZ5pPaPAbeVvlKTmtkloP76+XpnuyYPIvBwpkB0eW+TDsCJIn9U85FUhLBXpGjSnWsTnRe20nM4OTq3xiDknYOEYlMdl++45+zAXFDG0JyVaH4Jf6DKHM9P72pa+44Ih987XmW2tLCHyYZnoIPEh2b6MO5ggZbfgrXNZ538O5pm/y1UnDixz3Yu3t3pw2oAPMqE0XtIL2TgLPWVm4lHca4x2yO0nagm8GhBuHPZ6Sj3QqIvf7hCjqFAB/M2Cm4t0+h/SUwe03bmg8MP1RZuI4e9kEKh0+BHA10O5e6SRYmSNUtWAMOB8ssPHA8ulWdcIUNhyYHRh872KBzs5Zh+B0KtSJMj8gyojPRC9Ahx/kLhy6LgwfIUNIrGossk7S+5UCR8RNMWPkyH4aC/Y2fO442VB7i3ra5IPTi/wIpgHUgVcFjWKW8oPRexUGlS1rH2IwSwOCEFlVkMBtK2/tQm0ipNcsFmkW20eXdIFXjuLciOsR6sHy0AJbFAyBImi132cPZRgkR5Fp9zfQRtPHFoaR7m3q3cSON8oyO4bB00QrS6KDY5JW6RzBGu0llagzABA+R1Z9StFZ3o7LpA2EZTpRR/1B00DHHZNOQPQzUOZ1ULUDciLJlEG0qnWA+LGYKyUPxe9ZXzLWjZV0DFEJK+u3P+wNXVB4COmO7u34u55Z40W0r8WqinsbPFkvm7OgHRzyP3YEiP7R36btJQRl9I3PEmR0wLbR23kR9IEn9qMiwDnr3lozic33K8oQHir6nIx/kb3R0Bk7zSGOsQ8iw5R8f5GGqCw5R8VteU49XsjYRiylTmOUmKMKFm6BIt0uN5HPbJk7G0g3Nu9i3/h/53Sh4F2xSz7gvuLlr+4CaPIu1S3xB8X26Wzd2gcqBpuh12k7zcIEvMl/dUmv0mSMpKVkPZILarHCKf+M3c72MOOox/3wBxwla407+cbbHtrNUvi1OCFyGwBBvkdx36aaiMLw72IeOuuwSw4smPh4MsxFBTPvFUOthoKR+KPT+OZ2Hx66YyAnfkbx7gqeoM6S96tpo3eGbnk++DmzRwCP524/3QCtdIqhzHcqWnUPXc6s2i+00Pru3/3FuhNIyaz/lTdBj3hCihPyo4q9Bh83ksJ3Wli0pD2j8vhO72NRIPu0eX8SGecLFYqC2MpRPiJjFGbxLhO58rMh6J6aKd0q2GWJ+vWB0gFprhwYUbpeyk1NOT22CnRMJSp8IYh6XWP8iJONuv9lliwaH+J2xP8tGyWAYMxxGB9sXSW/VXCQGIPTjaPXLR2f7Io4/4rNBCPKy3R2t25j7dJ/S2QWDrm1x5iPyR/1ApET9bSRyiPsRxb3lCMXjOR45PCR95mrCAEzu+ASPbJwsGrJxCN4tLSP7J/SC2R1yGfJ08PQiLSO3J/iPwpwFOmK2UqBR3ZPEp9MW8MwsHgeZbbxNOlOnqJlOdTfKOM0yBxQmpKM+6+OAtJxOVPa28bIo0VPSR66kYJwxGGh2s2zJ80PAm/COaOL932i2loUsrdkeDm4HvMi9lr6I4HAsnkXtuoNOTA5FpNbe2lXrDkXupwXZkkdLwDNHUXsuys1pp/SUJp3gPVsqtPpAyLKxR9WlKIOOkqssY2vMqflLEFLKy7QgX7YLOkssvbaYmPtP10hrLcFfaA87f2H9QnZRyp4q0Uo1z2n+8XktGgh5oJ+S3jJ1CPtR+aPQJ61OV6/40xIEra0tE+BaJ5DOZp/zK7A3DPyi3PVDFUjOai6b5phxIGkRJ5PqIXloRp0XlsZ51PNNAjPJK4nkxp3ex2iH0XV8oTPBi2vWFRxEnm8kiJZ0srYbpwaGxIAdPiKGvaXJ20P2Z751SAbJOyZ5bH+Z0pOM0uogsmsPF0y/UR3p2VUdJy1OYizVPE9YdA6pwDPA24X2Lu4qWZmxuHrR3kxc0PNPytD7BFhyRwtpw0GSZwgXjZ5p0JDhr2wsnrP+HUbGBpzjOu0r84WLaHYOp31P12ExPGMq7Oe3CvI7Z8dOHZ1Z8HXSFbHx9WlLp/PbGQQQWHUvpwGg+ybEzbrPnY/wHZJ14ZT8j7PkI3zGB+FCR8UHyHXp4B6Ks0PXXW+rPZZ4hPpraIZkVfkU9sJVL6pwlHVY1M2us7t2es21PYsjwoFApX2/LD2Y2IHAoZ6BBJMZz00m5x3PLkMHijsr3PqimH6PZx2EvDLVw73LJVW515kJ52SY1KO88XsrPOhU6tpGGuPP3x6MV8e7FZJK+PPJEu5Qf3vcxkMvOo955P7Y54fPrG+sEI5zvO34hEN+Shyafp+ym3/JLPGqz8Pax7536x5EXdR5casG/fOYHT9T/p4oO5S2rP35xrO655jmG5/660ZzF000tApj8lDOWW4Gbzx4wVy9IkU7EJUW2Z8guy533lu52NqaZ97OjJPjODQ7gvRiksUEFwPkiF2gi7PJzKzCr1PvZ6gv6ZwH3VooLO2vX4mI58fkeEmW0uZ8tOCWGwvYNJkVNCtQvk53wv2RclLcmomYiQkpRrNM1kMW01WXWwKWv+843Gx8qWvWxpFKBHLWJFxIQFBwX2iG8Auex8BWkJy71Sy4nS1F0VAqlCfHLkIYJSc+iQooANrfSQZ2oEYbQrF9aizF/KjPSVWwnFwzqXe8RFDF/lnV8zdopma80kqxYv0pBC6FqDJq2fS4u4wxrlXpCNmLy/JK9jH4vol+ALYqyrgfYNHkFGO91B6Ckv+u1YuAscQmQIrdpo5FWxclw23T6vZjbwhC6b5nfOHgIKHORnn23UkLRpZ+PL3W3LP9R5gh78FMojJ6rPtF9CPd8xaOWlxoO8J1XBZbfXYCF8zB0Mk4kjXKPOjh70zZbYnwKCsJOhl2t42zktOPB9wvaCp1OffFORaJ+suRPEKBJlzvk6Mj24AqKREOJ4cvRinMvhixRPdEhMuY58ROGLjcvOF6svJJ/cvqVIfZ+Fx91rl68uBOBsWFMzQqnp18vH581kB6wR2wc0RHgZyBOH+1IPv5/8udlJ0ulByL3wV70vQZ32PFupAvD4jRtYZxgunEtyszq50G0V0QN5l1oUsV18ue0mQuaF6MUbtKMvyF9gMSCqQvOg9Su9+q3QqFx90GV4XDNhISuQg0zOjuywvgmrzPsV7cuMw5y4blEZMBZ1yvjlCKuRZ+xkxZ1+VnNiB43eCPLAJ2Cv5FxCvJB/LONQC6pDoPg2AF2ZWgFz0vLu30ui5z7nb8+bPKlJiANc/C1zZ0RRePiMG8x3NkTV9hiQrTbYTVxpsVl7aueml7PEDO2YWLZuPyV2gjGfMeHeB0eWk5/7O39C6ve0h6uCDA6uOGwNPJEoz5blxauhV3nESmOJPTmygI7p+TEQFWXb4WqHOM14sL8SpkOi8nu66ojFp6dQcL6q4DLFV1qPlVw2PP53pXvpyrgMa0rO4V4Avul4iv9V6DOLJ1IUdDG5kGMNyO1urhVPEwtDEFwYUoFfTWh1w8PfgnUpbkKbHPF1GHu15zWEzUSuF7rP7F1yEGJ4hFlPK67HmYPArnPBXgPrYcOZh2nLA3G5Bs4/IUj10XWne+4O3V2Nr/mQVkGMKnHLCLMPsssFl92javflwnkc5sengJCKjJ254EspZWvtMzXPLc7WvpY/pOeFHIPNV82udV62vq1+2vIV52ubrHGv3J7wE+1/0HccYsntlv6PdskCQpAAlaUN7SOx5AGu9+nnYZ1weuxg3f5kN2GP/J2wVM+DyGyR6iOsQ4RuHJw90Q18W3CPQ+k8N1RuGNxRP2zFlOLusobH17xudTbwF6F7EOUGECRzAA8nMzqiRJN83XWxEPn7UioR5bhBvJoHsWGJQButu3quJB+ZOYi64Q5N/fatV1ou4J+rPdF3qOBl8Q5hIshuSN16PhmhhvuR1iGMmKdb8N16PrjsxvrN8OuCyMxFKN/RvQs/hZbN8DEnJwcOfq0kbXN0m0WN9Rv9qI5vONz5ugtwzOLN8VDhN56KFN+wQEtxCMRN7xOCyI6E718HYgzFluSA0lvYO67bCgDoYHMtdMoCs/Oaxwu7NN22vtNy1PgR8GkRl1P0UtPXWOx4Q3jNzouEJ2Q2EN0Dk8Z+LWZdnCKvDIKw6lJuvlx3EZO9D2uRt6HZKZ7zW916NvMMhhKx16hv7oNxKIstOusN7fnptwElx1/cxxty4ntt7HOWZx3XL1Ok1s15zPda6+vYtwwux52d5qsottW65qZhZ1tuH17gqzerdFKSupO//CBBGl+hrQFwWXv59ks3t1/sPt0uUVZ/CvdVzVvTN/BXtZ9flTvX1vJo/IUmHKOXntCmOKJzhkaxvfp4d6SRDmgfEMdyjvuZy41Yd0XXcJn6adDeuWTuuDyB8tjvPE8Tu5lPYHEWqnWKd50HHMUdv3Ps3mi8szvny2lMthVwubh3Cjj17hV7t5ghiQVeXWd1ev31+dBxaDl4grgcVJAN9uTlZ9O/t0/2pgMCcMayoxWt5COEV7BuQF5z24R+DOOI/hkZky/7OEvyGLeNTvvtB5uXCFdxLo9gnzd/1B6NIJMjd+tvVopxGiRLP7yxrOXv+ELxOk89oVh8PnsN/bvht8xbEq9/wrd3Dvfd1yGhePsn5a65rUQ/Two96QGpl9kazcFcnK65mPk97rWr1Ipu2zl/QXM6nl2oHLvpm79vZm1g3AYHagd/aD6vG6aPU+zF2QNxkq92+JuZSdxaX/SFO+8j3lm907vtg+jBTou3ukMuBkp18GOO9yFvqMk3u+a67GwpHQVEDKPu5t0DlmvBuvPuGPuu931vEVVyGMmLduyAoLuIYKvuRdy0cd9QgWHXeBGIDD402d/kx996h0cA2BXmGwWuDzd5c3tzP1k3W7xrIAXujLbCPi90/21pQIw794Zuq9+z2QZ/BuUV5oKqR93vI5RFvPhuiPA92VxuN/jvZ4KVK8Rw3ocA6xv6258MWR5wNgD5Aeed6fRAD/TWPdqtL4hj6OTuvZujy8h0J9wQYJ4nlaYD3BlEDKQfB99xmhRwfuyvhtoUM7Qez9zdnkt4mbkOjHGcAwJvj2vd4id6JvvEtB0V3Mrkk6vcEc5863fh/nPgF4XOutzEX/2j3VqAFBu56zBvgJ0iu/9/ou3HR+ru9121XY9vhQeGFutD9Pvhpa5lgnb1O/2ru0nR165Bp8HOdpRofxa8kiA69tru1cxvZkKQVDy1AeLIGYfwx8hI7D0MmP2t1OxCi4ewqwxmt9XevZkLpK58CWOLD/ungt9xnESHmujPAQlDpaVlhN6EeM03pLWRgUJ/OQcVikE/vgN2oOMi8XPerSihGxE2vBKqDuW1+1utN5Du7tSx3r8MdIZCvtUrZ+1bvw1tviD+DVTE3Uf0Q8+Gs13HLa0PV41WsUWyN8kLQZDuGSMNqaxh/kW0RJp47IK0eS2mwfxWgEe79P0fYk/MeRjyEtnZ9emOZEVX0I7u41mgxhU54QfoILsfjOXQfPS6TxiZGknhRzSL1o8hkv6HJgE+9Qg+XIPXZF/+Xq9zqO8j1/On+4wBV0JDFIN6UftV4oeKjxDvOt7/3zN2Oad+J1Pdgo6u2GBAejlxzLXV7OuHBuCeRPEiGzV0DWr2kiejlzTKNp4zHESFDPIT9GuiY9geOusCajy9cQiTzbFdD0yUWyLifw/eTKNczif2aKnW4j0b3wGNbAid8yf8tQxnkNBYmSx5mR0d8rKU1x4qSjRxlYNDwoj+dQInW5i3X538OtN1IeQT4EKtLUUeFYzUO24mUfoN4Cetd1Ufg/a0OD2MMfJ52d51j+4nJjxSubYxsfjTwQZRHEHPOU+afpPA8l/5RbvR8IcfubQafDZ5t4Oj/OoP2AMfoj9JL3T5ckZj+bUmj2zasqBQf8124f5PKNA/M+HOO/cSmDtpfFLj4SW5j+cfLkshHj5SBHkzz8uIFSW5AqNvEyfvcFgVwUO853IvlDx/P3j643gM9BA7UEKAH441U1TwCfGp/BPmp4autmya09T3PP4kqwUYzwsfCEepBTZwcfWz6MVSw2gu4k12f95D75xCm+vBj+51fT4yncN4wZpz/3Pez2GfCj80f0V+OeEtaAYVz2pQOVwceIz+ynJN+MemLbGf1IPGf626Ymkz6ueUzz0fmW1PwMz4qOolZsI84j1t0ywwAcjyR2DVyX2Cj36QHzzPQnBYXF1d4DPNd8Wftd4ouW0/XvRMNcQOCnPOI3IaeUY12gRzw4U+a16e4t6tEIL/BfUIUWqrT0THILyaeGRNgv+hkyuOitBfXT58MCL9UVEL4nvuzaRePTyoAqZ6yf+CtRexj5duxN6fRt1m/Efd337MyJrF2U+jTozwyeuL+ivtj2xnJEvSJbz7T3wvF3mwaFrQAfCpBXz2n33z/KfUax7giQDF1lZ/8f6h9XPGh42ePz0av5izafCBoyFvV9ae0L0z1KT0xeJJwGx+zxCmjD5MW9L4XDrUvCfJz41bej30URZeaurz9zaqgtiedz85f51PZe3JfOfzopculz0pe0zwb1eT0af2Fw9OWU7GftyJlWdj8t2kj+dOr918fuHSVPpL9WONR+kHAN8Wm5T+oOFT/efV0H9RVL0Zv6zyZvgT3lfmz3EMMT8QvrL9CeED6hCwxw5fvT060P6DCfRiomOKZa1f6r79pTL6Gf0D4uQaT6UVar4Se4F41e8Lw+7Br/kUHihtOxyJNewaKkLdpwrlESJFezp+ufWr5Ik0x3Fezpdyeer/GvqT4yfdr48uLG4fh67MemqdGmGwqy4VRD1Keqt3WPZT80uAm/VvYku/vw7VLrK5yrGG0343yr2ZudL9uaOR/iOmCjgfkD3exAb2JnMD/PaOCjgewDyHrIb2Jn/r/BlkMk0WdGMDfOeIjfeKwxnob5p1+Ch7vtteDelOtjfE69GO/8LKPRMtDpOryTe78toUMt8mwmD/Bkqb1UMI9hTPdJJKuP2u8O1eyUf9QmoBZL2g3Sz6Buguy9f91Bzf/5yVeNL01OFdwTXodxOwtBUFkI44uvQD3x4L4sHG4b2J58U0reMOkiXYU2re2D9LegMnbGobwreG7QQfgr4fgUb9RC9b9wfYD0zftItQfuzbTerb89uYGHbe0EXJsaQQuaeD37HT1+rfJRw3aHbwt2r2g+BJvvw763H+f6q4YBub28f5L3ovPz8QxuEILeWtzcWRb59egN49HKpxLedTwG0VbwjerYxdbMwiSOM7Ubf+r9fgv5brfs74+0Db7HGC708uA2Ebx3J7LftD5db/T4Qitb5JW+HuXe679Gbi70HGVAPuvmr+51lwuHGXbxvvUGP3e78in7jWwceILicefbydu/xdUMxU4PeJz3eeSjahLspzjbHQOHeFF7XulF/zfA2OVo3r7Wf1L0nfNL+Lf6y5Le8eMtKS7wTfMB+M7fgvSC0b2lWDj/i9x0vfefDyXhl11jf6r37ua2hffmZ4JOVLaSV6QaDfc5Q1tfJ0A+gk5KU2lWA+W79ZgQfWUr6b13gmHMnHzCotfPjb7Kgp8g/KGGg+Qb9meO2h4MmbFfL4db+uqYnjgN7yqudN60vD8NG1b025VCH3Kuhst/vih7/ugR//u3HZeT/c7aPpzZsxQ8xw+rDwKxHBrb4hBDw+9BdYgX2q5kDD5oK2H8EMX5tK3rzVw+G6NI+bby1e7zRc1l3BPJJLfw/kDK0I1Hw6e/8JswdPqo/+BexXPhno+xhU4SZ3dreidOZ3G834lJhT464QdgqEkYTexWsVR6ffvJShMrtpL/mfc588eih9pWSz5Hefr4peenaYlawh4+4lYnffG8nePay/vT7+nff9PQC4OY3n2yDjeWTcBsG6LFtyU0oljb5mmuNvK4Mn8Hv53HwwtJJK18nw/fsn72LmdFI/7VCpaZqfI/qnzo/dT/ITg5UKhXRxSwHBPxfVH/Cnkk350xhQTERUz0+8nz8gKL0MfrSgPmhn5ynARA4/KWnzHBM3geYtPQrOb/kPvH+Ieiz68fN77zemx8BmBhmXuoFU70P+52P6O/TaT77bWajxoxgk0Afb0aiPPhqLk5921e+r1Xeo2KbpkN6gffN3Y/uYm3uXn2ZfU1wwxzn1gelt+/Qbn/3vsD2JnR8m3uqDzgenn03vwX2JmbE2fuGD/hnJ0nAeWD4Vvr1/0MOFGvuuDzAx0XyLu+D73pwvFAwh9ILgQ4gD5MkKQ+a1xs/t72KXexeStA6hA/HhRE/wQ6ZPjn8x2wL8XgxqQJ7pPJHLOcK/egnokl4D9y+sn4XfHTxSHIQZPu0QLGHl+m1Yr9RAYuXxK/V039oOX3v1SD+i602qtojkoXZxgRUUpX2FvlXxdaRXz4uOupisGn3+4pffFTpPAwfHOqa+yl0Pobs3/lTEwY2L9za+2T450HX2luLX7grjGAQ+VwkQ/g/BjAyX/4+O17pvqhV0KSZHY8Iu21vSrx1utL72O1D87up+Ik+6gY3MZR6l90n6grrXdk+76gARBH2m/O8hZLRH/Sh030K/hCPG+qn+XMVX57uU360Iy38a+8SHm+q3zKErg1m++Kum50XViHSw4HE6qpvxK3cm/xJqY+zeWG+md7HYxn3U9kO5ggd+GynO39xsMFXzHccs2Iq3w/CDivZB/X7VvHrzEWGcgaXs4rdNNFww+/H8Bet77ruGW634dcrsoWrb20Kae7o3uGe0z34W+Hn1WQgGio3C2te+bcsu775Ttcb36i+H3SknAbRitc0kMnW9Nygl3D++iXV/eULy+/JWkB/7DyLpcIA+/zWhB+nH6p6f393K69LGHbHz7kGCHRi4OokneH8HlnE6e+dxHCKLcnOcWrch+WXX7fldycee2iZCSXxVvMrx8GlV0Bfcr4E/F295Pf7qE/NnuE+d37O2tT3Xuz7xGR1OJVYC6MlsBXzaXv+HUDVRsIJVcLGGa3xDZNKtm/JP36WnqPDkD4hJ+CZgp+eR/x+1mkn1g8XDYxP3U+LCK2+cR0p/d8NhjNXylvZP82/9P9J/zoMltiNkn0x8tjZn2n2/Mqth/xN/DlTyxJ/e8+wQ3P9gq5MwM3i8VwPgDS9O9jYxhl34x+Pj8NEw2CnAvfUzNTQ/Q+Dn0y+YM6BfeP1q58ngo9FSYqVWsMupUv0S6/VNIoLrzFXsn8oAV1jl/yYo7sqrW33FXGl+o0SQJ4pMdFSsv8AMvwmGH/fV+JInl/6hHV/KkXAnBD9GqRoiXp7B83hd++P2HGGAnn/WSs1tCsggna1+iWON/G+4uACuSQJv7m5fta2k1yNsDElQwb7wayySyinIfMbiS/pFy/Pbr2/P7r8y/1MvpPSkYtly98Duhe5x+7+9x+va6y+XCGJ+o3BAGx98ZzIq/PvxH/FvMSnl2Xv3OO7vuaq39FPuXP3x/vv89/kx16O3v2bvSN73fxR/9/JDj3u7d99/IquD+rPxFYSZHnxSAzPeLXbeX8xOfvXb4ma0xEdxNIo118f/tR5y1ipMfyi/xd2O/+wLZRYqLLSkffVXQoKF+Hr9IeKH1YQbXHB4iSlLq1L7BPI35Ufvr1Du4n9KQfHmHuCn+dA8DIHuuCOjecR+YUJt0HuUnzT+4pDNvpf2U+i3zpGPIFgfbdybvsREC/tf3YGc3i5XeNV6O5fy4mIJIo+cPUKY713OJk36PoM9+RPsnwG7wGruvM96SQPQM7/Na4MPJ6HWDzvLih0y8wAWfyd+9J0F3ddEYxLB9gtGzQy+Ucwl/U77E/wF1WQHV89/mtwGC1cqSUfMhbG1P4zH8XpFVk/2p/w9D8di1xn+Fqx++Fcon+i6/jlU/78FPExX/tcg1suDG+Q1ctn+iqzX/7FfykhAgElMqle794hj+Rm4KeC9IADNIr3+13QP/y/y+6/b4XR6/AEWVfj6/i4owBA/4l/y082PdCJP+0tLFpSP8Lebv92PBf9UeHvw3xAc43NytKPyDz5mY8GAf/w7T0Mxd45fq0vv//gAm461m3PHarf++a5WNt52sA7ls7qj/wlqHoO//ytBf/4P9SY3/37oDotxmR23eJAgAK6nCEwUHwvHYhpTexUAS8Y25z0kWACK6Gi9Pfd3hg00Z7Qu3WvvB6A+HVuKNHgTdT5jfEgdPmUUeGp1R0I7FPsf9zIffpd8rwTydpdy21/PYq9N/xrLbf9tT3j/VQoZl0SKBsoYLzuXcZcsmnjWYZ8xtXYA03oGj2P/A0NBAKZ6XC8Dl3Zmb2dOAOIvD5czlzQRZUYkLyu3I4cdl29nMOJaLyLyVQCar0Yve58S/2vyT5dfW1ZnMZceEhUuI68ETxqDb1kb20EvNgoDAODKYRdnk1EXQyYIClkDA4pMbnn/WP9a40LLd8Q7vAgqK78whWWbPn9RbwbPIP8WH3tqRkJ9q0T4KYcQB3CA70pewgZzbJ8hkBO8fP0KpBEbOctV5BL9ZvB+APQiZRhNqzGiSIDL1wZqN2pw1FyAuWtraniA9X8VNGKAnMoe/Ud2Rhp/aCjGTaJkoCwoDIcEgOiDa2pdcx6HWJdwAPaAo6d8Bx/oNv18lHoHOgwTwEGAhUpRHHH4Hb8Fnz2NazR3AJifTwCsG2DPCYCvXCuaRs04LQjfIICyr2jfCq8VS0PfXlsBlVa8HDsQTAoCfYCWanLCHYIHkmt7CP1Z7k38UyQMgJskfQNkL0oHb91Few0qXtYIYzZAZ4DM/TOApX1PgNj9QJI5K1+Ar1wBZHvNWKtIHGILKMIAQRuA2TlhEipLOrY0myFsDAsagPJIU9QwQLIEYfROoAZjK/caqn5mdx97jymsDTc7rxq3ML8yz2nDRUoAyFUfF/9UVEyANwBGAIY7LYD8j1+vS5xciDyIAXNzAHWrZkD162nCddhmyl7WbGpJeBynMMp7KliAo7YjBzG7Wp46cyYrdatM4QlA385xr0a7QKIvgJJzUd8x/AVA5n18cygA8SQBfB2LdXM0Tx0Td3IuQI6A2Y80mzVaTNwxOQjnBF0fKkVzPv8P/FT+ewo+0BVwOplouE87fb9KtzLNbK9Wq1Z/BS9mP0VKGxcGfRnQIoxBtGpA2kCjnwX/LWdhf1gCG6hRC1KAn9kuS1QaFvNw8yF8G9VS1wItNRtmQKjAkPsHcyVDeFw0wO9iV0pp6mnfNRs5AVoULspHcBdNfVtgSGLA3WdYIDUlR4DLnCLAiUDMmFxXNlsKwK2qaTAyjm+qCroi5FDhbMDpaSH9facrKB5A1dsaKgWoc0CnZh5FEcDCp0I3OqJGJmrPYPxFoFmAzWd5gKf7OLIcdzr0Vg8FB3CFeL8vr3pA4atwwNGnN3JIvBd2LitCgOW3HNFqG11MLICQ5zPAgwcrKEb9FExhPivrRsg5QJWaKfgXByPA1ICqMgYiaop4ICP5BAtXwNa8eixrq0/AkmlLknoUfACg13jIVCF4IC0bEjhFQy8UXtAYIO3nOCDyYmjCXoDVskgglCDgaiSvERdCgH4/eHMtzw0rHiAFwKL3Alsl82/HeBIBQxG9HSwo/23zKJ8a9wpfA99++A3SYS8ZSgG3YtIzxmwGNfgQOhALTIpDbS4ghDpTt3TKMSh+IM+/RjJmIO5XecEbbHYg7OEJ1TfaA7chnzEoWSCjx14gnhIlINR/GJg64RkRD9Ve0k0gnM8gd0v/GH8rwP/0CEYffH0goZNg13YiGlcAYVfLMb9JL0pAk2s2YGIgnXdX9yvCKu1JLxDvZcUaIJSLOiDv+wCfIX9WAL3UaTYvbj1Ec1sVqg4HHJ5rYlCgtA9b32wwRwomxBvbC+YrnzdqUzhQCCig5ycKgOgTDaBgoIDkPtRnWgoiW9FIoJime1NYqxSglVs8oNYiUxIC2xIedSDkQDKIDt8+1GErNkA6oOg7HSY6IlfBOOJe1DGocr8tizJ8CusGoM2/AF9NXU4GXmYDfTXbE2tNKwJAo78iQM9A7YDIo1mfaxg1v01pe/0qbWDA5GVmAPrnPXcpb03RerxsvljAlk9D8G2gk6sJHAGjM6VDoP6/XzxOrzOg2BtX6y5Pa2BaT2slRo9VzWQ0cP1aOWTAgr8MoNmGZ6C1vB6mV+sSLzug76DTMHbA7a9Y7Cn6STIBwJgYRoE1inErL+wNQNPoSGC/+jl8NvM6ryO8fxEkYOuPXUx+GiKODwIqYmdaJyCQLxcgnwoz6CpUJEZKpXdAGkCtwJ8gph9yH1BPbc04jiXNRwVtD2jYPqUGYNEg7c0G3mOlFmDTD3vfYnBtJT+tW6C3uGCGHCsyD0Q0HEUhYIt/foZuYKmkGcJ1H3ZgoQQxYJqg9VhOjDGFf1dpM0OyQwISnjEzHNIPpR7WUYYtYN1cFWDuw3ggCkY9iyraPGD93wJg568iYN+8N9wpVXUAcmD1gKPvMW9QwJOfXf8/8CdmU60aiAaKb1hpLTg6Bsge71rA7jNGgXcnT2DGYJaFfwQ/YNZgztxYGG9NODox5DyKb2CHJwBCeOCzpTDg3fA44LIPIODCrXTg8WCd2n/EMYUx5CaDd+g84PlcaxVYYKjYIBo+N2PHXWD82nBtAuDUjxgfcDxkoEKqF11Q6lBXKtcGPxmgpj85oJgfZT8qR2og1aCMfRCA2N9tzRuPLaoHgABFYAhR4L7QQjlLwMelKxB0iiKtXzwUMyng1ERIylzlMlZOp1zQM8BWiw3gkTw3BHwZdeDMdD3gxEINAJvvfgE94LcgJeC8Onc/STJWZwZ6bEVvcFvg60DthibnadhgcneXedxWGgLoWKhuRQkTbJZ28RuoVwUaPzIAoCc1n0oA1d92fw/FPXxc0BUNf88ulw1PIC87vyS/PcCY7z0VOa0J4LRTNBD94KUA5i9sTSwQy+ChzwTaRMgtqhPg58Dr2HNSTeDx4IIXCp9Jah7cbBDZ4MTjcxU6ENIQny1FJAvghOdqb0dPHDIjBEKrfp9lCQOtA2dOEMZYL2A34J/gj+DNjQJ7RuRRL0mTEqVi+n7kDSt/wDNghiCLYJ7FOfAF8F1nbfV+4Ipg4+9nYJZfZL8ab0yJQG1MikZg+jQcRWMQyODuM3iSFrY3rQoERmCheBJHIG0ZlTBvQxCYbW0YdR9TEIboZxhofwDg7s17EODlLxD1HysQ4OCAkIVgxwZHaG7lH9kzTXcGM3Ap709kMvU5pUMg6w99yV1cOzwalRZDa81IZ0rlSJD9TQcA9+hoL29wbGdXBS8fMQ9pTwkPY79dENO/fm81EO/goGAFD0PvSJ8dEI8AvRCUEKvaK7gPYL3dExDjtwboDpCLEO7NIJCs4OzgOxD6eAcQnpDgfyjYNpCjEOoqdxCukL5EZODtbz8QyVpKrTIPfpDHrSmQ0JCYkNRtDbY9BXCQyYZai2VvZIpdXAs8UYZMkJSQrZCOTV8KQTgHgGy8aSJkEg27Q78ZT2mgoeDo71QYYYpQjU26KO0B4NXDdaCwF02gvHggrGilWJlxENkGIFEpGkBQ+wCYoMZYUoIoYO6sPa9mRSxEaKUBTyEQg9gDgmxlfqcAvEH4AmVmZSRQv9wUULJlHad19QxQiBRwsgYQ8uVs4C0lLFCsRSGodhQ0ULmPPd0tJXJlRgw6UIoUGmUvf3xfLY1dTT1lQ4VgELbg90C3WyeQ6gD1nXC1d/A/zS0Qh2CGkKdgppCWhwCgg9gILi0lYk1GDFlQihRYTRJQvHhFUKkkX40WZTVQl6UST3KfBNoC3HBNbrpWi2dATqc8TRVQgNhjUMBNDE03JQtQntxXCBRNbp9GmjZNO+CG4JzsdGQBVwnvZCYaTSBQ1BDHUJmlfY8cIN/lewhaJQGtWGseUOq3LXdiQLKHLBtfCgB/QiU0FFFQjXdwd01Pb5DkEOlQnFDS2ChggKVnUP+QgpDT6mfglEUc0LjNWlFZJ1q8EFCZLWLQsuD32DJQraoDgkDNSlDuG11NYXAojx8Q5IUmUKkkG9ZCELbQyM0VnlzlXFDzJXklVos+0JUlOtDe0O/eAmUO0JZlIdCkGlclXB9yDFQkAa0XQNo/IKNeUILnTuDwv0Jgrk07xGNrTyDPkOSjCpCwZ12AndoDRFRQraYywJgYY9DMUNbEf+UxMwvQjBQfkBYtAc1mcWplCgQR0Isfab9eZQCiEK1hH3VsXE0JxGvQs6UgE15lDJhX0NXNQDDcTScJB9CAMPY2HsRV1XjzQ/BntFf8WDCYGkIPOfBfxAQCJnwFFFAw6DCkGjxxTDCZn1Ygd3JV4DBqOPJcNDkyVuDsyymgiNC10JJA6NCCMKTTULVnczazEydtwP5Qyq88Gl0IEoVQmhFXFAxi9E4wjbp9uDIQ1dgOMJTSGiJqEN4wlNJLqhwQ8y9ZsDAgEmQRhxEyXSVZMPrtfjC14LYPJTDjFUkw2JN1MM6HKxBL1Q+ggSBo9WnYb5BT0K48ZIYl0nYWcFC9AInYYvQqVCTANNIeMMMwndhfn1SPUtUaJTEyC+4Z/yQ8MqdJoIeQqjDWMOY/EdAdox0FXp0ncyOMTQAmMKBnZNCdwJ3/fRCQKCdURxUJzREAueBIaQ00CjomrxbQpDobVBEwxaUKZSyw4aN1pUhFZ0BjFRU4FpkksOvAPKY1p0EwdLDlAKdFIrCxIwKwxzwKsOkjXs1CsO7RK0VlshLQhVRFX2ohGztLMPMAwkVUJShg2VJ6Jh8PcrCfF1e6U1Q0YL9vBbgfHm9waywYvCWfEpD7kLKQx5D90KevHsUse3boVds6l3iVXdC3hWiwsNtXYOHQNfMbshnQdBhJLU1oLbIlhXOwhWCDnEO7M7DnXFWlCfNsEAew7xCasMk6b1kihXKkbQ9LsIcQ77DekN4GWvkzEOuDB8U7sLRFf7CxkK3wTWgWVVxEICAyLTdFcWgskKWSHJCIUOOw7LZYkLjgW70QGnlgLw5NkLhwlHDjrxvvVMRkMjkNAcM3px8wlbC/MLWwmQ9xzTA4JV04ZQiwwC8wEJUPZh9h4Kjg2I9jpWWVMg8A7xJHIEhSdFCQgzQOpS5w9R9lbD6lYXDQkI5wyugnfyaLSeD44BJHaXCg83mQpUIbEAVwiPMkDxiBamxVcISQjLD+hnaIUTIA3RLQ69p71V7wWDJsUPcPGw9cLVNwi29W5WGgA3CWbxFFXIZCHFw0KWcKcNWfCgDyXz8gutdW7Cx7VVAWSAZwvbDa52cguP9fkMQoXbh+3DukfvBFcPYGZlEcRTw1GXD5hQZZIoU48Kjw4ZhxaH8EZPC080IPA5xw8M9kDEUnsJjwhugEqjew3BCocLTwnWQ88M0gRPChBCLwnODt+lr5VkUOmh4w+vD84N5FBPCPU0OQ1vDABgZoSuVG8NwfNG0hjQ28Z3CMrxAQ+j9mcIDfVQ9nkMxuFdwB8NWA0EMxUMZfFjDqcLZw7jN6elOiAN0/rU+Gaz4IMnXw/2D3sKUfbB0pcOLmRmC/K274HfCAcIcGVfClzT8XfdxgCC3wiBpr8KB+M6UT8J5gh/C4MKvaM3BOcI1yG/CzpTJ6CYsGwBIZGBhf8IKyAN0QQPKfDwZgngO4Q38qhggI//D7qhr0ekkeAEkQWQBEAH4QKBBNEAIAatEcACQQPEZpyiGUOpB//QqNcQQeWmoQAAAJaXUUljIAAABZEgiAAC02RgAAUVpaYbQwSCyvOJAWCO4cYtMUBn8g2jC/KxpqdK0pgPB4AABxZthMgF2EahAAADUgxWA9SmDD7QqqZpDSQJUnCbVkMSQ1cHhsRgzLBpdzFGlFd111Zy4ImLCWkJIEXns0oB1MBygxrGFzAzBrsyTDXVgq1XvgBkIsRBfQYvEUvW3EbY4ICympJDVrCNbgKFwtEwR1KBEQh23EfiF7mlcI9MMvBGlgEYJnCLxcGiRdWBurVLQ+LGmfYIjJ4E8I8wjgl1z9aNUTumiI5IiW4F1gD/xFCIesIw1weB/QKQRaXC1DceQzGlbsHFxGslgHFvY56Gl1eginMF2EKQi2PRkI9DhbBhRXNVhFQ3KIlnBKiLhSaoinMEEI+oiqnUtrXQjDsPySEqURm32CVJhsYOmIahBKCIZwXkstCNS6GrdBiJ4/FpDt8AKCcvBq5mJTMV5JWntgeoY+hiPQvBgOAlJSYiV36CsQmpD1iPvdHFNhWUxgw4jscPgw/YiTJGuQsZ18rW6w81ptiM5TTYiiTWuI7XDcKC2/cvR+aA8LczpweAAASV2ESgi2RnEI/TgAAHoAABU/lD6I0x1OCMj6HYD+BGRQaECiSCIzWcCKqChInlpBCPgAahAyEAAAOXxIuEiZ9QRrRYifkLf3P1YNtRqQPYsCSPxI+AB5EzmIprUgLzJI1NDo0MpIpaAKhydLPY1aSPpI4kiB3UaIuDB++jYwytgWRWQoTkj793qrHkiGSLddeYitdxZIg/NhiLX0JCgwrmpIgHwpSL5I9HUBSKTwNGoWiJeSbQpFIIoEOegKEHxI4pBpdXEIkuJBCNSDV10HnW0I4Bd5SLDA6cME2l0JGRQRXW42OehxCMEIvlpNCJlIpkix8O1Iggoz/T/SGGh0K0eaDkAlaTnoHlopiBumGgBqEA1I6I0dCMRIoMikxDTGbv1hfF+dcHgoSJIIihAkQmuvEx0SSK1I+0iXYMVI4U8hMwQSOehASKhIi6RcyMZI1VNCyPkItkiviFa4USAhsDBaOFIaEB5aXYQoSLZGZBBvSJtI2UjmSMh6YUi9BgDVY9Nv2CNInVB4ACmIQPAKEBIIuMjyHQTI5oikJz70fB1teAT7XVBJyOnI2cjeyM5dO0jByKRIj/xRHAROPUQPyC8cUmCAAA0xCJ5aXEjaSLnIx50FyJ1IpcilSMCvBfA76gSMSqUKEEqoLLYtlHxI3ojtyOkIhEihSP3I569HMjN0DyM6iFdSChApiAoQKEjbyNtIrTc6yKlQhYDa4BhRBTBg8WeI2pU3eB5IrQAzyMlFSI0dyPgoxMihckrYMehowm7bGSR3yM/IxVQqAB/I2Cj+yL9IhCiD0PFMY/w/kFi6FU8QAHoIqYhVAGoQegj/wHoIgKNrSPwohYi9yKTIh9AVcFa8XBs9n3EEKEjxCKjI11QpiBoIqYhaKN9I93DBSM3aXUjfegbICd9ij0yfZaDxBBIIpzBKCMBI68jCSKUo2sjhKKIopUi5MF9AofQ7QiuZAcNqEFAQWQA8ADcANyRVAEUov8iGiIAotSjHyN96KyigHirPVdRc0wcopyiXKIhQdyiBKP/IhUsGKO63Jvpwj1ZOSVo5l2WNKlpZsxEAagiBEFMo0kjzKO10HEYcCJeSVjxD+QxIkABsRhoIs8i1AH/8cQiaAAhIihAyEBgojyj+iPvIuYD6yMPQtBxaDG/5ZHt0YDaojIio4FgMVqi7CDdUJjUctXEcNhpnHURgZAVqtT6o9qjxqKGorqjd4B6owai+3Ge1KaiFqNzVGwjc2gsjAgUUDC7QAohCkJWojwi1qPJGJbJYW1w1A6i1yBB7OIjVqK9VE6idqOEYdajg2G5IXajMiJq8W6iHcHuom6i8GEuwGx8vzHOovajLqKBEF6jYBROwZFUNqJmojEAw1ROovLNTCMBo8GjlGGG1Tr0QiOevA/k7CHFPcQQT+Qyogsig/ypQUAp3qnjsaA0xNXB4KYh6CIoQGQVxCKoAcQjVAEDwHVA0aK8oxqjEKOaomHddhU7TRhpJA1Fmb90QaPeAAagA3XaI2JU2Cg9GUHIHgJGojmAnukkWOdNH12Fo1hx+aPho5jxOaL5ohHd4YB5VNmi5gA5oiaB5aNJIMWjrwHyrb6jHqJQKbGiUKBG/WxdiBQKIg+QiiM5ISVDNdDEFQnArBWAyBPsCaKJo0mjSaPJoymi6qPhIqKj/MNOfP/BJ4S6QLD1PhiJ0DyNE1Ulo2EZrlVWja9xHBip5KhgFaMSAC4YPaP0jKbtttSjo1eA/aPiIuIZA6IXAR+t5b01SO8pw6KmgUjNk6IzorF9OXHvSYXVNaO6oy2CLaLtFRWhpBVzImVhCiNSLYoil8OMgSA0x5G8acy5PMJtolzBMgHEI6XVMgGxGWqiIqM8ol2i66MZAp0V3GwXAUHDqJUNFT0VM6KsAWAxs8MNFCXljRT8KdrC7XyLo2aiK+mHoiejT2CWg6iE56Ieo4ujB+jDww0UIhk0gX7s2JyGCAWjdmGPo/SNR6P0FaSdT6P9o4ijm6MXHB+i8aizENujDaID4Y2jh3X6XCFJIoF9FEPVU4zGgrMRpdUoIlMxKCMQQU8kISPxIshApiFxGJ2j8yOpoxcCYilow9lDCUh/1CMjKEAoQMbF/wFjI2Bj+SPgYkiDl6zpo69ghUMGbAGiz4HiAL7oeI1how/h/aIwGBrYvuliZRyByGMNFShixrHcIrWj42mIYhBFNIBZwVJpcx1DdC6iyBh4YiMdo1TfvP81eGMnoo6BYDD+JUJoS0OkYtkoBB1qVNhjd6MgNZBjDmjnodzU36MYED+iMaLZaZ69F+h61NoiN8xRoqhAsTk0AaXUqaP7o02iYqK61IPQhtUhoyZUg9BPaCRjRqKe6IRilKGX6OgR/ckNmZ+gz6NU9FvoJDHy/MTV1FUWyKthnGMFoqWi3GMigOJoQmKcYneiV6K6VfxiJswn2LBgn6K/YOxiO4zhoxOjYqM99V7BDGNZycQQv0Bo/auiBSNro02jdGNJaI7UkMxO1NBiTGOdadgBsGN7o+qjdyP3Q0IC7DRe1UXADlT7jT8VbMGVGKhiFhBoYh7VumPBBJwtH0h3jDhNwQV6Y1hjl6NBosaiScXuaaNVR+G14FD8SVSUY+JjrvXBxHUxlmP01MpxxmLCuEZirCOmY9mjZmIwENMdFqLmYzgI+mM6dC6jGHCFQ2wsi4wKYyuih9SNomuiTaJpos2iP/CyFBLgFtQT7NQi1AElPPMjcGMsYt5jWmMucQXVjCLegndU9MDBYvnVygP6YrJjydSbgjnVEbG2Y45x4mmRYhOiBGJ6qaFjM+ghYqFVsXF89JXo8C0LozJjMWNWidED3+CWzInU0WL51VnVVmJmYqFxsWIlLKli/mhpYjFifqKQkT5ims3CydRj1R2KYyuNSmLeYzGjvRVxPfbglOhEYbdDSEG1aCxiBiJ0YnyiBIAWuHHoPk1bo9gBxCPUAMmiKaOlYhqiEGKtHZYi1yAa/GdJ19TW8X7swmOs8HXgLDyoGN/ozWJ79YINDmMVoqRjc9Tg8A1jJ0FYaR1idoBNY+1irWNvdC1jVhRCw990PSzqjOlijmIr6F1itXX9Y331nWN9Y3jxzOkDYu1jnr0/sHLwXgyKaRRD5jD5YiIsBWO1Y8iRW7ArMSBIlWMJopzAVWLVYh2jNWOaYspjl8LiKQHM84m5o77VOmMrYiWj4WI4aCtjgDQkrJ/BG2JqqOtjSWPfFZKB63EMbagdUP13sQ7klYVZouJj6WNzaRtjFSnQdB3ADBw1oklifqIwGLtjMxWAkIw04BVJ9YtR22PZY8ewfkDYbV1Jb9U0YmWRtGLro73DNA22oa2i82JYgDuiu6J7ovCjIqJlYgei2MLIGSeE3kPUATUUhUNSNR/gO2P1FUvBtqBo9eg1QCFUUO4032NnY1UUH2P4aIo1jmE/YrdDRvXrYgIZqDR5gkI0jiIpgDppyDXz6GsDfGIr6RDiQOL/nYZh0ONBQ5DjtcNQ4jbCu5GPY6QUzFGmiVNiLK3TY/BiUMC+8Hg0EpGYFE9iiaILYwPBVAGxGR2jGmOdom9jS2JpgicI97AFgSwhTIPrgewM2WPYYqQ0shEUNQTinK09JcTjh2KDYn8IeOIBYB4jPtDk4nQ0nBXdYgMIJdDE4owNrqlxYowjygGkUUnCAOOE4mSp1OLIEZTj9OPCraYANDUANFDi76OXkGjieMAqAay0XMG+HJ5j36JeYz+iAmymtfQ1C7A5cBjDxBGVY1VimOJY44tiCKJaYstjZ42k2ZsJDHBtVL19VOOHjHcQ/dXcfBZje2jY/WLjrvQi4tyoNF20odLifDT4YiV0oOLsNEbYEuNvLReMtmN3wIjxUuLfKQrigDRy4iXhXBHK46TjY2KS9bziEc3rVJzBFsMlkMjiLuwo4oPCXLXKY7KoBGia6UFg56H849QBAuNY4q9i+6I44wViQWOyNZLYkOJzIGqwjqHcMCriLNz5gF6VrGH6gNbivRBug21iI6LtMSpZsDRLIfARDuJW453ctuLulMzj8LGO4maUNuIa4vbibrGu4i7j4OIhgR7inC1S4ocxQhAw4yqUnMGKQjrjnmJKY15iM2L64vvRrCw5I+e5huNPY9ujO6O7o4LihKNvYoCiURRGAkkB1jS7wUuiOSO4yU7jmjTWAJro8BSP2XcJMFWDvIY1ze2oY/Li5iiR4tY11iMDlHHjVQDBITHi5imx4vo1ChF3ceHg76mJ4uFj32L+FQnAnQBR49q0WeOWogzjlGKzPHfcBOPB4m/VFU0649+duuPxgi+QIUnOdIA04UyAdcHh8SOoQWSiqAGNI2cAoSJoAX8i2OLgYoFigeLlYgtRL1HQA4ehrLShIs0iJDlnAWHi5SNdoiyi3031Aex0A3HrVM3jxCIt437iAWM1IvBieuKao5x85pm9wbI4K91IQZ3jXeKt4gcj4eJEonCoY2nl4x3UnePN4gNxqyJ9IsyjQuI0HIcxh1g5cfuhXUiD4zapZiIT4zKiw+Nt4iXdSMATdNyQM+Nj4oagQ+Poo2Vjk+JoVdogV3UwA+BspKNL43CjSHUEo63i8+OLI86AhUBEYL9UZ+FdSPAAiaOMookicGI94vXjKOJ1Y6cNddBAVPjoibjbImsBEEE7o0QAmCJ14wFipuP14x0oECN4AFAAIAFEQIxBzEFAAQ4gQAEEIgAAqY/jmQGQAdAAEEBHzP1FxRAHFWBBQEDyoPL4iFg5iBbgLYBAQARA5QCsIOO4mmFNgUOZgrC5hX4oOgCWEYFBzEAWACAAgUDqAAxBgBJkARyj+ADAACLAiqJAAAMB9+KP4k/iZADP4xQA6clZJHWUOGTQwO/i7GDZGRFllunwE8+hyZElhEIBBEHf4mB8yODnZVcgILiraXlA1ZAAEtwAgBJ2IUATZAHAEqABIBJ4AaATYBK8AXEZEBMPoEABUaNQE1AB0BKb6XQhRZmX/QFAwAFwE8xB0yVVEFTY8pirxa3RX+Pf4kbYq8SX+BBom8xPDPeh4iFogQASIAF34kABuBPCAcxB4BOAmDLw93UrgI/kVBMcAJCUmum6GL6AdpAoIiVBYAEaAWQB6IFgQKBArQEEIPAACgBkAFABJEEkQHwAkQAZQGkYAwGME0wTcRnME+BwGCEzFeRpRkBsE6IA7BOHgBwT/2JXMZwTTUFcE9wTswE8E7wTVMF8E5kAAhKCEsAAQhJRQMITaQAiE6EMohLepftjQCE/sBITyBNsEjCV7BIfSNISrZV0EkIA3BI8EsAAvBJrRYgB3EF2AQhB8hL8EngAihOCEpoS7UDCEkASwBOIADgSdiGME3gSEBNpAffinMHw0NASL+LyoPAVPQ1qXMaxb+Pv4/RglBJ+WL1p5BOAQRoTbQAkBV1QXAVVEeeo96BCIPQSmBIMEvEZKhJYjaoSWGXOgFXw50yKIRITL8WEebTQrZTuEzoTshK8AXITmQB8EkYSQADGEkoSJhP72BAjQAGeE1GVXhP64j4TRcAaEt/imhN+ExtF08HdGAN1ARO6E3oShhJkgAoT/BMCE8YSkhLKEoCZwhNkAGASTBKqE5qVNhPF8S2w8xVOEtESyRPGWC0gnBIBEq4AuhJyEnoS8hMJE8ETIRNKEyYSKRIqEqkTYBMiEukSaFWWldQhmRPf4qujIHkxEqohsRJcE7kTgRN5E0EThhMKEkkSoRLJE4USn2MpE6kSJROiEngNEkk7TL4SzhJ+ExOZFRPIIZUTMhNVEk4AQRJbRfoSWgAJEjsAiRNGE7UShRJhEywBphLYE2YTOBKMEsUS4BL4E5YSBBJkFU/iRBI2EvQY0eMXYLlopBJkExwBflmuE6kkL6E2qWUTqwAuEpLtXoHUEq8xGBOYE6IA4RKDEo0SahNnwDo1o6N5Qb4TAJgxEpwSVRKBEh0T1RNdE3oB3RIhEz0ToRPIkWETAxMNE2kTjRNuI4yZ/RTIElkTLRIVEmsS7RLrEkdh8RPtQTUTiROKEr0T2xINE8UTuxJLEw/BW+QlKDMRKxJZkROYRxNQwLIS8RL5Et0SBRNbE3UTvRNFErsSXhMlEt9MDGQlKUsV1xKeYnfgtxNxEnkSJxLhIZsTBRLbE8oTOgHhEhU1ERNkQhOxPaIrEi0SqxKtE+8SuRLHEtDAnxLcAZ0TBhMnE/kStRJnEt8SKRN9E9gSAxIWEk4AQxM6AffiDQhDqdYSsCJuFVdBhBBwaPYS8BOHWG2l+1lcOO1YzqErEiuD8cPeSfcVorjOoW4SA3TzEx4SCxM7EhcSzxJ7E+EUyjhCFdMTWRNGONMJRkH+EnESQJN3EvoSiAAGE4QBGxJhAF8TDxMvxPUSOxM/EswSlxJeQg69k2hwaG8SrG2pACEQORKEk7wB7RPHEvcSmxIPEuCSjxLnExCT/RPmEoMTFhP4E7PA3UgLkCMTz+Jwk5cjT6gL6HaB660Ik2QTiJOqHb04yJNxolQ1KJPzaaiTFSVokgpMA0WCIRiSW0XzEu4BCxNPEhETzxKP1XSMXJOUDe/11JL4knXgBJKxEzkTdJNAkx0Tu8UgkiSToJP3E2CTSRNkk48SPxKLExcS3hMDQs184OiRUeusUpM0uLSSyJFtE7cS9JLAkgySpJKMk4qSgwW9EsySIBIsk6kSrJNDEmyS3EHsk0QTcCOmUfAjYukJQaQT7+N8SCIFHWTmkw4TQykrEt+9LcQhGVaToIhYRMiRdBKYkwwSFJJ7IngBvxOeEYvE8UFN0QwjC4hWkp5i8ECcEjoThJPedP10CpK8AMEAZAFAEsBBQEB3E+6SEKBek/hBQEHekgCSrIB3OBYBXxJMk98TopLYk1GUDpMUkyqSIwBOkupBrUmsEgCTuEGukpqTbpKyk310vpMekk4BnpJ4AV6TfpI+k/l0HpJAAXGS/pMHE2+5AZOnErqTQhJFEsqSYpIVNSGSjpPeUMSjzkANrBGTSZKRk3LwUZJUIFqTQJPr4CCSxJJdEzGTAsGZAYmT8ZMadQmSRZP+k1dArICBkmSTupLnEk8TwZLpk5kAGZOrFZPx7kDOkjadLpM0uW6B2hK5kh8SCZIxkxQhsZKJkn6T3pNak+vgJZNJkgGS1EF5QYGSSpNMk76S/RL6k9igUJJKTJYT0JLDE3CjsJL0Yl0tZ6NSYsKt3JMTEgPR5BOMWJSpCBVeaSsTql3UEyvkq8T4jHQSuZN2kp4TypPYkpSSL6H9kkUccmLbCS6TMcXYI0KSlRNRk0WT9JI1EmCSKZJ1E+2TQZNYkmkSU5OhkoKBZkG31LpAw2J31bOTj7gRgG6S9ZLuktUSnxLBEoqSy5LlkiuSFJJVkimA16Mzk5aTEZPEAFuTHBM5k2sSRJKdE/mSoJOfEzqTe5Kpk/UTepLmEl2TLJNQk92S9+IEElAgIjW9k0lpsOJFSGR14xP2EobpPtkO2HJY0xIHE1QTqMkuE7b4E/hcAoqVE5JYkgeS4pI/tLIRu2xf4seSgsKGSFmRgJLRkx8T2pKuAaSTjJPLk6mSwZKrk2KSOJIdyWAC+6i1ku/chwD/kpqTp5MAU4uTCpNLk2cT+5OTkqBSlJPesWBSv5LZk9OT1kiQUz2UUFM7koBTvABAUymTyRP1EhWTIFK/Et+TFu2tgJTpuingUw6BEFJz6ZBTRxJnkwWTKFMXkzBTwFMrk4sSa5LwUz+SeJKNmBBTbbn/kwuS2pNEk8STAiG7kjBT4JJXkx2SkJP6kngTN5OskrwBdUDWEyMTHJJnlSNjC2j6yE+S8BLKsEOTq2XEU5EBTMTvkw48IZnDk6LhBomfkqKShFOhDemTGFJY8WIS78DzQa+TmIFm6VsAnBK4oGRT6+A3wY2SRZPNkj51LZLlEqWT3kI9E0BS+5MEU/aTlZPcU2rwhBDjQHxS/wD8UvYAAlLIUsWTDZJCU5oBvpLekoJSIlNNk9STyZNiU6hS5JPnE+hTPkySUjiS9JXPdfyU0lKuAMeSI+SKIK2VAlPCUwmS+ZPkUySShZMKUvGSulMNkyJSmhPEuW2TZZOXk+STsFKVkmQBB5M88TxStiNrQMzjLpLaU7JTuFM+k4Ch8lOFk0pShlOAoEZTWRPKUlsS4lMmU6pTTBLcU+pTTqPlcctBllNaU8641lO5k9GTNlKagUJSdlJ5kkpSilMlksZSZZOOUmhSplNpk2pTZlOSU07BGlLCEa5SV8BWUu5SmpM6Ut5TCZK2UgZSzZJhU4ZTSlM+Uw5S7ZPiU2hSaZMVkgFTDpOSUhDUtsNugCFT/FKhUnJSePQ+dOFScZNeUx5S8un2Uy/EvlKUUkGSElOmU7FSoZMgNe2By8CNpPyTblKJUz2VoVKpUtBSnpIKUilSilN2U6lTkVKtk6JTxlJ+UqpTV5OQkjeS3ZK0UiaxTwFGkqMSSjQXFRKR2MEDk6IAp1hIk7yTFmF8k9jB/JIkOQKSo0WCk3Y0GJN0Y/QS9pKZUuZThkwqkRcVLFPVeBqTExUEkklTZFL6UvhSe5IEUjFSIFOEUoIV6dntU9JTaVNSkxqTPZUykmRScpKWEPKSFFKnEipSl5N+Un0TVFPMk9eSBpM0UoaTRZHU3HgB95KCFbiVypXjQv1AExK1UzyTHQLdWcHFDqEBObwAAJKok9CjWFlNUvahHFIik5iTnFNfki5Sc1LEac+gCFKiUjST+JPuU/WT6xK7kmNSjlMqU0qSfVIqk7NTJ+ikaZ4NzRPFUrtS0pJ7UjuS+1KtAHpSBZIXkz1TlFPfGGVT1FODEreTR7CQ8f9dM1L0Uy2C6zXKlDKV81NPkuxTi1Od2bdNyJLkkQ1T1BKp2WtT6JLCki1SHhKtU/5SbVP/aVxYEpXiAB1SnplSZdKSlRLDU1qSI1MUU2NSvVL+UrFT31N3aI8jy0O00eqS/1O0k11SI1KXU+eSQNMHUuNTpVMTU52TMOFdk+ASFVJ4ADCQqqCzUriV/GOOoDvgZpKIkgykvJME2HyTy1NvU11R71M/FOiS5JHjk59TIpKcAFxTq5LHU7KJVFEo4ODTNJOdUrESC5KA0hsTeFNgAKhT0NOHUjjScFJrkuAxuNPgpDtTRlODUgTT85PbkgBTyFLkU5dTUNLRUk5SN1OTUjRScVLw03dS1SiI0gxSOZnwkyvByNI8kyjSL1IFOPVTaNMrUgKTq1LqExjSQpNzEhtTX1Ig0oFTJdUE/R2VA1NvuJTT/1JtExDSRNJXU+lSwFO9UqTSGFIuU3KJBnzUkz5SAtOkU4TTwJKjU91SxNP4UtdSE1IpUp2S15Ow0uVTcNLTUvlUTDRM0ksizNOdAVTcTFKs089S1MVLU69TpmDo041S80QfU5jSn1KkgdzSk5LfUoFSYtLnlcrS/NMdU+DSmpMA07KSQtK00iZT41LoU31TiNNkmbrSnej407tSBtJ0k8NSQtOQ0/KTQtNA0jLTdNNy0lNSDNIK0/DTiFWEEhyTYkloVXyMN5E1Uoa55BOq0q9T9VMsUqtSGNJgFJjTpmBY01rTu8TY0kdTONM2ElCRo6Li06dSEtKnk9ZT1NNnk3pTRNPE0sDTTlNHU97Sapg0iKdTO1J+0z2UhNKG0/tSS5LW0hlSVFKy0tRS9NK3UwzSiFWY6YrTjSGGQGJUTtMs0xMSi1Iu0mjS9qHq0pzSi7ju01zSyJDuEpxT2NObU1OTQ5l07KtjZtNnU+bTgtOS0ueSVtJG0qVTJNIZ0muTrRD5SBggf1JnUkNT0hMG0nhTVtLQ0kHSNtJjEHDS0JO3kmyTdlWVU/RSrlXZoG5UP+VO0zK5ztNIkuzSydIc0o1SKdJlmKnSzVKJUOnTXtOk0pvpA6N1wX2FetN/U/jTAtN64v7SF1P5UjqTV1OR08DSalPfU63TOKzGsVnSxdI6UjnTF1JS0oHT0tI90zLSTZOy02VSttPy0j2SldP5VfbSxpLX0DfQRiElVU9SKNJ6MX5k1lk2qNVkK1NJkhrZcJkSuFrww6g3Qc1SntMtU9rTPNPqUsSAPyQmY4Y07dKT5akBwXgQ053Si5IB0zTSB1O00sbTMVK905JTWbR9VNPSWlPFUxvTJFlL0jKSFtKS0ihS0tPd08LT11Mw0nLS5dLy0hXSd1KIVXRSDtJ7FbtUnTAs0gtSztJ1U6jS9dIokg3S71MwFFzTTdKqIHaS2tJfk61TklM30vFw6phF0mHT0hLh0yXTltOjUxHTpdIy08bSwdOT00IgdTGRMO3TRdOU0m0Tn9NQU1LTgdPW0+fTo9P002PTFdNFkFDVE9JVU/tiXqDZoHMgtdO1UqjT42VJ0w/TSZJu0k/STdLrUzexzdMi0llTWiN4DZywCVPi0p1THdMmtIPSNNJQ0zvTRtKqUr/S3tI3YlBlwQWqXB/SqDMS0+HSp9PAM8PTZdIWAeXTt1P34jRiEDNV0gSBVGOmACrSg5O0Yc+S6CWTEvPRI5NEuO+SFYFjk7mwGBMv0ptTr9IuUgTgZGKh03xSc5NbkrhSHlNAM3KSudLf09BSkdNn00HSWDJKNXQyxMnulZuS1EFzk7gzJdJ50odT5ZJ70ibS19E2VaOiN0CcM1ISzOKtlWgywDLD06wyBDKgEpfThDIEEwpiVdMtgkeT/TDyY7mw0DODkuQyisKWkiOSAJKjklQz54DUM7QS4iATkzQz6dO0MpSSOfFlII+YLVQCM1oSgjME01TTFtM50wHSpdK70pgyvDO/0uwyK5igNfONLFOrQQIyV8F1kkIzQ9Jn09FTPdO8Mt9MEjNDMdAdRmKH0igTx5OcMowzYdLqMyfTXdOAUsIzhjIj01gS0dM206Azl9JEMoHwcdNtASpi7mN2EwnStVNSMiuZ5DIyMsTUlDIfoHIzNBIKTMfSNDCIM/nSm+j2KCAsDVLHkwwzJ5NIU1vS3VLMMxoz3DIk0zwyLdKi01OTXjMuad4zCFM+MtoSsRIGMpozGDL50koyRFOCTNCNqmL80nozqjL6MmEyfjOA0hgzedIdk1HSk1K2MjHSdtJAAfIixDNiSUwJoiJ1FDVSTjLZ+azFzjPSM+xTlNWuM64SNBOuEuOTCDKKM4EzalI4kySIqTPOJbozZjN6MggylRNhMgEyQdOYMiGT3FJHENIi+oUFMqEyajNFM7EzhtNxMjwysFP+U5BBeTJaFSQs4UT90j4yJ5OhMpUyTDP+0v4yO9Pf05oyepMgMzdSvAGQQQzSv0EI0g9TDSk5Y4JcJp2kM04zZDIZM4ZAFDLjyFkzo5NF+dkz1DJa0+4SXtOIMm1T66nn7cpdXTLRMoUyMTJFMm0SJdNMMuEy8TPVMqvSlJPg8OlYLCMOpaYyDDINMxUz4zIn0ngzljI9UsLS1jMlMkEya5PTMiMz3hBxY83p/DP1MuYyvjPF0gsyX9JD0pMy1TIQkq0z0dMGkuPSvAFl1OIybik3RPvUeFDdMtn4jOQq0clwN5ErElThkfm44QfYrhSeMxEzsql71JWE7+EFMwp5qDLWtXlTEzNf00IyhjJOUssySDKziYiFaxXcoNcyZZg3M9kYtzJNMtszATKmEzsyiTO7M2AzvsGTY/dT19Nwksr5o9RHMpy4xiCZM1jFjhKvk7MzzhMYwP0yboBzE7aTCjOe0xtTijI60i5ScO1ldP/IbxOrE37TjTJd03cySzP3M1ozbDPik0csVhB/UpCyFjLFM1UzbzMZUmCzU5PjYldcRdN+EtuTCLPNM+EygTNDM3FTQ5jEKKgZELKAk5Cze1Lb0wYz0LO707kz31L1YhaDgsh/kuSNWLOHE9iz51M4syNTzDLQsqwy1jIiMrgSojMM0ndjyTJ7FbNivl3M6NAyDhN/MykF8xhOEvzSIBBAs7MTH5PzqBczSLJk09Q1gDVREqJT8LPSE2EydzK4smSyMLN4s5JTzLLrofQyyROss4IzlTIR0ywyP9PD0g8z31PG8LdjKLM3E4wyOLN+Mm8yJTMwsy3S1WG/dBdjWajwstizvjJQsiSzxTM/0qKzyzJeMhZTlVB4IBKzRLKSssKycTNos5MyOzIJMrDTF9Jj0nYzPZIdMt8z76P5mY6gf2FpMxzZ6TIUEsOTbaUAs4gRlDKjcVQytBKQ1R7TgzKgspyz6lJQMsDgAIHlM3MzMTJU0miyfLItM+iznjMrYfmQEAjGshszDTOAMxYzCzOks3yzrDP8s3FTgOKLQtyy50XGsuMzTLRAM68y7LIisiAzSrIX0wQyFLJJMpzj+zOqqOzjnuAc4r8ykxMuM7VZ/zKAdfyTgLLvk0CyjLI0MyCyPNN70jiSrV2JwcChCcTt0jyysTOSs8KzUrL8s9KzDzL9oMzpkeImFCEyrLMSsmyyvLN4M1YzHLIYs4Gyu2ji6ZHi16nUkqizQrPEsmGyiLMiswaylJJ98WqMJuFSAFGzcrLvE0my1NNQs+yzNrNLM+GybVJpspwUF4BugG5TxVMhso0yCrKW01szYbPCM+8zyrO2M6IybJLa4+6yAeAMNFriXrM0s5rE2FlTEz6yHNO+srMSfzJuEzkyAbMr0oGzcFIcEZsIFNPcs9GzPLOhswqzprLoslMyDbJEUo2y8c0Zs79TmbPqMrGy9zJ4s3GzcFIqRLR8r4GJskKz8rLJsy2zDJLdsloyqbJEUqGoEuNXAR2y/hKhs4WzvLKDs7iyQ7I9ssOyEA2q47JYo7OtE0y1bLNFsimyLrMj0zYzJbOJMnszvsD3kx0z+uM+4qRowjXT0qzTPTi0sgMlP6AAsvPT3+P0sn6zDLJ1sqAITLNTMmuTOpXSlUjB07LnUlmyUrJzsuGzQ7LLskjSIBD7s4lTMbKLM6fSE7IRM0yzR7NRIu8VAzU5U6dSSbJ5Uqaz47Ics92y5rOEsGKYSWEXs/HiRLKZs9eyp7I2smaybbNGM6z97DLyNW7j2rMAkvKz0hKvM1mzJLP+MoezxbMusqAzC7KfMifVH5H2MlYt44HfIUXiR2B30pqyfzJas70zMjNJk7IyurNyMnqyLVXrUvWyr9PnsoXirBQFISyyczOWsvMyndItslUyirPbMiLSd7L8LZeyBOPaWJazhTMfUpUSn7MHsvBziLIIcxczJtJVw0hzozIVMiaybRKoc8KyzrLFs2SyJbOusiqzpbJxg9bsQAD/s4e92UMBgEVCq7KJ06zSSdIP0m9Sj9Po0vAzAi2p0jXQL9MQcrQzkHNVaURz6AV7lf3SgDOOstay3DLfsjmyR7PnFURyZcSiQxuzFNK4MsSyB7I4c7OyaHJl0nhzIjL4cwzT9jWqspPSLLRoNCE0V8A0sqRzddLLU/XScDMc027TFHLP08ghadK5MpOyghVGIzyU0hJ0ci8zmpNjs4PSpLLZs8+ySLM7soIVreBic/mzodKsc0NTmzMTMrhydNMcc+SznHJJM/Y1jNNLs2s1DFJgNAKIlbN8c3VT/HOwMpuygnIUcyNxQnLpQcKTVHOgs9JyqnM/UnDjTmjiclvScHLjst3TZ7Nms+hy9BlA0aFDanIAMx/SXVNPs00z6DPsc3OyNjMJMguzHzJ3U3G0itMqcma0aDVi2OpyqtL8c2rSLOHJ04Jy2nKOsqjiInMIc/IsWvEECVGzLHP60/2ybHKQ0uxyrbOKsuhz1HL8LVkZoLU4Mx5yMbOGc12yxnLvMj+zrTNTUouy9LWnbZSyMnNmtNEIIKEas9AybNKLWRpzZHMCcw3SznPu0izgy9P6swGzL7NBNEzNYXN+ch3ShnMSc6ey+DK2szmygVIniGpCM7gsc3iTcnKbMrOzknPOs/gzinMrkjZyMJMjEOWyZrXLYLeDt9LPUnXSGnOOc6LhTnNacjFyHFN1sivSkHJ6cma0/vnQQwly5tKecl2zSXOxs7eyJnOXvYu55EPlctnTFXKWM9vSlnLec/By59JBcrsywXO/s2yT+KKEcnZz9FDsgdvUebIOcgVz99ORcurS5HIa0/AkmtIe0gozWNIGsyJzYElmMpRhDQNHk77T6XP6MhZzmXPJc4xznhBtc22cBnMoMv5yQ3IBcugzudMMcopzjXIfM01zNnMFYLly3bXiAX/8UtQkcwtT6nMdcoVy5jRFcmiTT9Iucn8gILMlctRzpXOzc5+81NFJ/QZzrHKVcs+zrbLSc22zsqgVUY4Mdy0EGJtyCLNDczhzk3PjUuSy2XPTclYS3HMQMv8AGsHaIrYRjjJAciEkEknOMoOgIHJOcgCSDGXzoCPk7jPac4FMO7JqUzUzU5OncudNlszt0+KAhLM9IRzEz3Lzk1azGXNfs5Zzh7OIM/dyZNMPc4NhOUhPco7gaPgvczVhqLNDcwpzh3NZcnDTbTNusmDhhHOpwfmY1yFnctCwUjNpRUZgWThXc4Vy13P0lBxdqQC3citz3mK6c7kzH3Kt0k60j3MTFG8TT3I/c7tFL3O/chNy9XKTcu9zw3IfcvvTsPJfcpKi8PPfcrW5CPK/c5tzdXJScttyUdLzstZzeHOgMwDzwXPnoEuyarLZQ4/BagkVRCzg0DKoYcxSQWTZqBuzKxKFYP0zP7TAs5Ryq3JfU/WyzlOSU0qUlIAQCBTjaXO9GKi54nJOs5+zf3MTsxJT6lNKlITywpC08wlT2ROY89azWPPeckYzXFLU8gMte8FF0bJzfFN084jySXNbcuzybDKlMkzzJM2c88YiAnJmM9zzrPIMc8jyjHMo8kzyppQC8kTz4PMIUkLz+3JI82zzDXJ88pWSovPnwGLyLPK5UqzzEvM885LzaHPs8liNMPL70CBhMvNc8jJSEvKf0/RyCnKHcozymVOK8wTyXyJc88FTsvPkPULyavPC8nGzjPLIs+2FNPPK8nTy/bKq8jezRnK3suryNTKBUlGYyvJa8+LzBvPjcvLyw3Ii87ryZNMDYJrzAvKactzzZvNqM4byVjODsueysVIa81VSMvL686bzgvM28yayf3Nq8vby93KBU3/CpvKC8jbzIHg88gOzcHINcgrzUvJ5Msiz+PWO8+7yKvLO869yLvM681VzxvIuUgig7vPW837zHvPa868zDPKu81TyQfKqwnOR0HIh8nLyhvIHc15zN7PZsrrz6vJu8o7y4kKR8gbzIfNy857yRnJ28oFz23Lh8z7yEfLx8wUzKvLm84nzAXNG82HyHPIuUi54C6AK6Gny/vL0c7bzizMZ88ZzgfLIsnqY2fI5kDnzCfNR8pLyFvKx8/nzlvMm8xHyRfJR8unznnJe8jHzUnI+c/byJvKp8oG18fMjGTnzJrX086hzXvMpsyLyyLLGTWXzozNp8rbyAfIN8tKyMPKBU0rzTfLvsvYAdfLWtPXzybMB8sby1fPS8oTzNfLl8tryifMV8knyefMx8oHyPfMZ06Lz7fO087XzRfIV8ltz8vMN8pbzYqP888PzLPN98sXz5vJh8vnyQ/Jk03doNPOp8s3ynfJqWarzofMu8jPzrvJM8k8B1EPZ8vPyo/It88Xz0/Ivs5nzGdPmcIXy3VGT8vTzC/IM84vzgXI48sqyuPLgEnjyzXJQICdzxDPUsXSRtCDkINhwcBPv4s4zU6X4BEKI/NOgcjVFLSDn8h0pd3Ip8ruy7vjH8/AQJ/Lw8yy5XDO3M9HyRvKD893zS/KUkjcQBLD6wRVIKDPFUou4r3Mzsy3zlfLY8wrzfPNP82oRN/NppK/yolJv8vfyi/Ld8pnyivPcUwn9e1iOxL4hJF2jMuN5b/JoM+/zD/JV8o1zu/KuspxzuPP4c6Ygh/MO0xrcxCAXhSfyiJIZLN6y2WSHyaTzK1Jp4vIyo0VJEBTyVzHCc9DzKPMBUjiSLcisFSmBCHC1k4AxN3MYC4lyybN5kg/z+lKFUwZTEVL2UsVSolLURKi5+Au+UlLyDzPOU0ozMWg21BxhBTMGaBfBHQmW4dnSfjOCU55TBVJNk4VTuAtFUj5TxVP4C9e4GRCKIGAL3vNECgXTlnToC/ayVjiE82QKaXPmc6GzFAvogF5TVAr5U+FSbxK0C2c4dAqECt7yRArqU0oyjAskC6MzpAqYCuQK8nNdU6wLswFsCrgL7As4CkmS+Ap0C7QLT+158+vz//KoCpSSfpx61dVwpAsYCpXFmAvkCqwKyVKUC7ZS7Ao2U9QK8ZMlkpwKv5RiCo/y//KlMhIKa5KSCiQK/9R8CtILkPIyCgIKFAuyCmwLlArCUtQLcgsKCzQKogucC0oK9AvcCyoLsqmZgXFV6Au/k+oLzAvaU8fTAgpaC4IK2gspU/ILOgoiCpoTigolEPoLH/P0CjwKqgu5SOdV/xMIU3wL0gv8ChlzmgthUnIKHApFUxYLHAp6CkoKaXP6C+GyDAqGCle8UKFGCvYLxgpkmCwKpguOCvJTTgvCC4pTxZN4C5YKrgtWCm4L1goGCnFSOJPaHRuxagod8t4K/AveCgDT8nINkp5TWgouC84KHAqKCwELBArJ89jzVnJ78hAK+/KQCngBqCJQCqGU3yBrYL1c53Kn8yno5DJNxIxhJzIQ8goI75OcYWn5JgseMq5zsfMGCvvRSQtewckK0LCnM3yRh4V9pHVyOgtI8iwyBVJRC4UKfgoAkspAbgyxEC2A9ApHcgDyCQpAAagi9jKtcxvAuQphYT8h83LZ+HlRqQqpC9WzSZKZCxkL9iL+siVzlPKlc67yOQs8VaV9pjRWgSxSakgFC/uBzbLCstgKmXPJUlQLQgoWCtEL89NlC4z4cGnlC/9y8tP78ndTqCLX09xyBIFFIkXBwKBesmkK9Qt1Cg0L3+KNCqbkTQrbsmXi2QvG8q0LfekjC1yhowr80h0LqfidCmOzWAo+dQdzkQrOCiUKPQqWCxMBfQt0+f0L1goVCoMKlQuoI4Dy1QopgbMKAGkVYdhSYwv1Cvcl4wrpCw0KUwt3BBkLUwrJoVfyHPMzCiMKKBEdVVCg9TIHCvDYCwqvgZ0Liwu6U9gK48HFCsILKwsrE6UKNpjrC7zyGwpj04ML9+MDwbHTWwvgdLJMlYQaMIB0fHKRIPULL5ITCt0Bb5Oe/axSRwp3c9MLa3JZSMu5IBnXkKQLJFJtknWSiwv98pJzb3Kt8+9zrnJJSPYYqzxvtHwLfwpIU/5y0/M788ny2jI/CiCKDRHvCjJTL3MpBWCKlwsAi5VzdvJL83FyIwDtCNi8V3DQiiRT2FKkU52yWPIl84PyO3JhoIiKvwtIihWYYIs4UoUKwvJAi9+y4As/s9lyd5O2cgTz9FAAcNAd5N0EGa8Kw5L3JO8L+wpvk64Snwofkl8LqxDHCrCzEwAyjDTR/VxMC6QYRcCwigCKY/Jfss0z2IsW8tVy3QCUi8rRDe0DcmYyMIpsgDSKhbPp83CKsQqf8jKzlhATsTR1pIR/C8iK/wu/8jvzf/PwipCLNal+kBKRLECci6CKXIosioLSoAtJ82ILEIoUigkBSPiYuILofmDYUzMUgorv82vyEIuxCmYTcQpKcqWzDNKMdLNz36GXCH31lgK2UDOIRIok8rlpdLLvsp5875LsiUgKsXPki6Ky9BjbA00DscR9s7+TmIonWR+yb3J0ih/zvPO2skzzcorX6Hw0mJmci+KKWIraikKLA/NuCiNy30x4jUBUGByaivYKWov/CyhzufJnssKLVfNoivQYporp/K5A45mhCsyKOFNaiwPTRouWisoLPIoiiq9p6otSiJHtP4jii28AEosmtdhzA7OgC+sLAwtKc3jzynWyiqCVdhSZdAqKUenhcviliopfJfAKfQqkijVEZIpZCsJzOnOrc7py1ovVc96sAFRmiwaKbouGig6LxfNLC3SLJfPfCj6K5Rn6igx1roooeJGKsRPuipXzHoq6iilyLlM3MGdxGooRivGL9ooJipaKyXL0iz5yWTSfKC7JX2V2C0yL5ov7srSK6/PCi2qKYYtmdJOpVnWSk5qLAovxixaLDovpilNzOItBc7bTXoqwk08KMHXPC/yhp6zqcm8LzjJKiwGLJIqrxaSLWTPnMt8LoYuQi7zx8Wlmi9mKRYppiyyKcIpFCrzzhAtJi3BTqJR5PX51cYvUi0WLgoqSijyK4gt5ig2LpVEauXtzhYqGis2KXYvgit2KeYrsi54R6Iossol1w2J2ijmLKIps86iLj/IIiixAw4v0wJ9kAor9ihaKA4qsiq2K3vP3CjKKSTLZdd6KIYFYwNPiJaBVi0SLkiTAcyxTyou1iqqKgzJqikOKWSRZoQeV44BwNR2KPZmdi7Bz5vNRizqLrYomiq+yyuObitmLfFN2iiiKT7NditGKaIoTiyBoTXAHiqmKnYv9ijuLM4tj863yfXN3soTMk6n1dKOLTYvTiheKLYqXi0CL9IuUnDGDOBgaMFuLfYsRi+eK7orpilVyMNNTc9Zyx3J3kluDhHLeHVSB4PFdUbt9tQt75MuKL5IrivzSq4pBinWKadIhi80Ka3P1ir91XoFOA2SZB4vQi6OLR4s7i1cKjovGileKWSVBFCBLPP03itOLOYqoi7mLVosnioVhUEoQss+LqYu3iy+LxYuvi8oL64ol/JGMLovrdEyKh4pgSkaKx4u7itwKbYq7stp05DwPeAd90EvPi4hLNzKvivCKu/JxC+AL0oq/sndTe3QLi+nJwlhvdD/U+XIo01WKxIp/isqLHwv/imuKqiHICyGLe4r9IHQISnUC8WeK24ovi3hK0fLdC5KLbIoRsqD9BYuk8GzxdEtmxduKSEsYS4mKe4qQS40hVwEaUxyprxMISueKeEsvMvhKbIve8m1SM9HsQTfUYTisS3+SbEoMSuxLQouOi92KKEs0S7u8csjcSuaKt4swS2OLsEtgCwRKuIvvimySAPXES1q0P0ybnW6AoPPi2O8L7NLZkw5pzFLdYORK3NIoCsCLRSEIgI8A5l06InaLd/JjitiKmErj8g+LRZzW0f3J5sV5ChzS7UEjs5pKOvPHi+OKvIoeDOo5aHC180/gvoDKeTxKG5jgSoxKg4pwSkZKWP06S8ZKf1Kz6GtTe5Dci/XzWkuXi6pLCWAupMhwJktw4lhxZPi2S13yhkvIS0xK0fzw9VZK7dPWS5zTvGOwirmLjEt8SgALc7kOStZKEYGmSs5KHooiSxBK9kpUIVGlbkrvsyZLDoG+SgZKf/IuSk6KPYuEyKxpgUoj80FK/dVOSiFL3IqhSqJKrksqyFQAOyFw8yWT7kvBS1iLBkp2Sllzb4t787iKbJKY48RK5kghMVShkMj7qIqLbwoUSiPy/4rq+UGKdpBUc9RKjfJEUmcpFuVpSk2yyIowSlFLtkvsS5hKbfOgUqoxFuQyjPxJjYroSxJLBUtsc+ZK0UuDij7yRFPFS+RJWUz5SpiLZUoJSyFKiUoo8+PyAeFVS8VciEwj8tSK9EpmS7xKVopMSg7y+yjSk0ZMHHg1S01LrEv0StUZwkrGikEK7gvcUqdAIRAviSVKEsy4SohKfkqJiv5KnopJSvEKbTKVCyqhxEoqwRGJMnSZOJWzGpAk84p04PLqjLcLQniICrDFr6nTS8Vzz9KU8kMzElInCqdz4kDoMfjJSFhNSmcLh4AvvFayufM+CpELZgvXCr0LJQsIUvpK/53+S9kKwQoPcotKc91cTA50y0rv3T0hK0qwc3Xz2/NJUk4Kywp+C1ELG0pmM5tKn2J8S0EKMUvyoTtKAkkQmDOItZLDdAdLWHOrSrILR0rrS8sKNwppUxsYo7lcCtpKMwvbSmTSzvBeoacJKVCkCtdLy0o3SodLpgpXChVKxQt3ShtLNwrHk6dKj0t2SttL50vEcFcIZ3EWYaVL0IpvSvtKIAud84dKQACCC59Lx0orC/dLgcH6Sy1KNgoLSrRxxqDVdItLAMqNmYDL5jNT85cKvgrHSzcKJ0rfSptLD0tnSj1KkMqMcE6gTGFbEQx8Ez17SzDLGzOj8gjL3QvaCvdL/goyUj9KSMpt8sjLf0roMQ9pqMsji2jKvoCVxLDKGMorCpjL5gsRCgoKqwqrGYjKEMrnS99S0XAvS6yxS0tXSwTLkPOEymvyXQpmCqDL8Mpgy1jLpMqMgT9L94pPSn9KFMpKEfb1lMu/kujKq0vvSmtK8ujEyvIKJMouC99KZMsiSpVL7gq5VW1ZZQUvSizK9gqsywdKwMofS3DKd0ugyljKNAqnSlzLW0uMy99TNkAqM79oVbnQyhWY/MrvSgLLbMqLMkIKEVNCyroLwsoMyjjLKAtPSpvoYstlBK5wzvmvS1TL10tQ8jISt0qCy7TLmMtfS2DKUUHgy1zLFkviC/LKPMoPUJrcqMs/MBLLystXIW9KKspd8yDKsZLmChzLclJ4CsLLfFPYy2TLSMtaynwyHTSKy3jKe0pUyproesua087yqstrSmrLxMtGyyTLLpMmyprKrUs2CpvpTMuakRG5WNgj8/9gYfie8mxzBso4CnTLMsqkynxYpkqt+KZLDMr1S79L5MsXS3+dEbgSyi7Lm4Suy34LqsqGy+tLHMu9Cm+Tg7ySDPhkpjP2y9YzUoqES0dz5VLzi3+z5YoBiJKT+Pkl1MjT53Or+OQzWWEsUzNJaaGxwB8BKko5S/VKjzJckWsV+KigSgnzVRzlS35K3UpJi0VLcFKVdWsz70kxcEXzqcu1S5+yu4uFS49LM/KXM6ywAv011ZwtCVPZyuCLF4rjiy5LrUpb1LDZbMGUkEtFK4rFnEXKnkqwSl5Kc4vxCzKKrSMtcviL2S1gUHS1pKHhcjawVWVEiyxSB7WeAMADTQvbsvWK1/Oqqfj8IGihGBLL3YDluF7LJ7JRi+BKJYonihvya5KGQLSZdTS2Ea7TyRLxSpJKWku5yr9KpfOqqCIZbco6Iv3LhRIDy53LA4sVS5rLn/M9yzHAI8t9yvSz/cq+SwPLCUuDyozLecu4qBZQyBCRGTIx/JOjyjPLY8rFylJKNguBs+n8U8qLy3pLHcrBSzPKdUuzyt7LQ8q60dyhBJkLy+3L08qdy2BLy8peS9wK8bOHoGvKu8pLynvKGErjy3VKGYtzy2ziKS2akVPK77IdyyB5S8t7y3eLxcuhStLzqbJUigvK7cqjy+vKocuRiifLm8qnyk/zPcq3y5kI5wRHyvfLdWAPyvvKFkoOy4GyJ7EEmUjgvdWLyq/KkrBvy1fKK8oHy6myQAs8Qx8ld8qXysfKP8ueSu/LK8ups9vK/8t2/NPLR8obysvLP8v7yj1Kq8tlESAqX8rrywArYCpXykAr48vvy6mzdEiH9C/KACsRS6/LaYtIS/hK3MvcU2PoR6Gfyy/L0Cv3ykgrXUoQS91KGcqTyln0Z0CgKhfLu8owK8fLb8uwKsArPcs2QFAqaCqIK9/L6CsPy4NL6cs5S63L7CEEKwgrjksDMsWKGCrdym+KpYpNchHLXotVCrXLZ8AGgJxIaTPncrajk0suWfQqcApXsigTaDCzSkX5/3HMK2xcEHOJy7HyTPJ4IRtc6pMsy1TL5fNEKsXKucvEKhxKScsmi4wBHCpeUJbKUhJT84ArlctAK7/Ks/LSsPwqroucKloT4nMJigPzGCokK7wqcot8K9zJ6ANKymIrG8tRSyfL0YpPy2KjRwEiK9XgAioY82IqLUuhysIq8ipSKvkynCt8ylwqgircK+ArQisQKxnTpzNSKoW8iiu/OTIqhUs8KkVLJCp/EwHc2iuiKwIqSitIK3LKkitnwEHgCisPydorwLjqKhQqxCrpyrwq7CsZ02gCqiv8KwYriis6K85Lsivdy//yTPPVXVorqitMisN1XCrmKngrtiuGS3YrGdNywSYqhYpqKjIq4CqwK84qJcrU87QqDirWKu4qhis2K2nKEisWK1vLhyMqK5rd3iqOK2orhisUKshL18uVShPzpV0BKqIqPio2Kh4qQit4K8oqSpURIG4qfammKo85QSvmKn4qeirGKx81oStYo2ErgSvuKzArESqeKiErJcvxK/orDiqHi44rZirYc0orIsunyko0LSDRK/LUMSvxME4qGSpGKqbLmCqCFO/g2SvJrDkrgcSxKs4qj8pyKq3K+9AcKt4qiStpKkEqviqDShYrcSqWK6XyASsJKwor1io6KhErkkoQKvkqTHNK3NIqfArpK0UqGiqRKporlvOUgQUq2NwEykkruCtNK8kr0UspKzNMDSoGKuEqtStJKnUrGir1K8S9GwByTdIrPisyC7EqlCueKi5TVjRIEf0r4SqaCsEqyCoTyjfLlvLDKqMAIyvdKo4LoytGKlUqonN9K+cokypmK+JyEzKby7oqectyKxU9xQ1noI0r5SsDKsUqCypDy5krCjxLK7rK+spzKlgL7SvFKnYrE8ozKuqJRsGzKzEqmyseKlsqLirbK4sqe6y7Kzkr6StMtPMqsir7KkMqyLNWNGqphypFKnsqySsnKikqgVJnKxPg5yqJILkqxyoRCicqqypzyosqfSvgSXQh1yspITcrJrXHKroqlSsLKyUqDysGUesqQMvz8hJzKysvK6sr9yr8LCiDSyp2i40qFys9Ks0rvSrfKpxI7yq/Kisrmyt3KlvKaypCveBIomLLK20rLAqDK8ErHSpXKzMqvtGPK/eRTyrWtc8qtiqXKhCrQyqQqyjAUKvPc0cqzyu3Ki8qcSqvKj3L2yusbQCryyqjKuCqYypwK+MqkKrsgfCrMcVzK4irMKtAq4/Lryv/Ki5A+GGYqh8qMKu+K4Mrlypwqm3p7nKAy6iqUytoqtMq/iu4qoegqKpgqj4LUyt5K3oqbyvLbMSqMMokq2CqnytIql8quKtrK5W0+Kur8+ELGSqYKlSrZKq/gQyq0KtrGNirBKvgq8gqLlPyKoO9LKsIqsJKpKuUqvEqRHNg0V1BnKpNK3sqOKolK8ir9SrV7HyqFSviKoSrsKp68lIr91BCq7Uqg8v8q1sq4yqCFaUroqugqgMqPSriq58q9yr0qj3ABSqcq1KrIyrtKvyrMqrAq18rBUMVvRsAYqvSqrPL4qv7KxKqSpUZ8YKr8quTK4IqfyodK+yrQ/LFnFKrPys0q+oqiqp0qrKrAqsmcqKrvKqaqxsrYquqq4qrOKsGqt9MYVxGq7qqFKtOKkCrJqoCqy4qs/PcoRqr5qrSqwqrFypqqqcq1qs6quaqbSq2qlqqMqv6qkqrsqtuIryqKqtGq7srxqvzK5aqEqshKkqV9iq6qo6qCqpOqiaqzqqmq1arYqNoA16rhSo3KlyqvEp5KsorzSt+qg6rrqs2q96reqp2qh6raqqeqvQZWWA2qt6rmqphq1qqsKvaqrPyWiv+qzUqxqqqq+6qvqpWqgcq6ouGqyGqUarxq7ar0at2q4SrGdMcqnGq3Sopqj6qCavCqzGrYqMtKvKqoatRqxaq+qpZq2MqEarfTCIqOavJq26r8ap3KuGq9qtio67j6auJK46q0atOq3mr6KslqiGqJIrlKharuSqUq0Gq/yuNIb89/XMqqySrtKoVqvgrsqi+Pe5ARcoBqk8qgasfKparCaseqp0qTatHUPWqtKutqw2rkSoKvdWS/p3Nq1CrLaoEqxUqbavhqu2qdavU4R2rFKrcqzWqzKu1qp5ihkHkq2WrjKpBqpkrSqq/PSOqmKpuqkcrWKpMqxIr0ysnoHWrlSE5qxmqQ6oNquyq+aoDqyOq8KpTq+crgKp5qwurFaqzqyOq3IGDq2OqNavjqi6r6ch1qqCrc6pFq/Wrnaqrqo2qa6vuQIYh66vzM9OrfivAq04gdao5AAeqtyqHq5UqZKojq5ZQPatxqjuqnasrquiqe6rdqjpcy6sBqtOq46tMqjyr7aokbaOroaobq0Oqm6umq2erK2Inqoiqp6rIqn6re6qHKjeqLaq3qxuqd6szqteqvl3UqxLKeqqPqguqV6tdqnHJvz2/XC+r0Kpsq32qXarBq2+rgDXfqlbLU6u/K+Wru6t/qs+qsyvvqr2rH6uPq5+qZ6sTqr+hEyqQagiqUGu/q6SqR6pbqp5jwyuwaliqYGs+q0Bqtaowav0qSGv4q4Bqwqu7q1XLw0sM0txgo0sutZEZkeLZYPag0DIKKBfxzjInVAwr36ty4XwMCiFQOBBQwYtHCy3Lxwpmyw7yCZm54zhrwfLIWJ7KsuSAKzSLGMu+Cu7K6sr0y3kZzzNey76qKgukawVChVBjATPSfvMUasFL3pnByh4yM4uuyrTKgcpfSkHLJ0t8U9czdGqJqmZSDGtnwZIZTmDEJXY1/JMsaixqVGvNigHKNsrsakLLNGvGyjJTnGvway0L3GpNvPwpjGtEBUxqspiUazgC6CsCatRq8MtqyhxrCMpmMyJr3KveytTz7Wn+YVIB5GpRc5py/GuUargqlctEy9RrMmu2ypzLCFNyasOr80pias6LUmH+YTiMEmoUapJrzGoqa1JrrGqCauzKamq2ykdKkVPCamuYdGqia1TyuMrPocMwimu8axJqUms3jSHLiCrSa6pqMmuGaiDL3lKyypxqJmryaqLL3FK+PP3h2mviSTprSmozE8prFmpEK1ZqNwvsyz0KsmvqyxpqT6pay+dKziCVYYpqxsQWa5ZqvAS+a+Qr+mvSa4LKNGvuarRrpSpysyZqpGpea+OVBOBOa6vl36sua0NQ4WvyM65rX0tuajLKwmu2aiJrdmqaa/JrqAttRORqPmq6ahFrFSUJa+BzVGrWagFrampGasbL0WvGapvSXGttqw7LJ6D3SeJqYWr9yi5qfmsRav5qyWs2ykbLKWp2yseTHmrQatXyyMr5wq3B+mHmaglr2WqJayVqSWqRarJqUWoGa+pqcmsxap5r9GvnSwfI3SmZanxqHNLZayxqzkpuytcL7Grqa0HKdmtpasFrnmptUxPJGtjxallq08p1agJrOWpuaoZqeWs2av4Kxmu0a01q9mqFalpqKhwcLMsAXdS1awJy7Wsqa0lrHWvWa51qLZOBasWdQWs9a6Jq1Wru7LxrSWE+aoNq+msSizTLt0u5au5qjWscajFqPWqxa/ZrwQuQ0VRcYDWhagNqymuSa6Vrdoyqa0NryWo2aiNq3WpBalPyVWrcatVqNdjmaxNqJWuTalZqHWuRap1rM2t5axVqTWujavNqvWvnS0EdmWA6am1qOCs7aq5ru2rla3trUWqBa+tqo2sbawVrY2r4s8LkoWv9apNry2t1auVLXQuAijNqF2qza7JrB2pXavcLnosQCwzTDWCjSufBhrEWQF6zfLHNGS30BGu6M37LA2ADM1bLQgjri5lTINNI+HtU6zMIUsp5Niv1a9LKFWuNajJSgOrNa1Vq+LPVef9rBTMg60Wr+2vdU0DqCMvqyhDrh2rXaxzyZIxiVD/yMxLtQd2BgOtsa27KKWpda0ZrqWsj8rJSoOubayDSaoxw6gAqCOruq49qPCoNa0JrF2vI6x3zuVIw6qZqWmo/aDLQyHFw684T8Or/nJmrj2vla1DrI2tWUqjqf2rU82jraHAE66JF+rkI6x9KD2pCawFrj2vqyyTqEMsYak4BDwoEE3VAWws0K2uUz2BrYe9qP4rZGR9r2Rmfa4wrIGrfau7Y4HOzSr9rJGvNaylzPuAw9UzroQvQ6kTqkOt4UlDrdMqXa9Dqm2uk6oay+UTc659gy0s86uWqe2rDavtrSOqpah7LSQFNeOlr/aoZayyjXOp3YUJ56OuE6yLq52ui6o9rvOpPaiHzKOpja7jqf0tOwU+472Ay66ArFOsY6/LrmOt86+7LCVKK6rjrwWvfUjxwJhX46zLqZ0sQ62LrBmty6sDrs2oJ8prrAuvcygxTyuuYIT+1OuqU6w2S6uuGymLq62vY6zJStQq06i9q1crziiaDXzPDCmJLJ+JhKafjgHPv4gxNFDW9pI3K/NMmMuDxYHNkinQgvXJxcpZLqyHmSWV41gB4xCPyjhkOUpeqqIuY6v2rLkr8SsONZXhjURwyHNKoxegT86q7qn+qWEuNq77rClV7QUcUNUue6m2SyGuZquBrQesnocHquMh0hJKx/JIB6uHqxao+6iEqLWv4yYyZGgW89NPKMeorq2GrsevRS3HqFMN9YDTEdrD9y4nqaKrwa4rqlkr4KXzxPo1duInrhHkB6r+rgeqk6inqRVzEsTG4TAph66WSSeqpq8Wr8TJUKtNyZYrNc8qgDOs26rAcyOEJsrecUjK9gJ9qYlPOysNhv+IhZL7V/rNsK/NrqbP1ASYBEQl40hDyOoT1aksLVwvq67MAUAEQAUBASRigAAdqIfNA4xnrnOqQK5zgAQCN6kwLx0GGhM3rlOo6i1TqSOut623qDEAd6gnyneua6l3rcFOL6EtFFeuN6wJylnjOSlABaxGQ62bq8up66kPrpJnj6qTqRutEMB7gvmLWNPjg08sz6jnLRhKT6nzqU+v66grrRJiL68ProOulM5BxueIL6u+zduGp+H3rAcuI6jZrA+rt69PquWkhU53ra+uBs5jgG+q3nPkLKzyy62VrROvnamRTO+uD68Dq/SU06mvrqOs9S5Bw5OHz64fqEPNH6rrrRcpsa9Nr/eo76m3qu+tn6vyl5+uG6lLr9FHc4Z4APevtCvxTx0Fb64Jr2+uda6fr7esP6jjqw+pP6sjKUDOWY5si54k966/qluq36ivqxOtAkx/r0+pf6ltLV2pK6m1SpWi5AS/q8wt/68RrIAvWy3rqa2of6/fqZ+oG6yPzX+vAGlrrpTJK4d3qXRx/603q92qI6ljq1OtGE1Aan+vQG0AbN+rf6lpqSMAGMKXCP8KJs/7qSZlv6pAbD2or6/dLBarSsJLrnirIylOiylAO4RgbBeoVyy2rAsrv6kgaSOvm6h7KuBrPa4erMOo4kxjRBOD09WPrmnKE6zfqq2qi65Aa5uq2a6QbewzAGjOq9eorMzd8L+qw2YQa1BtYGtLLy+vE6t1rF8oY65brQ0uESphqSTMh4KNKUJw21LiDHCLM6k8BnwTdGSTIqsBVqv8BtyAW4MwhJFgzcDeQdeuASqGKIBs9Spo59nA8G3VgR+pb6mnKRbKfS3fqUBqD6igbK+oPS3T4eBuXKrjKhRzHqB3JUhxJVRIaLwUDSgPzLeq8AYAbn+pRQTAaDBpHagKyYIGawr7TEwpRQXbhyhooUyoaTgGqG9AaykAiykNKJervitQqzXPd4ICBskr2KVPTKejqczPTWznGAT/gAhppRIoQpmlN4EvS2UtzS71yPKp9wJPgkMyuqBvSOZlH0/7K3utdyhHrKGpP/bYbgoCu0HpLh9P2Gn05DhtF6snqSrMGG0lKdOqVCh49iQth1QQRBn3ayjBUfHJmG8M4ZlRZ0qUK9ay4krLkLqUH2KxrJXG/ap0rIYiEEOcFvGJvEkfTbhpq6+VKVOupqiKqKzM+G2sIsTnk6z+4bhub05EbbKpXq7TrhhozcjL0oXJisoVDcoOmG0QFizn3AEDJ5cqWGovSwRo5M1RKgErzS9pLyMub4N1Vy2ymAhEa8Rv01V7r7hooaxxKDjKT0eVsFhtxGoN4BRqB6rSL3usNq4kaYDJX094autHh9DSosHD3kPXL53OJ0o5yrtLTytFzRXKUcncVv2q5s1UbtqiXGFdLY3KJcgkaUhtRGsXryeooK1Ub4PGBOEwK+tKtG7rrCRp8ShUbKrKV02XrJ3I99RuTUMoKAtsIfHMOcwVzdRo4K/Uay3PwMihzHOqqSjkb+5yX6DlxDSpBS+3SFXMpqlszUhrRGpVKubPx7RQ1isr1onEbXRrTGrzr2KrtGx4a0kulixUb9+P2EcRKXhCrTMUIqClLJTALKtIdczAyZHOdc1Fzj9KjGkJzUPKFYuMb0GojAFYRlCOTzRvgC3ESaosbtXPTG/fzMxrLGour3FLrG4ca3fB/owJiTCoect0apxvh6okaVuqcG3jyiFXES5MRiRUSkd157XL30tsanXNXczsb5HO7G85yYxoka/saCGr1Ag+JCzWPG2Zzg3JDa6cbbRoeGucbeTOk5KmZnxrXEy0bixvfGzcbPRu3Gl4bMdLliwzr7gBGSQqRIGigivbqKNNDGotzwxqe6lpzrxrFcuY0+rKhGnAaYJrGCI3g+tT7c7DLV8rlGk4bw6oTzc/wxgh+iLVyA9I0yhnrocoVG3TqldJPCqCagGEmkWoJyXHyS36LC3LPG4tzD7Jdco3TrXh7G28bXwvvGhOrfZDH2ZmQS+ULG1MbJxpLGl5yZxq/G6uqkxBQnUmRFJGkmwAzfKtJ6+UawJpJG6sb+PLl6sTBQCCTSL0ZmxskcpCaeJpQm0tygpPLc4Sa5Iqc64mqH0GKoXfAUsAA6nJy43Oy6znLjhpB604bDJp1kBxZqJt0c2xLUGvPahwb4ctqUzHTeIoMm/dRb5HC2TiatRu4mrk52xovG5pzIxusm6MbP2shG+ya6qvh8TG5j2NGbQia5JptGv3qsxu/G/XrHyQQCeP0Cpo8mkirtJtCmxULMdPW6zXKDJs11auV0/0xrMzrtRrDG4pKUpq7GtKahJoymy5zRJoTir3QwSDamghKg3Pcm8fqJLJIm7yaRRojAI3hIvCJKSnL/NLfGqabSxsUmmHKo9MrG70bRZBI4pqa/RosQDxQyBCbiDlSMcv5c08bEpvPGuLyepqvGvqabxoGmgBBsJoUG54c84mbiIEq1xqAmtab5Js/G4UaPKuRHNfF51G8UOVMUxo0mjobrIvsGp4aw0vAmkky/lF9G4fz8KCemUIdkVBPGjAzLpt4m1cbzhNSmk1SbJoemy7ry9MiGnyb3rHPWYA1eoCOS0GaReozGn6bSJo8q+5p+LyNKZGbXxsmmwert6pCmyGbHBuhm3cbH4uRywtR2bWcLEMbWxrRmyyb+JvRcw0asJqym/mro1As4/h1GtgCmtvz2ov1ctqrSpprkshRUvXv0xmb1xpEy2BqtxrqmxsKGprDCg6aOywY0HQwzpsQmgWa1TiwMs5rMZt6m7Gb0po9ci3KhptPq7LQz+D/onfd1Jrmc6qaURuKm2calJqoqZ2aNulcOWWbQqoZ8+iadJvCmmGaXzP2m+GbkQHmfS2M8pjim86bUZvNmpKbrpozErGbGtJxmu2byCHZSgmayJqXbeJo1iyrgLD0qprWyuZKqZtmmjyrutC8GFeRpjDdm1ab/vKfq1maKxtUKsObOZsgmgyaKgHsacZJNRoTmxFzuliumktzhZoNG7dy7Jodm06KO5u7csXQEsonGmibuaqOGhSbfpo5G8ebxNBsaKeaZJpnm9WrgppS8r0alQr+UZiaDJtfInT4DFBL0FGbe5oXGZOaB5svG11yYqXdczFzPXPxm9kbGYrASgoNl5vjTdWbPpvrm0uavZo2m7qLT/LjXMpU+aAdiwCbZJtom7nqIZqbmyXqqxoEEv5R9JoOm3EcOZmn6P/J+ZoumpOb+5r4my+aBJpvmhzq5QGzmh+aMYsojGzEjSnY/EGb3ZpLm9wqvJp56gALfuyH0d8RT4ommjWaQFuXq0CadZpeis1y/lEimg6bDQyVDGrULsw6mhKaUFvRm2Fq0JrumjCb8eJsKnOa9ks4WgrkmdG5iQObrRoaMr+aF5sfmovJFQykWh7q/uroW9+ad4sYWsBbYcvSSqXqV9NLickaolVnDUXAGrPim8ybBZu6m1ObrZvTm22bb5vtm3Xq8FpnDXsMtVRdGtebAptcqshb55upmjkaew3w60O5ZFvdGkBqGGtDmnaaJrCOFIxaWSSwjaiM9xhPm6RzUFoxm0SY05rdcjOb7FtjGxxbQEsojQu5ReF5GoBb15q0Wueay5ooWjiTdIGyWtkoJKECWjcasetqmtmawprCW/DSLXKfi7usxMliW3haLFv4WoWb0FpFm4ea0PIyWyeLmlop4XJaNFuAW2ebY4pmm4pbf5uIE+9IKlrfmkZaN5romgMLmFtzi3cbbkMjm2JIGckrOJnRhIzaWs2b99hq0zpabpqvmjZK7FqwWwaa+lsdmkXIhejxeCXQHVGLm2drPJu8W8uaX6pxyHQJyWhuWsmaSFvuWmqaQlqWW1bqVlv1mqOaNo2t3KdAfKRkSlsbkFr2Wy7SrFqtm26abZv6mzObMptHmmFLTiAujWdJpCB/KO5aClrGW8ha++uiSlFaUYXF0SDUNUunmjxbgaobmrebQlp3m8ZsNuoOmtI9EA0owCSskFsTmyFaLZo7Gw5aMFtSW05bK3Ku6lTyLlv5jTfRCskSWlaamZs3Sz+aFZoxqpWaghVLcQPcbxEqWzWbyGp+W2pb6pphm4CBWGrljQWMK2utKplbT5v2W6FaklpsWlJaTlswms0LcFsyWzNM9oOwGZU9ZSrpckVaEBrFWsjzfyrmmpM0bdQ1W4O9lppJW+Jyr6pWc3RbtpqpWmBao5rEMXQxXsAMMAnTzFt2WktSoVs+a5Jbr5s5W41aHFvEW55bit0lKc6T/rGKObmxMVqCmrxailtxWiWaA7GTW2V4lMolGj1ag5vBmkObflp3G1hb7wGySiYw9jEbisFazJvDWy9TWVuSm6xbYVtsW+Fa0lsRW85ab6uA4GtbN1QhxOVaPZu+mhRafFoHGmOwR7ggLTI9iFrrmrFatZqYWpVbdZphmrzs1lrpyd6RmpmM1Zcg4lp1GvVbpJmjW45aO1q5W3paE1rHWtda6AXO4MnQM1s8W4iacVoX63NaT/25OBsxDNGJW9xbNJqFGxVbwFqGGlubWFt5NFdb+uM3MI8AkwNDWnub4loEWv3K91uc0o1bRFrN08WanSuHMQNVKFwImvJbSVvWtLNaR1qeWsda4Nss1UGAi1pfWktas4occ8taOZu/WuGaEgw0sQSYTMA37UyaC3PaWllbz5rQW9lbult7GnlaLQubqkSxyNt/GQdbRlspmtDas+oACsjaX0CpHd1bcNrkW4ObFloXWg8Kd5vxAmlao5rTEYOQdTMJWa3RtVpA2g5bW1qOWiDaD1rjWtMKkVuymn4j5FHk2wsJFDKQ2z1bDEuzW29bYNuKoEegRrAM2n0yjNrBm/DbvVq2m5ubGJqksAFbNMmVsFD8+sHVsLdaupqjWg1aY1sg2lQ1qopg29xS4snX2PAR54Bw28mb6euvWx5beNo4kkDhqqS/YSWZONuZm8lbs4tDm5zaOHCRyqCa27ESSX9KgNtNmiFaI1ubWlOaYVrU2ynSNNqg2nNLmNpAS5urctsayLLx36uLWqHyHltM2k/r6lInsU0TndA+WmdabMrS2gjbxNsvapda25oOmymA/gkAFFrMdlqK2pta6NqFW3Az0JtFmu+bsXN5Wntb3lBsBQ/kVGEvWgvz5ZodWxWafZurAdbakM2KGmIwttsqyzeb0tsI23SaoFsGtaTaKTL6cLaw1VCU27dbfNrbWw1bKtsC2pbanprTM+7a8XDnkWcK3JvoW0haYtra2rAbVtqvEH7aDuzgU2zaWtu+W7WbBtr+W79baxrZcP1QyXG04k2bwVuZW4rbZtsEW8DaKtvumhFazluPWghrvkBrJDlwuRlSbU7adttFCiVb9tvwSXLIUdti5CnboduL69aaalo/W54artpskkuNKUrigHUyq2Ke2nzaJWtx243T3ttAyo9bTVoTit7ABNrlwlLbZ1o/Gnjac1ptUqXanTBaGj6a5lrl2kCadFsc2iBb6ls+TZ+NxEqUYTI51X3WyAraMdp1WyNahdr82/db8ds7WsVB1huu606LDds4hYZJB+Vl2vrb7Vup2kqaTEq5s1/zCX2Z6SLbPltFWhZaBhvZ2qGb9Fv34p+NlRo0c78lOBhkTKbbMdpm2hJacdqt29TabdsPWmraohqWS3sVYvLf0OPbp1ttWta0qdvs2garTorzaP7bY9t9wAPbetsL2lmaKVsu2yBauduxGEjaoZR0Cax5gDQXnePbzdpK2i+aGNqHm1DyM9o0S640jthEGfGY3dpr2l3LYtsV2nHylKhH2jvb89sB2r5bWdvfWn1bm5t12r5NWGrNJMSh3k2825Cad1vm24RbFttZC7TbSuvvMe5Bt9tmW/Ja7VtQ28VavdteShyqR5Gsbbvwx9pdS87aBttD29mbw9oEEhVMkds6mH3s843R2htbptts0pPawNpT2vHaRFo+2o/bu1uRWixAMNHhzGKJaFoB2zRar9uB2hXbb1ptUveo6OAQOoTaotv/6rSbl9u12z9bddrzTVhrqeTb2i/gt3wF23faXtvK2kXa09s027Bb7dpW2mA6pLXIO/R1/trV2y/aUson2kHb6hrNW1g6yQo/dC/bkNpd8j0atdvzsjnaG9tFkH9NIlqLgrFK+aN0K4Dbntst217b/NtF2tYaB9qdWkDNckrN5Z/aztuv23baadrv2xnTsjkOwSWk0euZ2oibtFrLW+HayUptM7EY95oOm4zDjtkGUSGZ61uo2xtbgDtA2vUawDroOiA6xds0OvZKdOCTCVw6C1j0Oova94vOqpZKXNTI2UI6oduGWrg6X9uD2xuaV9p12yTbHDoDWxrMXTLJkCkLCtoT2rw6VNrK2jlaAtrF2nBaNho5GzMDisxN4ZCwODptWhfag9tQOm/bvZuMOmuTKjq5YmTJhDrlm2vaLttsOjJKpLH9Wiky4c3H9LLcd9osmvfahFrhW+g6qtvSWonazVuTEauUBc3FQGbTLDsKm+Ramju/mxHqkxCGO34sfqj0OuIrRNpD21I6iDp3mgCdbtsNKMopfvHxsF5QqDrGOmg7ijvUOwBLAjo5GmwRuHx2gJj1Ojsx66aab1sC6sMyIBBbiI3NrKIuklY6ZRvwOuHb39rqWyTb2FoDW+NglgIJMdfMkrBuOyxa7jsY22yaVcieOpRb8mBhO3AsEER62gvbttpM2tA6fjpC2rE6EpE1oJ/0TtuBOoHbrDrE28E6hDMx0jQB9xrYLL9Vk3UROjpbxjuF2wSapjsgO8GL0TqcWrTw8Xg4LD46KZvl29Y7FFr5Oy1lobDGRPQ6favoasE6jjskO4g7WcFYa87gYbzhcsNagDqRc7w6Ixt8Ozk7/Dt1i4/a+LJVO8O0baD2OiI618vtGnCq4ix/o59bcDtWOg46UjsIOhU6lQurcVhrS3BnccgJWTto2kA6fDtUO63a9TqNaL7blvLdOssJ6OmWOhI7kNv2OxNzPduaO+Bq7ZXZQkV14jqQO9XbM1tAWmw7aTsXW3cbNJ1kOmDx4zpI8TvblNvZOnU7MFoYOkSboDp02+KTPSSucOJhTToJO0U7R1oIa5vpKzt3yGs7+toc2iQ6w9q/WlfSj0jOOoIVGtqn6PM6EJrN2gs7kTr721E6+xrLOu9blJPOki91mbxbOj3bi9qiOsHbA0OnOp19NYjnO5I669t6OznacYIN2i4tP5W1kNU6lDsF2y2b9Vt9O1Pb/TpX88WaubKKgkkVpSwRS4TaWduHWus70NqcWostRjilLJgbwzuM21s7iUq3OqQ7g/Gb26qoJS0WyD87DzryOrvbsdtAOs87wDsP2rTaJzpzGoZ9rKkJCNxbbTuAm1rbCTtB2mA7xKBqGW87PzqTOxI7Zko3Ono70zpYWzZyNCqimhnRJ6XFELOUzqE9OrHbvTu1O6C6/Dtguu8aJzqdK/ntign+CP+UFznvO1C6vpqKm5864tupsge5p6GwA/9D59uQO8fbX9rbOzjyOzsy24uJXNsNKJPwJxkLNSg6uJpo2+i6tTtQmjk7izumOjpzeTrEm2/x+bBT8KcEhTui22Ubvjswu8s7BQHjdEy6t31O2mU77Ts3Oki6htt48//x9xrgCRUhzPO7m8C7hzpUO2g7dTpYuloA2RvKOsdbGxGDifXpvLulOuhqgIowuvg7m6s9iM24cMMAWr87PjqX2uU7HTrku14aRtqjmjI9/kWoCUmNTdsAO/I7NTsKO086Art0u7k79Lvvm0K6HxtuRAfxCruius06v8rAapMR/+n1U/tDwYyau7o639vlOrK6XHIyOikzIgiQLDMC44PPdUY6kTv8u+46uTrF2tRLZjoSu+q7qZDfdNlbODuQ2xy6ozoXOvRrrLpiEMRlucSWu8a6zLs7q6k7Djsyuj/bOzowkgY66cnNbbv11GzAuoc7lDpPO3daiztjWvS7Cdol2pZLwNCHAtAo8LtWu7875zsiOra750qjqsvpvrpQuwPaUDuOuh072zrOu3XbDin3GiSj9eluuia62TpHOhbaeloMuhOKiBlK3SCtDro0G06zLLviupZL/VD4y28IkbtxutC7YdvnWly6REo5cipyoJqybPtpQbuRur06tLqsmyY6LzuMsq86KCp4qIJImbvJu/i61jsMO2/af5s9yk9oh8z5uiS7kzqkuoi7ertOuiE6XHL2m4RyN1GWujMCcanPKZm7NLrKup66mLsCunpbxzvmuvlblbvPdRY7vjAtG1K6RNo2ugG7XGsnOo26BOhncPQEzbvwuiM6vVt/O6m6K1ozcwC6utGvCAvKakgAOjw6NTr7m1m7B5rRu/vaarod2hyamoPU6APx7LspOxfanzqFumM7WrtEXYAwfbtT8cI6erpkutKKwpvku2yTyLqcOyHTFWK5wOi7E9qDurpbRztxm/W73rqXOiMAC7tE8PyN+bvmWxo6E7o2OnybzaGJ/LyJYNNjujXbqloIO6G7s7teG0wB9xrnBbqscSw1uku6tbv329m6grpHm+C7pTOHusqtV5r4uxu6LLsn29A657pJZPKsq9rxOlDbUzppOvq6YboHu7LbmprDw2l92psHO4q6ILoYu7S7nrpKOonKDbtOi9cdFpvnwHA7wbulupu7ozpbup1bpYjPqJab07p/OjiK3br6Ogdocrr+6E+6O/3nqYu6CjsLOnW7KroCOsO7mDrxWtaIzXXAesG7q9qSO9+7NrutujA6WCmb/eepKdozu12797vluspyNcuEckaJ/q0udNqJ8zoeula6ijpRO3GaMbr5WrPsbHwkiLH5XJt+uuzbFnObusU7DLpTosH9uWIbu1NqZbszuuHLlVrcut4MezphoZpbeAl+dSB7Srugeiq6Xrqquu3bGHofu6R7ahFQe7e7RDoEu7h76zrNWyesuv2QDU7btHtlOqm6iHrpOkh6oTr+6DmIohzmuH4b1Ls8O+R7UboP2npa5rqruiO78ElVCLmIOIPBqBy6Yrstu807Wat9c455vHp5ibq7/7u4c+vac7pLiOm7mpobiUU984muOhx6A7rPmq+62bvbWma677vce7a6LEBStQGbEnutWoNS0HsIujB6rbvpahQaOFFem06a/7ukuwh65brEekYaIlskepMR3G1ArPBsx7qge5x6p7r1u1R6YDsgMEsrEhh9i826glsFuj+6eHoTi/p7Hz1xO+o6Uzshu5y7zHpusty7GlvliyZ6PG3cO3fSSrsDuie6Jjoyejm6xFuye+dLVnpUrF+7insjOy2KynvhqsMz3G0uQG6Z1zt3uk66+7osepZ687qjmveoWIIiEDp6nHqmu+h6Cdt2AEK7w7pye/6aO+w+ewR7L6trO3R6Xzt4eiYr0VxBeyW6CLvWuzB6/3Kie14b9o2aexmThvjvjbspPnq2ehR7prr2ez7bgtugUjjI+XykRHx72Sq7u93aDDrGevR7m6oo2oaEXduQWPQ6THqcu4i6Fnok2lxzqVt/WmGh5myqHHA05Hpxerp7dnunuvGbltpY26I6y8l5ek57t7oRerh7qXshe4aby3BX67A7wntqegB62XuWWxp6QHsNKIlsV2zRbah7jztoe8q68XuFetx7arrmO1JZdXqGep27cGtKewJ6+arDMqEZDvSHAlV7hHrqex57Fnsaewa6rrsH6hMUIHuSezZ7UntLu3vaQ7tRO3p7EHrkqrbRAXhqeql7EXsueigrcMHzFPVJNHpmet+65ntZe+p6PXs2cyFy0XrZAZds1Kude/V7qDu+e8u7fnpFe40bubta9S17Hbo4e4U78btXuok6B+puBKt6QPD8el261Xoze0i6MJKrW7M6PfQAuQMMbqB8u+66DXpbWuh6S3tt2x6aubuBsuyIMBGo7aN7bXpauwfbkQERKF9BZ3tBe1N7QTrMejt6NXrIu2J6DZpjUGJj3O2mk9U6A3t1WwV63tsyex474HrFe06Ljl3x9FXJD3pde+d7dSqdW0yDjtCUocLs13usqtt7Inr/O2G6f1uEcv3p7ilCII96jzqLex67J7qFenp6r3tq2vlb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RQbP2u+mNSswZg+nLQdsp6+nl6ZLqiO1u6fXph0mS6eNpqenuLwwZyBm86oTBhwmyGbgZ0JtGGZup06ni6a1phGngODbhg6gP6dhp9B7eGav+9hmEEk4Zn6nq6fXeqOnS6bwZ28rJGcLp7hma6dkZuhn5GYEvRRmq6eUZmRn+6cnp9Rm3y00Zh+nE6fHp1hnlafoZiRtwGfRKxBnH6eQZ0hmzGfUZg2JDGdHp4xmn6cXpl+n+GaIa1emqGYvp2xnv6aXp9hnv1ycZ6hmlwdyp5uq06eAkSxnZ6aYZlamWGepptTHwmeZAoRnpGZEZ2um5GZPpzBrKGfvp5xndqZMZuJmc6e3ptb8gmZ8Zkhm/GfcZ1v66DEogSmns6Z8mn3By2ANzKpnN6fiZyanlEYaZ4Bm10a5kyjKcRqMZnJnZqavp+xmdadFplpnzacNp0xm66Ysh2a16meGZyWnn6fbp8ZmKmZQJhOmemZqpuxmxmdHsupnKmamZ3pmZmdQZ1eL5ma6Z7JnOaappz9G1MbvkTpnWmfhpsRnqUb2Z85nSaZAZ4I0JmY2Zv2mXGeWZ0pnZmf64zymhmaeZpZnBae2ZthnEaYeZhZnAGZJp2hmB6Y2pqGnPmcWZw5nqmesB7iAzmc2Zl5mYGb+Z4SwvqYhZoFmHaZWZtJnLqYBZ/ZngmZGZvJmfJtKWuFmvmahZxpn8mZqS9ZnAWesZ55mfmbcZt5mpUcGZyZniWY1puGnbmfaZm2nGWchZ5lmfKZBZvRmJqYZZx5nOWfdpo5m3icTWpX8iWcFZ7KnhWdCZvlbag3FZtFm8WeOZslmDQwapjln5WemZ2lmdmYTyCqnUWapZ75nFad0Z3BnwQt5pnVmiGaQZmlmj6f6ZxILog1VZ3VmSWbaZremi8gSpk1nomfnp81mUGaRZhPJ0jRtZ01mbGbdZjFm1Gbu+7FmbmZ5Zw1nEgo+Z71mXWawZv6mDWYuprYKg2fhZv1nXmc1Z1fJwWYjZrhmoGejZvpnVmc2EoGnnWfTZ5hm7qdUZ0FnjQbWAQpmkme0ZlJmi2d5ZyoHMyq/KIpnP6Z4Z1JmA2ZrZ6cCCGZbRyNniGdiZxVmfJuLyEsrImb3pn1nqWa7ZkVmx1t7Zy5J62eEZkp7RGb8p7EGOysyZwhmO2bNZ4dnpWdtBsdmvl3/p8MHbWa5Zqdmm2eLZqgH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RRdlF1SKDme3Zg0XDEaNFyd0dRbNF69mJRcRZoUWNwmEdCw9dRcXZ0rn6YeA519n+CuAKV0W7Rby5z0WdObJp3N6XRdFF/0WWud0xobm7mb9oGH7bRfVF1TmCGqvbVUX6DnjF5DmjRfJFv0XUxftZtTH7MzjFhNmkSYy5qLmUO19FsMWsxYuZ3Tm2QHDVPMWmWeCpy0X/kfk55EAu0GTF3kXxRcHJ5jmK5rr8asW+Rd4xxLmcnqbiZsW3RdE5tLnIxd3Z6tncCdDF00WyxdZZh1mYgG5FzMX8xcDFwLmxxdh1PYABxfDFydm6xfQx20HXBy7F1sWh1slFp0WIggnFtUWFxexJtrmixZ+CGUWTxZrFhUWExcMu1sso0YUqLTxHX23R+UXD8dHFs9nYdUnhJFj3MgdZKKG9Re3ZvPGCufvF78Wlem/oSkWxwj3FrnqoxbXRh8WfxboGl8WnMbfF+wn2xYbFuCWwJY4Udp7TxcZJ6cW1MfQlxG6lsywlm8X3xa9Fn9nrAn8XEgJk4sQlg+qtOZfB0iWSOccmm9owJfpzMxGpGafZoCXyub5W/CWUKwyYIiXuxZYpnBmQOaQkUCXEbrkwPiWoJfIJkNmhJZaepiXRJYoEcSXkJYElrDnqOa/F2SWUK26GBSWAJeCpjiWlResB7iXv8zae1iWlGdolnSXNRb0lkSXim190/8X3RaHZySWYJZnF/SWSAgP8aiXoqdMlw0WPKsclhSoSmxcl7CWgGrvFhK6LJe/zFSsfJeIllCWJObQlwKWnJdlHTSWbJcY52MnyxeDFrWQKJa8l2KgQpf4loSnIufq5mSXkpfUqG560pYkl+KXcJaVZzyXcpd4goyWtGZMl0qGuOa4lyKWvJfIg8qXumdoa/yWapbUloKXl0hilocXHOcKlqSXvRdUlnKXkqBi6P8XIJcUljKXCxaylxiX+pb9AgWGIJb1zAqWcJZ6lsiXLxYK5Hm1BxbYl2iXNxdcx7cXn0WVtVaXjJfC5kcX6JYrFtbGSxZWl9cXj2Y2l9HHtxdXFi9R0bl8lg6WgxejFq8Q5xfLbW6XQpfeh8KWwrvEdF6XdpYql/aXFvqXFz8XuDROl4JMzpafZi6WDqaBlkUXTpanFhaWGJcrF4GWDMBhl+yWcxarFnaXQZfWl5qXbQcM7ZaWQZaRlj8XpJb9oXPc0Zbxlw6XEpY99VR1cZbul/6XMpZUlxDGcZcRlqmXwZZ/plgqKZYZlt6WsYdQlsdbVNChlymX2ZYdFwSXepa60a+obpZ+lxqWLRcxl8Knc6Hpl16X0pf5l5SWguZy+hGWZZbmlttHSZcel7cseZbZl2WW2xY+lxMXtReJlxmWJZb7F7aXvpfRlv6WmZf8Zm+NWZeVlkaW5Zc5lxMXrpYNlvmWdZec5wy6SE2ll0WXzRdrFo2XJzuqgGPYYuhml3x7bZa8Jg8WLxcHGo3jBpfyl4OWciYBlgmWDIojl3+dA5a2x6OXoJfxlwWXnhGX/WIWhpdmllOW7JbTlxaXw5f9llpso5a0l72qqpeAl5uq/ZeWl9s8OpbWlv6W3JatFv6bM5acSJOWAz21lmOWaZYVl5Wbm5ZnobOWg5dLlkiWHpbXRquWGLxLl2KWmpbTFpuWE5e8l2uW9pZq5yYHsxaVZkeW84lblq49nZY7lsaXaZYzl6eWrJeGlgeWwpddlyuWe5cMl6yXOpfi57qXkZaXl4+WNJYalr2Wy5Z9l9i7j5f1mWeXfpfnluiWh5ZnF5eWSZrHls+WPRYvl/OW4ZcUihOXWkh/luuW35Ybl+sWNkePlliXT5bAV/zn5pcvl1u7j5eK2F+WxZe0l8uXOJdtBr+WMKlAVueX4Fb8lyeWGxewVzCXb5ftFkOXHRbDlixBj5ZYKVBW75cHl2OX05f0UY+X2pdIVgMX/5bVl4eXmFcFzVhWIxfflhhWC5aoV4BWypdgVvBXhxb4VzuW9GbIym575vwRuveWeueuh/yUFFe25i2WbhaGQYQ4bYlpoB4XkRtcFqYW4uoRFnjA9BeaFoG6DGUJDQIsXcct5vIWSxp0VwEX8RdSF2YXQedUVkxWNVxQu44XZnt25gEWwhcIFkEW5haMVrmynFZJXXBWloWqFs8XrFc8VuQW3hZ8V3YXjFYcin6Gfpe+51YWPZtCVu3n9FeIFpEWB+ZaatRXlpd+cFxXglbcVrlqPFeSVi4WDFauFufmIaakV/xW1KEQlnA7XFdVl2oWClZ6F4oXPBciV1RXuVGiijRW4lYsV6EWQlYKF8wXNhaKV1JXmlbBFkMXDwVTLGcRaYdGF3JXalYmFnXmbFb6VxpXthcGV5EWubNaV0ZWUxfaF5RWxBrYG+pX6hbsVkoXFlfSVoG6VlcTqWRWc5ZWF34XulaSFn3mgRcvxbxWHFaGVryoxgQZ7PYoclYSVgsWuhdCFwpX5lcRF/ZX5+cOVx5WJ4WyVrRXuuqSVhpWGhb2Vu5WllYoKo5X11Dy0cZXAhcmV+6XplY353RW+Wq+V4pW0ld+V5ZXgFbDgoFW8cZBVnZXgRYiViFWDlaxVouXgJDMVi3nPSXOVvJW6lZmVsJWZhfBVwPnIVe0JouX+OJeV6lWplf+FulXPlbBVppXiVcxVqFXp5dhV8xWqVcsVxJWelbcFuZXeVYWV/lWylYyVjMX2lfZVsVW3lYn5qPnzhbRVgZXZVbkZqRWFVfJVqpXcVasViVWUVfT6j/mFBa/55lXcCpOlwFX1lam63EWrldsVwlX7FaZVklWK3tUdYVXKVZqVxFWuVeRV2ZW9Ff6VuWtDFaiVrmz2Z36/TRWbVe0Vo1XfVdRV6VXvla1VtRmpFZDVr5QKVYCFo4WEVepl2EXtlfVVmNX0VZ+VuVWgbsTV9Fcw1YkFrpWaVaRVjYW/VY1VgNWSle8F6bL81di5cnH9VfDV4FXI1fpVlJWq1YxVvNWubMMixVWDVfFVy5XX+ZeFrxWiVedVgVXB8vUVvVW4VdTV15XFxe9V8tXo1d2VvlWR1c7VqgmYlcgbDpXRVZLVzlWM1e5V0FWF1ZlVpdXtVYyV7tWT5bkV+FXp1YuVzQX7ValVvdXY1YPV+NWj1dXVt8t11c9V9NX3lbhFggXwladViAWLVc9y7tW2Vd7VlVX8VazVm9Wc1bjVvdmpFb/V91WU1dpUl9X2HKA1+EX/VZD7QNXVFaelNpWZTKVVzdWvVe3Vn1XW1cQ14RJkNfuVgkBUNdWV5NX0RaCV89XS1dnV54XtBcdVxlXv1ZdV+jGRlcTqdO4ANZnV7DW51ZNVkpXP+bQFn9WHrP+VzaITlf7liZWKNa3Vt9XM1YQ1ytWkNerV+YWKCuI1ieFnldY1i9W7VYHVmjWbleHV+jXR1c3y/jXe1GtV4tWNldSygAmVNeuVwCZblbvV8DWMlbk1mFWayEnVmDW01bg1ltWeVZA1zVWzNckV+VWSxZPV05XVBuq65tX+1cQF4zW4Mv0G/THKieYaoEmh5LkKvfpK7O7B07QatjHylaTkoAwJr0yG7P2ewuGgutTkyvp/Cj2wP3Lfz0peNEWOWqU1rZWd1YJVmuZrGH7SmiM0hJuFvPo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"))
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* Utility functions */
|
|
|
|
var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
|
|
pcbdata.metadata.revision + '__#';
|
|
var storage;
|
|
|
|
function initStorage(key) {
|
|
try {
|
|
window.localStorage.getItem("blank");
|
|
storage = window.localStorage;
|
|
} catch (e) {
|
|
// localStorage not available
|
|
}
|
|
if (!storage) {
|
|
try {
|
|
window.sessionStorage.getItem("blank");
|
|
storage = window.sessionStorage;
|
|
} catch (e) {
|
|
// sessionStorage also not available
|
|
}
|
|
}
|
|
}
|
|
|
|
function readStorage(key) {
|
|
if (storage) {
|
|
return storage.getItem(storagePrefix + key);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function writeStorage(key, value) {
|
|
if (storage) {
|
|
storage.setItem(storagePrefix + key, value);
|
|
}
|
|
}
|
|
|
|
function fancyDblClickHandler(el, onsingle, ondouble) {
|
|
return function() {
|
|
if (el.getAttribute("data-dblclick") == null) {
|
|
el.setAttribute("data-dblclick", 1);
|
|
setTimeout(function() {
|
|
if (el.getAttribute("data-dblclick") == 1) {
|
|
onsingle();
|
|
}
|
|
el.removeAttribute("data-dblclick");
|
|
}, 200);
|
|
} else {
|
|
el.removeAttribute("data-dblclick");
|
|
ondouble();
|
|
}
|
|
}
|
|
}
|
|
|
|
function smoothScrollToRow(rowid) {
|
|
document.getElementById(rowid).scrollIntoView({
|
|
behavior: "smooth",
|
|
block: "center",
|
|
inline: "nearest"
|
|
});
|
|
}
|
|
|
|
function focusInputField(input) {
|
|
input.scrollIntoView(false);
|
|
input.focus();
|
|
input.select();
|
|
}
|
|
|
|
function 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]);
|
|
}
|
|
writeStorage("darkenWhenChecked", settings.darkenWhenChecked);
|
|
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;
|
|
|
|
settings.darkenWhenChecked = readStorage("darkenWhenChecked") || "";
|
|
populateDarkenWhenCheckedOptions();
|
|
|
|
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;
|
|
}
|
|
|
|
// Helper classes for user js callbacks.
|
|
|
|
const IBOM_EVENT_TYPES = {
|
|
ALL: "all",
|
|
HIGHLIGHT_EVENT: "highlightEvent",
|
|
CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
|
|
}
|
|
|
|
const EventHandler = {
|
|
callbacks: {},
|
|
init: function() {
|
|
for (eventType of Object.values(IBOM_EVENT_TYPES))
|
|
this.callbacks[eventType] = [];
|
|
},
|
|
registerCallback: function(eventType, callback) {
|
|
this.callbacks[eventType].push(callback);
|
|
},
|
|
emitEvent: function(eventType, eventArgs) {
|
|
event = {
|
|
eventType: eventType,
|
|
args: eventArgs,
|
|
}
|
|
var callback;
|
|
for(callback of this.callbacks[eventType])
|
|
callback(event);
|
|
for(callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
|
|
callback(event);
|
|
}
|
|
}
|
|
EventHandler.init();
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* PCB rendering code */
|
|
|
|
var emptyContext2d = document.createElement("canvas").getContext("2d");
|
|
|
|
function deg2rad(deg) {
|
|
return deg * Math.PI / 180;
|
|
}
|
|
|
|
function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
|
|
var point = [
|
|
linepoint[0] * text.width + offsetx,
|
|
linepoint[1] * text.height + offsety
|
|
];
|
|
// This approximates pcbnew behavior with how text tilts depending on horizontal justification
|
|
point[0] -= (linepoint[1] + 0.5 * (1 + text.horiz_justify)) * text.height * 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);
|
|
ctx.translate(text.thickness * 0.5, 0);
|
|
var angle = -text.angle;
|
|
if (text.attr.includes("mirrored")) {
|
|
ctx.scale(-1, 1);
|
|
angle = -angle;
|
|
}
|
|
var tilt = 0;
|
|
if (text.attr.includes("italic")) {
|
|
tilt = 0.125;
|
|
}
|
|
var interline = (text.height * 1.5 + text.thickness) / 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 = text.thickness + interline * tilt;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (txt[i][j] == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
lineWidth += fourSpaces - lineWidth % fourSpaces;
|
|
} else {
|
|
if (txt[i][j] == '~') {
|
|
j++;
|
|
if (j == txt[i].length)
|
|
break;
|
|
}
|
|
lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
|
|
}
|
|
}
|
|
var offsetx = 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;
|
|
}
|
|
var inOverbar = false;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (txt[i][j] == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
offsetx += fourSpaces - offsetx % fourSpaces;
|
|
continue;
|
|
} else if (txt[i][j] == '~') {
|
|
j++;
|
|
if (j == txt[i].length)
|
|
break;
|
|
if (txt[i][j] != '~') {
|
|
inOverbar = !inOverbar;
|
|
}
|
|
}
|
|
var glyph = pcbdata.font_data[txt[i][j]];
|
|
if (inOverbar) {
|
|
var overbarStart = [offsetx, -text.height * 1.4 + offsety];
|
|
var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]];
|
|
|
|
if (!lastHadOverbar) {
|
|
overbarStart[0] += text.height * 1.4 * tilt;
|
|
lastHadOverbar = true;
|
|
}
|
|
ctx.beginPath();
|
|
ctx.moveTo(...overbarStart);
|
|
ctx.lineTo(...overbarEnd);
|
|
ctx.stroke();
|
|
} else {
|
|
lastHadOverbar = false;
|
|
}
|
|
for (var line of glyph.l) {
|
|
ctx.beginPath();
|
|
ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
|
|
for (var k = 1; k < line.length; k++) {
|
|
ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt));
|
|
}
|
|
ctx.stroke();
|
|
}
|
|
offsetx += glyph.w * text.width;
|
|
}
|
|
}
|
|
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 setFullscreen(value) {
|
|
if (value) {
|
|
document.documentElement.requestFullscreen();
|
|
} else {
|
|
document.exitFullscreen();
|
|
}
|
|
}
|
|
|
|
function fabricationVisible(value) {
|
|
writeStorage("fabricationVisible", value);
|
|
settings.renderFabrication = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function silkscreenVisible(value) {
|
|
writeStorage("silkscreenVisible", value);
|
|
settings.renderSilkscreen = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setHighlightPin1(value) {
|
|
writeStorage("highlightpin1", value);
|
|
settings.highlightpin1 = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function 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(evt) {
|
|
refsSet = getStoredCheckboxRefs(checkbox);
|
|
var darkenWhenChecked = settings.darkenWhenChecked == checkbox;
|
|
eventArgs = {
|
|
checkbox: checkbox,
|
|
refs: references,
|
|
}
|
|
if (this.checked) {
|
|
// checkbox ticked
|
|
for (var ref of references) {
|
|
refsSet.add(ref[1]);
|
|
}
|
|
if (darkenWhenChecked) {
|
|
evt.target.parentElement.parentElement.classList.add("checked");
|
|
}
|
|
eventArgs.state = 'checked';
|
|
} else {
|
|
// checkbox unticked
|
|
for (var ref of references) {
|
|
refsSet.delete(ref[1]);
|
|
}
|
|
if (darkenWhenChecked) {
|
|
evt.target.parentElement.parentElement.classList.remove("checked");
|
|
}
|
|
eventArgs.state = 'unchecked';
|
|
}
|
|
settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
|
|
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
|
|
updateCheckboxStats(checkbox);
|
|
EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
|
|
}
|
|
}
|
|
|
|
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();
|
|
EventHandler.emitEvent(
|
|
IBOM_EVENT_TYPES.HIGHLIGHT_EVENT,
|
|
{
|
|
rowid: rowid,
|
|
refs: refs,
|
|
net: net
|
|
});
|
|
}
|
|
}
|
|
|
|
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);
|
|
if (input.checked && settings.darkenWhenChecked == checkbox) {
|
|
tr.classList.add("checked");
|
|
}
|
|
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();
|
|
populateDarkenWhenCheckedOptions();
|
|
}
|
|
|
|
function setDarkenWhenChecked(value) {
|
|
writeStorage("darkenWhenChecked", value);
|
|
settings.darkenWhenChecked = value;
|
|
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 populateDarkenWhenCheckedOptions() {
|
|
var container = document.getElementById("darkenWhenCheckedContainer");
|
|
|
|
if (settings.checkboxes.length == 0) {
|
|
container.parentElement.style.display = "none";
|
|
return;
|
|
}
|
|
|
|
container.innerHTML = '';
|
|
container.parentElement.style.display = "inline-block";
|
|
|
|
function createOption(name, displayName) {
|
|
var id = "darkenWhenChecked-" + name;
|
|
|
|
var div = document.createElement("div");
|
|
div.classList.add("radio-container");
|
|
|
|
var input = document.createElement("input");
|
|
input.type = "radio";
|
|
input.name = "darkenWhenChecked";
|
|
input.value = name;
|
|
input.id = id;
|
|
input.onchange = () => setDarkenWhenChecked(name);
|
|
div.appendChild(input);
|
|
|
|
// Preserve the selected element when the checkboxes change
|
|
if (name == settings.darkenWhenChecked) {
|
|
input.checked = true;
|
|
}
|
|
|
|
var label = document.createElement("label");
|
|
label.innerHTML = displayName;
|
|
label.htmlFor = id;
|
|
div.appendChild(label);
|
|
|
|
container.appendChild(div);
|
|
}
|
|
createOption("", "None");
|
|
for (var checkbox of settings.checkboxes) {
|
|
createOption(checkbox, checkbox);
|
|
}
|
|
}
|
|
|
|
function updateCheckboxStats(checkbox) {
|
|
var checked = getStoredCheckboxRefs(checkbox).size;
|
|
var total = pcbdata.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);
|
|
|
|
// Users may leave fullscreen without touching the checkbox. Uncheck.
|
|
document.addEventListener('fullscreenchange', () => {
|
|
if (!document.fullscreenElement)
|
|
document.getElementById('fullscreenCheckbox').checked = false;
|
|
});
|
|
}
|
|
|
|
window.onresize = resizeAll;
|
|
window.matchMedia("print").addListener(resizeAll);
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
</script>
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div id="topmostdiv" class="topmostdiv">
|
|
<div id="top">
|
|
<div 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" style="width: calc(50% - 18px)">
|
|
<input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
|
|
Dark mode
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
|
|
Full Screen
|
|
</label>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
|
|
Fab layer
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
|
|
Silkscreen
|
|
</label>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
|
|
References
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
|
|
Values
|
|
</label>
|
|
<div id="tracksAndZonesCheckboxes">
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
|
|
Tracks
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
|
|
Zones
|
|
</label>
|
|
</div>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
|
|
Pads
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
|
|
DNP outlined
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="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">
|
|
<div style="margin-left: 5px">Darken when checked</div>
|
|
<div id="darkenWhenCheckedContainer"></div>
|
|
</label>
|
|
<label class="menu-label">
|
|
<span class="shameless-plug">
|
|
<span>Created using</span>
|
|
<a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
|
|
</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>
|