All contact printer work to date.

This commit is contained in:
mmcw-dev 2018-07-14 10:29:43 -04:00
parent b3bab94c14
commit 41facffab0
44 changed files with 17000 additions and 0 deletions

13
build.sh Normal file
View File

@ -0,0 +1,13 @@
#!/bin/bash
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
echo "Building ${green}contact_printer${reset} project..."
#build OpenSCAD models
while read m; do
echo $m
done < models.txt
#run client tests?

2
clients/electron_app/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
node_modules/*
data/*.json

View File

@ -0,0 +1,18 @@
footer{
position:fixed;
bottom:0;
left:0;
right:0;
}
.window-content{
background:#2f2f2f;
height:100%;
display:block;
}
progress{
width: 95%;
margin-left: 2.5%;
}
#buttons{
margin: 5%;
}

File diff suppressed because it is too large Load Diff

View File

44
clients/electron_app/dist/app.js vendored Normal file
View File

@ -0,0 +1,44 @@
/*jshint browser:true*/
'use strict';
const Fingerprint2 = require('./lib/fingerprint2.js');
const ttm = require('./lib/talktomain.js');
var fp;
var onReady = function () {
fp = new Fingerprint2().get((result, components) => {
console.log(result);
setTimeout(function () {
ttm.send('config', { fingerprint : result });
}, 2000);
});
};
document.addEventListener('DOMContentLoaded', onReady);
/*console.log(ipcRenderer.sendSync('synchronous-message', 'ping')); // prints "pong"
ipcRenderer.on('asynchronous-reply', (event, arg) => {
console.log(arg); // prints "pong"
});
ipcRenderer.send('asynchronous-message', 'ping');
function timeout(duration = 0) {
return new Promise((resolve, reject) => {
setTimeout(resolve, duration);
})
}
var p = timeout(1000).then(() => {
return timeout(2000);
}).then(() => {
throw new Error("hmm");
}).catch(err => {
return Promise.all([timeout(100), timeout(200)]);
})
*/

Binary file not shown.

View File

@ -0,0 +1,295 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Copyright (C) 2015 by original authors @ fontello.com</metadata>
<defs>
<font id="photon-entypo" horiz-adv-x="1000" >
<font-face font-family="photon-entypo" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
<missing-glyph horiz-adv-x="1000" />
<glyph glyph-name="note" unicode="&#xe800;" d="m381 820q0-42 46-97t90-100 61-119-39-154q-20-34-26-16-2 6 0 16 10 18 6 56t-13 78-43 73-82 41l0-536q2-48-37-95t-105-71q-74-28-143-8t-89 76 20 115 116 85q86 30 158 4l0 652 80 0z" horiz-adv-x="582" />
<glyph glyph-name="note-beamed" unicode="&#xe801;" d="m206 714l534 116 0-704q2-42-30-81t-86-59q-64-24-110-8t-62 64q-18 48 7 97t85 73q52 20 106 10l0 376-354-82 0-490q0-42-32-81t-86-59q-64-22-109-7t-61 63q-18 48 6 97t84 73q54 20 108 10l0 592z" horiz-adv-x="740" />
<glyph glyph-name="music" unicode="&#xe802;" d="m600 800q42 0 71-29t29-71l0-700q0-40-29-70t-71-30l-500 0q-40 0-70 30t-30 70l0 700q0 42 30 71t70 29l500 0z m-110-476q32 44 23 92t-33 80-49 66-25 54l-60 0 0-368q-42 16-90-2-42-14-64-48t-12-64q12-32 53-45t85 1q88 30 88 98l0 262q36-6 55-32t18-52-3-42q-4-10 2-10 4 0 12 10z" horiz-adv-x="700" />
<glyph glyph-name="search" unicode="&#xe803;" d="m772 78q30-34 6-62l-46-46q-36-32-68 0l-190 190q-74-42-156-42-128 0-223 95t-95 223 90 219 218 91 224-95 96-223q0-88-46-162z m-678 358q0-88 68-156t156-68 151 63 63 153q0 88-68 155t-156 67-151-63-63-151z" horiz-adv-x="789" />
<glyph glyph-name="flashlight" unicode="&#xe804;" d="m807 706q62-62 85-130t-5-92l-134-134q-16-16-62-26t-96-4l-408-408q-18-18-57-6t-75 50q-36 36-49 74t5 56l408 408q-6 50 4 96t26 62l136 136q24 28 92 4t130-86z m-448-408q32-32 80 14 46 46 14 82-14 14-38 10t-44-24-23-43 11-39z m336 298q30-30 68-50t62-25 28-1q2 4-4 27t-26 60-50 67-66 50-59 26-27 2 1-28 25-62 48-66z" horiz-adv-x="902" />
<glyph glyph-name="mail" unicode="&#xe805;" d="m30 586q-32 18-28 40 2 14 26 14l846 0q38 0 20-32-8-14-24-22-14-6-192-102t-182-98q-16-10-46-10-28 0-46 10-4 2-182 98t-192 102z m850-100q20 10 20-10l0-368q0-16-17-32t-33-16l-800 0q-16 0-33 16t-17 32l0 368q0 20 20 10l384-200q18-10 46-10t46 10z" horiz-adv-x="900" />
<glyph glyph-name="heart" unicode="&#xe806;" d="m790 644q70-64 70-156t-70-158l-360-330-360 330q-70 66-70 158t70 156q62 58 151 58t153-58l56-52 58 52q62 58 150 58t152-58z" horiz-adv-x="860" />
<glyph glyph-name="heart-empty" unicode="&#xe807;" d="m790 642q70-64 70-156t-70-156l-360-330-360 330q-70 64-70 156t70 156q64 58 152 58t150-58l58-52 56 52q64 58 152 58t152-58z m-54-260q42 40 42 104 0 66-38 100-38 38-102 38-52 0-104-48l-104-92-106 92q-48 48-102 48-64 0-104-38-38-36-38-100 0-66 44-104l306-286z" horiz-adv-x="860" />
<glyph glyph-name="star" unicode="&#xe808;" d="m440 790l120-336 320 0-262-196 94-348-272 208-272-208 94 348-262 196 320 0z" horiz-adv-x="880" />
<glyph glyph-name="star-empty" unicode="&#xe809;" d="m880 454l-262-196 94-348-272 208-272-208 94 348-262 196 320 0 120 336 120-336 320 0z m-440-238l150-124-62 178 144 114-176-4-56 202-54-202-176 4 142-114-62-178z" horiz-adv-x="880" />
<glyph glyph-name="user" unicode="&#xe80a;" d="m736 128q204-72 204-122l0-106-940 0 0 106q0 50 204 122 94 34 128 69t34 95q0 22-22 49t-32 73q-2 12-9 18t-14 8-14 17-9 43q0 16 5 26t9 12l4 4q-8 50-12 88-4 54 41 112t157 58 158-58 40-112l-12-88q18-8 18-42-2-28-9-43t-14-17-14-8-9-18q-8-48-31-74t-23-48q0-60 35-95t127-69z" horiz-adv-x="940" />
<glyph glyph-name="users" unicode="&#xe80b;" d="m1000-90l-224 0 0 150q0 54-30 81t-154 89q40 30 40 84 0 16-13 33t-19 51q-2 8-14 16t-14 42q0 24 12 30-6 34-8 60-4 38 23 78t95 40 96-40 24-78l-8-60q12-6 12-30-2-34-14-42t-14-16q-6-34-19-51t-13-33q0-42 21-66t77-48q112-46 130-80 6-8 9-61t5-101l0-48z m-488 262q182-78 182-124l0-138-694 0 0 184q0 44 84 78 76 32 104 64t28 88q0 20-19 44t-25 68q-2 10-18 22t-20 56q0 14 3 23t7 13l4 2q-6 46-10 82-4 50 33 103t127 53 127-53 33-103l-10-82q14-8 14-38-4-44-20-56t-18-22q-6-44-25-68t-19-44q0-56 28-88t104-64z" horiz-adv-x="1000" />
<glyph glyph-name="user-add" unicode="&#xe80c;" d="m620 128q180-64 180-122l0-106-800 0 0 202q36 14 82 26 94 34 129 69t35 95q0 22-23 48t-31 74q-2 12-23 25t-25 61q0 16 5 26t9 12l4 4q-8 50-12 88-6 54 40 112t160 58 160-58 42-112l-14-88q18-8 18-42-2-28-9-43t-14-17-14-8-9-18q-10-46-33-73t-23-49q0-60 36-95t130-69z m230 272l150 0 0-100-150 0 0-150-100 0 0 150-150 0 0 100 150 0 0 150 100 0 0-150z" horiz-adv-x="1000" />
<glyph glyph-name="video" unicode="&#xe80d;" d="m980 600l-100 0 0-100 100 0 0-100-100 0 0-100 100 0 0-100-100 0 0-100 100 0 0-60q0-16-12-28t-28-12l-900 0q-16 0-28 12t-12 28l0 60 100 0 0 100-100 0 0 100 100 0 0 100-100 0 0 100 100 0 0 100-100 0 0 60q0 18 12 29t28 11l900 0q16 0 28-11t12-29l0-60z m-600-400l250 150-250 150 0-300z" horiz-adv-x="980" />
<glyph glyph-name="picture" unicode="&#xe80e;" d="m856 518l-100 0-124 150-214-150-180 0q-52 0-90-39t-38-91l0-160-108 296q-10 38 22 52l680 248q36 10 50-24z m106-90q16 0 27-12t11-28l0-472q0-16-11-28t-27-12l-724 0q-16 0-27 12t-11 28l0 472q0 16 11 28t27 12l724 0z m-56-452l0 162-72 160-166-60-130-132-138 170-92-214 0-86 598 0z" horiz-adv-x="1000" />
<glyph glyph-name="camera" unicode="&#xe80f;" d="m500 450q64 0 107-44t43-106-44-106-106-44-106 44-44 106 44 106 106 44z m400 150q42 0 71-29t29-71l0-450q0-40-29-70t-71-30l-800 0q-40 0-70 30t-30 70l0 450q0 42 30 71t70 29l120 0q28 0 40 30l30 92q10 28 40 28l340 0q30 0 40-28l30-92q12-30 40-30l120 0z m-400-550q104 0 177 73t73 177-73 177-177 73-177-73-73-177 73-177 177-73z m366 380q14 0 24 11t10 25-10 24-24 10q-36 0-36-34 0-16 11-26t25-10z" horiz-adv-x="1000" />
<glyph glyph-name="layout" unicode="&#xe810;" d="m170 650q80 0 80-80l0-90q0-80-80-80l-90 0q-80 0-80 80l0 90q0 80 80 80l90 0z m350 0q80 0 80-80l0-90q0-80-80-80l-90 0q-80 0-80 80l0 90q0 80 80 80l90 0z m-350-350q80 0 80-80l0-90q0-80-80-80l-90 0q-80 0-80 80l0 90q0 80 80 80l90 0z m350 0q80 0 80-80l0-90q0-80-80-80l-90 0q-80 0-80 80l0 90q0 80 80 80l90 0z" horiz-adv-x="600" />
<glyph glyph-name="menu" unicode="&#xe811;" d="m650 400q22 0 36-15t14-35-15-35-35-15l-600 0q-20 0-35 15t-15 35 14 35 36 15l600 0z m-600 100q-20 0-35 15t-15 35 14 35 36 15l600 0q22 0 36-15t14-35-15-35-35-15l-600 0z m600-300q22 0 36-15t14-35-15-35-35-15l-600 0q-20 0-35 15t-15 35 14 35 36 15l600 0z" horiz-adv-x="700" />
<glyph glyph-name="check" unicode="&#xe812;" d="m249 0q-34 0-56 28l-180 236q-16 24-12 52t26 46 51 14 47-28l118-154 296 474q16 24 43 30t53-8q24-16 30-43t-8-53l-350-560q-20-32-56-32z" horiz-adv-x="667" />
<glyph glyph-name="cancel" unicode="&#xe813;" d="m452 194q18-18 18-43t-18-43q-18-16-43-16t-43 16l-132 152-132-152q-18-16-43-16t-43 16q-16 18-16 43t16 43l138 156-138 158q-16 18-16 43t16 43q18 16 43 16t43-16l132-152 132 152q18 16 43 16t43-16q18-18 18-43t-18-43l-138-158z" horiz-adv-x="470" />
<glyph glyph-name="cancel-circled" unicode="&#xe814;" d="m420 770q174 0 297-123t123-297-123-297-297-123-297 123-123 297 123 297 297 123z m86-420l154 154-86 86-154-152-152 152-88-86 154-154-154-152 88-86 152 152 154-152 86 86z" horiz-adv-x="840" />
<glyph glyph-name="cancel-squared" unicode="&#xe815;" d="m700 750q42 0 71-29t29-71l0-600q0-40-29-70t-71-30l-600 0q-40 0-70 30t-30 70l0 600q0 42 30 71t70 29l600 0z m-146-638l86 86-154 152 154 154-86 86-154-152-152 152-88-86 154-154-154-152 88-86 152 152z" horiz-adv-x="800" />
<glyph glyph-name="plus" unicode="&#xe816;" d="m550 400q30 0 30-50t-30-50l-210 0 0-210q0-30-50-30t-50 30l0 210-210 0q-30 0-30 50t30 50l210 0 0 210q0 30 50 30t50-30l0-210 210 0z" horiz-adv-x="580" />
<glyph glyph-name="plus-circled" unicode="&#xe817;" d="m420 770q174 0 297-123t123-297-123-297-297-123-297 123-123 297 123 297 297 123z m52-470l200 0 0 102-200 0 0 202-102 0 0-202-202 0 0-102 202 0 0-202 102 0 0 202z" horiz-adv-x="840" />
<glyph glyph-name="plus-squared" unicode="&#xe818;" d="m700 750q42 0 71-29t29-71l0-600q0-40-29-70t-71-30l-600 0q-40 0-70 30t-30 70l0 600q0 42 30 71t70 29l600 0z m-50-450l0 100-200 0 0 200-100 0 0-200-200 0 0-100 200 0 0-200 100 0 0 200 200 0z" horiz-adv-x="800" />
<glyph glyph-name="minus" unicode="&#xe819;" d="m550 400q30 0 30-50t-30-50l-520 0q-30 0-30 50t30 50l520 0z" horiz-adv-x="580" />
<glyph glyph-name="minus-circled" unicode="&#xe81a;" d="m420 770q174 0 297-123t123-297-123-297-297-123-297 123-123 297 123 297 297 123z m252-368l-504 0 0-102 504 0 0 102z" horiz-adv-x="840" />
<glyph glyph-name="minus-squared" unicode="&#xe81b;" d="m700 750q42 0 71-29t29-71l0-600q0-40-29-70t-71-30l-600 0q-40 0-70 30t-30 70l0 600q0 42 30 71t70 29l600 0z m-50-450l0 100-500 0 0-100 500 0z" horiz-adv-x="800" />
<glyph glyph-name="help" unicode="&#xe81c;" d="m494 740q86-62 86-184 0-64-42-124-12-20-88-80l-46-30q-40-34-48-60-6-16-8-44 0-14-16-14l-128 0q-16 0-16 12 4 98 28 124 16 22 48 48t56 42l24 14q22 16 34 34 28 44 28 70 0 40-26 78-28 36-92 36-68 0-94-44-28-42-28-92l-166 0q6 162 114 232 70 42 166 42 130 0 214-60z m-216-636q44 0 73-30t27-74q-2-46-32-73t-74-25q-44 0-73 29t-27 75 32 73 74 25z" horiz-adv-x="580" />
<glyph glyph-name="help-circled" unicode="&#xe81d;" d="m454 810q190 2 326-130t140-322q2-190-131-327t-323-141q-190-2-327 131t-139 323q-4 190 130 327t324 139z m-2-740q30 0 49 19t19 47q2 30-17 49t-49 19l-2 0q-28 0-47-18t-21-46q0-30 19-49t47-21l2 0z m166 328q26 34 26 78 0 78-54 116-52 38-134 38-64 0-104-26-68-42-72-146l0-4 110 0 0 4q0 26 16 54 16 24 54 24 40 0 52-20 16-20 16-44 0-18-16-40-8-12-20-20l-6-4q-6-4-16-11t-20-15-21-17-17-17q-14-20-18-78l0-8 108 0 0 4q0 12 4 28 6 20 28 36l28 18q46 34 56 50z" horiz-adv-x="920" />
<glyph glyph-name="info" unicode="&#xe81e;" d="m352 850q48 0 74-27t26-69q0-50-39-88t-95-38q-48 0-74 26t-24 72q0 46 35 85t97 39z m-206-1000q-100 0-54 178l60 254q14 56 0 56-12 0-54-18t-72-38l-26 44q90 78 189 126t151 48q78 0 36-162l-70-266q-16-64 6-64 44 0 118 60l30-40q-84-86-175-132t-139-46z" horiz-adv-x="460" />
<glyph glyph-name="info-circled" unicode="&#xe81f;" d="m454 810q190 2 326-130t140-322q2-190-131-327t-323-141q-190-2-327 131t-139 323q-4 190 130 327t324 139z m52-152q-42 0-65-24t-23-50q-2-28 15-44t49-16q38 0 61 22t23 54q0 58-60 58z m-120-594q30 0 84 26t106 78l-18 24q-48-36-72-36-14 0-4 38l42 160q26 96-22 96-30 0-89-29t-115-75l16-26q52 34 74 34 12 0 0-34l-36-152q-26-104 34-104z" horiz-adv-x="920" />
<glyph glyph-name="back" unicode="&#xe820;" d="m750 540q40 0 70-29t30-71l0-290q0-40-30-70t-70-30l-690 0 0 140 650 0 0 210-500 0 0-110-210 180 210 180 0-110 540 0z" horiz-adv-x="850" />
<glyph glyph-name="home" unicode="&#xe821;" d="m888 336q16-16 11-27t-27-11l-84 0 0-310q0-14-1-21t-8-13-23-6l-204 0 0 310-204 0 0-310-194 0q-28 0-35 10t-7 30l0 310-84 0q-22 0-27 11t11 27l400 402q16 16 38 16t38-16z" horiz-adv-x="900" />
<glyph glyph-name="link" unicode="&#xe822;" d="m294 116q14 14 34 14t36-14q32-34 0-70l-42-40q-56-56-132-56-78 0-134 56t-56 132q0 78 56 134l148 148q70 68 144 77t128-43q16-16 16-36t-16-36q-36-32-70 0-50 48-132-34l-148-146q-26-26-26-64t26-62q26-26 63-26t63 26z m450 574q56-56 56-132 0-78-56-134l-158-158q-74-72-150-72-62 0-112 50-14 14-14 34t14 36q14 14 35 14t35-14q50-48 122 24l158 156q28 28 28 64 0 38-28 62-24 26-56 31t-60-21l-50-50q-16-14-36-14t-34 14q-34 34 0 70l50 50q54 54 127 51t129-61z" horiz-adv-x="800" />
<glyph glyph-name="attach" unicode="&#xe823;" d="m244-140q-102 0-170 72-72 70-74 166t84 190l496 496q80 80 174 54 44-12 79-47t47-79q26-96-54-176l-474-474q-40-40-88-46-48-4-80 28-30 24-27 74t47 92l332 334q24 26 50 0t0-50l-332-332q-44-44-20-70 12-8 24-6 24 4 46 26l474 474q50 50 34 108-16 60-76 76-54 14-108-36l-494-494q-66-76-64-143t52-117q50-48 117-50t141 62l496 494q24 24 50 0 26-22 0-48l-496-496q-82-82-186-82z" horiz-adv-x="939" />
<glyph glyph-name="lock" unicode="&#xe824;" d="m640 476q20 0 40-19t20-41l0-390q0-48-48-66l-60-18q-42-16-96-16l-290 0q-56 0-98 16l-60 18q-48 18-48 66l0 390q0 22 15 41t35 19l100 0 0 70q0 110 51 170t149 60 149-60 51-170l0-70 90 0z m-390 90l0-90 200 0 0 90q0 52-27 81t-73 29-73-29-27-81z" horiz-adv-x="700" />
<glyph glyph-name="lock-open" unicode="&#xe825;" d="m640 450q20 0 40-20t20-40l0-390q0-20-14-39t-34-25l-60-20q-52-16-96-16l-290 0q-46 0-98 16l-60 20q-20 6-34 25t-14 39l0 390q0 22 15 41t35 19l400 0 0 140q0 110-100 110t-100-110l0-40-100 0 0 20q0 110 51 170t149 60q200 0 200-230l0-120 90 0z" horiz-adv-x="700" />
<glyph glyph-name="eye" unicode="&#xe826;" d="m500 630q92 0 177-25t141-62 99-77 63-71 20-45-20-44-63-71-99-78-141-62-177-25-177 25-141 62-99 78-63 71-20 44 20 45 63 71 99 77 141 62 177 25z m0-494q92 0 157 63t65 151q0 90-65 153t-157 63-157-63-65-153q0-88 65-151t157-63z m0 214q8-8 37-2t50 11 25-9q0-44-33-75t-79-31-78 31-32 75q0 46 32 77t78 31q14 0 10-23t-12-47 2-38z" horiz-adv-x="1000" />
<glyph glyph-name="tag" unicode="&#xe827;" d="m944 830q36-106-8-199t-128-157l18-24q16-28 6-54l-48-158q-12-30-36-46l-464-328q-42-30-64 4l-210 304q-12 18-9 39t21 33l464 328q26 18 54 18l158 0q30 0 48-26l28-40q168 130 114 286-10 28 18 40 32 8 38-20z m-216-468q40 32 34 80l-32-16q-8-4-12-4-18 0-28 18-12 30 16 40l24 14q-48 34-92 0-28-18-34-51t14-61q18-26 51-32t59 12z" horiz-adv-x="960" />
<glyph glyph-name="bookmark" unicode="&#xe828;" d="m310 800q22 0 36-15t14-35l0-850-180 180-180-180 0 850q0 50 40 50l270 0z" horiz-adv-x="360" />
<glyph glyph-name="bookmarks" unicode="&#xe829;" d="m500 850q20 0 35-15t15-35l0-850-150 180 0 620q0 20-15 35t-35 15l-100 0q0 50 40 50l210 0z m-250-150q20 0 35-15t15-35l0-800-150 180-150-180 0 800q0 50 40 50l210 0z" horiz-adv-x="550" />
<glyph glyph-name="flag" unicode="&#xe82a;" d="m874 616q14 6 22-1t0-19q-96-138-164-213t-110-90-73-2-60 37-63 40-93-4-139-86l90-352-100 0-184 720 92 34q90 66 152 86t98 3 64-51 62-71 79-62 129-20 198 51z" horiz-adv-x="900" />
<glyph glyph-name="thumbs-up" unicode="&#xe82b;" d="m582 480q2-6 58-13t108-24 52-47q0-72-61-284t-107-212q-144 0-288 42t-144 88l0 342q0 14 15 34t46 45 53 41 62 43 46 31q50 34 104 100t85 104 41 26q48-76 29-137t-59-119-40-60z m-432-4q14 0 0-14-50-50-50-104l0-318q0-50 52-104 10-10-2-10-26 0-55 8t-62 45-33 99l0 242q0 62 33 100t63 47 54 9z" horiz-adv-x="800" />
<glyph glyph-name="thumbs-down" unicode="&#xe82c;" d="m218 218q-2 6-57 13t-108 24-53 47q0 72 62 285t106 213q144 0 288-43t144-89l0-342q0-10-8-24t-25-30-32-29-42-32-41-29-41-28l-33-22q-50-34-104-100t-85-104-41-26q-48 76-29 137t59 119 40 60z m432 4q-12 0 2 14 48 50 48 104l0 318q0 50-52 104-10 10 2 10 26 0 55-8t62-45 33-99l0-242q0-48-18-81t-45-48-48-21-39-6z" horiz-adv-x="800" />
<glyph glyph-name="download" unicode="&#xe82d;" d="m968 198q18-10 27-32t3-40l-28-154q-4-20-22-33t-40-13l-816 0q-22 0-40 13t-22 33l-28 154q-10 48 32 72l158 108 98 0-170-130 178 0q8 0 12-8l40-110 300 0 40 110q8 8 12 8l178 0-170 130 98 0z m-208 322l-260-244-260 244 166 0 0 256 190 0 0-256 164 0z" horiz-adv-x="1000" />
<glyph glyph-name="upload" unicode="&#xe82e;" d="m500 776l260-244-164 0 0-256-190 0 0 256-166 0z m468-578q18-10 27-32t3-40l-28-154q-4-20-22-33t-40-13l-816 0q-22 0-40 13t-22 33l-28 154q-10 48 32 72l158 108 98 0-170-130 178 0q8 0 12-8l40-110 300 0 40 110q8 8 12 8l178 0-170 130 98 0z" horiz-adv-x="1000" />
<glyph glyph-name="upload-cloud" unicode="&#xe82f;" d="m760 494q100 0 170-68t70-166-70-166-170-68l-190 0 0 190 106 0-176 230-174-230 104 0 0-190-248 0q-74 0-128 52t-54 124q0 74 53 126t129 52q14 0 20-2-2 12-2 38 0 108 78 184t188 76q90 0 160-52t94-134q28 4 40 4z" horiz-adv-x="1000" />
<glyph glyph-name="reply" unicode="&#xe830;" d="m900 10q-86 152-208 197t-330 45l0-218-362 334 362 322 0-192q90 0 168-27t131-70 96-95 69-104 44-95 24-69z" horiz-adv-x="900" />
<glyph glyph-name="reply-all" unicode="&#xe831;" d="m362 556l-212-188 212-196 0-138-362 334 362 322 0-134z m250-58q104 0 182-50t115-122 60-144 27-122l4-50q-86 154-168 198t-220 44l0-218-362 334 362 322 0-192z" horiz-adv-x="1000" />
<glyph glyph-name="forward" unicode="&#xe832;" d="m540 252q-210 0-332-45t-208-197q4 20 13 53t50 117 96 148 156 117 225 53l0 192 360-322-360-334 0 218z" horiz-adv-x="900" />
<glyph glyph-name="quote" unicode="&#xe833;" d="m146 680q146 0 184-146 38-140-40-302-80-168-224-204-32-8-66-8l0 70q112 0 182 108 54 86 26 146-16 36-62 36-60 0-103 44t-43 106 43 106 103 44z m420 0q146 0 184-146 38-140-40-302-80-168-224-204-32-8-66-8l0 70q112 0 182 108 54 86 26 146-16 36-62 36-60 0-103 44t-43 106 43 106 103 44z" horiz-adv-x="762" />
<glyph glyph-name="code" unicode="&#xe834;" d="m380 636q16-14 16-32t-16-30l-246-224 246-226q16-12 16-30t-16-32q-30-30-60 0l-320 288 320 286q30 30 60 0z m302 0l318-286-318-288q-32-30-62 0-32 32 0 62l248 226-248 224q-32 30 0 62 30 30 62 0z" horiz-adv-x="1000" />
<glyph glyph-name="export" unicode="&#xe835;" d="m750 60l0 56 100 82 0-188q0-20-15-35t-35-15l-750 0q-20 0-35 15t-15 35l0 550q0 22 14 36t36 14l288 0q-32-24-59-49t-39-39l-10-12-130 0 0-450 650 0z m-82 348q-166 0-242-41t-160-181q0 8 1 22t9 56 22 79 44 83 70 79 107 56 149 23l0 156 332-250-332-260 0 178z" horiz-adv-x="1000" />
<glyph glyph-name="pencil" unicode="&#xe836;" d="m718 680q32-32 47-64t15-48l0-16-252-252-290-288-238-52 50 240 290 288 252 252q54 12 126-60z m-494-640l24 24q-2 44-52 94-22 22-45 35t-35 13l-14 2-22-24-18-80q28-16 46-34 24-24 36-48z" horiz-adv-x="780" />
<glyph glyph-name="feather" unicode="&#xe837;" d="m60-138q-6-20-26-8-18 8-16 34 4 100 50 226-100 154-52 316 10-32 32-78t44-80 32-30q8 4 0 83t-11 166 25 157q22 44 80 94t104 70q-24-46-33-94t-4-78 21-32q12 0 84 120t106 122q46 4 114-29t82-65q12-24 0-79t-40-83q-44-44-146-62t-114-24q-16-10 12-34 54-48 176-20-56-80-136-114t-132-38-54-10q-4-24 49-54t101-14q-30-56-63-84t-54-35-76-11-85-8z" horiz-adv-x="698" />
<glyph glyph-name="print" unicode="&#xe838;" d="m66 526q-26 0-22 22 4 10 12 14 2 0 49 17t93 32 58 15l44 0 0 150 380 0 0-150 46 0q12 0 57-15t92-32 49-17q18-8 12-26-4-10-20-10l-850 0z m860-56q20 0 37-19t17-41l0-174q0-22-17-41t-37-19l-100 0 44-250-760 0 44 250-98 0q-20 0-38 19t-18 41l0 174q0 22 18 41t38 19l870 0z m-716-444l560 0-70 324-420 0z" horiz-adv-x="980" />
<glyph glyph-name="retweet" unicode="&#xe839;" d="m250 190l272 0 128-140-448 0q-42 0-71 30t-29 70l0 302-102 0 176 198 174-198-100 0 0-262z m650 60l100 0-174-200-176 200 102 0 0 260-274 0-128 140 450 0q40 0 70-29t30-71l0-300z" horiz-adv-x="1000" />
<glyph glyph-name="keyboard" unicode="&#xe83a;" d="m930 650q28 0 49-21t21-49l0-460q0-30-21-50t-49-20l-860 0q-28 0-49 20t-21 50l0 460q0 28 21 49t49 21l860 0z m-380-100l0-100 100 0 0 100-100 0z m150-150l-100 0 0-100 100 0 0 100z m-300 150l0-100 100 0 0 100-100 0z m150-150l-100 0 0-100 100 0 0 100z m-300 150l0-100 100 0 0 100-100 0z m150-150l-100 0 0-100 100 0 0 100z m-300 150l0-100 100 0 0 100-100 0z m150-150l-100 0 0-100 100 0 0 100z m-50-250l0 100-100 0 0-100 100 0z m550 0l0 100-500 0 0-100 500 0z m150 0l0 100-100 0 0-100 100 0z m-150 150l100 0 0 100-100 0 0-100z m150 150l0 100-200 0 0-100 200 0z" horiz-adv-x="1000" />
<glyph glyph-name="comment" unicode="&#xe83b;" d="m700 700q42 0 71-29t29-71l0-350q0-40-29-70t-71-30l-200 0 0-150-200 150-200 0q-40 0-70 30t-30 70l0 350q0 42 30 71t70 29l600 0z" horiz-adv-x="800" />
<glyph glyph-name="chat" unicode="&#xe83c;" d="m290 240l350 0q2 0 6 2l4 0 0-92q0-40-29-70t-71-30l-250 0-150-150 0 150-50 0q-40 0-70 30t-30 70l0 300q0 42 30 71t70 29l190 0 0-310z m610 560q42 0 71-29t29-71l0-300q0-40-29-70t-71-30l-50 0 0-150-150 150-350 0 0 400q0 42 30 71t70 29l450 0z" horiz-adv-x="1000" />
<glyph glyph-name="bell" unicode="&#xe83d;" d="m632 426q16-34 40-52t45-22 44-23 35-55q22-62-74-161t-252-157q-164-58-297-45t-155 75q-20 54 12 111t18 111q-56 192-47 300t113 192q26 22 29 51t29 39q24 8 46-12t56-18q132 2 198-66t160-268z m-186-404q88 32 159 85t100 91 25 50q-8 22-49 33t-124 1-187-48q-102-38-173-87t-94-84-17-53q4-12 50-22t134-4 176 38z m-62 174q8 2 21 7t17 7l2-2q14-40-17-83t-89-63q-96-36-152 14 78 68 218 120z" horiz-adv-x="800" />
<glyph glyph-name="attention" unicode="&#xe83e;" d="m957-24q10-16 0-34-10-16-30-16l-892 0q-18 0-28 16-13 18-2 34l446 782q8 18 30 18t30-18z m-420 50l0 100-110 0 0-100 110 0z m0 174l0 300-110 0 0-300 110 0z" horiz-adv-x="962" />
<glyph glyph-name="alert" unicode="&#xe83f;" d="m885 234q20-16 16-33t-28-23l-78-22q-24-6-40-28t-14-48l4-82q2-24-14-34t-38 0l-86 44q-22 12-47 4t-35-30l-46-88q-12-22-29-23t-33 19l-50 78q-34 48-88 20l-122-70q-22-14-32-6t-2 32l54 164q8 24-4 44t-36 22l-106 12q-24 4-29 18t15 30l86 76q20 16 20 41t-20 41l-86 76q-20 16-16 33t28 23l78 22q24 6 41 28t15 48l-6 82q0 26 15 36t37 0l80-38q24-10 49-2t37 30l46 80q12 22 30 21t30-23l50-86q12-22 35-29t45 7l136 84q22 14 30 6t0-32l-60-170q-10-22 2-41t38-21l114-12q26-2 30-16t-16-30l-86-76q-18-16-18-41t18-41z m-384-92l0 104-100 0 0-104 100 0z m0 160l0 260-100 0 0-260 100 0z" horiz-adv-x="901" />
<glyph glyph-name="vcard" unicode="&#xe840;" d="m900 750q42 0 71-29t29-71l0-600q0-40-29-70t-71-30l-800 0q-40 0-70 30t-30 70l0 600q0 42 30 71t70 29l800 0z m0-700l0 600-800 0 0-600 800 0z m-450 196l0-90-250 0 0 90 250 0z m0 150l0-90-250 0 0 90 250 0z m0 150l0-90-250 0 0 90 250 0z m346-320l4-70-250 0q0 70 6 70 84 22 84 66 0 16-27 56t-27 88q0 110 90 110t90-110q0-48-28-88t-28-56q0-20 21-36t43-22z" horiz-adv-x="1000" />
<glyph glyph-name="address" unicode="&#xe841;" d="m426 800q20 0 20-20l0-860q0-20-20-20l-46 0q-20 0-20 20l0 440-176 0q-16 0-28 6-12 2-26 12l-120 82q-10 6-10 16t10 16l120 82q14 10 26 12 8 4 28 4l176 0 0 190q0 20 20 20l46 0z m564-208q10-6 10-16t-10-16l-118-82q-22-12-26-12-14-6-28-6l-302 0-40 230 342 0q18 0 28-4t26-12z" horiz-adv-x="1000" />
<glyph glyph-name="location" unicode="&#xe842;" d="m250 750q104 0 177-73t73-177q0-106-62-243t-126-223l-62-84q-10 12-27 35t-60 89-76 130-60 147-27 149q0 104 73 177t177 73z m0-388q56 0 96 40t40 96-40 95-96 39-95-39-39-95 39-96 95-40z" horiz-adv-x="500" />
<glyph glyph-name="map" unicode="&#xe843;" d="m984 600q16-10 16-30l0-584q0-20-16-30-8-6-16-6t-18 6l-216 136-216-136q-18-10-34 0l-218 136-216-136q-16-10-34 0-16 10-16 30l0 584q0 20 16 30l234 146q18 10 34 0l216-136 218 136q16 10 32 0z m-750-450l0 506-168-104 0-506z m234-104l0 506-168 104 0-506z m234 104l0 506-170-104 0-506z m232-104l0 506-168 104 0-506z" horiz-adv-x="1000" />
<glyph glyph-name="direction" unicode="&#xe844;" d="m848 768q8-8 11-16t-2-22-10-26-19-39-24-49q-54-112-147-286t-157-292l-66-118-54 380-380 56q442 246 696 368 20 10 48 25t39 20 25 9 23 1 17-11z m-92-96l-304-280 28-234z" horiz-adv-x="860" />
<glyph glyph-name="compass" unicode="&#xe845;" d="m474 830q198 2 340-136t146-336q2-200-136-342t-338-146q-198-2-341 137t-145 337q-4 200 135 342t339 144z m12-858q156 2 266 114t108 270-115 267-269 107q-158-2-267-114t-107-270 114-267 270-107z m-234 154q4 26 12 66t41 128 77 132 125 76 141 42l60 10q-4-26-12-66t-41-128-77-132q-42-42-124-74t-142-42z m180 276q-22-20-22-48t22-50q20-22 49-22t49 22q52 52 88 186-136-36-186-88z" horiz-adv-x="960" />
<glyph glyph-name="cup" unicode="&#xe846;" d="m340 760q152 0 249-41t91-87l-72-594q-2-14-34-36t-97-42-137-20-136 20-97 42-35 36l-72 594q-4 28 36 57t121 50 183 21z m0-216q72 0 137 15t98 33 33 30-33 29-98 32-137 15-137-15-98-32-33-29 33-30 98-33 137-15z" horiz-adv-x="681" />
<glyph glyph-name="trash" unicode="&#xe847;" d="m50 458q122-70 330-70t330 70l-54-486q-2-14-35-36t-100-43-141-21-140 21-100 43-36 36z m488 300q94-18 158-55t64-71l0-10q0-58-112-99t-268-41-268 41-112 99l0 10q0 34 64 71t158 55l42 48q22 26 70 26l92 0q52 0 70-26z m-54-112l84 0q-92 110-104 126-14 16-32 16l-102 0q-22 0-32-16l-106-126 84 0 64 66 82 0z" horiz-adv-x="760" />
<glyph glyph-name="doc" unicode="&#xe848;" d="m600 800q42 0 71-29t29-71l0-700q0-40-29-70t-71-30l-500 0q-40 0-70 30t-30 70l0 700q0 42 30 71t70 29l500 0z m0-800l0 700-500 0 0-700 500 0z" horiz-adv-x="700" />
<glyph glyph-name="docs" unicode="&#xe849;" d="m970 480q38-10 30-46l-150-556q-4-16-18-23t-30-3l-406 110q-16 4-24 18t-4 28l24 92-180-48q-40-10-50 26l-160 602q-10 36 28 48l454 122q16 4 30-3t18-23l66-244z m-888 190l144-542 392 106-144 540z m702-742l132 492-298 82 76-282q10-34-28-46l-196-52-26-102z" horiz-adv-x="1001" />
<glyph glyph-name="doc-landscape" unicode="&#xe84a;" d="m0 600q0 42 30 71t70 29l800 0q42 0 71-29t29-71l0-500q0-40-29-70t-71-30l-800 0q-40 0-70 30t-30 70l0 500z m900 0l-800 0 0-500 800 0 0 500z" horiz-adv-x="1000" />
<glyph glyph-name="doc-text" unicode="&#xe84b;" d="m212 308l0 90 280 0 0-90-280 0z m388 492q42 0 71-29t29-71l0-700q0-40-29-70t-71-30l-500 0q-40 0-70 30t-30 70l0 700q0 42 30 71t70 29l500 0z m0-800l0 700-500 0 0-700 500 0z m-110 592l0-88-280 0 0 88 280 0z m0-392l0-88-280 0 0 88 280 0z" horiz-adv-x="700" />
<glyph glyph-name="doc-text-inv" unicode="&#xe84c;" d="m600 800q42 0 71-29t29-71l0-700q0-40-29-70t-71-30l-500 0q-40 0-70 30t-30 70l0 700q0 42 30 71t70 29l500 0z m-460-208l0-88 420 0 0 88-420 0z m420-480l0 88-420 0 0-88 420 0z m0 196l0 90-418 0 0-90 418 0z" horiz-adv-x="700" />
<glyph glyph-name="newspaper" unicode="&#xe84d;" d="m700 800q42 0 71-29t29-71l0-700q0-40-29-70t-71-30l-600 0q-40 0-70 30t-30 70l0 700q0 42 30 71t70 29l600 0z m0-800l0 700-600 0 0-700 600 0z m-250 250l0-50-250 0 0 50 250 0z m150 200l0-50-200 0 0 50 200 0z m-200 50l0 100 200 0 0-100-200 0z m-50 100l0-200-150 0 0 200 150 0z m-50-250l0-50-100 0 0 50 100 0z m50-50l0 50 250 0 0-50-250 0z m250-150l0-50-400 0 0 50 400 0z m-100 50l0 50 100 0 0-50-100 0z" horiz-adv-x="800" />
<glyph glyph-name="book-open" unicode="&#xe84e;" d="m340 238l0-68-200 80 0 68z m0 208l0-68-200 80 0 68z m538 346q22-12 22-42l0-640q0-34-32-46l-398-160q-8-2-10-2t-5-1-5-1-5 1-5 1l-10 2-398 160q-32 12-32 46l0 640q0 30 22 42 22 16 46 6l382-154 382 154q24 10 46-6z m-478-788l0 560-320 128 0-560z m420 128l0 560-320-128 0-560z m-60 186l0-68-200-80 0 68z m0 208l0-68-200-80 0 68z" horiz-adv-x="900" />
<glyph glyph-name="book" unicode="&#xe84f;" d="m682 594q18-8 18-28l0-562q0-14-12-25t-28-11q-46 0-46 36l0 522q0 12-12 18l-404 216q-32 10-68-10-44-20-56-44l408-228q18-8 18-28l0-550q0-22-18-28-6-4-16-4-14 0-20 4-8 6-202 127t-212 131q-26 18-26 34l-6 524q0 28 14 52 28 46 102 77t116 9z" horiz-adv-x="700" />
<glyph glyph-name="folder" unicode="&#xe850;" d="m954 500q32 0 40-12t6-36l-42-452q-2-24-12-37t-42-13l-806 0q-52 0-56 50l-42 452q-2 24 6 36t40 12l908 0z m-34 110l10-40-846 0 14 132q4 20 20 34t36 14l164 0q52 0 86-34l30-30q32-36 86-36l340 0q20 0 38-12t22-28z" horiz-adv-x="1001" />
<glyph glyph-name="archive" unicode="&#xe851;" d="m840 600l0-50-696 0 0 50q0 22 13 35t25 15l608 0q6 0 14-1t22-14 14-35z m-148 150q6 0 14-1t22-14 14-35l-498 0q0 22 13 35t25 15l410 0z m248-200q34-32 38-46 6-18 0-54l-76-450q-4-22-20-35t-28-15l-710 0q-52 0-60 50-6 26-39 223t-39 227q-10 22-3 44t10 26 21 20l10 10 30 30 0-80 836 0 0 80z m-248-270l0 100-70 0 0-80-260 0 0 80-68 0 0-100q0-50 48-50l300 0q22 0 35 12t13 24z" horiz-adv-x="981" />
<glyph glyph-name="box" unicode="&#xe852;" d="m870 750q12 0 21-9t9-21l0-120-900 0 0 120q0 12 9 21t21 9l840 0z m-820-730l0 530 800 0 0-530q0-30-21-50t-49-20l-660 0q-28 0-49 20t-21 50z m250 430l0-100 300 0 0 100-300 0z" horiz-adv-x="900" />
<glyph glyph-name="rss" unicode="&#xe853;" d="m0 730q314 0 537-223t223-537l-118 0q0 266-188 453t-454 187l0 120z m0-238q218 0 371-153t153-369l-118 0q0 166-119 285t-287 119l0 118z m114-296q46 0 80-33t34-81q0-46-34-79t-80-33-80 33-34 79q0 48 34 81t80 33z" horiz-adv-x="760" />
<glyph glyph-name="phone" unicode="&#xe854;" d="m461 290q162 162 118 206l-8 8q-30 30-41 48t-4 54 49 88q20 24 37 39t35 16 30 1 29-13 24-18 26-25 21-22q48-48-6-194t-204-294q-150-150-295-205t-193-7q-2 2-23 22t-25 25-18 24-13 31 2 30 15 35 38 37q42 34 70 47t54 2 35-18 39-37q44-44 208 120z" horiz-adv-x="800" />
<glyph glyph-name="cog" unicode="&#xe855;" d="m760 350q0-72 80-122-12-40-34-82-70 18-136-44-54-58-34-136-40-20-84-36-46 82-132 82t-132-82q-44 16-84 36 20 80-34 136-54 54-136 34-14 26-34 82 82 52 82 132 0 72-82 124 20 56 34 82 74-18 136 44 54 56 34 136 42 22 84 34 46-80 132-80t132 80q42-12 84-34-20-78 34-136 66-62 136-44 22-42 34-82-80-50-80-124z m-340-182q76 0 129 53t53 129-53 130-129 54-129-54-53-130 53-129 129-53z" horiz-adv-x="840" />
<glyph glyph-name="tools" unicode="&#xe856;" d="m155 506q-8-8-11-22t-3-25-2-11q-2-2-17-15t-19-17q-16-14-28 4l-70 76q-11 12 2 24 2 2 18 14t20 16q6 6 27 6t37 14q14 14 18 38t10 30q2 0 9 7t26 22 41 31q134 90 186 96 122 0 148-2 12 0-8-8-120-52-152-76-80-56-36-114 34-46 38-48 8-8-2-14-2-2-38-35t-38-35q-14-8-18-4-42 48-71 60t-67-12z m286-26l410-476q18-22-2-38l-48-42q-22-14-38 4l-414 472q-8 8 0 20l72 62q12 8 20-2z m554 202q16-104-16-166-50-88-154-62-56 12-100-32l-82-78-68 78 68 70q24 24 31 53t6 65 5 58q12 56 140 112 12 6 18-3t2-15q-12-12-46-80-14-10-12-35t40-53q58-40 96 22 6 12 26 41t22 33q4 10 13 9t11-17z m-858-684l254 248 76-86-246-242q-20-20-38-4l-46 46q-22 18 0 38z" horiz-adv-x="1000" />
<glyph glyph-name="share" unicode="&#xe857;" d="m650 200q62 0 106-43t44-107q0-62-44-106t-106-44-106 44-44 106q0 6 1 14t1 12l-260 156q-42-32-92-32-62 0-106 44t-44 106 44 106 106 44q54 0 92-30l260 156q0 4-1 12t-1 12q0 62 44 106t106 44 106-43 44-107q0-62-44-106t-106-44q-52 0-90 32l-262-156q2-8 2-26 0-16-2-24l262-156q36 30 90 30z" horiz-adv-x="800" />
<glyph glyph-name="shareable" unicode="&#xe858;" d="m340 350q0 68 47 114t113 46 113-46 47-114q0-66-47-113t-113-47-113 47-47 113z m-114 60q-14-60-66-60l-160 0 0 120 118 0q40 124 145 202t237 78q164 0 284-116 16-18 16-43t-16-43q-18-16-43-16t-43 16q-78 82-198 82-100 0-176-62t-98-158z m614-60l160 0 0-120-118 0q-40-124-144-202t-238-78q-164 0-282 118-18 18-18 43t18 41q16 18 41 18t43-18q82-82 198-82 100 0 176 63t98 157q12 60 66 60z" horiz-adv-x="1000" />
<glyph glyph-name="basket" unicode="&#xe859;" d="m150 0q0 40 30 70t70 30q42 0 71-30t29-70q0-42-29-71t-71-29q-40 0-70 29t-30 71z m500 0q0 40 30 70t70 30q42 0 71-30t29-70q0-42-29-71t-71-29q-40 0-70 29t-30 71z m-322 236q-36-10-34-23t44-13l562 0 0-76q0-20-20-20l-654 0q-20 0-20 20l0 76-10 46-98 454-98 0 0 80q0 20 20 20l156 0q20 0 20-20l0-86 704 0 0-274q0-22-18-26z" horiz-adv-x="900" />
<glyph glyph-name="bag" unicode="&#xe85a;" d="m835 668q28-26 24-60l-98-648q-8-30-38-30l-586 0q-28 0-40 30-94 620-96 648-5 34 22 60 6 6 54 43t56 43q18 16 56 16l480 0q38 0 56-16 78-58 110-86z m-406-436q56 0 98 34t63 89 30 89 13 66l-92 0q-38-188-112-188t-112 188l-92 0q46-278 204-278z m-352 368l704 0-110 116-484 0z" horiz-adv-x="859" />
<glyph glyph-name="calendar" unicode="&#xe85b;" d="m800 700q42 0 71-29t29-71l0-600q0-40-29-70t-71-30l-700 0q-40 0-70 30t-30 70l0 600q0 42 30 71t70 29l46 0 0-100 160 0 0 100 290 0 0-100 160 0 0 100 44 0z m0-700l0 400-700 0 0-400 700 0z m-540 800l0-170-70 0 0 170 70 0z m450 0l0-170-70 0 0 170 70 0z" horiz-adv-x="900" />
<glyph glyph-name="login" unicode="&#xe85c;" d="m800 800q42 0 71-29t29-71l0-700q0-40-29-70t-71-30l-450 0q-40 0-69 30t-29 70l0 100 98 0 0-100 450 0 0 700-450 0 0-150-98 0 0 150q0 42 29 71t69 29l450 0z m-350-670l0 120-450 0 0 150 450 0 0 120 200-194z" horiz-adv-x="900" />
<glyph glyph-name="logout" unicode="&#xe85d;" d="m502 0l0 100 98 0 0-100q0-40-29-70t-71-30l-400 0q-40 0-70 30t-30 70l0 700q0 42 30 71t70 29l400 0q42 0 71-29t29-71l0-150-98 0 0 150-402 0 0-700 402 0z m398 326l-198-196 0 120-450 0 0 150 450 0 0 120z" horiz-adv-x="900" />
<glyph glyph-name="mic" unicode="&#xe85e;" d="m620 488q20 0 20-20l0-138q0-92-69-164t-201-84l0-132 130 0q20 0 20-20l0-60q0-20-20-20l-360 0q-20 0-20 20l0 60q0 20 20 20l130 0 0 132q-132 12-201 84t-69 164l0 138q0 20 20 20l30 0q20 0 20-20l0-138q0-66 59-123t191-57 191 57 59 123l0 138q0 20 20 20l30 0z m-300-238q-80 0-115 25t-35 55l0 158 300 0 0-158q0-30-35-55t-115-25z m150 520l0-212-300 0 0 212q0 30 35 55t115 25 115-25 35-55z" horiz-adv-x="640" />
<glyph glyph-name="mute" unicode="&#xe85f;" d="m868 778q16-16 16-36t-16-36l-782-782q-18-14-34-14-18 0-36 14-16 14-16 36t16 36l782 782q34 32 70 0z m-216-386l50 50q74-92 101-172t-7-116q-24-24-75-57t-131-71-161-45-165 23l278 276q44-32 88-54t67-25 33 1q6 10 2 34t-26 68-54 88z m-276 62l-270-270q-40 132 28 283t132 215q34 32 105 11t159-85l-52-50q-58 38-105 53t-57 5q-4-8-2-28t19-58 43-76z" horiz-adv-x="884" />
<glyph glyph-name="sound" unicode="&#xe860;" d="m176 588q42 42 149-5t217-157 157-217 5-149q-28-28-92-67t-156-78-194-29-176 84-84 176 29 194 78 156 67 92z m464-480q8 10-3 49t-49 101-96 118q-56 58-118 96t-101 49-49 3q-8-10 3-49t49-101 94-120q58-56 120-94t101-49 49-3z m6 394q-18 0-34 16-16 14-16 35t16 35l94 96q36 32 72 0 32-36 0-72l-96-94q-16-16-36-16z m-180 124q-18 10-23 30t5 38l54 96q26 44 68 20 18-10 23-30t-5-38l-54-96q-14-26-42-26-14 0-26 6z m438-150q10-18 4-38t-24-30l-96-54q-16-8-24-8-28 0-44 26-10 18-4 38t24 30l96 54q18 10 38 5t30-23z" horiz-adv-x="910" />
<glyph glyph-name="volume" unicode="&#xe861;" d="m896 180q0-34-24-57t-56-23l-780 0q-22 0-31 5t-3 15 24 20l802 452q28 18 48 7t20-45l0-374z" horiz-adv-x="896" />
<glyph glyph-name="clock" unicode="&#xe862;" d="m460 810q190 0 325-135t135-325-135-325-325-135-325 135-135 325 135 325 325 135z m0-820q150 0 255 106t105 254q0 150-105 255t-255 105q-148 0-254-105t-106-255q0-148 106-254t254-106z m36 620l0-244 150-150-50-50-170 170 0 274 70 0z" horiz-adv-x="920" />
<glyph glyph-name="hourglass" unicode="&#xe863;" d="m560 622q0-44-48-96t-97-99-49-77 49-76 97-97 48-97l0-118q0-34-86-73t-194-39-194 39-86 73l0 118q0 46 48 97t97 97 49 76-49 77-97 99-48 96l0 118q0 32 87 71t193 39 193-39 87-71l0-118z m-482 112l-18-14q-4-8 4-14 92-52 216-52 132 0 220 50 14 10-16 30-96 54-202 54-120 0-204-54z m228-384q0 18 4 33t18 33 20 25 31 31 29 28q92 92 92 122l2 50q-100-54-222-54t-222 54l4-50q0-32 90-122 6-6 22-21t23-22l19-19t17-21 11-20 9-23 3-24q0-10-1-19t-6-18-8-16-11-17l-12-15t-15-16-16-15-18-16-17-16q-90-90-90-122l0-66q8 4 66 23t92 43 34 58q0 30 26 30t26-30q0-34 33-58t94-43 67-23l0 66q0 30-92 122-4 4-21 20t-22 21-18 19-18 22-12 20-9 23-2 23z" horiz-adv-x="560" />
<glyph glyph-name="lamp" unicode="&#xe864;" d="m209-110l0 104 282 0 0-104q-70-42-142-40-70-2-140 40z m276 164l-270 0q0 72-36 140t-78 113-74 112-26 139q8 120 94 206t254 86q170 0 255-86t95-206q4-60-16-113t-52-96-65-85-57-96-24-114z m-378 496q-4-4 0-20t2-20 5-19 6-18 8-18 11-19 13-19 14-19 15-21 16-23q88-122 112-212l82 0q24 94 112 212 4 6 25 35t25 36 17 29 16 33 6 28 1 35q-16 196-244 196-226 0-242-196z" horiz-adv-x="700" />
<glyph glyph-name="light-down" unicode="&#xe865;" d="m350 510q68 0 114-47t46-113q0-68-46-114t-114-46q-66 0-113 46t-47 114q0 66 47 113t113 47z m0-264q44 0 73 30t29 74q0 42-29 72t-73 30q-42 0-72-30t-30-72q0-44 30-74t72-30z m-300 144q20 0 35-12t15-28q0-40-50-40t-50 40q0 16 15 28t35 12z m546 204q28-28-8-64-14-14-33-16t-29 10q-12 12-10 31t16 33q36 34 64 6z m54-204q20 0 35-12t15-28q0-40-50-40-48 0-48 40 0 16 14 28t34 12z m-300-290q16 0 28-15t12-35-12-35-28-15-28 15-12 35 12 35 28 15z m-238 62q36 36 64 8t-8-64q-14-14-33-16t-29 8q-30 28 6 64z m-10 430q28 28 64-8 14-14 16-33t-8-29q-30-28-64 6-36 36-8 64z m432-484q-34 36-6 64t64-8q14-14 16-33t-10-29q-30-28-64 6z m-184 492q-16 0-28 15t-12 35 12 35 28 15 28-15 12-35-12-35-28-15z" horiz-adv-x="700" />
<glyph glyph-name="light-up" unicode="&#xe866;" d="m950 390q20 0 35-12t15-28q0-40-50-40l-48 0q-50 0-50 40 0 16 15 28t35 12l48 0z m-450 234q114 0 195-80t81-194q0-116-81-196t-195-80-194 80-80 196q0 114 80 194t194 80z m0-474q82 0 141 58t59 142q0 82-59 141t-141 59-141-59-59-141q0-84 59-142t141-58z m-350 200q0-40-50-40l-50 0q-50 0-50 40 0 16 15 28t35 12l50 0q20 0 35-12t15-28z m350 350q-16 0-28 15t-12 35l0 50q0 20 12 35t28 15 28-15 12-35l0-50q0-20-12-35t-28-15z m0-700q16 0 28-15t12-35l0-50q0-20-12-35t-28-15-28 15-12 35l0 50q0 20 12 35t28 15z m368 660l-34-34q-34-34-64-8-28 28 8 64 4 6 34 36 36 34 64 6t-8-64z m-700-588q14 16 33 18t29-10q12-12 10-31t-16-33l-36-36q-14-14-33-16t-29 10q-30 28 6 64 6 4 36 34z m20 646l36-36q36-36 6-64-10-10-29-8t-33 16q-30 30-36 34-14 14-16 33t10 31q10 12 29 10t33-16z m590-702q-36 36-8 64t64-8l34-34q36-36 8-64t-64 6q-30 30-34 36z" horiz-adv-x="1000" />
<glyph glyph-name="adjust" unicode="&#xe867;" d="m950 390q20 0 35-12t15-28q0-40-50-40l-48 0q-50 0-50 40 0 16 15 28t35 12l48 0z m-450 234q114 0 195-80t81-194q0-116-81-196t-195-80-194 80-80 196q0 114 80 194t194 80z m6-474l0 400q-86 0-146-59t-60-141q0-84 60-142t146-58z m-356 200q0-40-50-40l-50 0q-50 0-50 40 0 16 15 28t35 12l50 0q20 0 35-12t15-28z m350 350q-16 0-28 15t-12 35l0 50q0 20 12 35t28 15 28-15 12-35l0-50q0-20-12-35t-28-15z m0-700q16 0 28-15t12-35l0-50q0-20-12-35t-28-15-28 15-12 35l0 50q0 20 12 35t28 15z m368 660l-34-34q-34-34-64-8-28 28 8 64 4 6 34 36 36 34 64 6t-8-64z m-700-588q14 16 33 18t29-10q12-12 10-31t-16-33l-36-36q-14-14-33-16t-29 10q-30 28 6 64 6 4 36 34z m20 646l36-36q36-36 6-64-10-10-29-8t-33 16q-30 30-36 34-14 14-16 33t10 31q10 12 29 10t33-16z m590-702q-36 36-8 64t64-8l34-34q36-36 8-64t-64 6q-30 30-34 36z" horiz-adv-x="1000" />
<glyph glyph-name="block" unicode="&#xe868;" d="m480 830q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m258-220z m-622-260q0-132 82-230l514 514q-100 82-232 82-152 0-258-107t-106-259z m106-258z m258-106q152 0 259 107t107 257q0 130-82 232l-514-514q98-82 230-82z" horiz-adv-x="960" />
<glyph glyph-name="resize-full" unicode="&#xe869;" d="m476 746l316 0 0-316-100 124-146-152-100 100 152 146z m-230-444l100-100-152-146 122-100-316 0 0 316 100-122z" horiz-adv-x="792" />
<glyph glyph-name="resize-small" unicode="&#xe86a;" d="m156 146l-106 100 296 0 0-296-100 106-146-156-100 100z m744 554l-154-144 104-100-294 0 0 294 100-104 144 154z" horiz-adv-x="900" />
<glyph glyph-name="popup" unicode="&#xe86b;" d="m700 750q42 0 71-29t29-71l0-400q0-40-29-70t-71-30l-400 0q-40 0-70 30t-30 70l0 402q0 40 29 69t71 29l400 0z m0-500l0 400-400 0 0-400 400 0z m-600 100l0-300 300 0 0-100-300 0q-40 0-70 30t-30 70l0 300 100 0z" horiz-adv-x="800" />
<glyph glyph-name="publish" unicode="&#xe86c;" d="m900 800q42 0 71-30t29-70l0-600q0-42-29-71t-71-29l-198 0 0 98 200 0 0 462-802 0 0-462 200 0 0-98-200 0q-40 0-70 29t-30 71l0 600q0 40 30 70t70 30l800 0z m-770-168q38 0 38 38 0 16-11 26t-27 10-27-11-11-25q0-16 11-27t27-11z m100 0q38 0 38 38 0 16-11 26t-27 10-27-11-11-25q0-16 11-27t27-11z m672 6l0 62-602 0 0-62 602 0z m-404-198l242-240-150 0 0-300-184 0 0 300-150 0z" horiz-adv-x="1000" />
<glyph glyph-name="window" unicode="&#xe86d;" d="m900 750q42 0 71-30t29-70l0-600q0-42-29-71t-71-29l-800 0q-40 0-70 29t-30 71l0 600q0 40 30 70t70 30l800 0z m-670-94q-16 0-27-11t-11-25q0-16 11-27t27-11q38 0 38 38 0 16-11 26t-27 10z m-138-36q0-16 11-27t27-11q38 0 38 38 0 16-11 26t-27 10-27-11-11-25z m810-570l0 460-802 0 0-460 802 0z m0 540l0 60-602 0 0-60 602 0z" horiz-adv-x="1000" />
<glyph glyph-name="arrow-combo" unicode="&#xe86e;" d="m230 850l230-364-460 0z m0-1000l-230 366 460 0z" horiz-adv-x="460" />
<glyph glyph-name="down-circled" unicode="&#xe86f;" d="m460 810q190 0 325-135t135-325-135-325-325-135-325 135-135 325 135 325 325 135z m0-820q148 0 254 106t106 254q0 150-106 255t-254 105-254-105-106-255q0-148 106-254t254-106z m90 554l0-206 112 0-202-190-202 190 112 0 0 206 180 0z" horiz-adv-x="920" />
<glyph glyph-name="left-circled" unicode="&#xe870;" d="m920 350q0-190-135-325t-325-135-325 135-135 325q0 192 135 326t325 134 325-134 135-326z m-820 0q0-148 106-254t254-106 254 106 106 254q0 150-106 255t-254 105-254-105-106-255z m552-90l-204 0 0-112-190 202 190 204 0-114 204 0 0-180z" horiz-adv-x="920" />
<glyph glyph-name="right-circled" unicode="&#xe871;" d="m0 350q0 190 135 325t325 135 325-135 135-325-135-325-325-135-325 135-135 325z m820 0q0 150-105 255t-255 105q-148 0-254-105t-106-255q0-148 106-254t254-106q150 0 255 106t105 254z m-552 90l204 0 0 114 190-204-190-202 0 112-204 0 0 180z" horiz-adv-x="920" />
<glyph glyph-name="up-circled" unicode="&#xe872;" d="m460-110q-190 0-325 135t-135 325q0 192 135 326t325 134 325-134 135-326q0-190-135-325t-325-135z m0 820q-148 0-254-105t-106-255q0-148 106-254t254-106q150 0 255 106t105 254q0 150-105 255t-255 105z m-90-552l0 204-112 0 202 192 202-192-112 0 0-204-180 0z" horiz-adv-x="920" />
<glyph glyph-name="down-open" unicode="&#xe873;" d="m564 422l-234-224q-18-18-40-18t-40 18l-234 224q-16 16-16 41t16 41q38 38 78 0l196-188 196 188q40 38 78 0 16-16 16-41t-16-41z" horiz-adv-x="580" />
<glyph glyph-name="left-open" unicode="&#xe874;" d="m242 626q14 16 39 16t41-16q38-36 0-80l-186-196 186-194q38-44 0-80-16-16-40-16t-40 16l-226 236q-16 16-16 38 0 24 16 40 206 214 226 236z" horiz-adv-x="341" />
<glyph glyph-name="right-open" unicode="&#xe875;" d="m98 626l226-236q16-16 16-40 0-22-16-38l-226-236q-16-16-40-16t-40 16q-36 36 0 80l186 194-186 196q-36 44 0 80 16 16 41 16t39-16z" horiz-adv-x="340" />
<glyph glyph-name="up-open" unicode="&#xe876;" d="m564 280q16-16 16-41t-16-41q-38-38-78 0l-196 188-196-188q-40-38-78 0-16 16-16 41t16 41l234 224q16 16 40 16t40-16z" horiz-adv-x="580" />
<glyph glyph-name="down-open-mini" unicode="&#xe877;" d="m405 470q22 26 48 0 26-22 0-48l-196-192q-22-22-48 0l-196 192q-26 26 0 48 24 24 50 0l170-156z" horiz-adv-x="466" />
<glyph glyph-name="left-open-mini" unicode="&#xe878;" d="m252 180q26-26 0-48-26-26-48 0l-192 194q-24 24 0 50l192 194q22 26 48 0 26-22 0-48l-156-172z" horiz-adv-x="265" />
<glyph glyph-name="right-open-mini" unicode="&#xe879;" d="m13 180l158 170-158 172q-26 26 0 48 26 26 48 0l192-194q24-26 0-50l-192-194q-22-26-48 0-26 22 0 48z" horiz-adv-x="265" />
<glyph glyph-name="up-open-mini" unicode="&#xe87a;" d="m62 230q-26-22-50 0-24 24 0 50l196 190q26 26 48 0l196-190q24-26 0-50-24-22-50 0l-170 158z" horiz-adv-x="464" />
<glyph glyph-name="down-open-big" unicode="&#xe87b;" d="m63 570l370-356 372 356q22 26 48 0 26-22 0-48l-396-392q-22-22-48 0l-396 392q-26 26 0 48 24 24 50 0z" horiz-adv-x="866" />
<glyph glyph-name="left-open-big" unicode="&#xe87c;" d="m452-20q26-26 0-48-26-26-48 0l-392 394q-24 24 0 50l392 394q22 26 48 0 26-22 0-48l-358-372z" horiz-adv-x="465" />
<glyph glyph-name="right-open-big" unicode="&#xe87d;" d="m13-20l358 370-358 372q-26 26 0 48 26 26 48 0l392-394q24-26 0-50l-392-394q-22-26-48 0-26 22 0 48z" horiz-adv-x="465" />
<glyph glyph-name="up-open-big" unicode="&#xe87e;" d="m804 130l-372 358-370-358q-26-22-50 0-24 24 0 50l396 390q26 26 48 0l396-390q24-26 0-50-26-22-48 0z" horiz-adv-x="864" />
<glyph glyph-name="down" unicode="&#xe87f;" d="m660 366l-330-380-330 380 192 0 0 350 276 0 0-350 192 0z" horiz-adv-x="660" />
<glyph glyph-name="left" unicode="&#xe880;" d="m378 20l-378 330 378 330 0-190 352 0 0-278-352 0 0-192z" horiz-adv-x="730" />
<glyph glyph-name="right" unicode="&#xe881;" d="m350 680l380-330-380-330 0 192-350 0 0 278 350 0 0 190z" horiz-adv-x="730" />
<glyph glyph-name="up" unicode="&#xe882;" d="m660 336l-192 0 0-350-276 0 0 350-192 0 330 380z" horiz-adv-x="660" />
<glyph glyph-name="down-dir" unicode="&#xe883;" d="m460 550l-230-400-230 400 460 0z" horiz-adv-x="460" />
<glyph glyph-name="left-dir" unicode="&#xe884;" d="m400 580l0-460-400 230z" horiz-adv-x="400" />
<glyph glyph-name="right-dir" unicode="&#xe885;" d="m0 580l400-230-400-230 0 460z" horiz-adv-x="400" />
<glyph glyph-name="up-dir" unicode="&#xe886;" d="m0 150l230 400 230-400-460 0z" horiz-adv-x="460" />
<glyph glyph-name="down-bold" unicode="&#xe887;" d="m760 366l-380-380-380 380 192 0 0 350 376 0 0-350 192 0z" horiz-adv-x="760" />
<glyph glyph-name="left-bold" unicode="&#xe888;" d="m378 730l0-190 352 0 0-378-352 0 0-192-378 380z" horiz-adv-x="730" />
<glyph glyph-name="right-bold" unicode="&#xe889;" d="m350 730l380-380-380-380 0 192-350 0 0 378 350 0 0 190z" horiz-adv-x="730" />
<glyph glyph-name="up-bold" unicode="&#xe88a;" d="m760 336l-192 0 0-350-376 0 0 350-192 0 380 380z" horiz-adv-x="760" />
<glyph glyph-name="down-thin" unicode="&#xe88b;" d="m500 100l-250-240-250 240 162 0 0 740 176 0 0-740 162 0z" horiz-adv-x="500" />
<glyph glyph-name="left-thin" unicode="&#xe88c;" d="m240 100l-240 250 240 250 0-160 740 0 0-178-740 0 0-162z" horiz-adv-x="980" />
<glyph glyph-name="right-thin" unicode="&#xe88d;" d="m742 100l0 162-742 0 0 178 742 0 0 160 238-250z" horiz-adv-x="980" />
<glyph glyph-name="up-thin" unicode="&#xe88e;" d="m500 602l-162 0 0-742-176 0 0 742-162 0 250 238z" horiz-adv-x="500" />
<glyph glyph-name="ccw" unicode="&#xe88f;" d="m532 736q170 0 289-120t119-290-119-290-289-120q-142 0-252 88l70 74q84-60 182-60 126 0 216 90t90 218-90 218-216 90q-124 0-214-87t-92-211l142 0-184-204-184 204 124 0q2 166 122 283t286 117z" horiz-adv-x="940" />
<glyph glyph-name="cw" unicode="&#xe890;" d="m408 760q168 0 287-116t123-282l122 0-184-206-184 206 144 0q-4 124-94 210t-214 86q-126 0-216-90t-90-218q0-126 90-216t216-90q104 0 182 60l70-76q-110-88-252-88-168 0-288 120t-120 290 120 290 288 120z" horiz-adv-x="940" />
<glyph glyph-name="arrows-ccw" unicode="&#xe891;" d="m186 140l116 116 0-292-276 16 88 86q-116 122-114 290t120 288q100 100 240 116l4-102q-100-16-172-88-88-88-90-213t84-217z m332 598l276-16-88-86q116-122 114-290t-120-288q-96-98-240-118l-2 104q98 16 170 88 88 88 90 213t-84 217l-114-116z" horiz-adv-x="820" />
<glyph glyph-name="level-down" unicode="&#xe892;" d="m100 200q-42 0-71 30t-29 70l0 350 140 0 0-310 364 0 0 150 240-220-240-220 0 150-404 0z" horiz-adv-x="744" />
<glyph glyph-name="level-up" unicode="&#xe893;" d="m200 350l0-90-200 160 200 170 0-100 550 0q40 0 70-29t30-71l0-280-140 0 0 240-510 0z" horiz-adv-x="850" />
<glyph glyph-name="shuffle" unicode="&#xe894;" d="m754 516q-54 0-105-32t-80-66-83-104q-48-62-75-94t-78-77-107-66-122-21l-104 0 0 140 104 0q54 0 106 32t81 66 83 104q62 82 101 126t116 88 163 44l36 0 0 120 210-180-210-180 0 100-36 0z m-484-88q-74 78-166 78l-104 0 0 140 104 0q140 0 254-108-14-16-37-45t-27-33q-8-12-24-32z m520-242l0 100 210-180-210-180 0 120-36 0q-140 0-260 116 46 58 72 92 0 2 6 9t8 11q84-88 174-88l36 0z" horiz-adv-x="1000" />
<glyph glyph-name="loop" unicode="&#xe895;" d="m800 540q42 0 71-29t29-71l0-290q0-40-29-70t-71-30l-700 0q-40 0-70 30t-30 70l0 290q0 42 30 71t70 29l250 0 0 110 200-180-200-180 0 110-210 0 0-210 620 0 0 210-150 0 0 140 190 0z" horiz-adv-x="900" />
<glyph glyph-name="switch" unicode="&#xe896;" d="m700 592l0-140-500 0 0-90-200 160 200 170 0-100 500 0z m300-420l-200-160 0 90-500 0 0 140 500 0 0 100z" horiz-adv-x="1000" />
<glyph glyph-name="play" unicode="&#xe897;" d="m486 376q14-10 14-26 0-14-14-24l-428-266q-24-16-41-6t-17 40l0 514q0 30 17 40t41-6z" horiz-adv-x="500" />
<glyph glyph-name="stop" unicode="&#xe898;" d="m526 650q74 0 74-64l0-470q0-66-74-66l-450 0q-76 0-76 66l0 470q0 36 18 50t58 14l450 0z" horiz-adv-x="600" />
<glyph glyph-name="pause" unicode="&#xe899;" d="m440 700q90 0 90-64l0-570q0-66-90-66t-90 66l0 570q0 64 90 64z m-350 0q90 0 90-64l0-570q0-66-90-66t-90 66l0 570q0 64 90 64z" horiz-adv-x="530" />
<glyph glyph-name="record" unicode="&#xe89a;" d="m350 700q146 0 248-102t102-248q0-144-102-247t-248-103-248 103-102 247q0 146 102 248t248 102z" horiz-adv-x="700" />
<glyph glyph-name="to-end" unicode="&#xe89b;" d="m412 374q14-10 14-24 0-12-14-22l-362-228q-22-14-36-5t-14 35l0 442q0 26 14 35t36-5z m114 268q74 0 74-58l0-466q0-58-74-58-76 0-76 58l0 466q0 58 76 58z" horiz-adv-x="600" />
<glyph glyph-name="to-start" unicode="&#xe89c;" d="m174 350q0 14 14 24l364 228q20 14 34 5t14-35l0-442q0-26-14-35t-34 5l-364 228q-14 10-14 22z m-174 234q0 58 76 58 74 0 74-58l0-466q0-58-74-58-76 0-76 58l0 466z" horiz-adv-x="600" />
<glyph glyph-name="fast-forward" unicode="&#xe89d;" d="m866 374q14-10 14-24t-14-22l-372-248q-22-14-37-6t-15 36l0 482q0 28 15 36t37-6z m-454 0q14-10 14-24t-14-22l-360-248q-20-14-36-6t-16 36l0 482q0 28 16 36t36-6z" horiz-adv-x="880" />
<glyph glyph-name="fast-backward" unicode="&#xe89e;" d="m0 350q0 14 14 24l374 248q20 14 36 6t16-36l0-482q0-28-16-36t-36 6l-374 248q-14 8-14 22z m454 0q0 14 14 24l360 248q20 14 36 6t16-36l0-482q0-28-16-36t-36 6l-360 248q-14 8-14 22z" horiz-adv-x="880" />
<glyph glyph-name="progress-0" unicode="&#xe89f;" d="m1000 450l0-250q0-42-29-71t-71-29l-800 0q-40 0-70 29t-30 71l0 300q0 40 30 70t70 30l800 0q42 0 71-30t29-70l0-50z m-100-250l0 300-800 0 0-300 800 0z" horiz-adv-x="1000" />
<glyph glyph-name="progress-1" unicode="&#xe8a0;" d="m1000 450l0-250q0-42-29-71t-71-29l-800 0q-40 0-70 29t-30 71l0 300q0 40 30 70t70 30l800 0q42 0 71-30t29-70l0-50z m-100-250l0 300-800 0 0-300 800 0z m-750 50l0 198 200 0 0-198-200 0z" horiz-adv-x="1000" />
<glyph glyph-name="progress-2" unicode="&#xe8a1;" d="m1000 450l0-250q0-42-29-71t-71-29l-800 0q-40 0-70 29t-30 71l0 300q0 40 30 70t70 30l800 0q42 0 71-30t29-70l0-50z m-100-250l0 300-800 0 0-300 800 0z m-750 50l0 198 200 0 0-198-200 0z m250 0l0 198 200 0 0-198-200 0z" horiz-adv-x="1000" />
<glyph glyph-name="progress-3" unicode="&#xe8a2;" d="m1000 450l0-250q0-42-29-71t-71-29l-800 0q-40 0-70 29t-30 71l0 300q0 40 30 70t70 30l800 0q42 0 71-30t29-70l0-50z m-100-250l0 300-800 0 0-300 800 0z m-750 50l0 198 200 0 0-198-200 0z m250 0l0 198 200 0 0-198-200 0z m250 198l200 0 0-198-200 0 0 198z" horiz-adv-x="1000" />
<glyph glyph-name="target" unicode="&#xe8a3;" d="m430 780q178 0 304-126t126-304-126-304-304-126-304 126-126 304 126 304 304 126z m36-778q124 14 212 102t100 212l-192 0 0 70 192 0q-12 124-100 212t-212 102l0-194-70 0 0 194q-124-14-213-102t-101-212l194 0 0-70-194 0q12-124 101-212t213-102l0 194 70 0 0-194z" horiz-adv-x="860" />
<glyph glyph-name="palette" unicode="&#xe8a4;" d="m857 622q72-48 101-110t20-104-35-48q-16-4-54 10t-80 10-80-46q-30-46-21-75t34-65 23-50q-2-26-36-63t-126-74-216-37q-186 0-291 101t-95 245q8 118 104 235t216 151q290 84 536-80z m-318-466q30 0 52 22t22 54-22 53-52 21q-32 0-54-21t-22-53 22-54 54-22z" horiz-adv-x="980" />
<glyph glyph-name="list" unicode="&#xe8a5;" d="m100 200q20 0 35-15t15-35-15-35-35-15l-50 0q-20 0-35 15t-15 35 14 35 36 15l50 0z m0 200q20 0 35-15t15-35-15-35-35-15l-50 0q-20 0-35 15t-15 35 14 35 36 15l50 0z m0 200q20 0 35-15t15-35-15-35-35-15l-50 0q-20 0-35 15t-15 35 14 35 36 15l50 0z m200-100q-20 0-35 15t-15 35 15 35 35 15l350 0q22 0 36-15t14-35-15-35-35-15l-350 0z m350-100q22 0 36-15t14-35-15-35-35-15l-350 0q-20 0-35 15t-15 35 15 35 35 15l350 0z m0-200q22 0 36-15t14-35-15-35-35-15l-350 0q-20 0-35 15t-15 35 15 35 35 15l350 0z" horiz-adv-x="700" />
<glyph glyph-name="list-add" unicode="&#xe8a6;" d="m350 400q22 0 36-15t14-35-15-35-35-15l-300 0q-20 0-35 15t-15 35 14 35 36 15l300 0z m0-200q22 0 36-15t14-35-15-35-35-15l-300 0q-20 0-35 15t-15 35 14 35 36 15l300 0z m620 200q30 0 30-50t-30-50l-170 0 0-170q0-30-50-30t-50 30l0 170-164 0q-30 0-30 50t30 50l164 0 0 170q0 30 50 30t50-30l0-170 170 0z m-620 200q22 0 36-15t14-35-15-35-35-15l-300 0q-20 0-35 15t-15 35 14 35 36 15l300 0z" horiz-adv-x="1000" />
<glyph glyph-name="signal" unicode="&#xe8a7;" d="m490 150q42 0 71-30t29-70q0-42-29-71t-71-29q-40 0-69 29t-29 71q0 40 29 70t69 30z m-210 112q88 88 210 88t210-88l-70-72q-58 58-140 58t-140-58z m-140 140q146 148 351 148t349-148l-70-70q-116 118-279 118t-281-118z m-140 142q204 206 491 206t489-206l-70-70q-174 176-420 176t-420-176z" horiz-adv-x="980" />
<glyph glyph-name="trophy" unicode="&#xe8a8;" d="m510 134l0-66q70-8 116-32t46-56q0-36-65-63t-157-27q-90 0-156 27t-66 63q0 32 46 56t118 32l0 66q0 50-33 84t-113 88q-56 36-87 61t-75 72-64 108-20 137q0 14 11 24t25 10l172 0q48 92 242 92 196 0 244-92l170 0q14 0 25-10t11-24q0-76-20-137t-64-108-75-72-87-61q-78-52-111-87t-33-85z m138 252q80 56 126 114t54 148l-126 0q-6-158-54-262z m-198 364q-62 0-108-15t-64-32-18-29q0-14 18-31t64-32 108-15 108 15 64 32 18 31q0 12-18 29t-64 32-108 15z m-378-102q8-90 54-148t126-114q-48 104-54 262l-126 0z" horiz-adv-x="900" />
<glyph glyph-name="battery" unicode="&#xe8a9;" d="m770 350q0-98 36-157t78-59l66 0q-30-46-64-65t-118-19l-500 0q-130 0-199 94t-69 206q0 110 69 205t199 95l500 0q84 0 118-19t64-65l-66 0q-42 0-78-60t-36-156z m-136-90q10 12-8 26-136 134-178 164-16 10-26 13t-18-5-10-12-8-18l-22-56-148 66q-26 12-34 0-8-14 8-28 136-132 180-162 34-16 42-11t18 31l24 58 146-68q26-12 34 2z m310 192q22 0 39-27t17-71-17-72-39-28l-38 0q-22 0-38 28t-16 72 16 71 38 27l38 0z" horiz-adv-x="1000" />
<glyph glyph-name="back-in-time" unicode="&#xe8aa;" d="m532 760q170 0 289-120t119-290-119-290-289-120q-138 0-252 88l70 76q82-60 182-60 126 0 216 90t90 216q0 128-90 218t-216 90q-124 0-213-86t-93-210l142 0-184-206-184 206 124 0q4 166 123 282t285 116z m-36-190l70 0 0-204 130-130-50-50-150 150 0 234z" horiz-adv-x="940" />
<glyph glyph-name="monitor" unicode="&#xe8ab;" d="m900 790q42 0 71-30t29-70l0-550q0-42-29-77t-69-43l-218-44 86-38q50-28-20-28l-500 0q-98 0 32 52l36 14-220 44q-40 8-69 43t-29 77l0 550q0 40 30 70t70 30l800 0z m0-646l0 556-800 0 0-556 800 0z" horiz-adv-x="1000" />
<glyph glyph-name="mobile" unicode="&#xe8ac;" d="m480 840q42 0 71-29t29-71l0-780q0-40-29-70t-71-30l-380 0q-40 0-70 30t-30 70l0 780q0 42 30 71t70 29l380 0z m-190-940q30 0 50 15t20 35q0 22-20 36t-50 14q-28 0-49-15t-21-35 21-35 49-15z m210 150l0 660-420 0 0-660 420 0z" horiz-adv-x="580" />
<glyph glyph-name="network" unicode="&#xe8ad;" d="m224 504q-22 0-42-10-48 52-92 128 54 74 128 118 92-38 152-82-6-16-6-32 0-6 4-22-62-48-116-104-16 4-28 4z m-98-98q0-34 20-60-60-114-80-232-66 106-66 236 0 110 50 206 38-62 84-112-8-24-8-38z m336 318q-28 0-50-14-58 42-114 70 84 30 162 30 120 0 230-62-76-14-162-50-26 26-66 26z m146-460q-160 24-290 112 4 20 4 30 0 24-14 52 38 44 98 90 26-20 56-20 14 0 38 8 94-108 134-240-16-14-26-32z m128-132q38 14 54 60 58 4 108 18-46-146-166-232 6 48 6 98 0 10-1 28t-1 28z m-150 66q-190-96-304-272-90 36-158 110 12 144 80 274 6-2 20-2 30 0 52 14 142-98 310-124z m184 492q150-136 150-340 0-22-4-66-64-18-130-24-24 56-88 60-48 146-148 264 10 20 10 42l0 10q100 42 210 54z m-136-544q14-10 32-18 2-18 2-52 0-80-14-144-86-42-194-42-58 0-112 12 110 160 286 244z" horiz-adv-x="920" />
<glyph glyph-name="cd" unicode="&#xe8ae;" d="m460 810q190 0 325-135t135-325-135-325-325-135-325 135-135 325 135 325 325 135z m0-610q62 0 106 44t44 106q0 64-43 107t-107 43q-62 0-106-44t-44-106 44-106 106-44z" horiz-adv-x="920" />
<glyph glyph-name="inbox" unicode="&#xe8af;" d="m967 398q40-42 30-72l-28-154q-4-20-22-33t-40-13l-816 0q-22 0-40 13t-22 33l-28 154q-8 32 32 72 8 10 36 38t68 67 52 51q22 22 52 22l516 0q30 0 52-22 16-16 53-52t67-65 38-39z m-266-32l178 0-102 114-556 0-102-114 178 0q8 0 12-8l40-100 300 0 40 100q4 8 12 8z" horiz-adv-x="999" />
<glyph glyph-name="install" unicode="&#xe8b0;" d="m884 306q24-52 14-96l-34-184q-2-20-19-35t-39-15l-712 0q-22 0-39 15t-19 35l-34 184q-8 50 14 96l158 374q22 46 72 46l104 0-20-204-134 0 254-210 256 210-136 0-18 204 102 0q50 0 74-46z m-68-132q2 22-10 38t-34 16l-644 0q-22 0-34-16t-10-38l14-74q2-22 19-37t37-15l592 0q22 0 39 15t19 37z" horiz-adv-x="901" />
<glyph glyph-name="globe" unicode="&#xe8b1;" d="m480 830q200 0 340-141t140-339q0-200-140-340t-340-140q-198 0-339 140t-141 340q0 198 141 339t339 141z m410-480q0 132-78 239t-202 149q-18-24-16-32 4-38 18-51t30-7l32 12t20 2q22-24 0-47t-45-56-1-77q34-64 96-64 28-2 43-36t17-66q10-80-14-140-22-44 14-76 86 112 86 250z m-466 404q-112-14-199-84t-127-174q6 0 22-2t28-3 26-4 24-8 12-13q4-12-14-45t-18-61q0-30 38-56t38-46q0-28 8-68t8-44q0-12 36-54t52-42q10 0 11 22t-2 54-3 40q0 32 14 74 12 42 59 70t55 46q16 34 9 61t-17 43-34 28-41 17-37 9-22 4q-16 6-42 7t-36-3-27 11-17 29q0 10 15 27t35 37 28 30q8 14 17 21t22 16 27 21q4 4 25 17t27 23z m-72-794q66-20 128-20 128 0 226 68-26 44-118 34-24-2-65-17t-47-17q-74-16-76-16-12-2-26-14t-22-18z" horiz-adv-x="960" />
<glyph glyph-name="cloud" unicode="&#xe8b2;" d="m760 494q100 0 170-68t70-166-70-166-170-68l-578 0q-74 0-128 52t-54 124q0 74 53 126t129 52q2 0 10-1t10-1q-2 12-2 38 0 108 78 184t188 76q90 0 160-52t94-134q28 4 40 4z" horiz-adv-x="1000" />
<glyph glyph-name="cloud-thunder" unicode="&#xe8b3;" d="m760 494q100 0 170-68t70-166-70-166-170-68l-578 0q-74 0-128 52t-54 124q0 74 53 126t129 52q2 0 10-1t10-1q-2 12-2 38 0 108 78 184t188 76q90 0 160-52t94-134q28 4 40 4z m-192-216q14 16 14 30 0 20-30 32l-4 0q-26 14-38 16l50 116q6 0 6 20 0 14-8 18-16 10-34-8-2-2-30-32t-61-66-45-52q-12-18-12-30 0-22 30-30l4-2q8-4 38-16l-52-114-2-8q-2-8-2-14 0-10 8-18 18-10 34 10 100 100 134 148z" horiz-adv-x="1000" />
<glyph glyph-name="flash" unicode="&#xe8b4;" d="m40-100q-4 4 35 94t79 182 38 98-94 45-98 55q-4 12 84 120t180 209 96 97q6-4-74-186t-78-186 95-43 97-57q4-20-174-227t-186-201z" horiz-adv-x="400" />
<glyph glyph-name="moon" unicode="&#xe8b5;" d="m524 238q106 106 125 252t-53 270q52-26 96-72 128-128 128-309t-128-309-310-128-310 128q-40 40-72 94 124-70 271-51t253 125z" horiz-adv-x="820" />
<glyph glyph-name="flight" unicode="&#xe8b6;" d="m268-120l124 400-180 0-112-100-100 0 80 170-80 170 100 0 112-100 180 0-124 400 100 0 224-400 274 0t36-4 46-11 36-21 16-34q0-32-38-49t-74-19l-38-2-258 0-224-400-100 0z" horiz-adv-x="1000" />
<glyph glyph-name="paper-plane" unicode="&#xe8b7;" d="m894 720q14 4 22-3t4-19q-2-6-72-310t-74-316q-2-14-14-19t-24 1l-248 134-30 16 22 26q388 420 394 426 4 4-1 9t-9 1l-550-402-112 44-190 76q-12 4-12 12t12 12q8 4 441 157t441 155z m-582-728l0 204 160-82q-130-116-142-128-18-14-18 6z" horiz-adv-x="921" />
<glyph glyph-name="leaf" unicode="&#xe8b8;" d="m236 646q182 106 506 66 168-22 196-50 4-6-2-10-76-40-130-109t-78-132-65-132-93-105q-138-96-382-4-66-76-114-176-12-24-47-7t-25 39q44 100 129 193t176 153 176 106 141 68l54 20q-14 0-41-1t-104-14-148-38-162-84-161-141q-22 242 174 358z" horiz-adv-x="940" />
<glyph glyph-name="lifebuoy" unicode="&#xe8b9;" d="m454 810q190 2 326-130t140-322q2-190-131-327t-323-141q-190-2-327 131t-139 323q-4 190 130 327t324 139z m0-60q-94 0-178-44l62-104q56 28 122 28t122-28l62 104q-88 46-190 44z m-246-522q-28 60-28 122 0 64 28 124l-102 62q-46-88-46-190 2-96 46-180z m258-278q98 4 178 46l-62 104q-60-30-122-30t-122 30l-62-104q86-46 190-46z m-6 180q92 0 156 65t64 155q0 92-64 156t-156 64-156-64-64-156q0-90 64-155t156-65z m252 98l104-62q46 96 44 190 0 96-44 180l-104-62q28-60 28-124 0-62-28-122z" horiz-adv-x="920" />
<glyph glyph-name="mouse" unicode="&#xe8ba;" d="m551 130q28-80-17-157t-139-111q-94-28-175 9t-103 117l-106 384q-20 68 6 134t84 106l-96 186q-14 34 14 48 30 18 48-14l98-192q80 22 154-16t102-116z m-324 274q28 10 40 36t4 54q-10 28-35 41t-53 5q-28-10-40-36t-4-54q10-28 35-41t53-5z" horiz-adv-x="561" />
<glyph glyph-name="briefcase" unicode="&#xe8bb;" d="m456 326l0-100-456 0q8 226 10 292 4 108 100 108l160 0q16 26 37 67t23 45q14 26 23 32t37 6l222 0q26 0 36-7t22-31q18-32 60-112l160 0q96 0 100-108l10-292-454 0 0 100-90 0z m-74 354l-28-54 292 0-28 54q-14 26-42 26l-152 0q-28 0-42-26z m164-604l0 100 430 0q-6-88-10-166-6-84-90-84l-750 0q-90 0-90 84l-10 166 430 0 0-100 90 0z" horiz-adv-x="1000" />
<glyph glyph-name="suitcase" unicode="&#xe8bc;" d="m900 650q42 0 71-30t29-70l0-550q0-42-29-71t-71-29l-50 0 0 750 50 0z m-900-100q0 40 30 70t70 30l50 0 0-750-50 0q-40 0-70 29t-30 71l0 550z m670 204l0-104 110 0 0-750-560 0 0 750 110 0 0 104q98 46 170 46t170-46z m-60-104l0 66q-52 24-110 24-54 0-110-24l0-66 220 0z" horiz-adv-x="1000" />
<glyph glyph-name="dot" unicode="&#xe8bd;" d="m110 460q46 0 78-32t32-78q0-44-32-77t-78-33-78 33-32 77q0 46 32 78t78 32z" horiz-adv-x="220" />
<glyph glyph-name="dot-2" unicode="&#xe8be;" d="m110 460q46 0 78-32t32-78q0-44-32-77t-78-33-78 32-32 78 32 78 78 32z m350 0q46 0 78-32t32-78q0-44-33-77t-77-33q-46 0-78 32t-32 78 32 78 78 32z" horiz-adv-x="570" />
<glyph glyph-name="dot-3" unicode="&#xe8bf;" d="m110 460q46 0 78-32t32-78q0-44-32-77t-78-33-78 33-32 77q0 46 32 78t78 32z m350 0q46 0 78-32t32-78q0-44-33-77t-77-33-77 33-33 77q0 46 32 78t78 32z m350 0q46 0 78-32t32-78q0-44-32-77t-78-33-78 33-32 77q0 46 32 78t78 32z" horiz-adv-x="920" />
<glyph glyph-name="brush" unicode="&#xe8c0;" d="m118 170q38 34 85 29t87-45q42-40 48-87t-30-83q-86-84-228-102-84-12-80 14 0 4 6 10 52 60 64 145t48 119z m840 646q26-26-148-248t-292-338q-38-38-124-104-8-6-16 8-18 34-48 64-32 32-66 48-16 6-8 16 64 84 104 122 118 116 344 287t254 145z" horiz-adv-x="962" />
<glyph glyph-name="magnet" unicode="&#xe8c1;" d="m518-44l16 164 260-20-16-166q-4-28-32-24l-200 16q-28 0-28 30z m-490 144l258 20 16-164q2-12-6-21t-22-9l-198-16q-12-2-22 6t-10 18z m-26 270q-2 12-2 34 0 160 120 273t290 113 290-113 120-273q0-22-2-34l-16-170-258 22 16 170 0 12q0 58-44 99t-106 41-106-41-44-99l0-12 16-170-258-22z" horiz-adv-x="820" />
<glyph glyph-name="infinity" unicode="&#xe8c2;" d="m796 570q84 0 144-53t60-167q0-112-60-166t-144-54q-78 0-157 40t-139 106q-58-66-137-106t-157-40q-86 0-146 54t-60 166q0 114 60 167t146 53q78 0 157-39t137-105q58 66 138 105t158 39z m-590-352q60 0 127 37t113 95q-46 58-112 95t-128 37q-114 0-114-132t114-132z m590 0q114 0 114 132t-114 132q-62 0-129-37t-111-95q44-58 111-95t129-37z" horiz-adv-x="1000" />
<glyph glyph-name="erase" unicode="&#xe8c3;" d="m902 700q42 0 71-29t29-71l0-500q0-40-29-70t-71-30l-478 0q-38 0-70 28l-340 296q-28 26 0 54l340 296q30 26 70 26l478 0z m-140-550l72 74-128 126 128 128-72 72-128-126-128 126-72-72 128-128-128-126 72-74 128 128z" horiz-adv-x="1002" />
<glyph glyph-name="chart-pie" unicode="&#xe8c4;" d="m368 770l0-368-368 0q18 146 121 249t247 119z m106 0q156-20 261-139t105-279q0-174-123-298t-299-124q-160 0-278 105t-140 263l424 0q20 0 35 14t15 36l0 422z" horiz-adv-x="840" />
<glyph glyph-name="chart-line" unicode="&#xe8c5;" d="m34 284q-42 10-32 56 10 42 54 32l98-24-52-80z m890-12q14 12 33 11t31-15q32-32-2-64l-252-226q-12-12-30-12-14 0-28 10l-286 220-54 14 50 80 36-8q12-4 16-8l264-204z m-490 220l-350-550q-12-22-38-22-12 0-24 8-16 10-20 29t6 33l374 588q8 16 28 20 18 6 36-6l246-156 226 326q10 16 28 19t34-9q38-24 12-62l-252-362q-24-36-62-12z" horiz-adv-x="1003" />
<glyph glyph-name="chart-bar" unicode="&#xe8c6;" d="m750 800q22 0 36-15t14-35l0-850-200 0 0 850q0 50 40 50l110 0z m-300-300q22 0 36-15t14-35l0-550-200 0 0 550q0 50 40 50l110 0z m-300-300q22 0 36-15t14-35l0-250-200 0 0 250q0 50 40 50l110 0z" horiz-adv-x="800" />
<glyph glyph-name="chart-area" unicode="&#xe8c7;" d="m964 732q16 22 16-4l0-768-964 0q-12 0-15 7t5 17l230 288q20 22 40 2l74-66q10-8 21-7t17 11l158 238q16 26 38 4l112-104q20-20 38 4z" horiz-adv-x="980" />
<glyph glyph-name="tape" unicode="&#xe8c8;" d="m770 580q96 0 163-67t67-163q0-94-67-162t-163-68l-540 0q-94 0-162 68t-68 162q0 96 68 163t162 67q96 0 163-67t67-163q0-72-40-130l160 0q-40 64-40 130 0 96 68 163t162 67z m-670-230q0-52 38-91t92-39 92 39 38 91q0 54-38 92t-92 38-92-38-38-92z m670-130q54 0 92 39t38 91q0 54-38 92t-92 38-92-38-38-92q0-52 38-91t92-39z" horiz-adv-x="1000" />
<glyph glyph-name="graduation-cap" unicode="&#xe8c9;" d="m166 238l334-168 276 136q-4-22-8-47t-6-35-11-23-24-23-45-22q-40-18-80-41t-63-34-39-11-40 13-64 37-80 40q-72 32-103 69t-47 109z m810 246q24-14 24-33t-24-33l-78-44-308 102q-22 36-90 36-40 0-67-16t-27-40 27-40 67-16q26 0 36 4l292-68-268-152q-60-32-120 0l-416 234q-24 14-24 33t24 33l416 234q60 32 120 0z m-128-442q18 116 13 182t-19 90l-14 22 70 38q6-8 12-28t17-101-7-197q-4-26-22-30t-35 5-15 19z" horiz-adv-x="1000" />
<glyph glyph-name="language" unicode="&#xe8ca;" d="m988 306q30-82-10-176t-134-160q-10 0-12 2t-16 19-16 19q-2 6 2 10 86 60 117 152t-11 148q-16-38-39-76t-59-80-86-65-106-15q-52 6-84 41t-32 93q0 84 60 148 50 50 114 66l-2 100q-140-24-146-24-6-2-10 4 0 2-5 29t-5 31q-2 2 1 4t7 2l156 28q0 110-2 114 0 8 8 8 46 0 52 2 10 0 10-8l0-104q158 22 164 22 8 4 10-6 0-2 4-23t4-25q4-10-4-12l-176-30 0-102 12 0q86 0 148-36t86-100z m-370-160q28-6 62 6l-4 214q-34-12-60-40-44-44-44-108 0-66 46-72z m122 28q28 24 58 68t45 79 7 41q-36 18-96 18-2 0-6-1t-6-1z m-448 382q10-28 53-165t83-261 40-126q0-4-4-4l-86 0q-6 0-6 4l-50 166-176 0q-48-164-50-166 0-4-6-4l-86 0q-4 0-4 4 10 18 176 552 2 8 10 8l96 0q10 0 10-8z m-130-316l144 0-72 264z" horiz-adv-x="1001" />
<glyph glyph-name="ticket" unicode="&#xe8cb;" d="m216 272l326 326 178-178-326-326z m710 244q14-14 14-36t-14-36l-550-550q-16-16-36-16t-36 16l-76 76q12 20 12 48 0 42-29 72t-71 30q-22 0-50-14l-74 76q-16 16-16 36t16 36l550 550q14 14 36 14t36-14l74-76q-12-22-12-48 0-42 30-71t72-29q26 0 48 12z m-532-502l406 406-258 258-408-406z" horiz-adv-x="940" />
<glyph glyph-name="water" unicode="&#xe8cc;" d="m168 844q10-86 50-155t73-123 33-112q0-66-48-113t-114-47-114 47-48 113q0 58 33 112t73 123 50 155q2 4 7 4t5-4z m616 0q10-86 50-155t73-123 33-112q0-66-48-113t-114-47-114 47-48 113q0 48 21 93t48 78 53 92 34 127q2 4 7 4t5-4z m-320-444q2 4 7 4t5-4q10-86 50-155t73-123 33-112q0-66-48-113t-114-47-114 47-48 113q0 58 33 112t73 123 50 155z" horiz-adv-x="940" />
<glyph glyph-name="droplet" unicode="&#xe8cd;" d="m290 822q14-118 60-219t92-159 82-136 36-160q0-114-83-196t-197-82-197 82-83 196q0 82 36 160t82 136 92 159 60 219q2 8 11 8t9-8z m-42-392q2 4-2 14-6 6-14 6t-12-6l-40-58q-32-46-48-70t-34-75-18-101q0-24 17-41t41-17q58 0 58 68 0 94 42 246 2 6 5 17t5 17z" horiz-adv-x="560" />
<glyph glyph-name="air" unicode="&#xe8ce;" d="m85 534q-16-14-36-12t-34 18q-14 14-12 36t18 36q48 40 79 60t89 40 129 4 159-66 155-53 100 16 89 67q38 30 70-6 32-40-6-72-122-110-234-110-100 0-222 70-68 38-119 52t-93 0-65-29-67-51z m736-110q38 32 70-6 32-40-6-72-40-34-65-53t-72-38-97-19q-96 0-222 70-68 38-119 52t-93 0-65-29-67-51q-14-14-35-12t-35 18q-32 40 6 72 38 34 60 50t69 38 88 23 105-15 134-56q68-38 119-52t93 0 65 29 67 51z m0-256q38 32 70-6 14-14 12-36t-18-36q-40-34-65-53t-72-38-97-19q-96 0-222 70-68 38-119 52t-93 1-66-29-66-52q-14-14-35-12t-35 18q-32 40 6 72 38 34 60 50t69 38 88 23 105-15 134-56q68-38 119-52t93 0 65 29 67 51z" horiz-adv-x="905" />
<glyph glyph-name="credit-card" unicode="&#xe8cf;" d="m900 700q42 0 71-30t29-70l0-500q0-42-29-71t-71-29l-800 0q-40 0-70 29t-30 71l0 500q0 40 30 70t70 30l800 0z m0-600l0 300-800 0 0-300 800 0z m0 450l0 50-800 0 0-50 800 0z m-700-256l30 0 0-30-30 0 0 30z m180-60l30 0 0 30 30 0 0 30 60 0 0-30-30 0 0-30-30 0 0-30-60 0 0 30z m120-30l-30 0 0 30 30 0 0-30z m-150 0l-60 0 0 30 60 0 0-30z m30 60l0-30-30 0 0 60 60 0 0-30-30 0z m-120-30l0-30-60 0 0 30 30 0 0 30 30 0 0 30 60 0 0-30-30 0 0-30-30 0z" horiz-adv-x="1000" />
<glyph glyph-name="floppy" unicode="&#xe8d0;" d="m658 750l142-156 0-544q0-40-29-70t-71-30l-600 0q-40 0-70 30t-30 70l0 600q0 42 30 71t70 29l558 0z m-58-300l0 250-400 0 0-250q0-20 15-35t35-15l300 0q20 0 35 15t15 35z m-50 200l0-200-100 0 0 200 100 0z" horiz-adv-x="800" />
<glyph glyph-name="clipboard" unicode="&#xe8d1;" d="m630 750q28 0 49-21t21-49l0-760q0-30-21-50t-49-20l-560 0q-28 0-49 20t-21 50l0 760q0 28 21 49t49 21l60-150 440 0z m-100-100l-360 0-44 100 108 0 36 100 160 0 36-100 110 0z" horiz-adv-x="700" />
<glyph glyph-name="megaphone" unicode="&#xe8d2;" d="m792 500q58-138 67-258t-39-140q-28-12-61 3t-65 40-99 41-149 8q-28-4-42-19t-6-37q22-56 46-108 4-10 24-22t24-20q14-34-22-46-50-22-102-40-30-10-54 42-32 76-58 132-6 12-34 17t-46 31q-30-10-38-14-34-12-74 12t-54 60q-17 32-5 79t43 61q126 52 213 108t124 103 59 92 25 78 15 59 36 36q48 20 130-70t142-228z m-28-300q8 4 10 38t-11 98-41 128q-28 66-67 123t-67 84-36 23-10-42 10-105 40-133 68-119 68-76 36-19z" horiz-adv-x="860" />
<glyph glyph-name="database" unicode="&#xe8d3;" d="m686 208q14 20 14-2l0-100q0-74-104-135t-246-61q-140 0-245 61t-105 135l0 100q0 8 4 10t10-8q32-52 125-86t211-34 211 34 125 86z m2 254q8 16 12 0l0-116q0-68-102-114t-248-46q-144 0-247 46t-103 114l0 116q0 20 14 0 30-46 124-75t212-29 212 29 126 75z m-338 328q144 0 247-39t103-93l0-64q0-58-103-99t-247-41-247 41-103 99l0 64q0 54 103 93t247 39z" horiz-adv-x="700" />
<glyph glyph-name="drive" unicode="&#xe8d4;" d="m884 304q26-44 14-96l-34-184q-2-20-19-35t-39-15l-712 0q-20 0-38 15t-20 35l-34 184q-8 52 14 96l158 374q22 46 72 46l408 0q50 0 74-46z m-68-132q2 22-10 38t-34 16l-644 0q-22 0-34-16t-10-38l14-74q2-22 19-37t39-15l590 0q22 0 39 15t19 37z" horiz-adv-x="902" />
<glyph glyph-name="bucket" unicode="&#xe8d5;" d="m522 780q174 0 286-49t104-105q-6-38-48-307t-44-281q-2-18-37-44t-107-50-154-24-153 24-106 50-37 44q0 2-4 30 82-6 163 35t139 117q28 0 48 20t20 50q0 28-20 49t-50 21q-28 0-49-21t-21-49q0-20 10-36-48-58-115-89t-131-27q-102 10-157 57t-59 109q-8 122 156 184-18 94-22 138-8 56 104 105t284 49z m-452-470q4-32 37-59t91-39l-32 204q-100-44-96-106z m452 212q82 0 157 18t113 39 38 35-38 35-112 39-158 18q-82 0-156-18t-112-39-38-35 38-35 112-39 156-18z" horiz-adv-x="913" />
<glyph glyph-name="thermometer" unicode="&#xe8d6;" d="m400 356q64-36 102-98t38-138q0-112-79-191t-191-79-191 79-79 191q0 76 38 138t102 98l0 444q0 50 40 50l170 0q20 0 35-15t15-35l0-444z m-130-406q70 0 120 50t50 120q0 56-32 100t-84 60l0 370-100 0 0-368q-54-16-89-61t-35-101q0-70 50-120t120-50z" horiz-adv-x="540" />
<glyph glyph-name="key" unicode="&#xe8d7;" d="m774 612q20-116-28-215t-150-117q-66-12-130-2l-118-194-70-12-104-166q-14-28-46-32l-76-14q-12-4-22 4t-12 22l-16 98q-8 30 12 56l258 386q-24 50-38 120-18 106 53 187t185 101q106 20 195-45t107-177z m-126-76q30 44 21 97t-51 83q-42 32-92 22t-80-54q-8-12-12-23t-1-20 5-16 13-17 18-15 22-16 23-17q6-4 22-16t23-16 19-12 19-8 17 1 18 8 16 19z" horiz-adv-x="780" />
<glyph glyph-name="flow-cascade" unicode="&#xe8d8;" d="m520 120q50 0 85-35t35-85-35-85-85-35q-80 0-110 74l-164 0q-88 0-131 54t-43 118l0 464q-72 34-72 110 0 50 35 85t85 35 85-35 35-85q0-76-72-110l0-114q0-78 78-78l164 0q30 72 110 72 50 0 85-35t35-85-35-85-85-35q-80 0-110 74l-164 0q-42 0-78 16l0-194q0-78 78-78l164 0q30 72 110 72z m0 300q-28 0-49-20t-21-50q0-28 21-48t49-20 49 20 21 48q0 30-21 50t-49 20z m-470 280q0-28 21-48t49-20 49 20 21 48q0 30-21 50t-49 20-49-20-21-50z m470-768q28 0 49 20t21 48q0 30-21 50t-49 20-49-20-21-50q0-28 21-48t49-20z" horiz-adv-x="640" />
<glyph glyph-name="flow-branch" unicode="&#xe8d9;" d="m640 650q0-80-74-110-6-58-28-101t-61-69-68-38-75-26q-42-14-63-22t-47-24-38-40-16-60q70-30 70-110 0-50-35-85t-85-35-85 35-35 85q0 78 72 112l0 378q-72 34-72 110 0 50 35 85t85 35 85-35 35-85q0-76-72-110l0-204q40 30 138 60 58 18 84 29t51 41 29 76q-70 32-70 108 0 50 35 85t85 35 85-35 35-85z m-588 0q0-28 20-48t48-20 49 20 21 48q0 30-21 50t-49 20-48-20-20-50z m68-668q28 0 49 20t21 48q0 30-21 50t-49 20-48-20-20-50q0-28 20-48t48-20z m400 600q28 0 49 20t21 48q0 30-21 50t-49 20-48-20-20-50q0-28 20-48t48-20z" horiz-adv-x="640" />
<glyph glyph-name="flow-tree" unicode="&#xe8da;" d="m868 112q72-34 72-112 0-50-35-85t-85-35-85 35-35 85q0 78 72 112l0 114q0 78-76 78l-100 0q-44 0-78 12l0-204q72-34 72-112 0-50-35-85t-85-35-85 35-35 85q0 78 72 112l0 204q-30-12-76-12l-100 0q-34 0-53-19t-22-33-3-26l0-114q72-34 72-112 0-50-35-85t-85-35-85 35-35 85q0 78 72 112l0 114q0 64 43 118t131 54l100 0q76 0 76 52l0 140q-72 34-72 110 0 50 35 85t85 35 85-35 35-85q0-76-72-110l0-140q0-52 78-52l100 0q86 0 129-54t43-118l0-114z m-678-112q0 30-21 50t-49 20-48-20-20-50q0-28 20-48t48-20 49 20 21 48z m212 700q0-28 20-48t48-20 49 20 21 48q0 30-21 50t-49 20-48-20-20-50z m138-700q0 30-21 50t-49 20-48-20-20-50q0-28 20-48t48-20 49 20 21 48z m280-68q28 0 49 20t21 48q0 30-21 50t-49 20-48-20-20-50q0-28 20-48t48-20z" horiz-adv-x="940" />
<glyph glyph-name="flow-line" unicode="&#xe8db;" d="m168 162q72-34 72-112 0-50-35-85t-85-35-85 35-35 85q0 78 72 112l0 378q-72 34-72 110 0 50 35 85t85 35 85-35 35-85q0-76-72-110l0-378z m-116 488q0-28 20-48t48-20 49 20 21 48q0 30-21 50t-49 20-48-20-20-50z m68-668q28 0 49 20t21 48q0 30-21 50t-49 20-48-20-20-50q0-28 20-48t48-20z" horiz-adv-x="240" />
<glyph glyph-name="flow-parallel" unicode="&#xe8dc;" d="m240 650q0-76-72-110l0-378q72-34 72-112 0-50-35-85t-85-35-85 35-35 85q0 78 72 112l0 378q-72 34-72 110 0 50 35 85t85 35 85-35 35-85z m-50-600q0 30-21 50t-49 20-48-20-20-50q0-28 20-48t48-20 49 20 21 48z m-70 532q28 0 49 20t21 48q0 30-21 50t-49 20-48-20-20-50q0-28 20-48t48-20z m448-420q72-34 72-112 0-50-35-85t-85-35-85 35-35 85q0 78 72 112l0 378q-72 34-72 110 0 50 35 85t85 35 85-35 35-85q0-76-72-110l0-378z m-116 488q0-28 20-48t48-20 49 20 21 48q0 30-21 50t-49 20-48-20-20-50z m68-668q28 0 49 20t21 48q0 30-21 50t-49 20-48-20-20-50q0-28 20-48t48-20z" horiz-adv-x="640" />
<glyph glyph-name="rocket" unicode="&#xe8dd;" d="m543 236q6-50 8-81t-8-59-13-40-35-32-45-26-70-31-85-37q-32-12-45 4t-3 44l40 110-130 132-106-40q-28-12-43 2t-3 46q12 30 31 79t27 65 22 45 25 36 29 20 41 13l52 0t71-6q10 14 29 39t77 85 118 104 145 75 165 19q8 0 14-6 4-4 6-14 10-82-18-168t-76-151-98-118-86-81z m50 296q22-22 54-22t54 22q22 24 22 56t-22 56q-22 22-54 22t-54-22q-22-24-22-56t22-56z" horiz-adv-x="860" />
<glyph glyph-name="gauge" unicode="&#xe8de;" d="m406 178q34 56 214 284t194 220q12-6-96-278t-138-326q-50-86-136-36t-38 136z m94 380q-168 0-284-127t-116-311q0-30 2-46 2-22-12-37t-34-17-36 12-18 34q0 8-1 26t-1 28q0 226 145 382t355 156q72 0 134-18l-70-86q-40 4-64 4z m362-62q138-154 138-376 0-38-2-56-2-20-16-33t-34-13l-4 0q-22 4-35 20t-11 36q2 14 2 46 0 150-80 268 6 14 20 51t22 57z" horiz-adv-x="1000" />
<glyph glyph-name="traffic-cone" unicode="&#xe8df;" d="m480 246q-90 0-156 27t-70 65q44 124 56 158 10-28 59-46t111-18q64 0 112 18t58 46q12-34 56-158-4-38-70-65t-156-27z m0 334q-96 0-124 44l52 142q10 34 72 34t74-34q12-38 50-142-28-44-124-44z m440-384q40-16 41-41t-37-47l-352-188q-38-22-91-22t-91 22l-354 188q-38 20-36 46t42 42l188 76-22-60q0-48 80-82t192-34 192 34 82 82l-22 60z" horiz-adv-x="961" />
<glyph glyph-name="cc" unicode="&#xe8e0;" d="m474 830q198 2 340-136t146-336q2-200-136-342t-338-146q-198-2-341 137t-145 337q-4 200 135 342t339 144z m12-858q156 2 266 114t108 270-115 267-269 107q-158-2-267-114t-107-270 114-267 270-107z m-124 298q40 0 58 40l56-30q-20-36-50-52-32-20-70-20-62 0-100 38-38 36-38 104t38 106 96 38q86 0 124-66l-62-32q-10 20-24 28t-28 8q-60 0-60-82 0-38 14-58 18-22 46-22z m266 0q42 0 56 40l58-30q-18-32-50-52t-70-20q-64 0-100 38-38 36-38 104 0 64 38 106 38 38 98 38 84 0 120-66l-60-32q-10 20-24 28t-28 8q-62 0-62-82 0-36 16-58t46-22z" horiz-adv-x="960" />
<glyph glyph-name="cc-by" unicode="&#xe8e1;" d="m480 526q-66 0-66 68t66 68q68 0 68-68t-68-68z m98-26q14 0 22-8 10-10 10-22l0-196-56 0 0-234-148 0 0 234-56 0 0 196q0 12 10 22 8 8 22 8l196 0z m-98 330q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m0-872q162 0 277 115t115 277q0 164-115 278t-277 114-277-114-115-278q0-162 115-277t277-115z" horiz-adv-x="960" />
<glyph glyph-name="cc-nc" unicode="&#xe8e2;" d="m480 830q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m-370-350q-22-62-22-130 0-162 115-277t277-115q110 0 202 56t142 148l-178 80q-8-46-46-74-38-30-86-34l0-74-56 0 0 74q-78 0-146 58l66 66q50-44 108-44 24 0 42 12t18 36q0 18-14 30l-46 20-56 26-76 32z m506-122l242-108q14 44 14 100 0 164-115 278t-277 114q-102 0-188-48t-140-130l182-82q12 36 46 62 32 22 78 24l0 74 56 0 0-74q68-4 120-44l-62-64q-44 28-84 28-24 0-38-8-18-10-18-30 0-8 4-12l60-28 42-18z" horiz-adv-x="960" />
<glyph glyph-name="cc-nc-eu" unicode="&#xe8e3;" d="m480 830q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m-370-352q-22-62-22-128 0-162 115-277t277-115q110 0 201 55t143 149l-246 108-174 0q10-36 26-56 38-40 104-40 46 0 92 20l18-90q-56-30-124-30-128 0-196 92-34 44-46 104l-52 0 0 58 44 0 0 14q0 4 1 12t1 12l-46 0 0 56 10 0z m488-112l262-116q12 48 12 100 0 164-115 278t-277 114q-102 0-189-48t-141-130l158-70q8 14 28 38 72 82 184 82 70 0 122-24l-24-92q-40 20-88 20-64 0-100-44-10-10-16-28l56-24 136 0 0-56-8 0z" horiz-adv-x="960" />
<glyph glyph-name="cc-nc-jp" unicode="&#xe8e4;" d="m480 830q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m-374-364q-18-54-18-116 0-162 115-277t277-115q106 0 195 52t141 140l-152 68 0-68-126 0 0-108-118 0 0 108-124 0 0 74 124 0 0 36-12 24-112 0 0 74 54 0z m432-242l112 0-106 48-6-12 0-36z m126 100l192-86q16 58 16 112 0 164-115 278t-277 114q-106 0-194-51t-140-137l158-70-54 98 128 0 76-166 46-20 82 186 128 0-122-224 76 0 0-34z" horiz-adv-x="960" />
<glyph glyph-name="cc-sa" unicode="&#xe8e5;" d="m478 604q114 0 180-74 66-72 66-186 0-110-68-184-74-74-180-74-80 0-142 50-58 48-70 138l120 0q6-86 106-86 50 0 82 42 30 44 30 118 0 76-28 116-30 40-82 40-96 0-108-86l36 0-96-94-94 94 36 0q14 90 72 138t140 48z m2 226q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m0-872q162 0 277 115t115 277q0 164-115 278t-277 114-277-114-115-278q0-162 115-277t277-115z" horiz-adv-x="960" />
<glyph glyph-name="cc-nd" unicode="&#xe8e6;" d="m306 382l0 82 348 0 0-82-348 0z m0-154l0 82 348 0 0-82-348 0z m174 602q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m0-872q162 0 277 115t115 277q0 164-115 278t-277 114-277-114-115-278q0-162 115-277t277-115z" horiz-adv-x="960" />
<glyph glyph-name="cc-pd" unicode="&#xe8e7;" d="m480 830q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m-370-352q-22-62-22-128 0-162 115-277t277-115q110 0 201 55t143 149l-424 188q2-54 28-96t76-42q36 0 64 26l6 6 70-84q-4-2-10-7t-8-9q-62-42-136-42-86 0-159 58t-73 188q0 32 6 62z m310-34l440-194q12 48 12 100 0 164-115 278t-277 114q-102 0-189-48t-141-130l148-66q64 102 196 102 88 0 150-54l-78-80q-8 8-14 12-22 16-52 16-52 0-80-50z" horiz-adv-x="960" />
<glyph glyph-name="cc-zero" unicode="&#xe8e8;" d="m480 628q108 0 153-81t45-197q0-114-45-195t-153-81-153 81-45 195q0 116 45 197t153 81z m-86-278q0-18 4-66l106 194q14 24-6 42-12 4-18 4-86 0-86-174z m86-172q86 0 86 172 0 40-6 84l-118-204q-22-30 12-46 2-2 6-2 2 0 2-2 2 0 8-1t10-1z m0 652q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m0-872q162 0 277 115t115 277q0 164-115 278t-277 114-277-114-115-278q0-162 115-277t277-115z" horiz-adv-x="960" />
<glyph glyph-name="cc-share" unicode="&#xe8e9;" d="m676 488q12 0 20-8t8-18l0-354q0-10-8-18t-20-8l-260 0q-12 0-20 8t-8 18l0 104-104 0q-10 0-18 8t-8 20l0 352q0 12 6 18 4 6 18 10l264 0q10 0 18-8t8-20l0-104 104 0z m-264 0l108 0 0 78-210 0 0-300 78 0 0 196q0 10 8 18 4 4 16 8z m238-354l0 302-210 0 0-302 210 0z m-170 696q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m0-872q162 0 277 115t115 277q0 164-115 278t-277 114-277-114-115-278q0-162 115-277t277-115z" horiz-adv-x="960" />
<glyph glyph-name="cc-remix" unicode="&#xe8ea;" d="m794 342l10-4 0-136-10-4-116-50-4-2-6 2-252 104-8 4-124-52-124 54 0 122 116 48-2 2 0 136 130 56 294-122 0-118z m-136-158l0 86-2 0 0 2-220 90 0-86 220-92 0 2z m14 112l78 32-72 30-76-32z m102-74l0 84-86-36 0-84z m-294 608q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m0-872q162 0 277 115t115 277q0 164-115 278t-277 114-277-114-115-278q0-162 115-277t277-115z" horiz-adv-x="960" />
<glyph glyph-name="github" unicode="&#xe8eb;" d="m620 286q26 0 45-26t19-64-19-64-45-26q-28 0-47 26t-19 64 19 64 47 26z m226 234q74-80 74-194 0-74-17-133t-43-96-64-65-70-41-73-20-62-8-45-1q-6 0-36-1t-50-1-50 1-36 1q-24 0-45 1t-62 8-73 20-70 41-64 65-43 96-17 133q0 114 74 194-8 4-1 80t33 140q92-10 228-104 46 12 126 12 84 0 126-12 62 42 119 68t83 30l26 6q26-64 33-140t-1-80z m-384-514q166 0 251 40t85 164q0 72-54 120-28 26-65 32t-113 0-104-6l-4 0q-32 0-83 4t-80 5-63-7-56-28q-52-46-52-120 0-124 84-164t250-40l4 0z m-160 280q26 0 45-26t19-64-19-64-45-26q-28 0-47 26t-19 64 19 64 47 26z" horiz-adv-x="920" />
<glyph glyph-name="github-circled" unicode="&#xe8ec;" d="m480 354q16 0 42 2t41 2 32-4 29-14q26-26 26-60 0-64-43-84t-127-20-127 20-43 84q0 34 26 60 12 10 29 14t32 4 41-2 42-2z m-80-128q14 0 23 14t9 32q0 46-32 46t-32-46q0-18 9-32t23-14z m160 0q14 0 24 14t10 32q0 20-10 33t-24 13q-32 0-32-46 0-18 9-32t23-14z m-80 604q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m44-676q188 0 188 184 0 56-38 98 4 4 1 41t-17 71q-44-6-114-52-20 6-64 6-40 0-64-6-30 20-59 33t-41 17l-14 2q-14-34-17-71t1-41q-38-42-38-98 0-184 188-184l88 0z" horiz-adv-x="960" />
<glyph glyph-name="flickr" unicode="&#xe8ed;" d="m196 150q-80 0-138 59t-58 141q0 84 57 142t139 58 139-58 57-142q0-82-58-141t-138-59z m508 0q-80 0-138 59t-58 141q0 84 57 142t139 58 139-58 57-142q0-82-58-141t-138-59z" horiz-adv-x="900" />
<glyph glyph-name="flickr-circled" unicode="&#xe8ee;" d="m480 830q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m-128-580q40 0 70 30t30 70q0 42-30 72t-70 30-70-30-30-72q0-40 30-70t70-30z m256 0q42 0 71 30t29 70q0 42-29 72t-71 30q-40 0-69-30t-29-72q0-40 29-70t69-30z" horiz-adv-x="960" />
<glyph glyph-name="vimeo" unicode="&#xe8ef;" d="m896 558q-32-186-171-351t-245-237q-42-28-81-17t-66 38-43 61q-16 32-78 239t-74 223q-16 12-38 5t-44-21l-20-14-36 50q18 20 46 52t100 89 124 67q30 6 53-7t36-35 23-60 15-70 12-75 13-67q14-54 21-80t17-54 18-39 18-11q40 0 126 166 42 76 6 124t-112 2q22 126 140 188 104 54 182 8 80-46 58-174z" horiz-adv-x="901" />
<glyph glyph-name="vimeo-circled" unicode="&#xe8f0;" d="m480 830q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m220-386q14 82-48 94-60 14-110-40-28-28-34-66 38 24 56-1t-2-63q-44-84-64-84-14 0-36 94-4 14-8 40t-8 45-12 39-20 29-30 5q-26-6-60-32t-56-50l-20-24 18-24q4 4 10 8t22 10 20-2q6-8 37-113t39-121q14-28 38-43t58 1q54 36 124 120t86 178z" horiz-adv-x="960" />
<glyph glyph-name="twitter" unicode="&#xe8f1;" d="m920 636q-36-54-94-98l0-24q0-130-60-250t-186-203-290-83q-160 0-290 84 14-2 46-2 132 0 234 80-62 2-110 38t-66 94q10-4 34-4 26 0 50 6-66 14-108 66t-42 120l0 2q36-20 84-24-84 58-84 158 0 48 26 94 154-188 390-196-6 18-6 42 0 78 55 133t135 55q82 0 136-58 60 12 120 44-20-66-82-104 56 8 108 30z" horiz-adv-x="920" />
<glyph glyph-name="twitter-circled" unicode="&#xe8f2;" d="m480 830q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m196-392q30 22 46 48-32-12-54-14 30 18 42 52-30-16-60-22-28 28-70 28-40 0-67-28t-27-66q0-2 1-10t1-12q-120 6-194 100-14-24-14-48 0-50 44-78-26 0-44 12l0-2q0-34 21-60t55-32q-16-4-24-4-12 0-18 2 20-66 88-66-50-40-118-40l-22 0q68-42 144-42 122 0 196 83t74 187l0 12z" horiz-adv-x="960" />
<glyph glyph-name="facebook" unicode="&#xe8f3;" d="m500 644l-142 0q-14 0-25-15t-11-37l0-102 178 0 0-148-178 0 0-442-170 0 0 442-152 0 0 148 152 0 0 86q0 94 59 159t147 65l142 0 0-156z" horiz-adv-x="500" />
<glyph glyph-name="facebook-circled" unicode="&#xe8f4;" d="m480 830q200 0 340-140t140-340q0-198-140-339t-340-141-340 141-140 339q0 200 140 340t340 140z m114-330l0 78-72 0q-44 0-74-33t-30-81l0-44-76 0 0-74 76 0 0-222 86 0 0 222 90 0 0 74-90 0 0 52q0 28 18 28l72 0z" horiz-adv-x="960" />
<glyph glyph-name="facebook-squared" unicode="&#xe8f5;" d="m752 770q44 0 76-31t32-75l0-646q0-44-32-76t-76-32l-162 0 0 310 114 0 0 134-114 0 0 70q0 30 28 30l86 0 0 152-96 0q-74 0-124-54t-50-132l0-66-104 0 0-134 104 0 0-310-326 0q-44 0-76 32t-32 76l0 646q0 44 32 75t76 31l644 0z" horiz-adv-x="860" />
<glyph glyph-name="gplus" unicode="&#xe8f6;" d="m48 572q0 58 25 102t56 65 69 34 56 15 26 2l230 0 0-4q0-22-78-36-28 0-38-6 40-20 54-56t14-96q0-102-68-158-38-38-38-54 0-18 50-64 104-90 104-178 0-140-116-194-68-34-150-34l-4 0-4 2q-2-2-4-2-24 0-54 5t-75 21-74 57-29 103q0 60 32 101t83 57 88 22 71 6l2 0q-16 22-24 47t-8 39l2 14-14 0q-64 0-110 30-74 44-74 160z m370-452q-4 52-43 84t-103 32l-16 0q-64-2-114-46-46-42-42-94t53-80 119-24q68 4 109 40t37 88z m-60 500q-30 108-122 108-12 0-20-2-40-12-58-62-16-50-2-106 14-52 47-85t71-33q12 0 18 2 42 12 63 65t3 113z m388-174l150 0 0-94-150 0 0-150-94 0 0 150-150 0 0 94 150 0 0 150 94 0 0-150z" horiz-adv-x="896" />
<glyph glyph-name="gplus-circled" unicode="&#xe8f7;" d="m434 486q8-30-1-57t-31-33l-10 0q-42 0-60 60-6 30 2 54 10 24 30 30 2 2 10 2 44 0 60-56z m46 344q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m-28-686q60 30 60 98 0 44-52 92-26 22-26 32 0 12 20 26 34 34 34 80 0 58-36 78 2 2 10 3t10 1q40 4 40 16l0 4-116 0q-12 0-33-4t-53-32-32-76q0-56 38-80 22-16 56-16l6 0q-4-24 16-50l-2 0q-138 0-138-94 0-40 28-63t49-27 39-4l8 0q40 0 74 16z m254 208l0 48-76 0 0 76-48 0 0-76-76 0 0-48 76 0 0-76 48 0 0 76 76 0z m-314-58q32 0 52-17t22-43-19-44-55-20q-34-4-60 11t-28 41q0 26 22 48 20 20 58 24l8 0z" horiz-adv-x="960" />
<glyph glyph-name="pinterest" unicode="&#xe8f8;" d="m320 190q-26-130-58-211t-96-129q-6 74-7 120t11 110 22 104 26 99 24 99q-24 52-19 116t48 106 99 20q40-16 44-59t-13-95-32-103-4-90 63-49q68-14 121 38t74 131 11 163-54 128q-62 64-151 70t-163-33-120-117-32-170q4-22 22-52t21-47-17-67q-146 34-140 230 4 138 105 234t233 112q164 18 290-57t144-219q26-176-66-317t-252-129q-22 2-42 9t-30 13-31 21-31 21z" horiz-adv-x="778" />
<glyph glyph-name="pinterest-circled" unicode="&#xe8f9;" d="m480 830q200 0 340-140t140-340q0-198-140-339t-340-141-340 141-140 339q0 200 140 340t340 140z m32-592q82-8 128 64t34 162q-10 72-74 110t-146 28q-66-8-117-56t-53-118q-4-100 70-116 10 24 9 33t-10 24-11 27q-14 96 78 144t158-18q48-48 20-148t-98-86q-40 8-33 54t24 86-21 60q-42 18-65-33t1-89q-4-20-21-83t-18-87 1-98q52 38 78 172 46-30 66-32z" horiz-adv-x="960" />
<glyph glyph-name="tumblr" unicode="&#xe8fa;" d="m560-58q-48-26-106-40-48-12-102-12-58 0-110 16-54 20-82 46-36 32-46 64-14 30-14 96l0 322-100 0 0 130q54 18 92 50t62 80q24 52 30 116l130 0 0-232 216 0 0-144-216 0 0-236q0-84 8-102 10-24 32-36 28-20 68-20 68 0 138 46l0-144z" horiz-adv-x="560" />
<glyph glyph-name="tumblr-circled" unicode="&#xe8fb;" d="m480 830q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m130-686l0 74q-36-24-70-24-16 0-36 10-12 8-14 18-6 12-6 52l0 118 110 0 0 74-110 0 0 118-64 0q-8-42-16-60-10-22-32-40t-46-26l0-66 50 0 0-162q0-28 8-48 6-16 24-32 14-14 40-24 32-8 56-8 28 0 52 6 28 6 54 20z" horiz-adv-x="960" />
<glyph glyph-name="linkedin" unicode="&#xe8fc;" d="m204 698q0-40-29-68t-75-28q-44 0-72 28t-28 68q0 42 28 69t74 27 73-27 29-69z m-198-790l0 618 192 0 0-618-192 0z m306 420q0 86-4 198l166 0 10-86 4 0q60 100 190 100 100 0 161-67t61-199l0-366-192 0 0 342q0 134-98 134-70 0-98-72-6-12-6-48l0-356-194 0 0 420z" horiz-adv-x="900" />
<glyph glyph-name="linkedin-circled" unicode="&#xe8fd;" d="m480 830q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m-118-678l0 312-96 0 0-312 96 0z m-48 352q52 0 52 48t-52 48q-22 0-37-14t-15-34q0-48 52-48z m404-352l0 184q0 66-31 101t-81 35q-66 0-96-50l-2 0-6 42-84 0q2-28 2-100l0-212 98 0 0 180q0 18 4 24 12 38 50 38 48 0 48-68l0-174 98 0z" horiz-adv-x="960" />
<glyph glyph-name="dribbble" unicode="&#xe8fe;" d="m438 480q-30 54-66 109t-56 84-24 33q-82-40-139-112t-77-162q182 0 362 48z m50-132q8 4 14 4-10 28-32 68-182-56-402-56l0-14q0-150 100-262 4 8 13 21t39 50 64 69 89 66 115 54z m-270-306q-2 0-4 2l-4 4z m148 690z m354-86q-114 98-260 98-48 0-92-12 82-108 146-228 138 52 204 140z m-260-756q-190 0-325 135t-135 325 135 325 325 135 325-135 135-325-135-325-325-135z m68 396q-216-74-308-242l-2-2q110-84 242-84 78 0 154 32-24 140-84 298z m16 158q12-24 26-56 2-2 5-9t5-11q66 8 129 4t101-10 42-8q0 138-88 246l-8-10q-8-10-26-27t-42-36-62-42-82-41z m60-138q52-148 76-280 140 92 168 262-8 4-39 11t-88 12-117-5z" horiz-adv-x="920" />
<glyph glyph-name="dribbble-circled" unicode="&#xe8ff;" d="m494 352q-44-14-82-44t-55-51-25-35q-48 58-48 128l0 4q106 0 200 28l14-28z m114 148q-32-42-100-68-26 48-70 110 14 4 42 4 72 0 128-46z m-246-304q40 80 152 120 34-92 40-146-36-16-74-16-68 0-118 42z m104 222q-92-24-176-24 18 92 104 134 32-40 72-110z m90-92q12 2 38 2 30 0 80-10-16-82-82-128-6 56-36 136z m-76 504q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m0-714q98 0 167 69t69 165q0 98-69 167t-167 69-166-69-68-167q0-96 68-165t166-69z m46 282q72 28 108 74 42-52 42-116-48 8-90 8-30 0-44-2-2 2-2 4 0 4-2 4-2 4-6 13t-6 15z" horiz-adv-x="960" />
<glyph glyph-name="stumbleupon" unicode="&#xe900;" d="m552 448l0 60q0 22-15 37t-37 15q-20 0-36-15t-16-37l0-314q0-92-66-158t-158-66-158 66-66 158l0 132 172 0 0-132q0-20 16-36t36-16 36 16 16 36l0 314q0 92 66 157t158 65 158-65 66-157l0-60-102-34z m278-122l170 0 0-132q0-92-66-158t-158-66-158 66-66 158l0 134 70-32 102 32 0-134q0-20 16-36t36-16q22 0 38 15t16 37l0 132z" horiz-adv-x="1000" />
<glyph glyph-name="stumbleupon-circled" unicode="&#xe901;" d="m480 830q198 0 339-140t141-340q0-198-141-339t-339-141q-200 0-340 141t-140 339q0 200 140 340t340 140z m0-368q26 0 26-26l0-30 34-18 52 18 0 30q0 46-33 79t-79 33-80-33-34-79l0-160q0-26-26-26t-26 26l0 68-88 0 0-68q0-46 34-79t80-33 79 33 33 79l0 160q0 26 28 26z m252-186l0 68-86 0 0-68q0-26-26-26-28 0-28 26l0 68-52-16-34 16 0-68q0-46 33-79t81-33q46 0 79 33t33 79z" horiz-adv-x="960" />
<glyph glyph-name="lastfm" unicode="&#xe902;" d="m394 222l34-100q-64-52-168-52-106 0-183 73t-77 199q0 130 80 209t188 79q112 0 167-45t91-159l36-116q48-146 202-146 120 0 120 60 0 54-78 72l-78 18q-134 34-134 152 0 88 58 126t146 38q184 0 198-146l-114-14q-8 70-90 70t-82-62q0-50 66-66l74-16q150-36 150-166 0-160-238-160-136 0-204 53t-100 149l-36 116q-14 40-22 60t-25 43-42 33-61 10q-64 0-113-46t-49-142q0-80 46-130t110-50q60 0 128 56z" horiz-adv-x="1000" />
<glyph glyph-name="lastfm-circled" unicode="&#xe903;" d="m480 830q198 0 339-140t141-340q0-198-141-339t-339-141q-200 0-340 141t-140 339q0 200 140 340t340 140z m132-620q120 0 120 80 0 66-76 84l-38 8q-32 8-32 34 0 30 40 30 44 0 46-34l58 6q-6 74-100 74-102 0-102-84 0-60 66-76l40-8q40-10 40-36 0-32-62-32-76 0-100 74l-20 58q-18 58-45 81t-85 23q-54 0-95-40t-41-106q0-62 39-99t93-37 86 26l-18 50q-28-28-66-28-32 0-55 25t-23 65q0 50 25 73t57 23q34 0 49-18t27-56l18-58q32-102 154-102z" horiz-adv-x="960" />
<glyph glyph-name="rdio" unicode="&#xe904;" d="m766 402q4-32 4-52 0-160-113-275t-273-115q-158 0-271 115t-113 275q0 162 112 276t272 114q52 0 90-10l0-222q-76 26-154-10-70-34-101-101t-5-129q26-60 95-79t139 15q52 26 87 80t35 122l0 286q16-8 24-14 174-108 310-114 32-2 4-52-42-76-130-106z" horiz-adv-x="921" />
<glyph glyph-name="rdio-circled" unicode="&#xe905;" d="m480 830q198 0 339-140t141-340q0-198-141-339t-339-141q-200 0-340 141t-140 339q0 200 140 340t340 140z m170-454q52 16 72 60 12 22-4 22-72 4-156 58-2 2-6 4t-6 4l0-146q0-74-62-100-34-18-69-9t-49 41q-14 30 2 64t52 50q36 20 78 6l0 112q-22 6-46 6-80 0-137-58t-57-140q0-80 57-138t137-58 138 58 58 138q0 6-1 14t-1 12z" horiz-adv-x="960" />
<glyph glyph-name="spotify" unicode="&#xe906;" d="m440 790q182 0 311-129t129-311q0-110-51-205t-139-157q-100 170-310 176-162 6-272-104-108 124-108 290 0 184 128 312t312 128z m214-596q16 22-8 38-172 106-422 48-26-8-20-32 6-26 32-22 228 54 382-40 22-14 36 8z m54 124q18 30-12 48-100 62-235 77t-251-19q-32-10-24-44 12-32 42-22 104 32 225 18t209-68q28-20 46 10z m4 130q34-20 56 14 20 34-14 56-116 68-288 82t-282-24q-14-4-22-19t-4-31q10-38 50-28 94 34 249 22t255-72z m-336-414q120-6 172-110-64-14-108-14-114 0-214 56 58 72 150 68z" horiz-adv-x="880" />
<glyph glyph-name="spotify-circled" unicode="&#xe907;" d="m480 830q198 0 339-140t141-340q0-120-56-224t-152-170q-108 186-338 192-176 6-296-114-118 138-118 316 0 200 140 340t340 140z m234-650q14 26-10 40-188 114-460 54-30-8-22-36 8-30 36-22 246 58 416-46 26-14 40 10z m58 136q18 34-12 50-110 68-256 85t-276-21q-34-10-24-46 10-34 46-26 112 34 244 19t228-73q32-20 50 12z m4 142q38-24 62 14 20 38-16 62-126 74-314 89t-306-27q-18-4-27-21t-3-33q6-18 22-27t34-3q102 36 271 23t277-77z m-364-454q130-4 186-118-60-16-118-16-126 0-234 62 66 74 166 72z" horiz-adv-x="960" />
<glyph glyph-name="qq" unicode="&#xe908;" d="m812 200q30-22 38-53t-12-61q-110-154-298-187t-344 77q-24 16-38 30 76-24 148-25t128 18 101 43 80 57 53 52 28 35q20 30 53 33t63-19z m-612 30q14-32 1-61t-47-45q-32-16-64-7t-46 41q-80 172-14 352t238 260q24 10 44 16-84-76-123-170t-32-178 18-130 25-78z m302 580q190-18 312-164t106-336q-4-32-8-48-20 92-67 163t-98 109-110 63-92 32-57 9q-34 2-54 29t-16 63q4 38 26 60t58 20z m-196-486q16 38 34 46l0 6q0 12 8 24l0 2q0 8 2 12 4 50 33 82t79 32q48 0 78-32t32-82q2-4 2-12l0-2q8-8 8-24l0-6q18-8 34-46 26-54 6-66-12-6-30 22-6-28-30-46 26-10 26-26 0-14-18-23t-44-9q-52 0-60 26l-8 0q-12-26-62-26-26 0-44 9t-18 23q0 16 26 26-24 20-30 46-18-28-28-22-22 10 4 66z" horiz-adv-x="922" />
<glyph glyph-name="instagram" unicode="&#xe909;" d="m690 350q0 26-6 50l176 0 0-344q0-56-39-96t-95-40l-592 0q-56 0-95 40t-39 96l0 344 174 0q-4-32-4-50 0-106 76-183t184-77q106 0 183 77t77 183z m36 430q56 0 95-39t39-95l0-146-218 0q-78 110-212 110-138 0-212-110l-218 0 0 146q0 56 39 95t95 39l592 0z m64-166l0 72q0 24-24 24l-72 0q-24 0-24-24l0-72q0-8 7-16t17-8l72 0q24 0 24 24z m-200-264q0-66-47-113t-113-47-113 47-47 113q0 68 47 114t113 46 113-46 47-114z" horiz-adv-x="860" />
<glyph glyph-name="dropbox" unicode="&#xe90a;" d="m286 806l194-158-284-184-196 164z m368-754q8 0 12 2l116 78 0-46-302-190-302 190 0 46 118-78q4-2 12-2 10 0 14 4l158 132 160-132q4-4 14-4z m306 576l-194-164-286 184 196 158z m-480-342l286 178 174-140-282-184z m-176-146l-282 184 174 140 284-178z" horiz-adv-x="960" />
<glyph glyph-name="evernote" unicode="&#xe90b;" d="m750 636q0-4 5-73t9-144-1-171-19-171-51-126-91-51q-154 0-194 26-26 20-18 130 2 40 37 59t69 19l34-2-4-70q-12-2-38-2-20 0-24-26-4-38 40-42l86 4q38 4 28 136-2 16-18 26t-34 13-49 8-47 9q-28 8-46 28t-27 37-11 17-8-58-30-58q-44 0-139 15t-115 35q-34 34-62 149t-28 151q0 34 58 30l116 0q78 0 78 72 0 12-1 52t-1 60q0 82 40 82 90 0 120-14 18-8 29-26t13-34l4-14 202-12q10 0 25-3t39-19 24-42z m-96-302q6 6-2 32t-29 52-49 26-45-23-21-46 0-29q8-6 15-5t26 5 31 4q14 0 31-6t28-10 15 0z m-482 308q0-22-28-22l-144 0 176 172q-4-138-4-150z" horiz-adv-x="766" />
<glyph glyph-name="flattr" unicode="&#xe90c;" d="m180 424l0-210-180-180 0 414q0 302 278 302l442 0-312-310q-6-6-10-6-8 0-12 10l0 128q-98 0-112-2-94-16-94-146z m440 64l180 180 0-414q0-304-278-304l-440 0 312 312q2 6 8 6 8 0 12-10l0-128q98 0 112 2 94 16 94 146l0 210z" horiz-adv-x="800" />
<glyph glyph-name="skype" unicode="&#xe90d;" d="m894 250q26-58 26-118 0-108-75-185t-179-77q-62 0-120 32-52-8-80-8-182 0-311 132t-129 320q0 44 10 90-36 60-36 134 0 108 74 184t180 76q74 0 136-40 32 8 76 8 182 0 310-132t128-320q0-46-10-96z m-204-120q30 46 30 100 0 44-16 80-16 30-50 54-36 22-76 36-68 20-96 26-14 2-35 7t-27 7q-24 8-34 14-16 8-26 22-10 10-10 26 0 24 28 42 26 20 76 20t74-18q26-22 38-50 16-26 26-36 16-12 38-12 26 0 46 20 18 18 18 44 0 20-14 52-16 24-42 48-28 22-74 38-48 14-102 14-72 0-128-22-56-20-86-60t-30-92 28-90q34-40 76-56 48-22 116-36 12-2 29-7t30-8 21-5q28-10 46-28 18-14 18-42 0-34-32-56-36-24-90-24-40 0-64 12-26 14-36 28-24 44-26 46-8 24-24 40-20 14-40 14-28 0-46-18t-18-42q0-38 28-82 26-40 72-66 64-34 158-34 78 0 138 24 60 28 88 70z" horiz-adv-x="920" />
<glyph glyph-name="skype-circled" unicode="&#xe90e;" d="m588 358q20-12 28-30 10-20 10-44 0-32-18-56-12-22-48-40-38-14-78-14-54 0-88 20-22 12-40 36-16 26-16 46 0 14 10 24 14 10 26 10 14 0 22-8 8-4 14-22 2-6 7-15t7-11q6-8 20-16 16-6 36-6 32 0 50 12 18 14 18 32 0 16-10 24-10 10-26 16-6 2-21 5t-23 5q-20 4-66 20-20 10-42 32-16 22-16 52 0 28 18 50 16 22 48 34 30 12 72 12 34 0 56-8 20-4 42-20 18-18 24-28 6-16 6-30t-10-24-24-10q-12 0-22 6-8 8-14 20-10 18-22 28-10 10-42 10-26 0-42-10-16-12-16-24 0-10 6-16 8-8 14-10 4-2 20-8 18-6 34-10 36-8 54-14 28-10 42-20z m-108 472q200 0 340-140t140-340q0-198-140-339t-340-141q-198 0-339 141t-141 339q0 200 141 340t339 140z m116-748q58 0 100 43t42 103q0 34-16 66 6 28 6 54 0 104-72 178t-174 74q-28 0-42-2-34 22-74 22-60 0-102-43t-42-103q0-40 20-76-4-16-4-50 0-104 72-178t172-74q32 0 46 4 30-18 68-18z" horiz-adv-x="960" />
<glyph glyph-name="renren" unicode="&#xe90f;" d="m384 808l0-292q-2-150-77-274t-197-184q-110 130-110 296 0 170 110 298t274 156z m76-570q42-174 222-288-102-56-222-56t-220 56q178 114 220 288z m76 280l0 290q164-28 274-156t110-298q0-168-108-296-124 60-200 184t-76 276z" horiz-adv-x="920" />
<glyph glyph-name="sina-weibo" unicode="&#xe910;" d="m732 348q118-38 118-136 0-102-127-197t-313-95q-160 0-285 78t-125 196q0 130 146 280 92 92 186 129t134-3q36-36 10-116-4-14 8-14l16 2q74 34 134 34t84-34q24-36-2-100-6-18 16-24z m-322-354q122 12 202 77t72 145q-10 80-100 128t-212 36-202-77-70-145q8-80 98-128t212-36z m586 488l0-2q0-14-11-24t-25-10-24 10-10 24q0 96-68 163t-162 67q-16 0-26 10t-10 26q0 34 36 34 124 0 212-87t88-211z m-140 4q4-14-4-27t-22-15q-34-4-42 28-8 38-36 66t-66 36q-34 8-26 40 8 36 42 28 58-12 100-55t54-101z m-528-210q48 10 88-12t48-62q10-40-19-77t-79-45q-48-10-88 12t-48 62 20 76 78 46z" horiz-adv-x="996" />
<glyph glyph-name="paypal" unicode="&#xe911;" d="m771 610l8-4q38-22 60-62 20-38 20-96 0-130-110-210-106-80-306-80l-30 0q-16 0-32-12t-20-28l-36-156q-12-42-52-42l-106 0q-18 0-28 13t-6 29l6 24 68 0q16 0 32 13t20 29l36 156q10 40 52 40l30 0q196 0 306 80 110 82 110 210 0 56-22 96z m-580-516q-2-16-18-29t-32-13l-108 0q-18 0-27 13t-5 29l150 646q10 40 52 40l224 0q78 0 126-8 56-12 94-34 36-24 58-62 20-38 20-96 0-130-110-210-106-80-304-80l-32 0q-16 0-32-12t-18-28z m88 374q-4-16 6-28t26-12l28 0q86 0 134 36 48 34 48 98 0 44-30 64-32 20-94 20l-34 0q-42 0-52-40z" horiz-adv-x="859" />
<glyph glyph-name="picasa" unicode="&#xe912;" d="m250 760q10-12 158-144l-396-362q-12 48-12 96 0 130 67 240t183 170z m400 10l0-278-328 296q64 22 138 22 98 0 190-40z m70-40q94-64 147-165t53-215q0-80-26-152l-174 0 0 532z m-686-550q12 12 66 60l102 92 0-362q-116 80-168 210z m238-250l0 198 590 0q-56-100-151-163t-209-75l-84 0q-84 10-146 40z" horiz-adv-x="920" />
<glyph glyph-name="soundcloud" unicode="&#xe913;" d="m34 178q0-4-10-4-6 0-10 4l-14 70 14 72q4 4 10 4 10 0 10-4l16-72z m102-38q0-8-12-8t-12 8l-12 108 12 166q0 8 12 8t12-8l14-166z m102 2q0-10-14-10t-14 8l-10 108 10 222q0 10 14 10t14-10l12-222z m102 0q0-10-16-10t-16 10l-8 106 8 224q0 10 16 10t16-10l10-224z m102 2q0-12-18-12-16 0-18 12l-6 104 6 256q4 14 18 14 18 0 18-14l8-256z m72-12q-14 0-14 14l0 396q0 10 12 14 36 14 84 14 88 0 153-58t73-142q24 10 50 10 52 0 90-37t38-87q0-52-38-89t-90-37z" horiz-adv-x="1000" />
<glyph glyph-name="mixi" unicode="&#xe914;" d="m477-12q-184 0-319 101t-155 255q-22 170 108 308t336 164 366-77 182-273q14-118-35-244t-165-225-270-117l0 108-48 0z m306 220l0 276q0 34-10 52-8 18-30 38-16 12-44 20-28 6-56 6-44 0-74-16-24-12-42-30-10 16-36 32-30 14-70 14-66 0-110-38l0 30-88 0 0-384 92 0 0 236q0 4 4 20 4 10 16 26 10 14 26 20 20 10 40 10 18 0 30-6 8-4 16-10 4-8 8-20 4-16 4-28l0-248 90 0 0 236q0 36 22 54 22 22 62 22 20 0 32-6 10-2 16-12 8-8 8-18 4-20 4-28l0-248 90 0z" horiz-adv-x="998" />
<glyph glyph-name="behance" unicode="&#xe915;" d="m404 386q56 0 85-40t31-80l0-40q0-56-20-96t-50-58-59-27-49-11l-342 0 0 646 322 0q78 0 127-44t49-128q0-50-23-81t-47-37z m-262 180l0-144 170 0q26 0 40 15t14 61q0 30-11 47t-23 19l-10 2-180 0z m172-416q74 0 74 84 0 40-16 62t-32 24l-18 2-180 0 0-172 172 0z m468 366q70 0 118-29t67-70 27-82 6-69l-2-30-320 0q0-54 27-82t55-28l26-2q46 0 71 17t27 33l2 18 108 0q0-82-53-124t-105-44l-54-2q-72 0-122 25t-72 62-33 73-11 60l0 26q0 10 1 27t14 60 36 75 72 59 115 27z m98-194q0 4-1 11t-6 24-13 30-28 24-46 11q-42 0-70-25t-34-51l-6-24 204 0z m26 320l0-78-256 0 0 78 256 0z" horiz-adv-x="1000" />
<glyph glyph-name="google-circles" unicode="&#xe916;" d="m556 810q152 0 258-106t106-256q0-142-96-247t-236-115q-34-86-112-141t-172-55q-126 0-215 90t-89 214q0 96 54 173t140 111q12 140 116 236t246 96z m-252-818q118 0 174 100-104 22-179 97t-97 179q-100-56-100-174 0-84 59-143t143-59z m4 404q16-76 70-129t128-69q-2 80-60 138t-138 60z m300-198q88 18 145 88t57 162q0 106-75 180t-179 74q-90 0-161-58t-87-146q124-2 211-89t89-211z m-504 398q-42 0-73 30t-31 72q0 44 31 74t73 30q44 0 74-30t30-74q0-42-30-72t-74-30z m0 160q-24 0-40-17t-16-41q0-22 16-39t40-17 41 17 17 39q0 24-17 41t-41 17z" horiz-adv-x="920" />
<glyph glyph-name="vkontakte" unicode="&#xe917;" d="m532 302q26-16 26-48 0-36-24-50-14-10-62-10l-52 0 0 116 58 0q38 0 54-8z m-22 100q-14-10-56-10l-34 0 0 102 26 0q50 0 60-6 24-14 24-42t-20-44z m282 428q70 0 119-49t49-119l0-622q0-70-49-120t-119-50l-624 0q-70 0-119 50t-49 120l0 622q0 70 49 119t119 49l624 0z m-286-724q84 0 125 42t41 102q0 96-96 116l0 2q68 22 68 102 0 50-35 79t-85 29l-214 0 0-472 196 0z" horiz-adv-x="960" />
<glyph glyph-name="smashing" unicode="&#xe918;" d="m418 286q150-58 160-142 8-60-56-84-22-10-50-10-56 0-110 20t-78 40l-26 18-74-170q64-32 136-56l-80-20q-28-6-52 9t-32 43l-154 646q-6 28 9 53t43 31l186 44q-66-72-60-182 6-78 72-141t166-99z m520-164q8-28-8-53t-44-31l-136-34q42 58 44 136 4 88-54 164t-186 118q-152 52-158 126-6 52 56 72 24 10 54 8 58-2 102-17t60-29l16-14 58 160q-80 42-176 60l134 32q28 6 52-9t32-43z" horiz-adv-x="940" />
<glyph glyph-name="sweden" unicode="&#xe919;" d="m850 650q20 0 35-15t15-35l0-200-500 0 0 250 450 0z m-850-550l0 200 300 0 0-250-260 0q-40 0-40 50z m400-50l0 250 500 0 0-200q0-22-14-36t-36-14l-450 0z m-400 550q0 50 40 50l260 0 0-250-300 0 0 200z" horiz-adv-x="900" />
<glyph glyph-name="db-shape" unicode="&#xe91a;" d="m450 800q276 0 363-88t87-362q0-276-87-363t-363-87q-274 0-362 87t-88 363q0 274 88 362t362 88z" horiz-adv-x="900" />
<glyph glyph-name="logo-db" unicode="&#xe91b;" d="m546 240q48-90-4-180-42-70-115-88t-151 26l-64 36-108-184-56 32 206 358q-68-10-134 28l-120 70 186 324 122-70q66-40 92-100l206 358 58-34-108-186 64-36q76-44 98-119t-20-143q-48-88-152-92z m44 302l-64 38-124-216q0-2-2-6l62-36q52-30 100-17t76 61 15 97-63 79z m-440-222q52-30 100-17t76 61 15 98-63 78l-64 38-128-222z m156-270q52-30 100-17t76 61 14 97-64 79l-62 36-4-4-124-216z" horiz-adv-x="726" />
</font>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,27 @@
'use strict';
const gulp = require('gulp');
const concat = require('gulp-concat');
const minify = require('gulp-minify');
const files = [
'./index.js'
];
const targetDir = './dist/';
const targetFile = 'app.js';
const minified = 'app.min.js';
gulp.task('default', () => {});
gulp.task('scripts', () => {
return gulp.src(files)
.pipe(concat(targetFile))
.pipe(gulp.dest(targetDir));
});
gulp.task('compress', ['scripts'], () => {
gulp.src(targetDir + targetFile)
.pipe(minify())
.pipe(gulp.dest(targetDir));
});
gulp.task('default', ['scripts']);

View File

@ -0,0 +1,50 @@
<!doctype html>
<html>
<head>
<title>Contact Printer</title>
<link rel="stylesheet" href="./css/photon.css"/ >
<link rel="stylesheet" href="./css/app.css" />
</head>
<body>
<header>
<div class="tab-group">
<div class="tab-item active">
<span class="icon icon-video"></span>
Run
</div>
<div class="tab-item">
<span class="icon icon-gauge"></span>
Settings
</div>
</div>
</header>
<div class="window-content" style="color: black;">
We are using Node.js <script>document.write(process.versions.node)</script>,
Chromium <script>document.write(process.versions.chrome)</script>,
and Electron <script>document.write(process.versions.electron)</script>.
<div id="buttons">
<div>
<button class="btn btn-large btn-positive">
Start
</button>
</div>
</div>
<div id="progress">
<progress value="0"></progress>
<div>
</div>
<footer class="toolbar toolbar-footer">
<div class="toolbar-actions">
<button class="btn btn-default">
Cancel
</button>
<button class="btn btn-default pull-right">
Reset
</button>
</div>
</footer>
<script src="./dist/app.js"></script>
</body>
</html>

View File

@ -0,0 +1,44 @@
/*jshint browser:true*/
'use strict';
const Fingerprint2 = require('./lib/fingerprint2.js');
const ttm = require('./lib/talktomain.js');
var fp;
var onReady = function () {
fp = new Fingerprint2().get((result, components) => {
console.log(result);
setTimeout(function () {
ttm.send('config', { fingerprint : result });
}, 2000);
});
};
document.addEventListener('DOMContentLoaded', onReady);
/*console.log(ipcRenderer.sendSync('synchronous-message', 'ping')); // prints "pong"
ipcRenderer.on('asynchronous-reply', (event, arg) => {
console.log(arg); // prints "pong"
});
ipcRenderer.send('asynchronous-message', 'ping');
function timeout(duration = 0) {
return new Promise((resolve, reject) => {
setTimeout(resolve, duration);
})
}
var p = timeout(1000).then(() => {
return timeout(2000);
}).then(() => {
throw new Error("hmm");
}).catch(err => {
return Promise.all([timeout(100), timeout(200)]);
})
*/

View File

@ -0,0 +1,4 @@
#!/bin/bash
npm install
./node_modules/.bin/electron-rebuild --version=1.4.1

View File

@ -0,0 +1,74 @@
'use strict';
const SerialPort = require('serialport');
const parser = SerialPort.parsers.readline("\n");
const delay = 15;
const baud = 57600;
let waiting = false;
let waitCb;
class arduinoCom {
constructor () {
this.port = {};
this.path = '';
SerialPort.list((err, ports) => {
if (err) {
return console.error(err);
}
for (let i = 0; i < ports.length; i++) {
if ((ports[i].manufacturer + '').toLowerCase().indexOf('arduino') !== -1) {
this.path = ports[i].comName;
break;
}
}
if (this.path === '') {
return console.error('No arduino found');
}
console.log(`Connecting to ${this.path}...`);
this.port = new SerialPort(this.path, {
baudRate: baud,
parser : parser,
autoOpen: false
});
this.port.open((err) => {
if (err) {
return console.error(err);
}
console.log(`Connected to ${this.path} @ ${baud} baud`);
this.port.on('data', this.dataCb);
});
});
}
dataCb (data = '{}') {
data = JSON.parse(data);
if (waiting) {
waitCb(null, data);
waiting = false;
}
}
send (ch = 'z', callback = null, nowait = false) {
if (!waiting && !nowait) {
waitCb = callback;
waiting = true;
} else if (nowait) {
waiting = false;
if (callback !== null) {
return callback(null, {});
}
} else {
return callback('Port is currently in use');
}
setTimeout(() => {
this.port.write(ch);
}, delay);
return false;
}
close (callback) {
console.log('Closing ${this.path}');
this.port.close(callback);
}
}
module.exports = new arduinoCom();

View File

@ -0,0 +1,30 @@
'use strict';
const fs = require('fs');
class Config {
constructor () {
this.configPath = './data/config.json';
if (fs.existsSync(this.configPath)) {
this.data = JSON.parse(fs.readFileSync(this.configPath, 'utf8'));
} else {
this.data = {};
this.store();
}
}
get (key) {
if (this.data[key]) {
return this.data[key];
} else {
return null;
}
}
set (key, val) {
this.data[key] = val;
this.store();
}
store () {
fs.writeFileSync(this.configPath, JSON.stringify(this.data), 'utf8');
}
}
module.exports = new Config();

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,30 @@
'use strict';
const RPM = 15;
const RPS = RPM / 60; //Rotations per second, from 15RPM
const D = 31.27; //mm, Diameter of core (daylight spool here) 32, or 31.5
const THICKNESS = 0.11938; //mm, 16mm = 0.0047in thick
const PITCH = 7.6;
class Roll {
constructor () {
//var D_END = 87.16;
this.TOTAL = 33 * 1000;
}
//R = √(36000 × 0.005/π + 32) = √(57.30 + 9) = 8.14 inches.
diameter (length = 0) {
const val = ((length * THICKNESS) / Math.PI) + Math.pow(D / 2, 2);
const r = Math.sqrt(val);
return 2 * r;
}
length (d = 0) {
const len = Math.PI * (Math.pow(d / 2, 2) - Math.pow(D / 2, 2));
return len / THICKNESS;
}
//mm/s
speed (d = 0) {
const mm = d * Math.PI;
return mm * RPS;
}
}
module.exports = Roll;

View File

@ -0,0 +1,21 @@
'use strict';
const {ipcRenderer} = require('electron');
class TTM {
constructor () {
this.listeners = [];
}
send (service = null, obj = {}) {
let json = JSON.stringify(obj);
return ipcRenderer.send(service, json);
}
on (service = null, cb = ()=>{}) {
let listener = (event, args, etc) => {
return cb(event, args, etc);
};
this.listeners.push(service);
return ipcRenderer.on(service, listener);
}
}
module.exports = new TTM();

View File

@ -0,0 +1,21 @@
'use strict';
const {ipcMain} = require('electron');
class TTR {
constructor () {
this.listeners = [];
}
send (service = null, obj = {}) {
let json = JSON.stringify(obj);
return ipcMain.send(service, json);
}
on (service = null, cb = ()=>{}) {
let listener = (event, args, etc) => {
return cb(event, args, etc);
};
this.listeners.push(service);
return ipcMain.on(service, listener);
}
}
module.exports = new TTR();

View File

@ -0,0 +1,74 @@
'use strict';
const electron = require('electron');
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;
const config = require('./lib/config.js');
const ac = require('./lib/arduinoCom.js');
const ttr = require('./lib/talktorender.js');
const path = require('path');
const url = require('url');
let mainWindow;
const Roll = require('./lib/roll.js');
/* app functions */
/*ipcMain.on('asynchronous-message', (event, arg) => {
console.log(arg); // prints "ping"
return event.sender.send('asynchronous-reply', 'pong');
});
ipcMain.on('synchronous-message', (event, arg) => {
console.log(arg) ; // prints "ping"
return event.returnValue = 'pong';
});*/
let createWindow = () => {
mainWindow = new BrowserWindow({
width: 350,
height: 600
});
if (config.data.position) {
let pos = config.get('position');
mainWindow.setPosition(pos[0], pos[1]);
}
mainWindow.loadURL(url.format({
pathname: path.join(__dirname, 'index.html'),
protocol: 'file:',
slashes: true
}));
mainWindow.webContents.openDevTools();
mainWindow.on('closed', () => {
mainWindow = null;
});
};
let ipcBindings = () => {
ttr.on('config', (event, args, etc) => {
console.dir(event);
console.dir(args);
});
};
app.on('ready', createWindow);
app.on('window-all-closed', () => {
config.set('position', mainWindow.getPosition());
app.quit();
});
app.on('activate', function () {
if (mainWindow === null) {
createWindow();
ipcBindings();
ac.send('c', () => {});
}
});
//ac.close();

View File

@ -0,0 +1,30 @@
{
"name": "contact_printer",
"version": "1.0.0",
"description": "16mm contact printer control software",
"main": "main.js",
"scripts": {
"start": "gulp && electron .",
"test": "echo \"Error: no test specified\" && exit 1"
},
"jshintConfig": {
"esversion": 6,
"strict": "global",
"node": true
},
"author": "mmcwilliams",
"license": "MIT",
"dependencies": {
"electron": "^1.4.1",
"electron-rebuild": "^1.5.7",
"serialport": "^4.0.7"
},
"devDependencies": {
"electron-rebuild": "^1.5.11",
"gulp": "^3.9.1",
"gulp-clean-css": "^2.3.2",
"gulp-concat": "^2.6.1",
"gulp-less": "^3.3.0",
"gulp-minify": "0.0.14"
}
}

1
clients/node_client/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
node_modules

Binary file not shown.

View File

@ -0,0 +1,21 @@
'use strict';
const cmd = require('commander');
const Arduino = require('arduino');
const printer = new Arduino();
async function configure () {
//read command lines
}
async function run_printer () {
await printer.connect()
await configure();
await
}
run_printer().then(()=>{}).catch(()=>{});

View File

@ -0,0 +1,333 @@
'use strict'
const SerialPort = require('serialport')
const Readline = SerialPort.parsers.Readline
const exec = require('child_process').exec
const parser = new Readline('')
const newlineRe = new RegExp('\n', 'g')
const returnRe = new RegExp('\r', 'g')
let eventEmitter
const mcopy = {}
async function delay (ms) {
return new Promise(resolve => {
return setTimeout(resolve, ms)
})
}
async function send (device, cmd) {
return new Promise ((resolve, reject) => {
mcopy.arduino.queue[cmd] = (ms) => {
return resolve(ms)
}
return mcopy.arduino.serial[device].write(cmd, (err, results) => {
if (err) {
//console.error(err)
return reject(err)
}
//
})
})
}
async function write (device, str) {
return new Promise ((resolve, reject) => {
mcopy.arduino.serial[device].write(str, function (err, results) {
if (err) {
return reject(err)
}
//console.log('sent: ' + str)
return resolve(results)
})
})
}
async function open (device) {
return new Promise((resolve, reject) => {
return mcopy.arduino.serial[device].open(error => {
if (error) {
return reject(error)
}
return resolve(true)
})
})
}
async function close (device) {
return new Promise((resolve, reject) => {
return mcopy.arduino.serial[device].close((err) => {
if (err) {
return reject(err)
}
return resolve(true)
})
})
}
/******
Arduino handlers
*******/
mcopy.arduino = {
path : {},
known: [
'/dev/tty.usbmodem1a161',
'/dev/tty.usbserial-A800f8dk',
'/dev/tty.usbserial-A900cebm',
'/dev/tty.usbmodem1a131',
'/dev/tty.usbserial-a900f6de',
'/dev/tty.usbmodem1a141',
'/dev/ttyACM0',
'COM3'
],
alias : {
},
serial : {
connect : {},
projector : {},
camera : {},
light : {}
},
baud : 57600,
queue : {},
timer : 0,
lock : false
}
mcopy.arduino.enumerate = async function () {
return new Promise( (resolve, reject) => {
return SerialPort.list((err, ports) => {
let matches = []
if (err) {
return reject(err)
}
ports.forEach(port => {
if (mcopy.arduino.known.indexOf(port.comName) !== -1) {
matches.push(port.comName)
} else if ((port.manufacturer + '').toLowerCase().indexOf('arduino') !== -1) {
matches.push(port.comName)
}
})
if (matches.length === 0) {
return reject('No USB devices found');
} else if (matches.length > 0) {
return resolve(matches)
}
})
})
}
//commands which respond to a sent char
mcopy.arduino.send = async function (serial, cmd, res) {
const device = mcopy.arduino.alias[serial]
let results
if (mcopy.arduino.lock) {
return false
}
mcopy.arduino.lock = true
await delay(mcopy.cfg.arduino.serialDelay)
try {
results = await send(device, cmd)
} catch (e) {
return console.error(e)
}
mcopy.arduino.lock = false
mcopy.arduino.timer = new Date().getTime()
return await eventEmitter.emit('arduino_send', cmd)
}
//send strings, after char triggers firmware to accept
mcopy.arduino.string = async function (serial, str) {
const device = mcopy.arduino.alias[serial]
let writeSuccess
await delay(mcopy.cfg.arduino.serialDelay)
if (typeof mcopy.arduino.serial[device].fake !== 'undefined'
&& mcopy.arduino.serial[device].fake) {
return mcopy.arduino.serial[device].string(str)
} else {
try {
writeSuccess = await write(device, str)
} catch (e) {
return console.error(e)
}
return writeSuccess
}
}
//respond with same char over serial when done
mcopy.arduino.end = async function (data) {
const end = new Date().getTime()
const ms = end - mcopy.arduino.timer
let complete
if (mcopy.arduino.queue[data] !== undefined) {
mcopy.arduino.lock = false;
//console.log('Command ' + data + ' took ' + ms + 'ms');
complete = mcopy.arduino.queue[data](ms) //execute callback
eventEmitter.emit('arduino_end', data)
delete mcopy.arduino.queue[data]
} else {
//console.log('Received stray "' + data + '"'); //silent to user
}
return complete
};
mcopy.arduino.alias = function (serial, device) {
console.log(`Making "${serial}" an alias of ${device}`)
mcopy.arduino.alias[serial] = device
}
mcopy.arduino.connect = async function (serial, device, confirm) {
return new Promise(async (resolve, reject) => {
let connectSuccess
mcopy.arduino.path[serial] = device;
mcopy.arduino.alias[serial] = device;
mcopy.arduino.serial[device] = new SerialPort(mcopy.arduino.path[serial], {
autoOpen : false,
baudRate: mcopy.cfg.arduino.baud,
parser: parser
})
try {
connectSuccess = await open(device)
} catch (e) {
console.error('failed to open: ' + e)
return reject(e)
}
console.log(`Opened connection with ${mcopy.arduino.path[serial]} as ${serial}`);
if (!confirm) {
mcopy.arduino.serial[device].on('data', async (data) => {
let d = data.toString('utf8')
d = d.replace(newlineRe, '').replace(returnRe, '')
return await mcopy.arduino.end(d)
})
} else {
mcopy.arduino.serial[device].on('data', async (data) => {
let d = data.toString('utf8')
d = d.replace(newlineRe, '').replace(returnRe, '')
return await mcopy.arduino.confirmEnd(d)
})
}
return resolve(mcopy.arduino.path[serial])
})
}
mcopy.arduino.confirmExec = {};
mcopy.arduino.confirmEnd = function (data) {
//console.dir(data)
if (data === mcopy.cfg.arduino.cmd.connect
|| data === mcopy.cfg.arduino.cmd.proj_identifier
|| data === mcopy.cfg.arduino.cmd.cam_identifier
|| data === mcopy.cfg.arduino.cmd.light_identifier
|| data === mcopy.cfg.arduino.cmd.proj_light_identifier
|| data === mcopy.cfg.arduino.cmd.proj_cam_light_identifier
|| data === mcopy.cfg.arduino.cmd.proj_cam_identifier ) {
mcopy.arduino.confirmExec(null, data);
mcopy.arduino.confirmExec = {};
}
}
mcopy.arduino.verify = async function () {
return new Promise(async (resolve, reject) => {
const device = mcopy.arduino.alias['connect']
let writeSuccess
mcopy.arduino.confirmExec = function (err, data) {
if (data === mcopy.cfg.arduino.cmd.connect) {
return resolve(true)
} else {
return reject('Wrong data returned')
}
}
await delay(mcopy.cfg.arduino.serialDelay)
try {
writeSuccess = await send(device, mcopy.cfg.arduino.cmd.connect)
} catch (e) {
return reject(e)
}
return resolve(writeSuccess)
})
}
mcopy.arduino.distinguish = async function () {
return new Promise(async (resolve, reject) => {
const device = mcopy.arduino.alias['connect']
let writeSuccess
let type
mcopy.arduino.confirmExec = function (err, data) {
if (data === mcopy.cfg.arduino.cmd.proj_identifier) {
type = 'projector'
} else if (data === mcopy.cfg.arduino.cmd.cam_identifier) {
type = 'camera'
} else if (data === mcopy.cfg.arduino.cmd.light_identifier) {
type = 'light'
} else if (data === mcopy.cfg.arduino.cmd.proj_light_identifier) {
type = 'projector,light'
} else if (data === mcopy.cfg.arduino.cmd.proj_cam_light_identifier) {
type = 'projector,camera,light'
} else if (data === mcopy.cfg.arduino.cmd.proj_cam_identifier) {
type = 'projector,camera'
}
return resolve(type)
}
await delay(mcopy.cfg.arduino.serialDelay)
try {
writeSuccess = await send(device, mcopy.cfg.arduino.cmd.mcopy_identifier)
} catch (e) {
console.error(e)
return reject(e)
}
})
}
mcopy.arduino.close = async function (callback) {
const device = mcopy.arduino.alias['connect']
let closeSuccess
try {
closeSuccess = await close(device)
} catch (e) {
return console.error(e)
}
return closeSuccess
};
mcopy.arduino.fakeConnect = async function (serial) {
//console.log('Connecting to fake arduino...');
const device = '/dev/fake'
mcopy.arduino.alias[serial] = device
mcopy.arduino.serial[device] = {
write : function (cmd, cb) {
const t = {
c : mcopy.cfg.arduino.cam.time + mcopy.cfg.arduino.cam.delay,
p : mcopy.cfg.arduino.proj.time + mcopy.cfg.arduino.proj.delay
}
let timeout = t[cmd]
let end
if (typeof timeout === 'undefined') timeout = 10
mcopy.arduino.timer = +new Date()
setTimeout(() => {
mcopy.arduino.end(cmd)
return cb()
}, timeout)
},
string : async function (str) {
//do nothing
return true
},
fake : true
};
//console.log('Connected to fake arduino! Not real! Doesn\'t exist!');
return true
}
if (typeof module !== 'undefined' && module.parent) {
/*module.exports = function (cfg, ee) {
eventEmitter = ee
mcopy.cfg = cfg
return mcopy.arduino
}*/
}
class Arduino {
}
module.exports = Arduino;

View File

@ -0,0 +1,11 @@
{
"name": "arduino",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "mmcwilliams",
"license": "MIT"
}

1563
clients/node_client/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,18 @@
{
"name": "contact_printer_node_client",
"version": "0.0.1",
"description": "Node.js client for the contact_printer project",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "mmcwilliams",
"license": "MIT",
"dependencies": {
"arduino": "file:lib/arduino",
"commander": "^2.16.0",
"lodash": "^4.17.10",
"serialport": "^6.2.1",
"uuid": "^3.3.2"
}
}

4600
dxf/InvoluteGear_1.dxf Normal file

File diff suppressed because it is too large Load Diff

4144
dxf/InvoluteGear_2.dxf Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,216 @@
#include <Adafruit_NeoPixel.h>
#include <ArduinoJson.h>
StaticJsonBuffer<200> jsonBuffer;
/*LIGHT VARIABLES*/
#define NUMPIXELS 1 // Number of Pixies in the strip
#define PIXELPIN 3 // Pin number for SoftwareSerial output;
Adafruit_NeoPixel light = Adafruit_NeoPixel(1, PIXELPIN, NEO_GRB + NEO_KHZ800);
String color = "000,000,000";
volatile int commaR = 0;
volatile int commaG = 0;
String strR = "000";
String strG = "000";
String strB = "000";
volatile int r = 0;
volatile int g = 0;
volatile int b = 0;
/*MOTOR VARIABLES*/
#define PI 3.1415926535897932384626433832795
#define HALF_PI 1.5707963267948966192313216916398
#define TWO_PI 6.283185307179586476925286766559
#define DEG_TO_RAD 0.017453292519943295769236907684886
#define RAD_TO_DEG 57.295779513082320876798154814105
const float RPM = 15.0;
const float RPS = RPM / 60.0;
const float RATIO = 0.5; //Gear ratio
const float THICKNESS = 0.11938; //16mm thickness
volatile int LENGTH = 33000; //mm
String lengthStr = "33000";
volatile float CORE_D = 31.27; //Daylight spool
//2in core
//3in core
//takeup spool?
unsigned long starttime = 0;
unsigned long runtime = 0;
volatile boolean running = false;
//motor pins
const int MOTOR_PIN = 9; //TIP120 -> 2.2k resistor
/*CORE INFO*/
volatile int i = 0;
unsigned long now; //to be compared to stored values every loop
/*COMMANDS*/
volatile char cmd_char = 'z'; //null command default
const char cmd_connect = 'c';
const char cmd_light = 'l';
const char cmd_length = 'f';
const char cmd_start = 's';
const char cmd_stop = 'x';
const int serialDelay = 5;//allows for sending longer strings to arduino in realtime
void setup () {
Serial.begin(57600);
Serial.flush();
Serial.setTimeout(serialDelay);
pinMode(MOTOR_PIN, OUTPUT);
light.begin();
setAll(0, 0, 0);
delay(2000);
reportString("msg", "Connected to contact printer");
}
void loop () {
now = millis();
readCmd();
if (running) {
motor_run();
}
}
void readCmd () {
if (Serial.available()) {
/* read the most recent byte */
cmd_char = (char)Serial.read();
}
if (cmd_char != 'z') {
cmd(cmd_char);
cmd_char = 'z';
}
}
void cmd (const char val) {
if (val == cmd_connect) {
reportString("verify", "contact_printer");
} else if (val == cmd_light) {
colorString();
reportString("light", color);
} else if (val == cmd_length) {
setLength();
reportInt("length", LENGTH);
} else if (val == cmd_start) {
running = true;
} else if (val == cmd_stop) {
runtime = now - starttime;
reportInt("stopped", runtime);
running = false;
i = 0;
}
}
void reportString (String key, String val) {
JsonObject& jsonObj = jsonBuffer.createObject();
jsonObj[key] = val;
jsonObj.printTo(Serial);
Serial.println("");
}
void reportFloat (String key, const float val) {
JsonObject& jsonObj = jsonBuffer.createObject();
jsonObj[key] = val;
jsonObj.printTo(Serial);
Serial.println("");
}
void reportInt (String key, const int val) {
JsonObject& jsonObj = jsonBuffer.createObject();
jsonObj[key] = val;
jsonObj.printTo(Serial);
Serial.println("");
}
void motor_run () {
starttime = now;
runtime = 0;
Serial.println("Starting motor");
//analogWrite(MOTOR_PIN, 255 - (i * 2));
analogWrite(MOTOR_PIN, pwm());
Serial.print("PWM = ");
Serial.println(255 - (i * 2));
Serial.print(i);
Serial.print("ft = ");
Serial.print(diameter(12.0 * 25.4 * i));
Serial.println("mm");
Serial.print(32.0 + (i * 0.4));
Serial.print("mm = ");
Serial.print(length(32.0 + (i * 0.4)) / (12 * 25.4) );
Serial.println("ft");
delay(1000);
i++;
if (i > 108) {
runtime = now - starttime;
reportInt("completed", runtime);
running = false;
i = 0;
}
}
int pwm () {
int val = 255; //full speed
return val;
}
float diameter (const float len) { //mm
'use strict';
return 2 * sqrt( ((len * THICKNESS) / PI) + pow(CORE_D / 2, 2) );
}
float length (const float diam) {
return (PI * (pow(diam / 2, 2) - pow(CORE_D / 2, 2)) ) / THICKNESS;
//var len = Math.PI * (Math.pow(d / 2, 2) - Math.pow(D / 2, 2));
//return len / THICKNESS;
}
void setAll (const int red, const int green, const int blue) {
for (volatile int x = 0; x < NUMPIXELS; x++) {
light.setPixelColor(x, red, green, blue);
}
light.show();
}
void setLength () {
while (Serial.available() == 0) {
//Wait for length string
}
lengthStr = Serial.readString();
LENGTH = lengthStr.toInt();
}
float speed (float diam) {
return (diam * PI) * RPS;
}
void colorString () {
while (Serial.available() == 0) {
//Wait for color string
}
color = Serial.readString();
commaR = color.indexOf(','); //comma trailing R
commaG = color.indexOf(',', commaR + 1);
strR = color.substring(0, commaR);
strG = color.substring(commaR + 1, commaG);
strB = color.substring(commaG + 1);
r = strR.toInt();
g = strG.toInt();
b = strB.toInt();
setAll(r, g, b);
}

2
models.txt Normal file
View File

@ -0,0 +1,2 @@
light_housing
lamp_plate

64
notes/contact_printer.js Normal file
View File

@ -0,0 +1,64 @@
var RPM = 15;
var RPS = RPM / 60; //Rotations per second, from 15RPM
var D = 31.27; //mm, Diameter of core (daylight spool here) 32, or 31.5
//var D_END = 87.16;
var THICKNESS = 0.11938; //mm, 16mm = 0.0047in thick
var PITCH = 7.6;
var TOTAL = 33 * 1000;
var roll = {};
//R = √(36000 × 0.005/π + 32) = √(57.30 + 9) = 8.14 inches.
roll.diameter = function (length) {
'use strict';
var r = Math.sqrt(((length * THICKNESS) / Math.PI) + Math.pow(D / 2, 2));
return 2 * r;
};
roll.length = function (d) {
'use strict';
var len = Math.PI * (Math.pow(d / 2, 2) - Math.pow(D / 2, 2));
return len / THICKNESS;
};
//mm/s
roll.speed = function (d) {
'use strict';
var mm = d * Math.PI;
return mm * RPS;
};
var job = {};
job.pmw = {}; //15 7.5
/*
job.pmw.values = [255, 55];
job.pmw.rps = [0.1100917431, 0.06629834254];
*/
job.state = {
motor_pwm : 255,
current_rps : RPS,
start_time : 0,
end_time : 0,
estimated_time : 0
};
job.begin = function () {
'use strict';
job.state.start_time = +new Date();
//job pins set
job.state.estimated_time = 0;
};
job.simulate = function () {
'use strict';
};
job.begin();
console.dir(job.state);

2
notes/proofs.r Normal file
View File

@ -0,0 +1,2 @@
print("Motor PWM values to maintain a constant speed");

96
notes/winding_forum.txt Normal file
View File

@ -0,0 +1,96 @@
vnkarwa
June 3rd, 2003, 03:46 AM
Can anybody have the circuit for the calculation of diameter vs. linear speed.
I have a application in the winding machine that as the coil diameter increases the linear speed increases as the rpm is fix.
I want a circuit which can reduce the referance voltage according to increase in the diameter so that the linear speed will be maintained.
Thanks a lot.
Also Mr jvdcande I want your Email address to communicate with you personally.
My address is vnkarwa@indiatimes.com
JesperMP
June 3rd, 2003, 04:05 AM
Is this a trick question ?
Speed = Diameter x Pi x RPM
If Speed is constant then
RPM = Constant Speed / (Pi x Diameter)
So RPM is inversely linear with the Diameter. It cant get much simpler than that.
Calistodwt
June 3rd, 2003, 05:24 AM
Linear velocity v = omega * r [m/s]
Where omega = 2*PI*n ( n is speed in revs per second)
and v = velocity in metres per second.
and r is the radius in metres and D is diameter in metres.
So v = 2*PI*n*r = PI*D*n [m/s]
So v is proportional to D.
Therefore v1/v2 = D1/D2
which gives: v2 = v1 * D2/D1
So with your references of diameter D1 and speed of v1 you can work out v2 for any given diameter D2
rdrast
June 3rd, 2003, 09:18 AM
If possible, the simplest solution for what (I think) you want to do, is mount a tachometer/encoder with either a belt drive, or a rubber roll, and use it as a surface speed feedback device to your drive.
If you can put such an arrangement on an arm so a belt can maintain contact with the winder roll, you are covered in all cases.
If you can only put a single roller on the material coming into the winder, you need to also put in some extra circuitry/logic to take care of the case when no material is loaded.
Peter Nachtwey
June 4th, 2003, 02:06 AM
vnkarwa, clearly stated that he wanted change his system to keep the linear speed constant and not the RPM constant as he has it now.
Although the equations are valid, they assume that the RPM is held constant.
Hint, vnkarwa, don't assume that you are the first to ask this question. I know we discussed an unwinder a few months back. Search this site and search the web. The answers are out there.
JesperMP
June 4th, 2003, 02:42 AM
Peter,
neither mine nor Calisto's replies assumes that the RPM should be kept constant.
Both formulas assumes that the speed (of the unwinded material) should be kept constant.
I found the relation between speed = f(diameter) so simple that maybe I had misunderstood something.
Calistodwt
June 5th, 2003, 05:00 AM
I assumed that what was required was to control the linear speed as the diameter of the cable coil varied; with the winding rpm assumed to be constant. From this I also assumed that the application could measure the changing diameter and use this in the velocity formula to determine a measured value for a controller. Maybe I assumed too much but then the initial information was rather vague with no further response on the suggestions made being offered by the originator.
scottezell
July 12th, 2003, 10:17 AM
The issue as I understand it is that you wish to be able to maintain a constant linear speed as the diameter decreases. The first thought is that you need to know the circumfrence of the object an any point during the cycle. ie if the cir=1 meter then at 60 rpm your linear spd is 60 m/s. but as the dia changes the spd would change at this rpm. Therefore to maintain constant linear spd you have to vary the rpm. To find the cir of the object at any point in the process it is easier if you use polar math rather than conventional math. The equation that explains this reduction in dia is R=(T/2p)*q where R=Radius T=change in diameter per revoulution p=Pi and q= Theta(angular position). if you have a graphing calculator ie ti-85 or similar change your mode to polar and enter this formula. you will basically get a spiral. This formula can be used in the calculation for circumfrence and applied as the angular velocity.
Peter Nachtwey
July 12th, 2003, 12:03 PM
The is because the change ing angular velocity is changing as the diameter changes. The simple arithmetic formulas above require that one assumes the rotational speed is constant or conituously measures the sheet speed and roll radius. With the equations below, if you know the initial conditions then one can calculate the state knowing how many encoder pulses have gone by. The calculus equations end up being pretty simple, but they look nothing like what I see above. It isn't that they are wrong. They just make assumptions that a lot of the parameters are known or measured.
Below is the link I post a long time ago for winder equations.
If you want to show the world that you know something about winding, you better study the info at this URL. It isn't hard, but it does take more effort than lifting another beer.
Winder Control Equations
http://www.apicsllc.com/apics/Ie_ias03/IAS4p5s.html
Winder Control Equations (http://www.apicsllc.com/apics/Ie_ias03/IAS4p5s.html)
( I couldn't get the link to work, but I could cut and paste the URL into my browser )
Since we are quoting rock stars now.....
"Living is easy with eyes closed, misunderstanding all you see."
Strawberry Fields Forever, John Lennon
DickDV
July 12th, 2003, 10:31 PM
You could avoid the calculus at the cost of a slight increase in error by using the static formulas and recalculating the rpm required while adjusting the diameter either up or down by double the caliper of the sheet being wound or unwound.
Use the results of this calculation to adjust the drive speed on the center shaft. Remember also that you need to tell the control system the size of the empty core so it knows what diameter to use at the beginning of a run (assuming a winder).
DickDV
July 12th, 2003, 10:35 PM
The first paragraph in my previous post should read "recalculate the rpm required after each complete revolution while adjusting the diameter...."
Peter Nachtwey
July 13th, 2003, 01:20 PM
That is why I recommend using best algorithms available.
Did you read the full report? In the end the calculus boils down to equations that use a square root and no calculus is necessary.

View File

@ -0,0 +1,61 @@
time = 0;
SPROCKET_BASE_D = 19.05; //8 frames
SPROCKET_BASE_H = 2.7;
INNER_D = 13.98;
INNER_H = 10.6;
TOP_BASE_D = 18.47;
TOP_BASE_H = 2.96;
LIP_D = 18.84;
LIP_H = 0.33;
HOLLOW_D = 4.7;
HOLLOW_BASE_D = 12.01;
HOLLOW_BASE_H = 6.09;
TOP_D = 21.66;
TOP_H = 1.4;
SPROCKET_H = 10;
SPROCKET_W = 0.79;
SPROCKET_L = 1.3;
FRAME_C = (SPROCKET_BASE_D * PI) / 8;
//echo(FRAME_C);
$fn = 100;
module sprocket () {
//cube([SPROCKET_L, SPROCKET_W, SPROCKET_H], center = true);
translate ([0, 0, -SPROCKET_H/2]) {
difference () {
translate([0, 0, 0]) scale([1, 1, 2.25]) rotate([90, 0, 90]) cylinder(r = SPROCKET_W/2, h = SPROCKET_L, center = true);
translate([0, 0, -1]) cube([2, 2, 2], center = true);
//translate([1.5, 0, 0]) rotate([0, -5, 0]) cube([2, 2, 2], center = true);
//translate([-1.5, 0, 0]) rotate([0, 5, 0]) cube([2, 2, 2], center = true);
}
}
}
module sprocketed_roller () {
difference () {
union () {
cylinder(r = SPROCKET_BASE_D / 2, h = SPROCKET_BASE_H, center = true);
translate([0, 0, (INNER_H / 2) + (SPROCKET_BASE_H / 2)]) cylinder(r = INNER_D / 2, h = INNER_H, center = true);
translate([0, 0, (TOP_BASE_H / 2) +INNER_H + (SPROCKET_BASE_H / 2)]) cylinder(r = TOP_BASE_D / 2, h = TOP_BASE_H, center = true);
translate([0, 0, (TOP_BASE_H / 2) + INNER_H + (SPROCKET_BASE_H / 2) - (TOP_BASE_H / 2) + (LIP_H / 2)]) cylinder(r = LIP_D / 2, h = LIP_H, center = true);
translate([0, 0, (TOP_BASE_H / 2) + INNER_H + (SPROCKET_BASE_H / 2) + (TOP_BASE_H / 2) - (LIP_H / 2)]) cylinder(r = LIP_D / 2, h = LIP_H, center = true);
translate([0, 0, (TOP_H / 2) + (TOP_BASE_H / 2) + INNER_H + (SPROCKET_BASE_H / 2) + (TOP_BASE_H / 2) - (LIP_H / 2)]) cylinder(r = TOP_D / 2, h = TOP_H, center = true);
}
cylinder(r = HOLLOW_D / 2, h = 100, center = true);
translate([0, 0, (HOLLOW_BASE_H / 2) - (SPROCKET_BASE_H / 2)]) cylinder(r = HOLLOW_BASE_D/2, h = HOLLOW_BASE_H + 0.1, center = true);
}
for (i = [0: 8]) {
rotate([0, 0, i * 360 / 8]) translate([(SPROCKET_BASE_D / 2) + (SPROCKET_H / 2) - .15, 0, (SPROCKET_BASE_H / 2) - (SPROCKET_L / 2)]) rotate([0, 90, 0]) sprocket();
}
}
sprocketed_roller();

View File

@ -0,0 +1,116 @@
time = 0;
$fn = 100;
SPROCKET_BASE_D = 19.05; //8 frames
SPROCKET_BASE_H = 2.7;
FRAME_C = (SPROCKET_BASE_D * PI) / 8;
SPROCKET_H = 10;
SPROCKET_W = 1;
SPROCKET_L = 1.5;
INNER_H = 10.6;
TOP_D = 21.66;
TOP_C = (TOP_D * PI) / 8;
TOP_H = 1.4;
TOP_BASE_D = 18.47;
TOP_BASE_C = (TOP_BASE_D * PI) / 8;
TOP_BASE_H = 2.96;
LIP_D = 18.84;
LIP_H = 0.33;
LIP_C = (LIP_D * PI) / 8;
echo(FRAME_C);
module bearing_laser (x, y, z, width= 8, hole = true) {
innerD = 8.05;
outerD = 22.1 - .4;
fuzz = 0.3;
translate ([x, y, z]) {
difference () {
cylinder(r = (outerD / 2) + fuzz, h = width, center = true);
if (hole) {
cylinder(r = innerD / 2 - fuzz, h = width, center = true);
}
}
}
}
module sprocket () {
translate ([0, 0, -SPROCKET_H/2]) {
difference () {
translate([0, 0, 0]) scale([1, 1.2, 2]) rotate([90, 0, 90]) cylinder(r = SPROCKET_W/2, h = SPROCKET_L, center = true);
translate([0, 0, -1]) cube([2, 2, 2], center = true);
}
}
}
module sprocketed_roller (sprockets = 8) {
D = (FRAME_C * sprockets) / PI;
LIP_D = (LIP_C * sprockets) / PI;
TOP_D = (TOP_C * sprockets) / PI;
TOP_BASE_D = (TOP_BASE_C * sprockets) / PI;
INNER_D = D - 5.07;
echo(D);
echo(LIP_D);
//top
cylinder(r = D / 2, h = SPROCKET_BASE_H, center = true);
//center
translate([0, 0, (INNER_H / 2) + (SPROCKET_BASE_H / 2)]) {
cylinder(r = INNER_D / 2, h = INNER_H, center = true);
}
//lip
translate([0, 0, (TOP_BASE_H / 2) + INNER_H + (SPROCKET_BASE_H / 2) - (TOP_BASE_H / 2) + (LIP_H / 2)]) {
cylinder(r = LIP_D / 2, h = LIP_H, center = true);
}
//bottom
translate([0, 0, (TOP_H / 2) + (TOP_BASE_H / 2) + INNER_H + (SPROCKET_BASE_H / 2) + (TOP_BASE_H / 2) - (LIP_H / 2)]) {
cylinder(r = TOP_D / 2, h = TOP_H, center = true);
}
//bottom base
translate([0, 0, (TOP_BASE_H / 2) +INNER_H + (SPROCKET_BASE_H / 2)]) {
cylinder(r = TOP_BASE_D / 2, h = TOP_BASE_H, center = true);
}
for (i = [0: sprockets]) {
rotate([0, 0, i * 360 / sprockets]) translate([(D / 2) + (SPROCKET_H / 2) - .15, 0, (SPROCKET_BASE_H / 2) - (SPROCKET_L / 2)]) rotate([0, 90, 0]) sprocket();
}
}
//rotate([0, 0, time]) sprocketed_roller(sprockets = 13);
module corner (sprockets = 8) {
}
module contact_printer_roller () {
union () {
sprocketed_roller(13);
translate([0, 0, 16]) cylinder(r = 12 / 2, h = 2, center = true);
translate([0, 0, 22]) {
difference () {
translate([0, 0, 3]) cylinder(r = 8 / 2, h = 26, center = true, $fn = 50);
translate([0, 6.5, 11]) cube([10, 10, 12], center = true);
}
}
}
}
module contact_printer_roller2 () {
innerD = 8.05;
fuzz = 0.3;
translate([0, 0, 21]) cylinder(r = innerD / 2 - fuzz, h = 10, center = true);
sprocketed_roller(13);
}
//contact_printer_roller();
//contact_printer_roller2();

773
scad/contact_printer.scad Normal file
View File

@ -0,0 +1,773 @@
include <16mm_sprocketed_roller_var.scad>
include <./lamp.scad>;
include <../box_laser/library.scad>
include <../readyCAD/ready.scad>
AT = 25.4 * 0.22;
daylight_w = 92;
daylight_h = 18;
INNER_BOX_X = 225;
INNER_BOX_Y = 400;
INNER_BOX_Z = 40;
OUTER_BOX_X = INNER_BOX_X + (25.4 / 2) + .2;
OUTER_BOX_Y = INNER_BOX_Y + (25.4 / 2) + .2;
OUTER_BOX_Z = 70;
REEL_SPACING = 250;
REEL_SPACING_X = 115;
REEL_HOLDER_Z = 4;
IDLE_SPACING = 120;
IDLE_OFFSET = 0;
IDLE_PLAY = 20;
IDLE_PLAY_ANGLE = 45;
IDLE_PLAY_SLOT = 8.1;
SPROCKETED_SPACING = 45;
SPROCKETED_OFFSET = 40;
SPROCKETED_Z = 7.5;
LAMP_Z = -3;
SLIT = 1;
BOLT_R = 2.55; //M5 25mm 0.8
BOLT_Z = 25;
INVOLUTE_SCALE = 1.45;
INVOLUTE_ROTATE = (360 / 12);
PEG_INNER_D = 4;
PEG_OUTER_D = 7;
PEG_H = 10;
PRESSURE_PEG_SPACING = 60;
PRESURE_PEG_OFFSET = -25;
BREAK_PEG_SPACING = 190;
BREAK_PEG_OFFSET = -80;
module m5_25 () {
cylinder(r = BOLT_R, h = BOLT_Z, center = true);
}
module daylight_spool (DEBUG = false) {
//inner starting d = 31.5 or 32
color([[255, 0, 0, 1]]) difference () {
cylinder(r=daylight_w / 2, h = daylight_h, center = true);
cylinder(r=(daylight_w / 2) + 1, h = daylight_h - 2, center = true);
cube([9, 9, 50], center=true);
translate([4.5, 4.5, 0]) {
rotate([0, 0, 45]) {
cube([3, 3, 50], center=true);
}
}
}
difference () {
cylinder(r = 32/2, h = daylight_h, center=true);
cylinder(r = 32/2 - 1, h = daylight_h + 1, center=true);
translate([0, 32/2, 0]) {
cube([1.3, 10, 18], center=true);
}
}
if (DEBUG) {
color([0,0,1,0.5]) cylinder(r = 300, h = 16, center=true);
}
}
module roller (DEBUG = false) {
$fn = 100;
H = 21;
echo("ROLLER_CLEARANCE");
echo(H - 4);
//translate([0, 0, 9]) cube([16, 16, 20], center = true);
difference () {
union () {
cylinder(r = 24 / 2, h = 2, center = true);
translate([0, 0, 1]) cylinder(r = 16 / 2, h = 4, center = true);
translate([0, 0, 10]) cylinder(r = 14 / 2, h = 18, center = true);
translate([0, 0, H - 3.5]) cylinder(r = 16 / 2, h = 4, center = true);
translate([0, 0, H - 2]) cylinder(r = 24 / 2, h = 2, center = true);
}
cylinder(r = (IDLE_PLAY_SLOT / 2) + .1, h = 50, center = true);
if (DEBUG){
translate([50, 0, 0]) cube([100, 100, 100], center = true);
}
}
//translate([0, 0, H/2 - 1]) cube([25, 25, H], center = true);
}
module idle_roller_peg () {
translate([0, 0, -.6]) cylinder(r = (IDLE_PLAY_SLOT / 2) - .1, h = 39.25, center = true);
translate([0, 0, -6.75]) cylinder(r = 16 / 2, h = 2.4, center = true);
}
module idle_roller_peg_top (DEBUG = false) {
difference() {
union () {
cylinder(r = (IDLE_PLAY_SLOT / 2) + 2, h = PEG_H, center = true);//inner peg
translate([0, 0, PEG_H / 2 - 1]) cylinder(r = (IDLE_PLAY_SLOT / 2) + 4, h = 2, center = true);
translate([0, 0, -PEG_H / 2 - 1]) cylinder(r = (IDLE_PLAY_SLOT / 2) + 4, h = 2, center = true);
}
translate([0, 0, (25.4 / 4)]) cylinder(r = (IDLE_PLAY_SLOT / 2), h = 15.5 , center = true);
if (DEBUG) {
translate([50, 0, 0]) cube([100, 100, 100], center = true);
}
}
}
module idle_roller_peg_cap (DEBUG = false) {
difference() {
union () {
cylinder(r = (IDLE_PLAY_SLOT / 2) + 2, h = 5.5, center = true);//inner peg
translate([0, 0, -1.75]) cylinder(r = (IDLE_PLAY_SLOT / 2) + 4, h = 2, center = true);
}
translate([0, 0, -7.1 - .2]) cylinder(r = (IDLE_PLAY_SLOT / 2), h = 15.5 , center = true);
if (DEBUG) {
translate([50, 0, 0]) cube([100, 100, 100], center = true);
}
}
}
module sprocketed_roller_peg () {
D = 4.7;
cylinder(r = (D / 2) - .1, h = 30, center = true);
translate([0, 0, -2.75]) cylinder(r = 16 / 2, h = 3, center = true);
translate([0, 0, -9.25]) cylinder(r = 6 / 2, h = 11.5, center = true);
}
module sprocketed_roller_peg_cap (DEBUG = false) {
D = 4.7;
difference() {
translate([0, 0, 1.3]) cylinder(r = 5.92 - .1, h = 6, center = true);
cylinder(r = (D / 2) - .1, h = 6, center = true);
if (DEBUG) {
translate([50, 0, 0]) cube([100, 100, 100], center = true);
}
}
}
module reel_holder (top = true) {
$fn = 60;
SQUARE_INNER = 8;
difference(){
translate([0, 0, -1.5]) cube([SQUARE_INNER, SQUARE_INNER, 21.5], center= true);
for (i = [0:4]) {
rotate([0, 0, (i * 90)]){
translate([(SQUARE_INNER / 2) + .4, (SQUARE_INNER / 2) + .4, 18.5 / 2]) rotate([0, -15, 45]) cube([2.5, SQUARE_INNER, SQUARE_INNER], center = true);
}
}
}
difference () {
union() {
translate([0, 0, (18.5 / 2) + (3.5 / 2)]) cylinder(r = SQUARE_INNER / 2, h = 3.5, center = true);
translate([0, 0, (18.5 / 2) + (7.5 / 2)]) sphere(SQUARE_INNER / 2, center = true);
}
translate ([0, 0, (18.5 / 2) + 7.5]) cube([10, 10, 2], center = true);
}
difference () {
translate([0, 0, -(18.5/ 2) - (3 / 2) - 3]) cylinder(r = 16 /2, h = 3, center = true);
//translate([0, 0, -14.3]) cube([4, 4, 2], center = true); //notch
difference() {
translate([0, 0, -14.3]) cylinder(r = 8 / 2, h = 2, center = true);
translate([0, 6, -14.3]) cube([8, 8, 2], center = true);
}
}
}
module bearing_laser (x, y, z, width= 8, hole = true) {
innerD = 8.05;
outerD = 22.1 - .5;
fuzz = 0.1;
translate ([x, y, z]) {
difference () {
cylinder(r = outerD / 2 + fuzz, h = width, center = true);
if (hole) {
cylinder(r = innerD / 2 - fuzz, h = width, center = true);
}
}
}
}
module inner_box (DUMMY = false) {
difference () {
//8.8 inches x 15 inches
if (DUMMY) {
color("lightblue") cube([INNER_BOX_X, INNER_BOX_Y, 6], center = true);
} else {
translate([0, -209.5, 0]) Box2D([INNER_BOX_X, INNER_BOX_Y, INNER_BOX_Z], SIDE_TABS = 1, TOP_TABS = 0, TOP = false, BOTTOM_TABS = 3, MATERIAL = 6);
//translate([INNER_BOX_X + 4, 14, 0]) cube([INNER_BOX_X, INNER_BOX_Y, INNER_BOX_Z], center = true);
}
idle_play_voids();
bearing_voids();
sprocketed_voids();
elastic_peg_voids();
//takeup motor mount point
translate([0, 157 + 1.25, 0]) {
cylinder(r = 6, h = 100, center = true);
//bolts
translate([(15.2 / 2), 19.14 + 1, 0]) cylinder(r = (3.75 / 2), h = 100, center = true);
translate([-(15.2 / 2), 19.14 +1, 0]) cylinder(r = (3.75 / 2), h = 100, center = true);
}
//drive motor mount point
translate([5, 0, 14.5]) rotate([0, 0, 90]) {
cylinder(r = 6, h = 100, center = true);
translate([(15.2 / 2), 19.14 + 1, 0]) cylinder(r = (3.75 / 2), h = 100, center = true);
translate([-(15.2 / 2), 19.14 +1, 0]) cylinder(r = (3.75 / 2), h = 100, center = true);
}
//light mount points, 40mm spread
translate([75, 20, 0]) cylinder(r = 3, h = 7, center = true);
translate([75, -20, 0])cylinder(r = 3, h = 7, center = true);
//Hole for light strip
translate([87, 0, 0]) cylinder(r = 5, h = 50, center = true);
//Hole for power cable to motor
translate([-10, 195, 0]) cylinder(r = 2, h = 50, center = true);
CENTER_ELEC = 546;
//Arduino USB B plug hole
translate([CENTER_ELEC, -205, 0]) cube([11.5, 11.5, 20], center = true);
//DC power
translate([CENTER_ELEC + 30, -205, 0]) cylinder(r = (11.5 / 2), h = 20, center = true);
}
}
module outer_box (DUMMY = false) {
difference () {
if (DUMMY) {
cube([OUTER_BOX_X, OUTER_BOX_Y, OUTER_BOX_Z], center = true);
} else {
translate([0, -209.5, 0]) Box2D([OUTER_BOX_X, OUTER_BOX_Y, OUTER_BOX_Z], SIDE_TABS = 1, TOP_TABS = 0, TOP = false, BOTTOM_TABS = 3, MATERIAL = 6);
}
CENTER_ELEC = 571;
//Arduino USB B plug hole
translate([CENTER_ELEC, -205, 0]) cube([11.5, 11.5, 20], center = true);
//DC power
translate([CENTER_ELEC + 30, -205, 0]) cylinder(r = (11.5 / 2), h = 20, center = true);
}
}
module light_source () {
//light mount points, 40mm spread
translate([0, 20, 0]) cylinder(r = 3, h = 7, center = true);
translate([0, -20, 0])cylinder(r = 3, h = 7, center = true);
translate ([10, 0, (7 / 2) + (3 / 2)]) {
rounded_cube([55, 80, 3], d = 20, center = true);
translate ([0, 0, 0]) {
cube([55 / 2, 80, 3], d = 20, center = true);
}
}
}
module idle_play_voids () {
translate([IDLE_OFFSET, IDLE_SPACING / 2, 0]) {
rotate([0, 0, IDLE_PLAY_ANGLE]) {
cube([IDLE_PLAY, IDLE_PLAY_SLOT, 50], center = true);
translate([IDLE_PLAY / 2, 0, 0]) cylinder(r = IDLE_PLAY_SLOT / 2, h = 50, center = true);
translate([-IDLE_PLAY / 2, 0, 0]) cylinder(r = IDLE_PLAY_SLOT / 2, h = 50, center = true);
}
}
translate([IDLE_OFFSET, -IDLE_SPACING / 2, 0]) {
rotate([0, 0, -IDLE_PLAY_ANGLE]) {
cube([IDLE_PLAY, IDLE_PLAY_SLOT, 50], center = true);
translate([IDLE_PLAY / 2, 0, 0]) cylinder(r = IDLE_PLAY_SLOT / 2, h = 50, center = true);
translate([-IDLE_PLAY / 2, 0, 0]) cylinder(r = IDLE_PLAY_SLOT / 2, h = 50, center = true);
}
}
}
module bearing_voids () {
bearing_laser(REEL_SPACING_X / 2, REEL_SPACING / 2, 0, hole = false);
bearing_laser(REEL_SPACING_X / 2, -REEL_SPACING / 2, 0, hole = false);
bearing_laser(-REEL_SPACING_X / 2, REEL_SPACING / 2, 0, hole = false);
bearing_laser(-REEL_SPACING_X / 2, -REEL_SPACING / 2, 0, hole = false);
}
module sprocketed_voids () {
//translate([SPROCKETED_OFFSET, -SPROCKETED_SPACING / 2, 0]) {
//cylinder(r = 6 / 2, h = 50, center = true);
//}
//translate([SPROCKETED_OFFSET, SPROCKETED_SPACING / 2, 0]) {
//cylinder(r = 6 / 2, h = 50, center = true);
//}
bearing_laser(SPROCKETED_OFFSET, SPROCKETED_SPACING / 2, 0, hole=false);
bearing_laser(SPROCKETED_OFFSET, -SPROCKETED_SPACING / 2, 0, hole=false);
}
module gate () {
H = 20;
GATE_D = 65;
BOX_X = 39;
BOX_Y = 100;
difference () {
intersection () {
translate([-1, 0, 0]) cube([4, 16, H + 4], center = true);
translate([GATE_D / 2 - 3, 0, 0]) cylinder(r = GATE_D / 2, h = H + 4, center = true);
}
translate([0, 0, -2]) cube([50, SLIT, H], center = true);
}
//side walls
translate([8, 10, 0]) rotate([0, 0, 20]) cube([20, 4, H + 4], center = true);
translate([8, -10, 0]) rotate([0, 0, -20]) cube([20, 4, H + 4], center = true);
translate([BOX_X - 6, 0, 0]) {
difference () {
rounded_cube([BOX_X, BOX_Y, H + 4], d = 6, center = true);
cube([BOX_X - 8, BOX_Y - 8, H + 4 + 1], center = true);
translate([-BOX_X / 2, 0, 0]) cube([BOX_X, 24, H + 4 + 1], center = true);
translate([BOX_X / 2, 30, -9]) cube([20, 20, 8], center = true);
}
}
}
module bearing_hobbled_rod () {
RH_CONNECT_R = 4; //inside of bearing
difference () {
cylinder(r = RH_CONNECT_R, h = 30, center = true);
translate([RH_CONNECT_R + 2, 0, 0]) cube([RH_CONNECT_R * 2, RH_CONNECT_R * 2, 31], center = true);
}
}
module motor_hobbled_rod (h = 11) {
difference () {
translate([0, 0, 0]) cylinder(r = 5.9 / 2, h = h, center = true, $fn = 24);
translate([5.3, 0, 0]) cube([6, 6, h + .1], center = true);
}
}
module motor_15RPM (DEBUG = false) {
H = 52;
ROD = 16;
difference () {
union(){
cylinder(r = 37 / 2, h = H, center = true);
translate([0, -6, -(H / 2) - (6 / 2 )]) cylinder(r = 6, h = 6, center = true);
translate([0, -6, -(H / 2) - 6 - (ROD / 2)]) motor_hobbled_rod(ROD);
}
if (DEBUG) {
translate([50, 0, 0]) cube([100, 100, 100], center = true);
}
}
}
module gears_to_cut () {
//http://hessmer.org/gears/InvoluteSpurGearBuilder.html
//settings 12 and 24 gears
//render with projection()
GEAR_2_CENTER = 57.8 + 8.6;
difference () {
scale([INVOLUTE_SCALE, INVOLUTE_SCALE, INVOLUTE_SCALE]) {
union () {
linear_extrude(height = 1) import("../dxf/InvoluteGear_1.dxf");
translate([0, 0, 0.5]) cube([20, 20, 1], center = true);
translate([GEAR_2_CENTER / INVOLUTE_SCALE, 0, 0.5]) cube([20, 20, 1], center = true);
}
}
bearing_hobbled_rod();
translate([GEAR_2_CENTER, 0, 0]) {
//bearing_hobbled_rod();
motor_hobbled_rod();
}
}
//find gear 2 center
//translate([GEAR_2_CENTER, 0, 0])cylinder(r = 3, h = 30, center = true);
}
module gears_to_cut_2 () {
//http://hessmer.org/gears/InvoluteSpurGearBuilder.html
//settings 20 and 12 gears
//render with projection()
GEAR_2_CENTER = 40.75;
ORIENTATION = 0;
difference () {
union () {
linear_extrude(height = 1) import("../dxf/InvoluteGear_2.dxf");
}
motor_hobbled_rod();
translate([GEAR_2_CENTER, 0, 30]) {
rotate([180, 0, ORIENTATION]) contact_printer_roller();
}
}
//find gear 2 center
//translate([GEAR_2_CENTER, 0, 0])cylinder(r = 1/2, h = 30, center = true);
}
module drive_gear_cap () {
difference () {
union () {
cylinder(r = 5, h = 5, center = true);
translate([0, 0, -(5 / 2) + (1.5 / 2)]) cylinder(r = 8, h = 1.5, center = true);
}
motor_hobbled_rod(11);
}
}
module temp_inner_walls () {
difference () {
cube([INNER_BOX_X, INNER_BOX_Y, INNER_BOX_Z], center = true);
cube([INNER_BOX_X - (25.4 / 2), INNER_BOX_Y - (25.4 / 2), INNER_BOX_Z + 1], center = true);
}
}
module temp_outer_walls () {
difference () {
cube([OUTER_BOX_X, OUTER_BOX_Y, OUTER_BOX_Z], center = true);
cube([OUTER_BOX_X - (25.4 / 2), OUTER_BOX_Y - (25.4 / 2), OUTER_BOX_Z + 1], center = true);
}
}
module temp_bottom () {
difference () {
cube([OUTER_BOX_X, OUTER_BOX_Y, 6], center = true);
}
}
module elastic_peg_bottom (DEBUG = false) {
difference() {
union () {
cylinder(r = PEG_INNER_D / 2, h = PEG_H, center = true);//inner peg
translate([0, 0, PEG_H / 2 - 1]) cylinder(r = PEG_OUTER_D, h = 2, center = true);
}
if (DEBUG) {
translate([50, 0, 0]) cube([100, 100, 100], center = true);
}
}
}
module elastic_peg_top (DEBUG = false) {
difference() {
union () {
cylinder(r = PEG_OUTER_D / 2, h = PEG_H, center = true);//inner peg
translate([0, 0, PEG_H / 2 - 1]) cylinder(r = PEG_OUTER_D, h = 2, center = true);
translate([0, 0, -PEG_H / 2 - 1]) cylinder(r = (PEG_OUTER_D / 2) + 2, h = 2, center = true);
}
translate([0, 0, (25.4 / 4)]) cylinder(r = (PEG_INNER_D / 2), h = PEG_H , center = true);
if (DEBUG) {
translate([50, 0, 0]) cube([100, 100, 100], center = true);
}
}
}
module elastic_peg_voids () {
translate ([PRESURE_PEG_OFFSET, PRESSURE_PEG_SPACING / 2, 0]){
cylinder(r = (PEG_INNER_D / 2) + .1, h = 50, center = true);
}
translate ([PRESURE_PEG_OFFSET, -PRESSURE_PEG_SPACING / 2, 0]) {
cylinder(r = (PEG_INNER_D / 2) + .1, h = 50, center = true);
}
translate ([BREAK_PEG_SPACING / 2, BREAK_PEG_OFFSET, 0]){
cylinder(r = (PEG_INNER_D / 2) + .1, h = 50, center = true);
}
translate ([-BREAK_PEG_SPACING / 2, BREAK_PEG_OFFSET, 0]) {
cylinder(r = (PEG_INNER_D / 2) + .1, h = 50, center = true);
}
}
module reel_holder_bearing () {
$fn = 40;
BASE_D = 14;
//translate([0, 0, -0.9]) cube([3.9, 3.9, 1.9], center = true);
difference() {
translate([0, 0, -0.9]) cylinder(r = 8 / 2, h = 1.9, center = true);
translate([0, 6, -0.9]) cube([8, 8, 1.9], center = true);
}
translate([0, 0, -5.8]) cylinder(r = 8 / 2, h = 8, center = true);
translate([0, 0, -9.9]) cylinder(r = BASE_D / 2, h = 2, center=true);
}
module reel_holder_breaked () {
BREAK_D = 24;
BREAK_INNER_D = 20;
BREAK_VOID = 6;
reel_holder_bearing();
translate([0, 0, -11.5]) cylinder(r = BREAK_D / 2, h = 2, center = true);
translate([0, 0, -11.5 - BREAK_VOID / 2 - 1]) cylinder(r = BREAK_INNER_D / 2, h = BREAK_VOID, center = true);
translate([0, 0, -11.5 - BREAK_VOID - 2]) cylinder(r = BREAK_D / 2, h = 2, center = true);
}
module break () {
BREAK_INNER_D = 20.5;
BREAK_H = 5;
THICKNESS = 8;
difference() {
cylinder(r = (BREAK_INNER_D / 2) + THICKNESS, h = BREAK_H, center = true);
cylinder(r = BREAK_INNER_D / 2, h = BREAK_H + 1, center = true);
translate([0, 50, 0]) cube([100, 100, 100], center = true);
}
translate ([(BREAK_INNER_D / 2) + 11, 0, 0]) {
difference () {
translate([-2, 0, 0]) cylinder(r = 9, h = BREAK_H, center = true);
cylinder(r = 3, h = BREAK_H + 1, center = true);
translate([0, -50, 0]) cube([100, 100, 100], center = true);
}
translate([5, 0, 0]) cylinder(r = 2, h = BREAK_H, center = true);
}
translate ([-(BREAK_INNER_D / 2) - 11, 0, 0]) {
difference () {
translate([2, 0, 0]) cylinder(r = 9, h = BREAK_H, center = true);
cylinder(r = 3, h = BREAK_H + 1, center = true);
translate([0, -50, 0]) cube([100, 100, 100], center = true);
}
translate([-5, 0, 0]) cylinder(r = 2, h = BREAK_H, center = true);
}
}
module reel_holder_gear () {
reel_holder_bearing();
translate([0, 0, -13]) {
difference() {
translate([0, 0, -0.9]) cylinder(r = 8 / 2, h = 24.5 / 4, center = true);
translate([0, 6, -0.9]) cube([8, 8, (24.5 / 4) + 1], center = true);
}
}
}
module idle_roller_plate () {
//translate([0, 0, -.5]) cube([70, 70, 1], center = true);
translate([0, 0, 1]) roller();
translate([0, 30, (39.25 / 2) + .6]) idle_roller_peg();
translate([30, 30, PEG_H / 2 + 2]) idle_roller_peg_top();
translate([30, 0, 5.5 / 2]) rotate([180, 0, 0]) idle_roller_peg_cap();
}
module sprocketed_roller_plate () {
translate([0, 0, 15]) sprocketed_roller_peg();
translate([20, 0, 4.5]) rotate([180, 0, 0]) sprocketed_roller_peg_cap();
}
module plate () {
//translate([0, 0, -.5]) cube([150, 150, 1], center = true);
//pressure elastic_pegs
translate([60, 60, PEG_H / 2]) rotate([180, 0, 0]) elastic_peg_bottom();
translate([60, 45, (PEG_H / 2) + 2]) elastic_peg_top();
translate([45, 60, PEG_H / 2]) rotate([180, 0, 0]) elastic_peg_bottom();
translate([45, 45, (PEG_H / 2) + 2]) elastic_peg_top();
//break elastic_pegs
translate([30, 60, PEG_H / 2]) rotate([180, 0, 0]) elastic_peg_bottom();
translate([30, 45, (PEG_H / 2) + 2]) elastic_peg_top();
translate([15, 60, PEG_H / 2]) rotate([180, 0, 0]) elastic_peg_bottom();
translate([15, 45, (PEG_H / 2) + 2]) elastic_peg_top();
//reel holders
translate([60, 25, 15.25]) reel_holder();
translate([40, 25, 15.25]) reel_holder();
translate([20, 25, 15.25]) reel_holder();
translate([00, 25, 15.25]) reel_holder();
}
module sprocketed_roller_mold () {
//sprocketed_roller();
//translate([0, 0, 5]) cube([32, 32, 22],center=true);
//(CUBE = [100, 200, 50], MATERIAL = 3, SIDE_TABS = 1, BOTTOM = true, BOTTOM_TABS = 3, TOP = true, TOP_TABS = 4, PADDING = 4, PROJECTION = false)
Box2D([32, 32, 22], MATERIAL = 3, SIDE_TABS = 2, BOTTOM = true, BOTTOM_TABS = 2, TOP = false, PROJECTION = true);
}
module contact_printer (DEBUG = false) {
translate([0, 0, -15]) inner_box(true);
translate ([0, 15, 5 - (25.4 / 8)]) temp_inner_walls();
translate ([0, 15, -8 + (25.4 / 4) ]) temp_outer_walls();
//translate ([0, 15, -(25.4 / 4) - 12]) temp_bottom();
//projection()
//gears_to_cut();
//translate([0, 0, 20]) reel_holder();
//rotate([0, 0, 90]) bearing_hobbled_rod();
//translate([53, 0, .25]) gate();
translate ([PRESURE_PEG_OFFSET, PRESSURE_PEG_SPACING / 2, -14.25]) {
elastic_peg_bottom();
translate([0, 0, -25.4 / 4 - 2.2]) elastic_peg_top();
}
translate ([PRESURE_PEG_OFFSET, -PRESSURE_PEG_SPACING / 2, -14.25]) {
elastic_peg_bottom();
translate([0, 0, -25.4 / 4 - 2.2]) elastic_peg_top();
}
translate ([BREAK_PEG_SPACING / 2, BREAK_PEG_OFFSET, -14.25]) {
elastic_peg_bottom();
translate([0, 0, -25.4 / 4 - 2.2]) elastic_peg_top();
}
translate ([-BREAK_PEG_SPACING / 2, BREAK_PEG_OFFSET, -14.25]) {
elastic_peg_bottom();
translate([0, 0, -25.4 / 4 - 2.2]) elastic_peg_top();
}
//negative feed
translate([REEL_SPACING_X / 2, -REEL_SPACING / 2, 0]) {
translate([0, 0, 1]) daylight_spool();
translate([0, 0, REEL_HOLDER_Z]) reel_holder();
//translate([0, 0, -10]) reel_holder_breaked();
translate([0, 0, -25.5]) rotate([0, 0, -40]) break();
}
//negative takeup
translate([REEL_SPACING_X / 2, REEL_SPACING / 2, 0]) {
translate([0, 0, 1]) daylight_spool();
translate([0, 0, REEL_HOLDER_Z]) reel_holder();
translate([0, 0, -10]) reel_holder_gear();
}
//print stock feed
translate([-REEL_SPACING_X / 2, -REEL_SPACING / 2, 0]) {
translate([0, 0, 1]) daylight_spool();
if (DEBUG) {
translate([0, 0, 1]) color([1, 1, 1, .5]) cylinder(r = 150, h = 16, center = true);
}
translate([0, 0, REEL_HOLDER_Z]) reel_holder();
//translate([0, 0, -10]) reel_holder_breaked();
translate([0, 0, -25.5]) rotate([0, 0, 40]) break();
}
//print stock takeup
translate([-REEL_SPACING_X / 2, REEL_SPACING / 2, 0]) {
//translate([0, 0, 1]) daylight_spool();
translate([0, 0, REEL_HOLDER_Z]) reel_holder();
translate([0, 0, -10]) reel_holder_gear();
}
translate([IDLE_OFFSET - 7, (IDLE_SPACING / 2) - 7, -9]) {
roller();
translate([0, 0, 5]) idle_roller_peg();
translate([0, 0, -14]) idle_roller_peg_top();
translate([0, 0, 23]) idle_roller_peg_cap();
}
translate([IDLE_OFFSET, -(IDLE_SPACING / 2), -9]) {
translate([0, 0, 0.5]) roller(DEBUG);
translate([0, 0, 5]) idle_roller_peg();
translate([0, 0, -14]) idle_roller_peg_top(DEBUG);
translate([0, 0, 23.5]) idle_roller_peg_cap(DEBUG);
}
translate([SPROCKETED_OFFSET, -SPROCKETED_SPACING / 2, SPROCKETED_Z]) {
rotate([180, 0 ,0]) {
//difference () {
contact_printer_roller();
//translate([50, 0, 0]) cube([100, 100, 100], center = true);
//}
}
//translate([0, 0, -15]) sprocketed_roller_peg();
//translate([0, 0, -3]) sprocketed_roller_peg_cap();
}
translate([SPROCKETED_OFFSET, SPROCKETED_SPACING / 2, SPROCKETED_Z]) {
rotate([180, 0 ,0]) contact_printer_roller();
//translate([0, 0, -15]) sprocketed_roller_peg();
//translate([0, 0, -3]) sprocketed_roller_peg_cap();
}
//find motor mount point
//translate([0, 157, 0]) cylinder(r = 3, h = 100, center = true);
//takeup motor
translate([0, 157 + 6 + 1.25, 14 + .5]) motor_15RPM();
translate([0, 0, 14.5]) rotate([0, 0, 90]) motor_15RPM();
echo("ROTATING GEARS");
echo(INVOLUTE_ROTATE);
translate([-REEL_SPACING_X / 2, REEL_SPACING / 2, -23]) rotate([0, 0, INVOLUTE_ROTATE]) gears_to_cut();
//translate([REEL_SPACING_X / 2, REEL_SPACING / 2, -23]) rotate([0, 0, 180 - INVOLUTE_ROTATE ]) gears_to_cut();
//translate([75, 0, -15]) light_source();
}
module reel_holder_plate () {
reel_holder();
translate([0, 20, 0]) reel_holder();
translate([20, 20, 0]) reel_holder();
translate([20, 0, 0]) reel_holder();
}
//corner pieces for outer box to support inner box
/*
___________
|/ \|
| |
|\_______/|
*/
module spacer () {
H = 16.3;
W = 25;
difference () {
rotate([0, 0, 45]) cube([W, W, H], center = true);
translate([150, 0, 0]) cube([300, 300, 300], center = true);
}
}
module four_point_connector () {
$fn = 120;
X = 35;
Y = 40;
H = 8.5;
Z = ((H - 6) / 2) - 1;
translate([0, 0, -4.5]) {
difference () {
//plate
rounded_cube([X + 5.6 + 2, Y + 5.6 + 2, 3], d = 2.8 * 2, center = true);
//negative
rounded_cube([X - 7, Y - 7, 4], d = 20, center = true);
}
}
translate([X / 2, Y / 2, Z + 2.5]) cylinder(r = 2.8, h = H + 5, center = true);
translate([X / 2, -Y / 2, Z + 2.5]) cylinder(r = 2.8, h = H + 5, center = true);
translate([-X / 2, Y / 2, Z + .5]) cylinder(r = 2.8, h = H + 1, center = true);
translate([-X / 2, -Y / 2, Z + .5]) cylinder(r = 2.8, h = H + 1, center = true);
}
//contact_printer();
/*projection() {
intersection () {
inner_box();
translate([30, 0, 0]) cube([130, 160, 50], center = true);
}
}*/
//translate([23, 0, 0]) cube([35, 45, 5], center = true);
//translate([8, 0, -26]) rotate([0, 0, 34]) import("/home/mathias/Desktop/InvoluteGear_2.dxf");
//translate([20, 0, -20]) cube([41.6, 0.5, 2], center = true);
//translate([0, 0, 6]) outer_box();
//translate([57.5, 0, 0]) four_point_connector();
translate([40, 0, LAMP_Z]) rotate([0, 0, -90]) {
lamp_plate();
//light_housing();
//light_housing();
}
//reel_holder_plate();
//reel_holder();
//translate([60, 45, PEG_H / 2]) rotate([180, 0, 0]) elastic_peg_top();
//reel_holder_breaked();
//projection() gears_to_cut();
//projection() gears_to_cut_2();
//drive_gear_cap();
//break();
//sprocketed_roller();
//sprocketed_roller_plate();
//projection()
//translate([0, 0, 15 - 6]) inner_box(true);
//projection() outer_box();
//idle_roller_plate();
//plate();
//roller();
//light_source();
//spacer();
//contact_printer_roller();
//sprocketed_roller_mold();

View File

@ -0,0 +1,8 @@
difference () {
union () {
translate([0, 0, 9.5/4]) cube([25.4, 9.5 * 2, 25.4 + (9.5 / 2)], center = true);
translate([0, (25.4 * 3) / 2, 0]) cube([25.4, 25.4 * 3, 25.4], center = true);
}
cube([25.4, 9.7, 25.4], center = true);
translate([5, 9.5 + (25.4 * 3) / 2, 14]) rotate([0, 45, 0]) cube([25.4 * 2, 25.4 * 3, 25.4], center = true);
}

View File

@ -0,0 +1,40 @@
include <../readyCAD/ready.scad>
in = 25.4;
$fn = 100;
module arrow () {
difference () {
cube([20, 10, 15], center=true);
translate([0, 0, 5]) rotate([0, 20, 0]) cube([230, 10, 15], center=true);
translate([0, -8, 0]) rotate([0, 0, 15]) cube([230, 10, 15], center=true);
translate([0, 8, 0]) rotate([0, 0, -15]) cube([230, 10, 15], center=true);
}
}
module dial () {
rod_d = (3/8) * in;
outer_d1 = 58;
outer_d2 = 48;
dial_d1 = 30;
dial_d2 = 25;
dial_h2 = 10;
dial_h = 15;
difference () {
union(){
translate([0, 0, dial_h/2]) cylinder(r1 = outer_d1/2, r2 = outer_d2/2, h = dial_h, center =true);
translate([0, 0, dial_h + (dial_h2/2)]) cylinder(r1 = dial_d1/2, r2 = dial_d2/2, h = dial_h2, center =true);
translate([33, 0, 7.5]) arrow();
}
translate([0, 0, rod_d/2 - .5]) cylinder(r = rod_d/2, h = rod_d, center=true);
translate([rod_d - .5, 0, rod_d/2 - .5]) cube([rod_d, 3, rod_d], center=true);
translate([rod_d + 2.5, 0, rod_d/2 - .5]) cube([4, (in/4) + 2, rod_d], center=true);
}
}
//intersection(){
dial();
rotate([0, 0, 20]) decoys(41, 2, 7);
//translate([0, 5.5, 7]) cube([32, 11, 14], center=true);
//}

View File

@ -0,0 +1,131 @@
include <../ReadyCAD/ready.scad>;
OUTER_D = 44.45;
CAP_D = 57.15;
WALL_THICKNESS = 3;
LENGTH = 95.25;
$fn = 100;
module rail_neg () {
cube([17.4, 4, 120], center = true);
cube([35, 4, 95], center = true);
translate([17.4, -1.5, 0]) cube([17.5, 4, 96], center = true);
translate([-17.4, -1.5, 0]) cube([17.5, 4, 96], center = true);
}
module rail_guide () {
translate([10.2, 0, 0]) cube([3, 4, 72], center = true);
translate([-10.2, 0, 0]) cube([3, 4, 72], center = true);
translate([10.2 - .6, 1.5, 0]) cube([4.3, 1, 72], center = true);
translate([-10.2 + .6, 1.5, 0]) cube([4.3, 1, 72], center = true);
}
module fan_holes () {
dist = 29;
cylinder(r = 34/2, h = 500, center = true);
translate([dist/2, dist/2, 0]) cylinder(r = 2.9/2, h = 500, center = true);
translate([dist/2, -dist/2, 0]) cylinder(r = 2.9/2, h = 500, center = true);
//translate([-dist/2, -dist/2, 0]) cylinder(r = 2.9/2, h = 500, center = true);
translate([-dist/2 + 2.1, -dist/2 + 2.1, 0]) rotate([0, 0, 45]) cube([5, 5, 500], center = true);
translate([-dist/2, dist/2, 0]) cylinder(r = 2.9/2, h = 500, center = true);
}
module light_holder (DECOYS = false) {
//cap
$fn = 200;
difference () {
translate([0,0,(LENGTH / 2) + (WALL_THICKNESS / 2) ]) {
cylinder(r = CAP_D / 2, h = WALL_THICKNESS, center = true);
}
translate([0, 22, 0]) rail_neg();
fan_holes();
}
//tube
difference () {
cylinder(r = OUTER_D / 2, h = LENGTH, center = true);
cylinder(r = (OUTER_D / 2) - WALL_THICKNESS, h = LENGTH + 10, center = true);
translate([0, 22, 0]) rail_neg();
//light
translate([0, 20, -41 + 6]) rotate([90, 0, 0]) cylinder(r = 13/2, h = 25, center = true);
}
//rail
translate([0, 20.5, 12]) rail_guide();
if (DECOYS) {
decoys(36, 48.6, 6);
}
}
module rail (DECOYS = false) {
difference () {
union () {
translate([0, 20.7, 2.4]) cube([17, 1.3, 100], center = true);
translate([0, 21.9, 2.4]) cube([14.2, 2.8, 100], center = true);
}
translate([0, 20, -41 + 6]) rotate([90, 0, 0]) cylinder(r = 9/2, h = 25, center = true);
translate([0, 23.4, -41 + 6]) rotate([90, 0, 0]) cylinder(r = 13/2, h = 3, center = true);
}
translate([0, 24, 52.2]) cube([24, 8, 3], center = true);
if (DECOYS) {
translate([0, 0, -35]) rotate([90, 45, 0]) decoys(25, -22.05);
translate([0, 0, 42]) rotate([90, 45, 0]) decoys(25, -22.05);
}
};
module baffle (DECOYS = false) {
//print 3 of these
difference () {
cylinder(r = (OUTER_D / 2) - WALL_THICKNESS - 0.3, h = 7, center = true);
cylinder(r = (OUTER_D / 2) - WALL_THICKNESS - 2, h = 8, center = true);
}
difference () {
translate([0, 0, 2.5]) cylinder(r = (OUTER_D / 2) - WALL_THICKNESS - 0.3, h = 2, center = true);
translate([58, 0, 0]) cube([100, 100, 100], center = true);
}
if (DECOYS) {
decoys(28, 1.5, 6);
}
}
module LED_mount () {
$fn = 200;
difference () {
cylinder(r = (OUTER_D / 2) - WALL_THICKNESS - 0.015, h = 10, center = true);
cylinder(r = (OUTER_D / 2) - WALL_THICKNESS - 0.015 - 2, h = 11, center = true);
translate([0, (OUTER_D / 2) +4, 0]) cube([OUTER_D, OUTER_D, OUTER_D], center = true);
}
translate ([0, 0, -4.5]) {
intersection() {
difference () {
cylinder(r = (OUTER_D / 2) - WALL_THICKNESS - 0.015, h = 15, center = true);
cylinder(r = (OUTER_D / 2) - WALL_THICKNESS - 0.015 - 2, h = 16, center = true);
}
translate ([0, -17, -1]) cube([7, 7, 15], center = true);
}
}
difference () {
union () {
difference () {
translate([0, -6, 0]) cube([OUTER_D - 8, 2, 10], center = true);
translate([OUTER_D / 2 - 3.5, -6.5, 0]) rotate([0, 0, 60]) cube([4, 2, 10], center = true);
translate([-OUTER_D / 2 + 3.5, -6.5, 0]) rotate([0, 0, -60]) cube([4, 2, 10], center = true);
}
translate([7.5, -5, 0]) cube([4, 4, 10], center = true);
translate([-7.5, -5, 0]) cube([4, 4, 10], center = true);
}
translate([7.5, 0, 0]) rotate([90, 0, 0]) cylinder(r = 1, h = 40, center = true);
translate([0, 0, 0]) rotate([90, 0, 0]) cylinder(r = 1, h = 40, center = true);
translate([-7.5, 0, 0]) rotate([90, 0, 0]) cylinder(r = 1, h = 40, center = true);
}
translate([0, -8, 0]) scale([1.5, 1, 1]) decoys(20, 3);
}
//rail(true);
/*difference() {
light_holder(false);
//translate([0, 0, -36]) LED_mount();
translate([0, 0, 60]) cube([200, 200, 200], center = true);
}
decoys(30, -45.64, 6);*/
baffle();

346
scad/lamp.scad Normal file
View File

@ -0,0 +1,346 @@
$fn = 80;
include <../readyCAD/ready.scad>;
include <./16mm_sprocketed_roller_var.scad>;
BRACE_L = 24;
PLATE_L = 47;
Z = 36;
X = 45;
OUTER_W = 34;
INNER_W = 22.3;
module roller_base (X = 40) {
BEARING_OUTER_D = 22;
BEARING_INNER_D = 8;
R = BEARING_OUTER_D / 2;
BEARING_H = 10;
EXTRA_1 = 1;
EXTRA_2 = 3;
TEST_PAD = X;
MOUNT_HOLES = 27;
OFFSET_H = 2;
//cylinder(r = R, h = BEARING_H, center = true);
translate ([0, 0, -(BEARING_H / 2) - 1]) {
difference() {
translate([0, 0, -1]) cylinder(r = R + EXTRA_2, h = OFFSET_H, center = true);
cylinder(r = BEARING_OUTER_D / 2, h = OFFSET_H + 1, center = true);
}
}
translate ([0, 0, -(BEARING_H / 2) - (OFFSET_H / 2) - 2]) {
cylinder(r = TEST_PAD / 2.5, h = 2, center = true);
}
}
module lamp_plate() {
//middle
difference () {
union () {
//round sides
translate([X / 2, 0, 0]) roller_base(X);
translate([-X / 2, 0, 0]) roller_base(X);
//corners
translate([12 + X / 2, 9, -8]) cube([PLATE_L / 2, PLATE_L / 2, 2], center = true);
translate([-12 - X / 2, 9, -8]) cube([PLATE_L / 2, PLATE_L / 2, 2], center = true);
//middle flat plane
translate([0, 0, -8]) cube([X, Z, 2], center = true);
//back flat plane
translate([0, Z, -8]) {
difference () {
cube([X + PLATE_L, Z, 2], center = true);
//back corner voids
translate([32, 5, 0]) cube([30, Z + 1, 3], center = true);
translate([-32, 5, 0]) cube([30, Z + 1, 3], center = true);
//void for lamp housing
translate([0, 0, 0]) cube([34.15, Z + 1, 3], center = true);
}
}
}
//laser voids
translate([X / 2, 0, 0]) cylinder(r = 22 / 2, h = 31, center = true);
translate([-X / 2, 0, 0]) cylinder(r = 22 / 2, h = 31, center = true);
}
//pegs for corners
translate ([41, 20 - 4.5, 4 - 6]) {
difference () {
cylinder(r = 3 - .2, h = 12, center = true);
translate([0, 7, 0]) cube([10, 10, 50], center = true);
}
translate([0, 0, -6 + 2.4]) cylinder(r1 = 4, r2 = 3 - .2, h = 3, center =true);
}
translate ([-41, 20 - 4.5, 4 - 6]) {
difference () {
cylinder(r = 3 - .2, h = 12, center = true);
translate([0, 7, 0]) cube([10, 10, 50], center = true);
}
translate([0, 0, -6 + 2.4]) cylinder(r1 = 4, r2 = 3 - .2, h = 3, center =true);
}
//slide holder
}
module light_housing () {
color("red") translate([0, 32, -8]) cube([34, 28, 2], center = true);
translate([0, 31, 3]) {
difference () {
cube([OUTER_W, 15 + 8, BRACE_L], center = true);
cube([INNER_W, 15 + 8 + 1, BRACE_L + 1], center = true);
//set screw holes
translate([0, -7, 7]) rotate([0, 90, 0]) cylinder(r = 1, h = 50, center = true, $fn = 40);
//gaps for slide wings
translate([(INNER_W / 2) + 1, (BRACE_L / 2) - 10, 3]) color("green") cube([2, BRACE_L, 20], center = true);
translate([-(INNER_W / 2) - 1, (BRACE_L / 2) - 10, 3]) color("green") cube([2, BRACE_L, 20], center = true);
}
}
//light + acrylic holder
translate([0, 45, 5]) {
rotate([0, 0, 180]) light_holder();
translate([0, -7.5, -11.5]) cube([10, 17, 2], center = true);
translate([0, -1.5, -1]) {
difference () {
cube([OUTER_W, 2, 22], center = true);
cube([9, 2, 22], center = true);
}
}
}
//extended tabs from light housing
translate([20, 35.5, -4]) {
difference () {
union () {
cylinder(r = 5, h = 10, center = true, $fn = 60);
translate([-2.5, 0, 0]) cube([5, 10, 10], center = true);
}
//
difference() {
cylinder(r = 3.05, h = 20, center = true);
translate([-4, 0, 0]) cube([6, 6, 21], center = true);
}
}
}
translate([-20, 35.5, -4]) {
difference() {
union () {
cylinder(r = 5, h = 10, center = true, $fn = 60);
translate([2.5, 0, 0]) cube([5, 10, 10], center = true);
}
//
difference() {
cylinder(r = 3.05, h = 20, center = true);
translate([4, 0, 0]) cube([6, 6, 21], center = true);
}
}
}
}
module lamp_plate_attached () {
difference () {
lamp_plate(.2);
translate([0, 18, -6 - 5.5]) rotate([0, 0, 90]) four_point_connector();
}
}
module corner () {
H = 22;
W = 26;
L = 19;
D = 36;
difference () {
translate([3, 3, 0]) cube([L, W, H], center = true);
//top negative
translate ([-12, -12, 0]) cylinder(r = D / 2, h = H + 1, center = true);
//inner negative
translate ([-10.2, -6, -2.5]) cylinder(r = D / 2, h = H + 1, center = true);
//pin
translate ([7, 9, -(H / 4) - .01]) {
difference() {
cylinder(r = 3.1, h = H / 2, center = true);
translate([0, 7, 0]) cube([10, 10, 50], center = true);
}
//pyramidic cylinder
translate ([0, 0, -4.01]) cylinder(r1 = 4, r2 = 3 - .2, h = 3, center =true);
}
translate([10, -10, 0]) rotate([0, 0, 8]) cube([10, 10, 40], center = true);
}
}
module lamp_front () {
R = 70;
T = 2;
W = 22;
H = 22;
SLIDE_L = 15;
BOT_H = 2;
translate ([0, R, 0]) {
difference () {
intersection () {
difference () {
cylinder(r = R, h = H, center = true, $fn = 360);
cylinder(r = (R - T), h = H + 1, center = true, $fn = 360);
}
translate([0, -R, 0]) cube([W, W, H], center = true);
}
//gate gap
translate([0, -R, 0]) cube([6, W + 1, 18], center = true);
translate ([0, -R - .5, 0]) cube([80, 2, 16.25], center = true);
}
translate([0, -R, 0]) {
//slide sides
translate([(W / 2) - (T / 2), (SLIDE_L / 2) + (T / 2), 0]) {
cube([T, SLIDE_L, H], center = true);
translate([2, 5.25, 1.5]) cube([2, 4.5, 19], center = true);
}
translate([-(W / 2) + (T / 2), (SLIDE_L / 2) + (T / 2), 0]){
cube([T, SLIDE_L, H], center = true);
translate([-2, 5.25, 1.5]) cube([2, 4.5, 19], center = true);
}
//bottom
translate([0, (SLIDE_L / 2) + (T / 2), -(H / 2) + (BOT_H / 2) ]) {
difference () {
cube([W - (T * 2), SLIDE_L, BOT_H], center = true);
translate([0, 8, 0]) cube([11, SLIDE_L, BOT_H + 1], center = true);
}
}
}
}
}
module gate (TYPE = "full", WIDTH = 2) {
$fn = 600;
R = 70 - 2;
T = 2;
W = 17.8;
H = 20;
difference () {
union() {
intersection () {
difference () {
cylinder(r = R, h = H, center = true);
cylinder(r = (R - T), h = H + 1, center = true);
}
translate([0, -R, 0]) cube([W, W, H], center = true);
}
translate([0, -R + 3, 0]) cube([W, T, H], center = true);
translate([0, -R - 0.5, -1]) cube([5.9, 2, 17.9], center = true);
}
if (TYPE == "full") {
translate([0, -R, -.5]) cube([WIDTH, 20, 16], center = true);
}
}
}
module ws2812b (H = 1.4) {
W = 4.91 + .25;
Z = H;
cube([W, W, Z], center = true);
}
module light_holder () {
//
difference () {
translate([0, 0, 0]) cube([10, 2, 18 + 4], center = true);
rotate ([90, 0, 0]) {
ws2812b(9);
translate([0,6.75,0]) ws2812b(9);
translate([0,-6.75,0]) ws2812b(9);
}
}
difference () {
translate([0, 8.5, -1]) color("blue") cube([10, 15, 18 + 2], center = true);
translate([0, 8.501, 0.01]) cube([6, 65, 18], center = true);
}
}
module acrylic_piece (PROJ = false) {
H = 18;
W = 6;
L = 15;
if (PROJ) {
projection() cube([H, L, W], center = true);
} else {
cube([W, L, H], center = true);
}
}
//sync with other file
module four_point_connector (fuzz = 0) {
$fn = 120;
X = 35;
Y = 40;
H = 8.5;
Z = ((H - 6) / 2) - 1;
translate([0, 0, -4.5]) {
difference () {
//plate
rounded_cube([X + 5.6 + 2, Y + 5.6 + 2, 3], d = 2.8 * 2, center = true);
//negative
rounded_cube([X - 7, Y - 7, 4], d = 20, center = true);
}
}
translate([X / 2, Y / 2, Z + 2.5]) cylinder(r = 2.8 + fuzz, h = H + 5, center = true);
translate([X / 2, -Y / 2, Z + 2.5]) cylinder(r = 2.8 + fuzz, h = H + 5, center = true);
translate([-X / 2, Y / 2, Z + .5]) cylinder(r = 2.8 + fuzz, h = H + 1, center = true);
translate([-X / 2, -Y / 2, Z + .5]) cylinder(r = 2.8 + fuzz, h = H + 1, center = true);
}
//translate([22.5, 0, 0]) contact_printer_roller();
//translate([-20, 0, 0]) contact_printer_roller();
module lamp_cover () {
difference () {
//base solid
cube([40, 35, 7], center = true);
//inner negative
translate([0, -3, -2]) cube([34.2, 35, 7], center = true);
//lamp/led negative
translate([0, 3, -.75]) cube([10, 35, 6], center = true);
//front side negative
translate([19, -18, 0]) cube([15, 15, 10], center = true);
translate([-19, -18, 0]) cube([15, 15, 10], center = true);
//screws negative
translate([0, -6, -3.5]) rotate([0, 90, 0]) cylinder(r = 3.5, h = 50, center = true);
}
}
//corner();
translate ([0, 0, 11]) {
rotate([0, 180, 0]) {
//difference() {
//lamp_plate();
//translate([250, 0, 0]) cube([500, 500, 500], center = true);
//rotate([0, 0, 60]) translate([255, 0, 0]) cube([500, 500, 500], center = true);
//}
//translate([0, 30, 14]) lamp_cover();
//lamp_plate_attached();
//translate([0, 18, -6 - 6]) rotate([0, 0, 90]) four_point_connector();
//translate ([34, 6.5, 24]) corner();
//translate ([-34, 6.5, 24]) mirror() corner();
//film plane
//#translate ([0, 16, 4.5]) color("yellow") cube([80, 0.4, 16], center = true);
//moves up to 2.5mm forward
//translate ([0, 16 - 2.5, 4]) color("blue") lamp_front();
//translate ([0, 86.1, 5]) gate(WIDTH = 1);
//acrylic_piece(true);
}
//translate([0, 0, 12]) cube([90, 90, 6], center = true);
}