diff options
author | Walter Bender <walter.bender@gmail.com> | 2013-05-03 14:09:52 (GMT) |
---|---|---|
committer | Walter Bender <walter.bender@gmail.com> | 2013-05-03 14:09:52 (GMT) |
commit | d7d52c48a1ecd527335de53a36e86a3cd1ec79b4 (patch) | |
tree | 63f7d0653a869c8ba1714966872d525b32136783 | |
parent | fba8e527fd22b61f0e94b0f87073ead603db61e3 (diff) |
OLPC AU branchv175.1
131 files changed, 186493 insertions, 65983 deletions
@@ -1,7 +1,12 @@ +175.1 + +OLPC AU branch + 175 ENHANCEMENT: * Power management utility: Alan Aguiar +* Game keys exit fullscreen mode BUG FIXES: * Force audio sensors to use single channel on XO 4 diff --git a/activity/activity.info b/activity/activity.info index 3d1e9d5..b836dcc 100644 --- a/activity/activity.info +++ b/activity/activity.info @@ -1,6 +1,6 @@ [Activity] name = TurtleBlocks -activity_version = 175 +activity_version = 175.1 license = MIT bundle_id = org.laptop.TurtleArtActivity exec = sugar-activity TurtleArtActivity.TurtleArtActivity diff --git a/plugins/currency/__init__.py b/plugins/currency/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/plugins/currency/__init__.py diff --git a/plugins/currency/currency.py b/plugins/currency/currency.py new file mode 100644 index 0000000..4d9a7ed --- /dev/null +++ b/plugins/currency/currency.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- +#Copyright (c) 2011, Walter Bender +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +import gtk +from time import time +import os.path +from gettext import gettext as _ + +try: + from sugar.datastore import datastore +except ImportError: + pass + +from plugins.plugin import Plugin +from TurtleArt.tapalette import make_palette, define_logo_function +from TurtleArt.talogo import primitive_dictionary, logoerror, \ + media_blocks_dictionary +from TurtleArt.taconstants import MEDIA_SHAPES, NO_IMPORT, SKIN_PATHS, \ + EXPAND_SKIN, BLOCKS_WITH_SKIN + +class Currency(Plugin): + """ a class for defining palette of money """ + + def __init__(self, parent): + self.tw = parent + + def setup(self): + self.heap = self.tw.lc.heap + self.keyboard = self.tw.lc.keyboard + self.title_height = int((self.tw.canvas.height / 20) * self.tw.scale) + + SKIN_PATHS.append('plugins/currency/images') + + self._currency_palette() + + def _currency_palette(self): + palette = make_palette( + 'currency', colors=["#FFFFFF", "#A0A0A0"], + help_string=_('Palette of Australian currencies')) + + self._make_constant(palette, '5 cents', 0.05, expand=(0, 10)) + self._make_constant(palette, '10 cents', 0.1, expand=(0, 10)) + self._make_constant(palette, '20 cents', 0.2, expand=(0, 10)) + self._make_constant(palette, '50 cents', 0.5, expand=(0, 10)) + self._make_constant(palette, '1 dollar', 1, expand=(0, 10)) + self._make_constant(palette, '2 dollars', 2, expand=(0, 10)) + + self._make_constant(palette, '5 dollars', 5, expand=(60, 20)) + self._make_constant(palette, '10 dollars', 10, expand=(60, 20)) + self._make_constant(palette, '20 dollars', 20, expand=(60, 20)) + self._make_constant(palette, '50 dollars', 50, expand=(60, 20)) + self._make_constant(palette, '100 dollars', 100, expand=(60, 20)) + + def _make_constant(self, palette, block_name, constant, expand=(0, 0)): + """ Factory for constant blocks """ + palette.add_block(block_name, + style='box-style-media', + label='', + default=constant, + prim_name=block_name, + help_string=_(str(constant))) + BLOCKS_WITH_SKIN.append(block_name) + NO_IMPORT.append(block_name) + MEDIA_SHAPES.append(block_name + 'off') + MEDIA_SHAPES.append(block_name + 'small') + if expand > 0: + EXPAND_SKIN[block_name] = expand + self.tw.lc.def_prim(block_name, 0, lambda self: constant) + diff --git a/plugins/currency/icons/currencyoff.svg b/plugins/currency/icons/currencyoff.svg new file mode 100644 index 0000000..7a4825a --- /dev/null +++ b/plugins/currency/icons/currencyoff.svg @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + version="1.0" + width="55" + height="55" + id="svg2"> + <metadata + id="metadata10"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs8" /> + <rect + width="55" + height="55" + x="0" + y="0" + id="rect3269" + style="fill:#282828;fill-opacity:1;fill-rule:nonzero;stroke:none" /> + <text + x="10.554688" + y="42.207031" + id="text2993" + xml:space="preserve" + style="font-size:11px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"><tspan + x="10.554688" + y="42.207031" + id="tspan2995" + style="font-size:48px;font-weight:bold;fill:#ffffff;-inkscape-font-specification:Sans Bold">$</tspan></text> +</svg> diff --git a/plugins/currency/icons/currencyon.svg b/plugins/currency/icons/currencyon.svg new file mode 100644 index 0000000..9bcba86 --- /dev/null +++ b/plugins/currency/icons/currencyon.svg @@ -0,0 +1,121 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + version="1.0" + width="55" + height="55" + id="svg2"> + <metadata + id="metadata20"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs5"> + <linearGradient + x1="0" + y1="22" + x2="74" + y2="22" + id="linearGradient2431" + xlink:href="#linearGradient3166" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.3333,0,0,0.3333,27.031478,32.193732)" /> + <linearGradient + x1="0" + y1="22" + x2="74" + y2="22" + id="linearGradient2428" + xlink:href="#linearGradient3166" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.3333,0,0,0.3333,27.031478,45.064925)" /> + <linearGradient + x1="0" + y1="22" + x2="74" + y2="22" + id="linearGradient3172" + xlink:href="#linearGradient3166" + gradientUnits="userSpaceOnUse" /> + <linearGradient + id="linearGradient3166"> + <stop + id="stop3168" + style="stop-color:#ffffff;stop-opacity:1" + offset="0" /> + <stop + id="stop3170" + style="stop-color:#ffff00;stop-opacity:1" + offset="1" /> + </linearGradient> + <linearGradient + x1="0" + y1="22" + x2="74" + y2="22" + id="linearGradient2557" + xlink:href="#linearGradient3166" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.3333,0,0,0.3333,9.2560985,9.9123239)" /> + <linearGradient + x1="0" + y1="22" + x2="74" + y2="22" + id="linearGradient2561" + xlink:href="#linearGradient3166" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.3333,0,0,0.3333,8.962951,22.783517)" /> + <linearGradient + x1="0" + y1="22" + x2="74" + y2="22" + id="linearGradient2461" + xlink:href="#linearGradient3166" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.3333,0,0,0.3333,27.031478,32.193732)" /> + <linearGradient + x1="0" + y1="22" + x2="74" + y2="22" + id="linearGradient2463" + xlink:href="#linearGradient3166" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.3333,0,0,0.3333,27.031478,45.064925)" /> + </defs> + <rect + width="55" + height="55" + rx="0" + x="0" + y="0" + id="rect2839" + style="fill:#ffd200;fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <text + x="10.554688" + y="42.207031" + id="text2993" + xml:space="preserve" + style="font-size:11px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"><tspan + x="10.554688" + y="42.207031" + id="tspan2995" + style="font-size:48px;font-weight:bold;fill:#ffffff;-inkscape-font-specification:Sans Bold">$</tspan></text> +</svg> diff --git a/plugins/currency/images/1 dollaroff.svg b/plugins/currency/images/1 dollaroff.svg new file mode 100644 index 0000000..1299d26 --- /dev/null +++ b/plugins/currency/images/1 dollaroff.svg @@ -0,0 +1,298 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="70" + version="1.1" + viewBox="0 0 71 70" + width="71" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="1 dollaroff.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="1" + inkscape:cx="-108.06607" + inkscape:cy="112" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><image + y="0" + x="0" + id="image3046" + xlink:href="data:image/png;base64,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 +" + height="70" + width="71" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/1 dollarsmall.svg b/plugins/currency/images/1 dollarsmall.svg new file mode 100644 index 0000000..4f887a0 --- /dev/null +++ b/plugins/currency/images/1 dollarsmall.svg @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="40" + version="1.1" + viewBox="0 0 40.57143 40" + width="40.57143" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="1 dollarsmall.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="1" + inkscape:cx="-115.56607" + inkscape:cy="107" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><image + y="0" + x="0" + id="image3046" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEcAAABGCAYAAACe7Im6AAAABHNCSVQICAgIfAhkiAAAIABJREFU eJzEvGWYHdW6rn2XTNees90lnaTj7p4QhRgJAYIv3B0WSwiyCAQCCycQnBBIgABR4u6eTndH2t17 ulXN+n5kn21nr33W2Xvt77z/Zl11zaue+3rHO6rG+4wh8D8c2376lqvm3wjA+++9krNu7arERJtt SF5WVn9NVQpCkbDLZjUJkqxJSjwimfSOQFpy+vGootQGQqHd50tLQ/2GD+saOGhEcMKUhe3/08/7 r0P4n/jTj95eyr2P/J6qsjPk9uzPZ2+/eu03X3z+RK++CSMnjh/HyGGDSXTakUQRURLQRAGiIdBU 0AkImgrxuBYLh4XKinIaOmOUlFX+0NIe6XQn518cOHjwezVVZZEb73leEwSB4hOH6DN45D9cxz8U zvnDu+g9YiIA7/31zemnju3pMbRf5p9mTB2mS0122PWWBM1XXSuUV9dy+PBRTp0ppa45RmdHiFg0 RjwOkiGOqorkpBrpkZvOoD49GTmsl5aenSWIDittnW3UNtR0nStt8+zYVfzBkuXbPs0v0LXv/nUV E2Yv/kfK+cdnzp2Lps0Z0Lfbk4N7u9xDhgwtkhMTtQvHjgl7dx/k142lVFSUoDeYycpKpaBbBimp RnJzsrGajNjMJlKSM/H5/HR6fFTX1VNcXEZZRQud7Y1kpqYwZtRwJk4YzIBu3TR/tEk4dOZsbU0d Ww7uO/3x5xsOH/9HavlvwTl3ZDd9h0/gmw/fkv0h/5ADe9eveu+tF/LtVoPm80nCV598wk8//UBz c4QRI4qYOHUIw4YNw2Q0YDQZEEUJVdUIBfwkJbjRiSId/jY0UcPhdBKJKfh9IUxWKwISl8vKWf/L ZrZsPIwflVlTR/OHp+5GR4z21rborzuPrrYm9Hn/tkf/fEwQBKpKT5NbNOD/DRyAirLS9A9ff+LW Bx64+amc3OSE5ro67bknXhVKLpUyYvhAZsycRlFRTxISEpCFOKoaw2DQI5tMnD11glWrV5PkdjHn 6pkkOl2Y7HZEUWbNTz/xyy/rSUlNIystBY046ZnpjB8/Bp1eR3llDbu2HWL/3v3o9C6eevI2Rg/q xeX61sAbH6x+b+aC+19bcOOdnSeObWLw0Jn//8LxNdU6/7LkiauGD8r7cO71M91dbe3aK0teE0qL a5g1bSxTrh5NSnIqaBqCKKLT6dBUA7LJiM/TxfffreLosaOEo2GumTWTG+64nY7KCn7bspODh45S VNSL+YsWYbc5EKMe9EY9F6oqOHhwL9detxAx2IVkdFJd72HX3qOs/fE3spLMPPrQtVr/QcOEA4cu Hdh9+PTJAcPGvzn3xoeqTu3ZzcDxE/7n4bz23MPujvaGpQ/fu+iulARV2777pPDCkmU8+sjDTJg4 CqNJxWRKJBqJYLZYUFUVWadD0UJEtTjvvrkcu93OzFlXs3P3flpbm2hrbMTT2cnjjz1K9x7dAYjF YugMRpqqzmIy2nAm59BY30Zbp5+szAziWghRVNEbjTQ0trLv2ElWffgFMyYM59a7FqDpLHyzemck K3foxAV3P37op6/f4tpbHv+7dUp/7437Nq/l81VrefymGSMyMux3PPbwgkdMxph29fTbBINBz6tL /0Tv3nlIgobdmkJICWF2OUGLEYsGiUaDGFxJfPrBu6QkJXP8yGmWvbqaKZOHkpWZxIRxI+lV2IO0 9ExESUQV4qCqBJo72bR3D7nZ+RgQMJnNfLvme3T6CN3zs1AjYSSdBasziYFFRUycPJHzl6t4bfkK Ut2JLJozUZYE3y1r166pue3BF8+88cJDbN199B8H54cvP2XGgpt4/PY5CyaN7fPGDQunXXvq5Bnt 5pufFu5/6H4W33QdxSVn0TSV1NQ04ogYLCYEnQ5REjm4ezcnTpwgGo1hkAUaGmoZPXY8+dkuNmz8 lb27zjJqxGh8Pi+HD+6irbWZ/XsOsnXDdk4dPs7Ma6bRWNtIXVUdmfm5JCfYefuDD5k25Sr0sg5R 1iMKEmo0ituVyIABA+jTtx8ff7aKc8WXmDdzhJiRZBmVmZMbeHLJB8e/WvkK637d8d+H8/VHr3DD nY+w7E9P3DVrfJ8vJl4zOeXAtr3Cc3/4i/DBh69Q0CMVVY3z1ddfYLYYyc3NBUVDNhmJKgrFx46y YcMGLBYrLrsdUVSJhHwQizJ1+lRuv/9+pFiU15e9jTPRSksX/La3hM07jxLRFMZMHkHP/CRy8/LJ 6dcbb2sdaB7KKj0oSoRueXlIgkhMUTAZzQiagE6nw+lMYMbsqZwtPseqlT8Js2fOsBR2M141eMTo Tn/pnuPX33g96zbv+6/Dee65x3n8mZf540PXPT1vSu+/Dhw9WFr12VfCqjVrePXV53HaTLhtFn7Z uImCgjxqaqsYOnESeqOFivJyXl6yhHETxpOSlEQsFmPq/PlYBIUEh5lQ0EfFpUvs3rKJ6xbNZfa8 GXzzzWqicYXTZ0oRJdDpNPoUZVBeWs+6Dfv48KNvOHLsJGlJScT1DkrPnWH8mNGoMQWdXk80HEWS dUTCESx2BzpBYOSokdiSknn0iSeEG+YtkFPNsSn1QUvHrY++fuzHVR+z5qf1f1P/3yzIP33zNfNv upnZY4o+uvP26XdfM2sC77/7hXD0+FmWL3+ZWCxEWkYWv/7wIx2dnfTu24uzp04SCgQQBZnkdBez 51yLxxvg3OmzGAwGRo8ehaL4OF96lrSUVGKROGXnS4gB02fPIRaI8Ozvn2bQkCGUlJZTmJ9HNNzF L1uKOVfcgKJCbqaFzz95iyNn9rNh4xa+XbkC1e9HsriQ9DJKNIooiGiSjCSIqJqKbNKxZ9d+ljy7 lM1r3tYqWxrqSxql+xb87s8bLp7YT/fBY/7v4AA8cc+t9/fLt7x/y0O3adt+/F748YdfWbZ0GUaT hKSTOXn6NMuWvcZTTz+G3WxBI47FZMRpt3PsyH527tyH3elm+oyZ5OTmYDHoiEQDSBJEQiqiIKKq Mc6WXsLhdNG3qAeXKit4++0PyM7OYMiQIfz2206aPT7mz53NoIH9WbN6FZlpaeQW5PHUn15n69ov IRJGtCRh0AvEFAWdyUTE70fQSUg6AwIScUHHzp37+H7lJ3y04kWtpLw6WN3unDL31kcP/y394n90 8cWn7mLuxAFj2puK37/xpms5snWfsGzpu7zy0hIghKooSFYrp0+d5KOPPqKmrp13V3zJsZOlnDh9 gT+8+Cql56sYM34cEyeN4WzJcSx2I4Ggl+bGWnZu24a/ywNRhbq6SvLys/j11x/w+trJSE/jg4/e 5/7778fr9WK1GpgxbjDzZk7CKis8fN/vaKqrID8nB5vVQCQaRmfQY7SaQdTQGXX4utox2K2IaEii QJenA51RZtq0cWQWDeLTL74TMl16S0XJ/jvicc30t+D8hzVn54ET1l++fW/7558sd3p9Hh6+/1lW fvwhVpsOi82MrDNw/swZFEXl+InjLFv2FYGAgCSI7N97mJYWL/fceQebt2ykqHd3fl2/iZzsIlZ8 /AXFJSVYzCZSkxIRBPAHA5htDoxGE+WXLpGRmYU/FOTY0SPEYlEikTB33/kQEV8IizmBuCqxdft+ +vYupL0rQF5mCokpiQRiKrKgIQgikiRSdr6YBFciiqJiT3Lx5rKlRCJBbn/gQd56bTkZyQ6tf//e g7dv273/p027L1++fJl33nnnb2fO+WO7ABjaJ/mTB++6OUdSY9y2+FYefPBmzGYJ4hoiMiIC6enp fPHFF5wvKeHzL19m16G1vPH6M6zd+CUvPX8fd9/9e2ZePYuW1g48XRp//uN7bNtbyqWqdiZNn4mg FzHaDFRVNpBV2JtjR88wZ85Cjh47yttvLaelpYnq6ioGDOhHJNCMqI8RiHYRk2LMvm423371NePH j6WmtgaEOKJehyCKxFUFSRT5dtW3nDp1ElEUOXfiOKdPn6C+oZpzp7by1vsfsfzdnwWX26YlGpo/ 3qdpQrdu3f7zzPngky/ZuX5VD7fs/3DRLdcJX364EldaJosXzsFqNaAz2lAECckgEo1GSE5JQpZE qiov421rx+1KxigZSUtNw2SNk5aWwdo1PzFyxBDARygWoLq6jdS0ZMZPnUVMgez0NIxGE4cOHGT0 xKs4evgQM2dMp7mplaGDhzNi+Gjigowg6pBlPSICWenpFJeVkJ2RQigcJjMrB1lTkET9lSIqRDhf dhaHy0FaRgZvv/M2Nrud4cNHsHXLTqbPmEZObiafrfxamD9nlmPNKw9lPfbEUxvmXzNbW/vzxr89 rEpP7zq85A8PuQNdXl56/i8sfX0pohhHUxQkvQHRoOfVF1+go72d/v0H0Kdff/r1G0BTYyPrf/6J kycOElNCjBo3kWWvvkpxcTU9euThdDrJy8lh0YKZXDhfTHZaEkkuF5IoUl9fT0trOwNHjcLT2oTZ YmLiVVNJcrlRFAVRvDJvaJqGKIqoqsqg4cP55KMVZGVm09nZSTQaIzExCcGg48SJ41RWV5KSms66 n34BNG6/7Tai0SiHDx9mxoxZZOfkse6HH0jLSNO65bpTonL3vfMX39nwNzNn1tghE6ZP6f/4rOvn asufXyrMu/5aCvJzkHUyBqsVwajn7WVLWXjdAkZNnkSCw4bJqKezpR0VlYULrsEb8JHbrZCu1i62 b9/L92s+p6GuHqPZTHpyEjPmXE1Xcx0XL5SQmZGOJug5V1zMxx9/gS4eZcasGZw9c5rMtHQkWQca iKKAqsYRRRFRFNE0DU1RmDpjJmu//56Ghka6ujycPXuG8+fOca64hIcee4Jff/6FpMREPF2dBAJ+ XC4XGelp5OXmEfaFmD13Dkteekm4aeF0+4aNO9RdR0o3Vpw/ztsffPwvcA4cOMBnn33GpEGFHz/z 1C350Va/8NU3a7nnocWIcQEkA5JOz67tW8jMSCUvJweDyYgWiaCpKnpR5vTJw8gGmXjcwOef/cyP a7/l008/wmqzU9S3L7379qV79x5EAwHy8nPZtXMnGrDu1800N7fQu6iAlEQ3JrMRq81GKBTGbLIg 6HQQjyMIAoIgoGkaADqdAQSRcePG07OoF8eOHqOiqgJZb+CWW2/l1aWvMnDAQK6ZNZPDhw6DprFn 927mz70Gk86IwWQFUeRi+WVCXr9WkOMempmReWTB7Y9f/jcFefTo0WiaJtitDEpIShCWLX2PuXOu RdP7UGMRdEYDSBINNVXkZWfR0tRMPBiCuIYs6+hoayQaDhCNqZSXN7Nj23lmXT0Vm8OBqqqEo1E+ fv99ghEFndmO3uJkxNjxbNm+C1dSGonuRFwuFzOmT+WHtWtQNY3a2lra2trRCQLx+JWs+eeHFkUU RSUWiaAqCnabjYceeYSly17h6rlz+MMf/0w0BidPnkInizz6yEMMHzaEmxbfQEtDPaIIfn+QSFTh gQceYOVXvwl9+mRpqamW3wH88N3KfzusLKKx79h+lieysgtZ9e1KHnvyfspLGwnFFVyJTkpOn8Dp dvHb5s14vO2kJrnRGw0o4QDhUIDmRg/5eW7Onq/j110neO6RxSQmJSNo4PcHKDt/nvOn9tK3bxEa Epl53bHanLS3VjNwQF+cditWu5WxEyfz7rvvYnc4iMTCnDl3mtzsPAxmM6IoIkkSoiQhGXVEI2HC 4RB6nYwgCuzevY+zp08ioDBoYC/cDjNJzgRam5tRFIU+/Qfy+gcrGDJoMBYZ9DoDRlc6dY1ncSsp QmN7WfeX/rrupylXzWz958ypuXiG7es/v3/ytGmUnTtL/34DCYci9OjZne3btnH88CGWL1/O7h07 sdvtjB49GkEQaWtqora2jnPnzzFoyBA+/fRLTp04gdkAPYt6EQ2HEXU6HA4HHo+X7Nw8Tp88QxwN La5SV1OFTjayevX3GI0mOju68Hs8/OH3z3Hy+AnOnT5HVnoma9asZd0PP7Bn924uXbzI4UOH+OHb 1bz15pt8t3o1YVHkkYcewmW3MGXiBJ56/DGMsszsa+ZiczqRdAYURcUoiUSjMYqLixFFiXAkhK+r g0XX3ciqH1czZOBQ+aPlT88tPXcaALms5CjZ3fvz1dIHFmAyaytWrBDuvuceZFlGp9Nhs5gpPV9C v759uGryJMorLiGKIu3t7bS0tHC+uJj6lmqqqlp55s8vsPSlj+jTK4De7oBIBDUSQTKZGD58OFab TGNDIwtnLyQvN5UpV01j3Y+/seLDD/j4w/cZNnw4S5e+xmvLlvHs089w8cIl3nnrbXQGIykpKQC0 t7cTDodJTk5m8eLF9B02jL/84Q/ceOONdLZ5SU1Opbaqhn69+9PY0obT4cLudLH/4AFGjBiGIOs5 fLyYUYOGotPLIENmVh5Nvk7sJpuWalcXF/Ud8JfS06XIPXsNo67yXHbLiZ8Tfe0d1NbWkZWVSTQa wZKcSEXFZR595BFKzp2je/cCggEv1VVV+L0+ZEnC6/UyaswoWhqiHN17EDSVSeOHQCyGEosh6fWo oRBjJ0/i9VdfoHdREZ+seBODQc+xoycYN24cjgQXDzz8KG8tf51u3bohiSKSKNK3Xx8+/+pLqqtq aGtvJxKJkOB0kpmdje2fVhiJxfD5Q9TXN1Db0MnbH65k4IAhBIKdnDpzngS3jf69irj1pkV0trdh tNgIBENY7HYCvgCiEiEsmbjmugWUlVwSuuU4eh7asTe9aEBRgwTQ0Vb5wZwpg/tWV9YQDocYP2EC BoMBURA4uH8fSkyhra0Vq9lMaVkp48aNI9HtpnthIeOnXMXeg3spK6nClWDj00838tLSp7CbrUii gKaBgAaqSkVVJT27F/LzT+uoqaygsLAnH638kgXXXUc8EqKtrZ24ojBs6LArBVgDQdMwW62kpaWR np5OckoKggCCJCMKEFcUCgsL+OzzL6lv7mTwsGEMGDKALq+P4SOGMW/OHCZPmYCkadRUVXKpoY2O 1lZmTJqApiqogKAzYbQYOfjbNgYO7CEcL27cvHnn3koZwG0KGpPSstmwdQ8jR48irkaRRRlREWho amJ+QTcUVeXPLy3lrTffQC/LCCYrSixO6fFjfL7yN66/YQ7+qEzfQdlkZRUQDwfBYIFICFGSwGwh GlIw6vXk52eTnZ1DbWMLCSnp6EQBf8hHSpKbUCCAzmAgrmnICU6IKQixKBcuXsTvC6GTdJgMRqwO PYmJSZhsNvJ6FLLy688hGLxSoA0G+hWkcf7cOeyySlJqEpXFxRw5foIFE0ew5I338EYVbLKKKkhI qkJ2ZiF1TfW4bHM4tOeLl4Ed8s9fr07du3P5KNlioaKinHlzphMOBzGbrCBoWCxmNmzcwJEjR5g0 aSKnTh4mNSmZ9et34XDYKC8/zW13TKOgIIekpHSSk12Eg2Eu11QQ8XmIxVREnUR5aSmzr53BiYN7 ae5oYvyUyehMLQgE8XnasTsS2brjADcsnk9tXSUllyo5sOcgXn+QUCSGOzGRpAQ3akxFb5CIRAL4 Ax4URUGv12O1WunRoycJiYkEfT7S09OZOvNqGqoq+G7lSnr37Ut6ejrZ2VmAQENDHQVpLuI6lbii YEtIRDaaUeJRkty29g8/+cEq7923yTpscN9UYhFa21txuVyEw14ikRBqLM7NNy5m5cqVfPbJx3g8 XoLedhBAMpvYtvsQby17Bl80QEeHh1XffE1cFThy+BiKFiE7Kxub1UKP7t24ftF1aIpIj55DKL3Q zPN//oiLl6tobPCgKhqCoPDIk/eyd+8+Lly4SFHPPvz+2WewpKShBdsQzEZUrxdJFoirCoJggbiK YDQS9Xppbmmhur6etpYmxk+ceAVSRztp3boxLyWZ02fOMH78eJqbG4mrcWprq8hyW9AkE0ZJIhyN kpmXT31jreZ0yLP8nia7XFpyzLHo6gVE2trQ6SRC4QDBYACTwYwkCqQkJzJy+DAqy8txuVzkZuVz 6NhRDh7bzxPPPk52ZgGPPfkM9z9wPy+98gZEo0gmM8GONox6A5JOxNfZgRCNEo2Gyc3JZMKE8Xx+ 5x/Ry7Dig+dx2Kx4YlGWvf42S199A4PBBPEokUAXJYd3UlHdREFeFnabBX+gA09nB0nJOdjtNmw2 O6qq4LBb6W3Kxz54IB3t7QTiCn6/n+qKchLcLgYOHEgkEiE1NZWePQvZu28PU0YPxqfGEeMqcQ36 DhhE2YmdQmFuOq9//k6enJqUXJDkcNPQXIPblYTBYEEnyfj9PgwWA6kZ2ciiTEVFFW+88RaapjFq 7FgEVcEgaHz33Xf89d2/4vV4uHjmBD26d4dQDIss0tnWSEJWJmgaB4+dIOhtQYlrfP3Nah576DoW LLgWNRKgtqmZTZs28ebyd1A1DY04Ub8PvSThtFpobKzh61VfYbfZ+f2TjzF0SA8E0YiqxK58mCJi kA0oqkg8GsXb2YZIFKvFgdlqp7W1EZNZD0KcuqoK7rhhEat/WE15XSVpqT2JRMPoTXGysnPZs8XD kIGDGJDf3C4nJthdRsmo1flbhZycHELBMM1N9eTl5aBEIxAOotNJiLLAjTdeh9WZgD8Q4qbExTTX NXDrnbeBQc93K74mOcGFToTM9HR8oQhl588wwqrD6/fy2Wcfc/X0GZwrLuXOO35HVVUVJh3ICal8 99e/cv9jj6HKQDhCPKKCphIORDDqTPTt3YuklBQESaDsYjEJFg1FcGC329Hp9AiCQDgUQtbp6erq pMvjATGOPqyQll2IrqudkydPIMugAxRNZf7cuWzfvZvr5+VhthrRlAhWi42W1k4SnU5S0jJuFr3+ cHe9Xi90dXZiNBk4f76YLVs2IxAnrsbAYsBsM1JRdZlps6ZScv4ce3bvxmoy0rd/XwKdnXTV1TNu 7DjCkQi1dbWs/PxT/vrxxxw4cYJwJMi500fo3T2X7Jxcbr/9FkaNGoXP50M2Gln9xRfMXrCAcGcn beWV+No78Hd2gaYi6yQc7gSGjhiHt83L4f2H0IjT7m3FZDJiMOgQJYF4XEGNK2hajPaOFvR6A1aL nWAoiKZGcSYk4HAmEFXAZktkxLjRuJKSOXr0HNU1NYTDYQRAECAaVTGZTFog2DJaNJt0FaIoIgKa pqIoUQQRWlqbkWSRYKeHsrJLBINhDh46wqnTZ1g4fx6qEiM7I40Tx4/T2NBAv7790OJxrA473XsW kZuXw4L58wmGVNLSu2GyJLJv317CoRDV1dVEozE8fh8Ou420RDdKLIrLYcdiMmE1m4iFQvj9Pto7 2xD8Xdx4wwKunj2bffsOojc4EASIxaIEA35aWpoJBvy0tjWg04m0trbQ3t6B25WEKF5pK+/dfYCs jDx6DxyFElfQG4z4vAoXLl5AEEVCoRBGo4lIJAogaPGYSa6t7yiqrq5GFQSCwQDOBAd9+/ShoaEe q9mI0ZrMqVMljJ0wngMHjpOUlEp6ehoOm5mujk569+5JLKwS6OoiOzsbUZI4ee40EX+QYK+ebPpl M5ervWh6M+++9hghQWT+jAUsW/Y8WzesZ8H1Cwn5/Bh0EpKmIQCxcJhwOMyl8oscOXqEe2+9gUhQ ZODAAezcug29IZFIJEQg4KOzs5Pq6hoSE914PS2ASCgUxOVy43QnEIhc+b5zp6ZSXllDiiuXfce2 0rPfIAKBOLLRcKVhYBRRVYW4FkeWJCKhiFHMzHKWJCW6NZMmEQuo5OfmY7dZEeIysmBFIMjdd96K 0WzEG4gQCIf54IN3yc7KwmZPwOVOw52ciMWWwJGjh8jPT8ZpzuCBex/kzifeYMn7+6lvaeCehaMo uVzJC79fwpAhRVitFmwWM2gCRp0N2WhBEEPU1JdSevEUR47uo6OllT7delPXVs+WHftob6kkJTWf 33btQhbiXCgtpqujlbaWBjrbmklLScHn9RGMxNBkPf52D7qoh4a6yzTWd+H1+di4byNd7W1UV1TT 0uGjZ2Ya0XiUaMiHGolhMEhoBhlNkSJiOKL6NUESklOT8Xg9iJJERWUV2TnZ6AwGQr4ABT2709HW RmG3XPxeDxMmjAdBQ6cTiUbDiLKI3+ensbGZ2vpGamqrWPHV14wb2Y9X/ngDs6aNp8UfYMVHHzFg 4AAeeuhhSkrOM2bsWIJeD4Kg0VBTw/5Dxzh1toyK+hbaOkPkditiyrXX4XS6CQZCHDp4iP3792Kx WAkGg2RnZyPLMhaLheaWFvz+IAgi3QoLSUhMxB8Jc6akikPHKtmw5TAlFy9TXV3NrFmzqKioJDHJ SlJSMvF4nFhMAcBgMFBf34CKEBbPnzpX3tLSgTPBRlRR0DSNaDSKx+ejqqqKts5ObGYLt992Kz27 5fPkY49QkJuD3+tFjSlEw2G8/k7q6uqoqGjhQtllHE4HES1On+4ZuPVB7njwd5y7fJmioiLmzJmF xWImPT0DvcFIwBckpoZxuBxY7G4OHj3Lzr3HQDbRY8BgYuEoqiIwYfxkzGYrXV1dFBbmYzQacbvd VFRU4HA4yMnJxucPYDSZqamtw+/zk5CaxJff/8qu/cU0t4eQ9Xr69O3Lxo0bae9oZ9y4cZjMZlRF QaeTCQQC2Gw24vE4ssFaK6al53o6Oj04nE5iqoLeZGTetfP57rvvyM7NxesLsub7NezetY0Rw4eQ kexGliTCoSCKEkMUIBYLcejIMQq7d6ej00dNfRUBr4eF8+dRUnyeNStX8uDdd3HhwgXMVivbtm2j R1ERajRGZ1sHkXAQQRYZNG4Sy975kHffW8Gtjz1ONBAgFPDgsLvJycln6oxZdOtWgCSJOJ1O2tvb CQaDZGZmkpeXj9PlJjE5hcuXy1mx8hPOnz9PWloatTWXWbRoNDOnTaZPr96MHj2a1JQU0tLSAFDj cURR4uLFi6SkphAMBjRvKFYt9S7My4h01t4zbuJQNm3bx/hxowmHguTm5bNs2XLGTRjD0EGDcCc4 aWuso7SkmH17d9PYWI8ajWLU62loreP777ZisToYO34UFqsNqywiCQbFxfOFAAAV+klEQVTmXruI QQMGEA37Wb9pK5PGj8fv95KcnITFbsdlt1NbX43V5UaL65GiKlosQqilCZPFgN4oo5MNKFGJ9s4G 6uvb0cQoaW4XoiThdrvJzs4mGo3S3tHJ3v0HSEh0k5WZg84g0b/fQBoaqpg/bwxbf93AhKnTaaiq YPXadcxbsBiLGEMRROKawI4du8nMSKKlqUY4eL7lA9nidscqWy+hU1SSbQkEvAEEWSMtOYHH7ruF T7/6jC5/lNp6D4FonLDXz9C+vThffpkuRWDzkQNcrA1itOm46/YZhKIqZy6UYowamD07DS3uxefT 0CETiEYpu1zJqMlXE/X4ICojGmREQY+nqQlZ7CQSbqOtvQVnQir5fYcQD6t4BB/WeAgpGqCyto6e vZPo9AVYvepbEtOyaPp1O44EF6IuTlllM+amIGdOb+btN1/EbI3Tf1A3Wpr9DB46ls0//syEqVeR mp6GAT+iPgmrGkWwJdLaVMO0MbP46OtDmC19iuUlLy9ruG7qgHiHJyQO6NeHCxcuUNCzgPLSi2Sl p3DXzbfT3NaGLxDE7nKRlpKE02Ti2+9WM2nKFGpqa/j+rjdZ++0beDo6+euKz6lqDZDlUNm/fz9j Rw/FaNARjKjoZB2Zudkofg86g55IJMylkrOsX/8jo0YNJzurgPqaNvRGI/ndigh1tREJh7Ba7cRC IVQJPEEBUZ/J71/7hvYOH9HjXjo9Afze0ziJ0qdfFpPHD2TenAmsW7ea+x54gNGjxvDZys/5w9PP 8tQTTzNlxnR69uxJZ2cXWSnp+D1BEs16vN4O4qKO/UertDXbdjXIOQU9OoZ2d1bVt3nyszNS+HL1 Nyy4cRGXKqvIz8vDbjITCvhISbQj6wRi/hZioo1Elx2dIFBypox3Xr+LglwXa37ciSApTJ82nME9 CqiuvIgogT/gJ9mVxNhRo0nJzibu6aSptpxffvmZuoZa8vIz8Aev1Kp1P2/hnrvuIhgIoDcK+GNe on4RSRA4cvIsx0+XUHzmIrX1EYYNSWTw4EJEMUZGRgoj+vUlOdmNJIPeIHKpJJUff/yFcZMmYjIZ OX36FPfecw/bt2/H7Xbj9XpRVRWzzYnX00bPHvlU17cg25IqevXJ65ABrpo+e83J4kvPLpo6HuIq eXl57Nm7F9lgpq6pltTUVAJ+3xXHlmRC0fSYzHbOlZSya98BPrv5DQ4dOUCXt51nn74bi9mA0ZBG Rfl5DAYdkUiQcDgIcQ2UGGo8RltHI4XdC5g9bz7uJAfl5Rcpv1SFP+gjp1suaiRMXXUzddXVRMUA SbYsmjv8dHaoPHXPBMaNH447wYlep2Kz6lFiEZCMxFUBWTag1xu46YbbefpPSzDZ7EyYMBFPRwcT pkzj4PFjjOvTl107djFpzFj8oTgbNvxKQX4W2/ceDL3+9ufTrppx9ZXuw733P/Dm9t2HNVSFyZMm cPLkKW6/7U4eefJJGjtb+fHnnzBZrBiMDkymBJrb/cRFmW07d3PvQ3eCaOHosRIeePAp8jMLyXSn YDQbMZnMxKIx0CAej2N32Ki9cJGDe/ZTU1VDQ0MT33+/nksXa2lu8tLY5GHM+LFUlF/A6nJiMlqQ ZQOOFBfnL1ew6bdjFHVP4M6b55BVkIEzyU1KanckMROHrS92cwEWfSqyZkUJiaCKLHn+T3z55SYO HjxIt26FtDU2kZiYSEpyCuFwBEVRiQM7t2/C4XRw/FSJZ+X7yyoA5IrzB/n22x9ai8vbL9U2NBeO GNZP2LBpD76CAPc/eA/frPqe5555jB9/XkcsEGP+wkVcvHwJh9WGLAqkOBP49ZcfWbz4OiKRKGan G9HhYs/Pq7GaLZj1NmRRTzQe5dCJg1wsr6X8Yg3Hjl7i6quHEgiqPPOHV/B4/GgapCQmcGDfMcZP GAdolJWV4o8IVNY0cfRoKz989UcsZidGvRFBkIlrcQwWAxoqGjFESSIeUZAFHUJUwRCPs2H959x2 +++YMGYSKWkyXo+Pxtp6RE3A4/cTCSr06pHDviMXcWUNXvHd+j3a94KAnN97FADXTB331Tfr1r/8 wL3X4bQZCQU6ycpKZc7MmTz66BM8+fTTGE0utu47ihYK0FTXgkEyc6mskjXr1mOwOmht3YXX68Od 4GLImGHkpmZg0BsJhoOYrVY01cTePYdxOWx8+c1LDOhbdGXxXYBQwE9MibJ23W9UVLSz5qfNuF3J 2B1OlKjIhZIW/vLiIgYO6o6CQFxVkWUJSZYBCTUWQ4lriIKAwWQhGo4g6EU0RUPSYOWnK3nwngd5 /PFHsFgsbNy4kcrKalKysvjojbcZOWoiLy37LnrTXc9tFIQrxoV/tr1pmiZfNSQn9MmbD0sEQ0JZ RR29hvbGqndQermEF195C73Zym233MzIob1xJ7iIx2N4Ojto94ZpqG+ksCCf3B49QZbxNTfQUlND TloqvqCXYDTIbXctYdrUkTz552eJdrUhizpEyYgWjYGoEY8rXK4pp8eokXz06uts3Lid4UOHcuZk DaNG9uG++25AFgVAB6KIJBvQ4nEETQBRQBBBk2RCXi96SUa2W/B3tKNEFExmCxcrK7hQWkZDfT3T p83g1KkzXH311Tz58CMMmzRJW/3L6W3bDp6bdmDrVkZPnXqlHbxr6ybyunWPD+zf22SWwmN75Reg xWVUWSbRnYjRIHHD9fMIejv44INv2bhtJ3sPHOXQkVNcuFRDRInjdDoRBAExEkH1e9mxew+ZqenY LRaMJiORaIQLF8t58f03eHPJc+zfc4Azp0soK7uMK9GF3elEkiQ+fP8j2qpqqa2q4t67bicU6CI5 M4Ggp4V+PYp45933OXjiDJ0drRQV9UJRFSSLhVg4TF1TE06nk7raOn7bto0z587Q3tVBenIKEiIv vPIy06+aSlNTEzt37OT++x/g5b/8hfFjR/PWh18L/YZOvu3YqXM1n3399ZWOJ8DEqTP5/quVNDY0 vL/8ry8+PaJfdyk1y0FlnZ8uSwBRlBGVGHNnTKMwvxst3ijvfvApOr0eh9XIuvU7CPoVdCKImohR ryMUivDdN68SicfRFJVwSMHlTgCPh7lXz6XLF+Ktv75HgsPB2PEjqG9uYMfWLWRn5nDkwDGcCTbM BhPDhwwmMyeHl5a8jDsllbT0DAYPG8r69ZuZO0e44rZAYNOGDQhSHGdKKoooYbWauHy5nD079+I0 2XAnpTB4wBC6AjF27j/Gkj//ic7OLgyiQqs3SnvQ1vXeylVHn35mKTndc/4FDsCiW+4EqH/izsUv frtxx2M3zZvsTDTpiEUjWC1GEDSMJjNF3Quo372Lpx+/jcFDhrN14xYKehRdKdIWGxnp6RQUFODv akGNx9EEAUnWIckisk6CmIrb5aa6rpjUjBSuX3AtTY0N7Nu3j7q6ekYMG8GceVdz9twZautqaG5p xGxxUdCtG+h09O3Xh9bmBoYNH0kwGAJRQIrFqKysZP61V3N4317GjBnDxWIBu8XKnXfchdVq4MMP 3sfjCfLZ1xuYO3cm2VnZ3HnrYn53y2Lt5bd/FHbu2T1YEITov/Yryf/6x8Gd2xg16aoXRw1IT+uZ m3vvqKIMrNYs/P4ArkQXBoMJJaZglnXYTXriSoD8rFQcNoFxI/rSo0cPiGtoqkrILxOPRZFliWgk hNfjxWAwwj9ZSQRBJK6p5OalUllRQ1V1BQX53alvbCAUCWJz2LHanew/eJipU624XMlo2hXYUUVF lVTMNiuhQICzZWU0tbTQ0NRCW1MDuuRE/IEAmTl5lJaUsmPnFl58bRmJlgQkgw6j2cimH35i5Igx 7D9yTtDZ0r+7XFZRyb+Lf2OYHDXpKgBGTFz40s9bT5R7FVHztLcgS3pCAZVgOEpqbh6lF8rJyMql uPg8OQU5rPrqBzo7wmzbsg/Z4IK4CTUexWIxE48rSJKI1+e5MgQ0DbPZTCgUQonFOXa0mIqKGkwm K2fPnQFJJTMnk8TEFCoqawgEItQ3NoEk0unxU11bB4KEgkaXp5OWzg7OnjiOw5XAb9t20qNbHl0X S7HaHZw6fZ7+/ftxww03kJqQgCAKhCNhqi9fZvV335OR01P77KcDbNp96tnJs6/V/j2c/80TWH6h jBsW3+zLyeru3XV425z+3TIFtzuHYETBmnClkdblDbNuwwZEvZ7m5iYEWWbbjh3k5udg0Im4MtJo bWzAZjUjSiKxaITq6ko8/ghDBvXn+NEjnC8rR4kLnDtRybath/lwxZuUlp7F6XZSdvEC/kCIaFQl ElNwJbppaGpky5Yt1DfUU9S7iMsXLrNly28cOniQcDhETk4egiRh1Yt0tDQjGaxUVbexf98Opk2b QlJyCpFQDEdqJr9/8gnmzr1We+GNL4Qx0+bOnL9w4fGd27bz5ddf/RsW8r+HU9CjJwAb9xz44rFH Hk3duKNk6UKboBVk9xNqLzbRvSiXSRPH8+XqVYiygcy0DJ558jk+WfkxdfXNhCInKejdl4A/RKLL TTQSQwBCwQiIAuj1tLe3U1NZTjgSISvDzVNPLUEkSnJiIgV5eTQ3NJGekkpaRi4P3P8Xjh8+hSTJ IIn4A2H27iklPdFNKOJHk2P4AgppWamMGT2G++57joQEGb2sI9FmYP7sObz4l/dZfNtCZk6ZxWM3 zuOqabO0dXuOCcMmz3jnk8++3www6aop/x7Ff27v/+WHteYPXvvjqvHD8+ZOHtuTtJR0QmGB7n37 UV1fw30PPszIoSN57vdPEYtFuf+hx8jOSmPJm29yYssG3K4EnE47sWiEffv20BGSuPWG+egk0ASZ mKKiN8pE/X5a2tqora9Dp5dJSU7l4qVKfvhpM9OmT2PmlDHo9SZiigKShCRKEIuD2Ug8HCSOdsXx ZTQRDUeIhSJEYwomi4xOMCHINiSXzPP3PEBhYQ6X6jr49pcjje998nX+9GsWhv+W/v/Q3v+/Ys6C hcHr73jsj9+tP3XycPE5Llw6RSwU5Pzpk6RnZHDvPXdRWXEJSRIwGHQ89fiDjBw5DMJ+YrEYNpuV WCyGXq8nHA4TjUaRRJFYNEo0EkFVVUIeLzq9gfKqSkaOHYfP66etvZ1YLMbZc1UMGzaAuBICIYIk KeiMIOo1BEMULdQFahQhoiLFRVBV9IKAwWDAYrYg660oshXJYOSVxx9FEERag5r29drD4UuNoZ7/ GRj4D4bV/xaacP4Pf3l+0Z23PFC2/M/zRX9XuZCdn0vJ2TPMnjObSeMnoKERj0XpVpBPbl4Omqr+ 06J1DL1eRyQSQRD+xSYr63TENBFBjaMJIoqm0dDYRHNjI6lpGZw4cYLUtFTmzx/Fnr27aGttwWAw EgyHURQNd6Kb3NxcsjIySXa7sdsseNvasblcaBrIokhUUVBjKjqdyJJnniQxKUFr01Rh6ds/C5cr L/cUBMH7f5L+f4Rz+/33oGna5cqLNVlL33i79PZFvRw6g54mXxeXKsqZc/VctJiCKAhEwiEMCQkI Oj011TX079eHUDCAXqcnOyuLFr+KpNcT9HSgM5iJKSrEQUZEJxu478GHeev1ZeRkZ7Nl62889eyz 7Ny5HU8IWqpqiCgKXq8PRVXRG0/jsBoxiir33nUHBXnZIIigKmiA3mAgrpe48dprsetNyMYMYd3m 0/Xzrr15viOlW3XVpVJyC4v+U+1/1zbGF154gW279/lFh2XTT+v3ZnZ5GnoUpCdpwa4O4fTZc2Tn FWBxpKJhQQAeufdWGrp8WF0uDh47xtmSUtypqXR1dnL0yBF6FvVGiyvoZRFViyIIGoWFBUydPIlX l77OhUutPPDgg1RU1hIOxwmEgwSCQXSyTEpSMnpJR0qykbycHFRV4MDBwzhdCbgTnCDLyCYLew4c 4Y+P/Z75s8ahdzq097/YI0ycef2DH3/51ebS06UU9v7PwcD/5e7gLRt+Ydtva4e0NtTd5Wm6dPeU sf0xGqG2sp5r5ixk0IixqHGVDz55j+aqdi6UXSAU9CMiIIqgt8lkprl5c/kbxCJhFCWGpJMJhUIY DAZkWUZDYteu3az4+Eu8fgFQ8UcEDPoYdrueAQMG47AncPT4eU4db8BmjlLQLYnUFDevv/ESkqTn 808+ZdtvW5i3YIF2/mK1sPrHPdrAkeOeWrdp9/L1P63hmvnX/V16/0tbp1ev+tJ4dP/2l04fXn9b 38IU98A+/YSW9jY6PH7uuu9BCnoNRPOUEdego70NgyQh60RUKQEtFkNRYpgMegQ0BElCFEWi0Sia pmGxWPH5A9hsDjRBQ5N0aKKAElMJBINcvlBOJBzDaBUYNHQMsWAY2ahDZ5LZ+P163n//PSZNmIQk Suw+eoq9xxs6x44ePWL99j0Xf/r+a+Yvuvnv1vnfOpFg0fzpN3U1ld8Y9jfNGD1qoGYx6YWmhkbS k3K48ZabyC4sJB4KokZCxKJRRIOGoMZRYlGIx9HrdMTiMWRZRlEUVFVF1OkQVBW9wYQgiAgGPYIo EVcUNCRknR7igF5D03QIMY3Nm3/lxx/WIMtWUjPyKCuv4siJi5rZnrLjw88++934CVNrqi+Vk1NY 8H+l7799XMPEkWP1JlPrJ97OhoUFWUmmMUMGaf42n7DpwCH69u7FtKuuYsCAAbiSkkAJEA6GrtQa JQaahqrFAdDr9YRCQQw63ZWNIBqIsogoSMQUDVGSMZiMxFWVSDhCm0fh6N5DfPf9WjIz00hKdlFT W6cdPl0mVLaIHXc/cOsLy5eveOfXnzcye+6s/5K2f9gpKM8/8+Csb79a+U2aS3YO6N1Nc7ntgslk oaq6hua2dkwmC1OnTKF///4UdS9EbzaCoqKqV6Z8QYxjMJvQFI1YNIYocWVBSwDBkUSosZGSiyVs 2LyBM2dPkeHKJiMzi7YuHx1dPm37rpNCiw/mXTtjxXc/br4fiD/11AO8/vr7/2VN/xA4DTUXSM/u gaZpjuvnjL634tLlR8RwIK2oqJDkFCeaFiGmRgj6IwR8XnSyiMVixmF34nankZGRht6oQ4lGiUZV FEUhGAzi8/rw+fx0eBtRFYgqAgh67DYHF6urtLKLnUJmVlJJW6eqz89LX/H4k8+snTxzXvUnH77J Xff9/ccy/K34h56f89sv3zBtzk0AvPTMI3esWvX5fYIWLXAn2hLMRgMJThuJLhdxNYbufxVpImha nLimEFdVJFm+8sIoyKCJiKJEIBTVPN6IUFFRT1urTw2HhUBm99wWvUHcuu9w6YOCIGgAv/64htnX /n0z0f/zOH30yo7/bz97f8r8GRPWpDjEsNuEZgYtP9msufRohel6bXBPl9Yrx6gN7Z2gFWYI8X7d LFpBqqz1yLBqVgGtW5ZV+//Gz8nwt6OpsjgjObb1ytlTLD6udvC9V7QCNDmzCxkc2LmRwcHdn4GB gYHh////rKuXzhefMXWyTFt7593JkydZcXHy33n24nkSBzvLlrfvPsXz8LJd+Pef+Z+khORTSQnZ O4/vP2ZZuGbZ2WdPHwpLScvDDzS7f/sGg6KqBk3dDgDusE2qQpw9lwAAAABJRU5ErkJggg== " + height="40" + width="40.57143" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/10 centsoff.svg b/plugins/currency/images/10 centsoff.svg new file mode 100644 index 0000000..821f6f0 --- /dev/null +++ b/plugins/currency/images/10 centsoff.svg @@ -0,0 +1,292 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="70" + version="1.1" + viewBox="0 0 71 70" + width="71" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="10 centsoff.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="1" + inkscape:cx="-123.06607" + inkscape:cy="99" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><image + y="0" + x="0" + id="image3046" + xlink:href="data:image/png;base64,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 +" + height="70" + width="71" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/10 centssmall.svg b/plugins/currency/images/10 centssmall.svg new file mode 100644 index 0000000..825d0ef --- /dev/null +++ b/plugins/currency/images/10 centssmall.svg @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="40" + version="1.1" + viewBox="0 0 40.57143 40" + width="40.57143" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="10 centssmall.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="1" + inkscape:cx="-365.56607" + inkscape:cy="12" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><image + y="0" + x="0" + id="image3046" + xlink:href="data:image/png;base64,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 " + height="40" + width="40.57143" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/10 dollarsoff.svg b/plugins/currency/images/10 dollarsoff.svg new file mode 100644 index 0000000..73d94e6 --- /dev/null +++ b/plugins/currency/images/10 dollarsoff.svg @@ -0,0 +1,104 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="55" + version="1.1" + viewBox="0 0 117 55" + width="117" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="10 dollarsoff.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="1" + inkscape:cx="-67.723576" + inkscape:cy="87.999997" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><image + y="-8.0163699e-07" + x="2.2370994e-14" + id="image3048" + xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a +HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy +MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AHUDASIA +AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA +AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 +ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm +p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA +AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx +BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK +U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 +uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCW7uRu +dBIN6oXAY9cevI45Gen4VWt0ttUFxNcxlmhIjASTryeO2DnjBq/dW6pZSBlDOAW54+b16j+Yqnp0 +YGmXAO1svxyQOg9OfyAx6DGB2Xs9DmsmtSL+zoBHu+yOsmOFMvBz6HPTn0z7VdiiSMkC2nMePv5H +X6Zz3/nWeVlhk+VFdm7q8iY56554/wABWlD5Una4Ix0Vn+nY1hioqUbS1Ekk9AnVFRW8tjuOMZx/ +npUZcpykfB65bnqf8auXyolpG4RzggY5Jxg9utYx1Oy3FJLlYJB/DIjZH4YrghhotXsapIe99Ibq +OOOHK5Cu+/gH0x3pl5eyxyGNI1du2X25/TH6ipYpNO8uNItRtyV5y7HLHuScVfSG2uc+U9vOT/zz +kVv65rqjhqa9SXBM5abU54ZCj2rI4OcO+D/KrtjNJfxswVUwcFS24npgD35rVudMhlTyZo+M/Lng +p9PSs/S7Y2UbsrFyJCDgcEDIOPXoevvxgV1wdtCHBJaGnpjXdvDPcIzIhKrllzz9QMd/5eozVm8Y +SQ6vBp3n75XcJIVVQIyTxyetbaNG1kzyea8rkZ5VUZsYzzxyGznAOWHUjjh/EKLp+saZJGysizs5 +cDO7BXknHPAH4Ck9dSlpZHZSaxcW52tMZWPTaFA7c9OnX/61VZLy5vFUTvuC+wFcnZaXN4kzqWoM +7ROSIoIzhVA4xUxt5PDWoW/lySGwuX8po5Dny29v8/0qlZa2Jd3pc6pRgYxk0VW853JESF8ddvQU +UwsPu1do3WM4yDgYz+GOv5EU3TWEto8R8xArbeQcjpjnGSOnXt+mZc6oTCzFBJEVKuhUE/X368jv +254N7TJ4UtpA11FliSj7s/jz7+/65okmmEZXRI1pGzsXLkA8KWwx/D9KVreOCfC3MikgBRvwTThq +sMkTBbiALyd+eSev3Tj3qiNRSB4riSzH2kKY5JMc5z0x14B9fX8MK12h2ubFwpW1RGdpMPkMxye/ +euP8Qi4MjSSQbraIhEJ6Enknr17e1dAupLqcLou+KRCdpJB4IPI+n+HrU8drc6ppoSaK38gE7Wjf +GQDwcdjnHfvWFGLv7xomcvBoN1c2TSWbiCZDzGwI5645/wDrUy1ub2xuBHfx4XaWG046HBz1xgAk +jrxjFehyObS2jW2hUvIMPIw6ZBGf6Y9qyJNLKQK9xGpnEu4eYpIXkYYqCCTjgj/d7A10WGmOt9Vh +a0a3uMsoJXZ345J46H5lxzzj3qGKIWB3rIJIzINzMcsBxzjjd2PXkjPOcVyV1dyteyNZr+6RthYH +JwGyAD/3z6nv3IrX0S6EJnknDm28s+YhJ+c9gPxI596cbpilZo1Lm6MdnPKyzyIuHC9PLJOCpGPy +6jIPpXGaze/aL7TUa1ULuKnggtnbnPv1/P6VsandyXF632VXiQIEaPgAY5KgegOTg+n0FZslpNM6 +GTGY+VPGR+OP849Oa6FBuJzc6Uun3jdK8RSaRENPudsflE7G8sEOpOc56/59RS3WqN4ivbW3hGYI +ZBLLIq4H5fn+ftWjZ+Hda12RltrEXSj5mLxqQPYEnA+g5ou/D97osggvrT7G5GUAX5O3RgcZ4GaV +lfl/4cd38S/zR0Fq8fkjy2+X1BzmiudhnuIlI5kB5BHP8qKt00Qpy7fiNLK4kBBU5+ZQuc47eg+n +/wCupbS6hHyyRRSgNnJUEE+/qcAc0yVSJGWUc56gdv0qMvJGMn95H6j5v8n8/rVtXJT/AK/yZfuw +UuGKxh42G5GCjARioH5dOOnFQXdw187PbqqSNOVLOQvJ7ZJGCeetJbX43R5McsYBBVv7p5I/Ncjj +t710FotsCGt3XzFLMg3D7pAymc8Lxwe2T2rirPk8zpjO+4+20eztYY5raTduyNrHIb8iMHgZ69eK +fYXVnpsKpJcKrpuLhotrEc4yf4tp43en0pBeWdlDGnmA5be6gbMHnt2yM5Hvn0rE1C/tbsrp8Eoe +SfO1lOVG3nBI9cY/OuWnORrGzNo+IofNJtn88rljs/hJPYjHH44+tY+syXbQzT/aWjEhBk52ogPH ++RU+lLZ6Tokep6kAsUgwqgcuMEjAHXOOK5bXNbvdZm2NB9ntkb93Aq4APqfU103CxbVFhQJGY2Xb +xg85zznnqf8AGrJdYwY0V/NZh8uAflBHXHHVay7K8l2rHMCq7SrMw4bpjPbOOOasqr/PhwJC37t4 ++eOwOOfw7du9aRdjKUe44xCQSP5h+QgsTyTk/wCeatW+nNMvyLIMD0yOuMAjvwPpg0sf2DZIJJJb +d1KAIw49evrzzWrpl6sUckLo++N+GCMQwPJ6D3qnNiUNNz1LwhbJaeGbNSnDAtIQOSx5zVPx9FC/ +haaWVMiN1aIkcj5gOPwJ/OpfCniCxudKW285fNj+UgHrUXjLVLS50ttPDbnfGcHoAQcn8v1rmjf2 +lzZ25DyJVI+aGQbG55IFFaD6YuepA/2FFFejf+rnC/P8i/f6fHOGbhW65x1Ncvc2H2eZQzOrEFsD +HIP0ooqKbbdmXNcquhYYkaQFyxx09umf5Ct3TrZVjT97MCuDlSOcdunTtRRXn5o3GCsxU37wl5oV +jc2X2ZzcbdwOQ4B4yPQ+vpVSy8LWqSSCMyncuCZCp2jPbj/ZoorwHi6lOLaf5nZCPPNRvZeVh8/h +SzlXbJdXZAOSquoUH1xt61VbwdZwxlY7q5CkEkMVPPr93/OaKK7MPWqSipSd7kVpNNpdCIeF4OVN +3OTnOcLz168VbtdJitIjGZZZELbvmOMcYxx257UUV7dNGSm2tTV0/STeTsYnMZjXH3uSD2z/AJHJ +4rQfw/dhw8JhQg8jGMjPTj2/z1oopTk0zaCuhG8O3ZcsPJyeSQcf0pJtPnsYl83ZgnHymiiiEm3Y +U4pK5Ase8nPI7UUUVtcwsf/Z +" + height="55" + width="117" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/10 dollarssmall.svg b/plugins/currency/images/10 dollarssmall.svg new file mode 100644 index 0000000..f2784ea --- /dev/null +++ b/plugins/currency/images/10 dollarssmall.svg @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="25.8547" + version="1.1" + viewBox="0 0 55 25.8547" + width="55" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="10 dollarssmall.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="2" + inkscape:cx="41.363688" + inkscape:cy="21.113258" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> +<image + y="0" + x="0" + id="image3048" + xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AHUDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCW7uRu dBIN6oXAY9cevI45Gen4VWt0ttUFxNcxlmhIjASTryeO2DnjBq/dW6pZSBlDOAW54+b16j+Yqnp0 YGmXAO1svxyQOg9OfyAx6DGB2Xs9DmsmtSL+zoBHu+yOsmOFMvBz6HPTn0z7VdiiSMkC2nMePv5H X6Zz3/nWeVlhk+VFdm7q8iY56554/wABWlD5Una4Ix0Vn+nY1hioqUbS1Ekk9AnVFRW8tjuOMZx/ npUZcpykfB65bnqf8auXyolpG4RzggY5Jxg9utYx1Oy3FJLlYJB/DIjZH4YrghhotXsapIe99Ibq OOOHK5Cu+/gH0x3pl5eyxyGNI1du2X25/TH6ipYpNO8uNItRtyV5y7HLHuScVfSG2uc+U9vOT/zz kVv65rqjhqa9SXBM5abU54ZCj2rI4OcO+D/KrtjNJfxswVUwcFS24npgD35rVudMhlTyZo+M/Lng p9PSs/S7Y2UbsrFyJCDgcEDIOPXoevvxgV1wdtCHBJaGnpjXdvDPcIzIhKrllzz9QMd/5eozVm8Y SQ6vBp3n75XcJIVVQIyTxyetbaNG1kzyea8rkZ5VUZsYzzxyGznAOWHUjjh/EKLp+saZJGysizs5 cDO7BXknHPAH4Ck9dSlpZHZSaxcW52tMZWPTaFA7c9OnX/61VZLy5vFUTvuC+wFcnZaXN4kzqWoM 7ROSIoIzhVA4xUxt5PDWoW/lySGwuX8po5Dny29v8/0qlZa2Jd3pc6pRgYxk0VW853JESF8ddvQU UwsPu1do3WM4yDgYz+GOv5EU3TWEto8R8xArbeQcjpjnGSOnXt+mZc6oTCzFBJEVKuhUE/X368jv 254N7TJ4UtpA11FliSj7s/jz7+/65okmmEZXRI1pGzsXLkA8KWwx/D9KVreOCfC3MikgBRvwTThq sMkTBbiALyd+eSev3Tj3qiNRSB4riSzH2kKY5JMc5z0x14B9fX8MK12h2ubFwpW1RGdpMPkMxye/ euP8Qi4MjSSQbraIhEJ6Enknr17e1dAupLqcLou+KRCdpJB4IPI+n+HrU8drc6ppoSaK38gE7Wjf GQDwcdjnHfvWFGLv7xomcvBoN1c2TSWbiCZDzGwI5645/wDrUy1ub2xuBHfx4XaWG046HBz1xgAk jrxjFehyObS2jW2hUvIMPIw6ZBGf6Y9qyJNLKQK9xGpnEu4eYpIXkYYqCCTjgj/d7A10WGmOt9Vh a0a3uMsoJXZ345J46H5lxzzj3qGKIWB3rIJIzINzMcsBxzjjd2PXkjPOcVyV1dyteyNZr+6RthYH JwGyAD/3z6nv3IrX0S6EJnknDm28s+YhJ+c9gPxI596cbpilZo1Lm6MdnPKyzyIuHC9PLJOCpGPy 6jIPpXGaze/aL7TUa1ULuKnggtnbnPv1/P6VsandyXF632VXiQIEaPgAY5KgegOTg+n0FZslpNM6 GTGY+VPGR+OP849Oa6FBuJzc6Uun3jdK8RSaRENPudsflE7G8sEOpOc56/59RS3WqN4ivbW3hGYI ZBLLIq4H5fn+ftWjZ+Hda12RltrEXSj5mLxqQPYEnA+g5ou/D97osggvrT7G5GUAX5O3RgcZ4GaV lfl/4cd38S/zR0Fq8fkjy2+X1BzmiudhnuIlI5kB5BHP8qKt00Qpy7fiNLK4kBBU5+ZQuc47eg+n /wCupbS6hHyyRRSgNnJUEE+/qcAc0yVSJGWUc56gdv0qMvJGMn95H6j5v8n8/rVtXJT/AK/yZfuw UuGKxh42G5GCjARioH5dOOnFQXdw187PbqqSNOVLOQvJ7ZJGCeetJbX43R5McsYBBVv7p5I/Ncjj t710FotsCGt3XzFLMg3D7pAymc8Lxwe2T2rirPk8zpjO+4+20eztYY5raTduyNrHIb8iMHgZ69eK fYXVnpsKpJcKrpuLhotrEc4yf4tp43en0pBeWdlDGnmA5be6gbMHnt2yM5Hvn0rE1C/tbsrp8Eoe SfO1lOVG3nBI9cY/OuWnORrGzNo+IofNJtn88rljs/hJPYjHH44+tY+syXbQzT/aWjEhBk52ogPH +RU+lLZ6Tokep6kAsUgwqgcuMEjAHXOOK5bXNbvdZm2NB9ntkb93Aq4APqfU103CxbVFhQJGY2Xb xg85zznnqf8AGrJdYwY0V/NZh8uAflBHXHHVay7K8l2rHMCq7SrMw4bpjPbOOOasqr/PhwJC37t4 +eOwOOfw7du9aRdjKUe44xCQSP5h+QgsTyTk/wCeatW+nNMvyLIMD0yOuMAjvwPpg0sf2DZIJJJb d1KAIw49evrzzWrpl6sUckLo++N+GCMQwPJ6D3qnNiUNNz1LwhbJaeGbNSnDAtIQOSx5zVPx9FC/ haaWVMiN1aIkcj5gOPwJ/OpfCniCxudKW285fNj+UgHrUXjLVLS50ttPDbnfGcHoAQcn8v1rmjf2 lzZ25DyJVI+aGQbG55IFFaD6YuepA/2FFFejf+rnC/P8i/f6fHOGbhW65x1Ncvc2H2eZQzOrEFsD HIP0ooqKbbdmXNcquhYYkaQFyxx09umf5Ct3TrZVjT97MCuDlSOcdunTtRRXn5o3GCsxU37wl5oV jc2X2ZzcbdwOQ4B4yPQ+vpVSy8LWqSSCMyncuCZCp2jPbj/ZoorwHi6lOLaf5nZCPPNRvZeVh8/h SzlXbJdXZAOSquoUH1xt61VbwdZwxlY7q5CkEkMVPPr93/OaKK7MPWqSipSd7kVpNNpdCIeF4OVN 3OTnOcLz168VbtdJitIjGZZZELbvmOMcYxx257UUV7dNGSm2tTV0/STeTsYnMZjXH3uSD2z/AJHJ 4rQfw/dhw8JhQg8jGMjPTj2/z1oopTk0zaCuhG8O3ZcsPJyeSQcf0pJtPnsYl83ZgnHymiiiEm3Y U4pK5Ase8nPI7UUUVtcwsf/Z " + height="25.8547" + width="55" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/100 dollarsoff.svg b/plugins/currency/images/100 dollarsoff.svg new file mode 100644 index 0000000..8a65bb9 --- /dev/null +++ b/plugins/currency/images/100 dollarsoff.svg @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="55" + version="1.1" + viewBox="0 0 134 55" + width="134" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="100 dollarsoff.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="1" + inkscape:cx="-172.24001" + inkscape:cy="44" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><image + y="0" + x="-2.253418e-06" + id="image3048" + xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AIYDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCzqGqi zuFiKEkrn72PwqI6q5TasJcFcNtlAwOmMVS1e3M96/zkBIuF7dTVNLePOAFDYPAXnAB/wrP2MZx1 PJpxVrmxJqTRMwaFmbGQFkUjORih9XSH/l3JAxysykH1x+tZa2auRvlcxrgtzj8KZdm2hcBQGZeg 6/nWf1aDfU1Sivso37XW0uQfKgLAdSJBwc1MLyVmINvsGzcHeQBcjqM/rWfpUj2+k3Go3BUxRcQo f4m7/wAjXLX2ozXs7zTzMxzkIzcAdRgVKwNOW9/vO2niZxjZJI7T+0ZpXdY3s3ZR8/77oOoOcdqp Sa5cq7qLeKXaRlY5g3Pf+dcT9pyGUOY88HBxn/61RCcgnLAE9ea0/s+jtYp4mo92dr/wkxBKGxlU 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 " + height="55" + width="134" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/100 dollarssmall.svg b/plugins/currency/images/100 dollarssmall.svg new file mode 100644 index 0000000..3695601 --- /dev/null +++ b/plugins/currency/images/100 dollarssmall.svg @@ -0,0 +1,105 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="22.574627" + version="1.1" + viewBox="0 0 55 22.574627" + width="55" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="100 dollarssmall.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="1" + inkscape:cx="58.911764" + inkscape:cy="31.000877" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> +<image + y="0" + x="0" + id="image3048" + xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a +HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy +MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AIYDASIA +AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA +AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 +ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm +p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA +AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx +BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK +U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 +uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCzqGqi +zuFiKEkrn72PwqI6q5TasJcFcNtlAwOmMVS1e3M96/zkBIuF7dTVNLePOAFDYPAXnAB/wrP2MZx1 +PJpxVrmxJqTRMwaFmbGQFkUjORih9XSH/l3JAxysykH1x+tZa2auRvlcxrgtzj8KZdm2hcBQGZeg +6/nWf1aDfU1Sivso37XW0uQfKgLAdSJBwc1MLyVmINvsGzcHeQBcjqM/rWfpUj2+k3Go3BUxRcQo +f4m7/wAjXLX2ozXs7zTzMxzkIzcAdRgVKwNOW9/vO2niZxjZJI7T+0ZpXdY3s3ZR8/77oOoOcdqp +Sa5cq7qLeKXaRlY5g3Pf+dcT9pyGUOY88HBxn/61RCcgnLAE9ea0/s+jtYp4mo92dr/wkxBKGxlU +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 +" + height="22.574627" + width="55" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/2 dollarsoff.svg b/plugins/currency/images/2 dollarsoff.svg new file mode 100644 index 0000000..0f1a6ce --- /dev/null +++ b/plugins/currency/images/2 dollarsoff.svg @@ -0,0 +1,279 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="70" + version="1.1" + viewBox="0 0 70 70" + width="70" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="2 dollarsoff.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="1" + inkscape:cx="-124.56607" + inkscape:cy="94" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><image + y="0" + x="0" + id="image3046" + xlink:href="data:image/png;base64,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 +TkSuQmCC +" + height="70" + width="70" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/2 dollarssmall.svg b/plugins/currency/images/2 dollarssmall.svg new file mode 100644 index 0000000..ef8e77d --- /dev/null +++ b/plugins/currency/images/2 dollarssmall.svg @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="40" + version="1.1" + viewBox="0 0 40 40" + width="40" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="2 dollarssmall.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="1" + inkscape:cx="-472.06607" + inkscape:cy="-156" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><image + y="0" + x="0" + id="image3046" + xlink:href="data:image/png;base64,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 TkSuQmCC " + height="40" + width="40" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/20 centsoff.svg b/plugins/currency/images/20 centsoff.svg new file mode 100644 index 0000000..25e77fe --- /dev/null +++ b/plugins/currency/images/20 centsoff.svg @@ -0,0 +1,257 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="70" + version="1.1" + viewBox="0 0 70 70" + width="70" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="20 centsoff.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="1" + inkscape:cx="-109.56607" + inkscape:cy="101" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><image + y="0" + x="0" + id="image3046" + xlink:href="data:image/png;base64,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 +XodtAAAAAElFTkSuQmCC +" + height="70" + width="70" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/20 centssmall.svg b/plugins/currency/images/20 centssmall.svg new file mode 100644 index 0000000..10d8e80 --- /dev/null +++ b/plugins/currency/images/20 centssmall.svg @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="40" + version="1.1" + viewBox="0 0 40 40" + width="40" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="20 centssmall.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="1" + inkscape:cx="-479.06607" + inkscape:cy="-197" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><image + y="0" + x="0" + id="image3046" + xlink:href="data:image/png;base64,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 XodtAAAAAElFTkSuQmCC " + height="40" + width="40" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/20 dollarsoff.svg b/plugins/currency/images/20 dollarsoff.svg new file mode 100644 index 0000000..64eabd7 --- /dev/null +++ b/plugins/currency/images/20 dollarsoff.svg @@ -0,0 +1,105 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="55" + version="1.1" + viewBox="0 0 122 55" + width="122" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="20 dollarsoff.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="1" + inkscape:cx="-75.566073" + inkscape:cy="105" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><image + y="-4.4480385e-07" + x="0" + id="image3048" + xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a +HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy +MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AHoDASIA +AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA +AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 +ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm +p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA +AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx +BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK +U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 +uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCV7hGw +vPPFUJri1e4+dJG4HzLnA/Kp3zvUfPjI46Z49ax7uDfcsyqww3J2kknHsPb1/wDrefGKejPqpScF +eJoH7Ioci3nO3HCgk/lV+3t7KdMmCZT1wx2nnHrWRayeXAqSiZURcfKpIOAO2P5+9atvMuCimaQY ++8ykfl8oq1TjfYwq15qN+YmkuYdNtpZYoiH6kSE4HOeozxyeR+RrN1Dxg9nJGkVkMkHcsucg54xj +1yOeeoqW+jjhjkmSRlkwC4TP7z0yF5zxjI5+oGKzbG2XctxjeqAiMqdoXJHTtzz93jGcAdK7o01F +aHzNSu6lR850Wl6nq14ytcadHbQ++S5/A8fnW2zhVB2k1y/nTHnzXLcDIJH/AOqtm20//RyZ3kZi +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 +" + height="55" + width="122" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/20 dollarssmall.svg b/plugins/currency/images/20 dollarssmall.svg new file mode 100644 index 0000000..c5ad6a3 --- /dev/null +++ b/plugins/currency/images/20 dollarssmall.svg @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="24.795082" + version="1.1" + viewBox="0 0 55 24.795082" + width="55" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="20 dollarssmall.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="2" + inkscape:cx="45.381168" + inkscape:cy="24.560276" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> +<image + y="0" + x="0" + id="image3048" + xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AHoDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCV7hGw vPPFUJri1e4+dJG4HzLnA/Kp3zvUfPjI46Z49ax7uDfcsyqww3J2kknHsPb1/wDrefGKejPqpScF eJoH7Ioci3nO3HCgk/lV+3t7KdMmCZT1wx2nnHrWRayeXAqSiZURcfKpIOAO2P5+9atvMuCimaQY +8ykfl8oq1TjfYwq15qN+YmkuYdNtpZYoiH6kSE4HOeozxyeR+RrN1Dxg9nJGkVkMkHcsucg54xj 1yOeeoqW+jjhjkmSRlkwC4TP7z0yF5zxjI5+oGKzbG2XctxjeqAiMqdoXJHTtzz93jGcAdK7o01F aHzNSu6lR850Wl6nq14ytcadHbQ++S5/A8fnW2zhVB2k1y/nTHnzXLcDIJH/AOqtm20//RyZ3kZi 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 " + height="24.795082" + width="55" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/5 centsoff.svg b/plugins/currency/images/5 centsoff.svg new file mode 100644 index 0000000..94b3ab4 --- /dev/null +++ b/plugins/currency/images/5 centsoff.svg @@ -0,0 +1,288 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="70" + version="1.1" + viewBox="0 0 70 70" + width="70" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="1 centoff.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="1" + inkscape:cx="-117.06607" + inkscape:cy="100" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><image + y="0" + x="0" + id="image3235" + xlink:href="data:image/png;base64,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 +RU5ErkJggg== +" + height="70" + width="70" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/5 centssmall.svg b/plugins/currency/images/5 centssmall.svg new file mode 100644 index 0000000..c59b97a --- /dev/null +++ b/plugins/currency/images/5 centssmall.svg @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="40" + version="1.1" + viewBox="0 0 40 40" + width="40" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="1 centsmall.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="1" + inkscape:cx="-111.56607" + inkscape:cy="93" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><image + y="0" + x="0" + id="image3091" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEYAAABGCAYAAABxLuKEAAAABHNCSVQICAgIfAhkiAAAIABJREFU eJzFvGd8XeWV7//d/fR+jprVm1Us25J7w2Bsio1poRMIoYYQIIFAEhIS5iaTAVIoARI6GDBgusHg 3gu2LLmqWZIl2Vaz6tHpbf9fyPGd+U/m3iST3HnenRdn72f9PmutZ63f+j1b4H9g6brOyy+/lN7a esxms1oXKIqSqaqqFolE7JqmnQaG4onEWpvNPja1pto/c/rM4J//e7KjjQl5hf/0PQr/rAevXPEm 133zJk73nODxJx6X58yZW9zX23dha2vrjHg8vqi8vNyrqiqpZJKUriNLEiaTiXAkgtVi0eOJhOD3 +xFFsbGvr2+dpmmh6urqV2tra4/PO+fc1Nx583WAI0eOUFlZ+Q/f/z8cmJ07tjF33gIAHvvZIze3 H2+fu3Dhgm/YrLZEb2+ft6mpiYaGBmKxGKdOniSVSjEWCBAOR5FlkWRSRxRFFFXF43aQlpaG1+tj 8uTJTJw4MQoM9w2N/CwciZ1++IcPfgqwYf0azl988T/Ujn8YMJ+v/pRll1zKb558vLS/r29O8YQJ D1qdNrWxubno67pavb29U+jp6QVAUzWSqSR2mwOz2YTNZsNgMCDLCnoiRiSRZHR0jFgsxthYgNGR QYKhCBazkcrKSn32lClCeUU5NpdzvajKTx/v6Ox96KFH9r/w3PN857t3/0Ps+W8D47KZGfIHueu2 W6wOt/t3+Xn5mU6n8+Itm7fom7dsFkLhMNFYDKfLQXFhIdkTsklLT8Pn86EoKmaTGQQwGU2omkoi EgFRZHjUTyyeJBAYIx6N0NffR0NDI21tbcQTUYKBMSrKyvVrr75GyMnI/E3tkSanf2Toe3PnLogs v+Iy/X8UmLdee4kbb7md73/v7l/Pmzfv7qGhIfN7770nDQ4Ocqqvn7y8PIqKipg6ZQpetwuHzYam aWgGDVmSkGSFWCxGMplEEARSqRSiAKlUCklWCEZipJIJNFkiFA4TDAaJRCL0jwxQv7+e2j1f47ba Magq85csji9bujS4du3aX1x66aXvD48M9Sy+8JL/t8CsWvkWV113Iz9+8P4FDrv9XwqKis5Zs2YN hw4dYnR0lPz8fKZUT6ZmylTMRiNep5tkKkVK1xEEgfb2dgoKClBNZr7e+zU11TXUH6inpqaG5oYj 5OYXkkylaGpuIRqNMnVyFZFIBIPBwOioH0WRSek6vb09NDY28vXXexkcPE1xcTFXXnklJpPp98FA 4IVb7rjn2MaNG1m0aNE/H5gfPXAfXo9bTiH+wON2Pz4yMsw7767E7/eTkZ7B4sWLKS8vx+0wEw6F yfD6iIYjSIpKOBbHaDKyYcMGfF4fGTk5NDQ0UFBQwNatW/ne9+5hxRuvU11dzZGjjUiygs/rJSsr k2OtrRQXF5NMJpCSOiajkWgqSTgWxR8KsH3DJurq6wgEgyxZvISZs2bpRotjUUGOb1vFlNnJ+rq9 TK2e8VfbKf0toMjAtt1fU1JU8MoVl1/+wxUrVvDVV18hGlTOXXguy5cvp6S4GLfLhSTIKIoBQVKI p3T6BgapqKpi3foNVE+bRmNzM5FYFI/HQ0vrMZLJJOFolHAojKYZGBkZIT0tDaPRwJZtWxFFEc2g YTabcdssCAIokshgby9ZXh95BQWUTiwjEAyxcdNWenr7hdys9OvD8UTioYcebKmu+d+10D8cmKSu O4b7u5uWLFlS/uyzz5r27NkjVFRUcPu3vs2COXMxqwbsFisGUSZGCpvdTjyRoP7gAVK6jmYwEI1G SUtLo62tDbfHQyQa5eSJE5SUlBAKhbBaLIyOjjI6Oko0GkXVVEb9ftxuNwaDgfr6eoKBAIPDQxhM Zibk5HC0sQmjyYjFYmbatOmk+XwcOniQr7/eLbmdrkUOpzP1k5/8eO9zz70Q/Vuc4K9a77z5Wv7N 133jwPLll9qeeOIJBgYGuPbaazn3vHNxW+0oiooqK5BIEo0n2LJrGzfddBNNu3fjTfOhKgqbN23i 7rvv5qmnnmLWrFkMDg7icjg51XUCPZki3ZeGIAiYzWb6+vooLCxEFEX6+/spLy+nsbERj8fD4YZG cnJzkbTTfF27n7FAgNKSIiRZIZFIMnfObLKzs1j13jt8+MEqdJ2H0PVTuq4/LwhC4q+x96/2mHSv q/GWb97g+vW/PS4MDQ9z2223sWzZMlRFxeZ2oho0kqkU/sAY2bm5DIwMMzQ0hMfjYdKkSezZvZtp NdNoa2tDFEU++OADZk2bgSgI6KkUoWCQwoICuk6eoK2tDY/Hg9/vx+V2M+ofxefzkZ+fz+bNmzCY LWhGI6qmsW7DBibk5lJelAeCQCgcRgQcThdlpYWcHhhg67ZtWMzWC4PBAL947F/2Pvvss/Gv9+zi 5Zdf+fuAueOWb7L/wCHuvPVbx+fNmzfhhT/+SYilRB5++GHmzJpFKh7F7bByeniUlpZmMjMzCYZD hCJhREEiHAojKwqbNm6mvKKCo0cb+PLLNdhtViZVVrBj53bsDht5ebn09HSTmZmB2+0kHApSU13N 4cMH8bg9JJJJVE0jFAxjMVuJRaO43W727N5FTXUNfb29lJWVs3nrNkZGhsnLyUZEx2I2U1xUTAqJ r9auFWRVPcdus+Y/+OCDu6ZNnxn4uzzm5T8+x6P/61/pbG1avfTii4tefvllY3//aR544EFyc3OI RaMokoAoiBjNFgYHBxkeHiYnJweASDiCJEts27qNtLQ0Nqxfj81qpaSkGD2ZICPNx8jICFlZmaiK TFpaGmNjY9is44afOnmCsomliKLAe++vwuv2MDQ0hNlsRpZlujo7mTVzFkePHKF66lRa29qpra1l 4cJzSKVSJONxbDYrug5FRUUkUjq1e/fhcXsmxaMx4x+e+cNXC+bN0Ve+9/7fBsxnn69BTMUfv2TZ sltWrFhh6OnpER566CEKciegSiImowEEgZaWZuxODyaTifb2drq6ujh9+jRVVVXs3rWLiy+6iIGB AebMmUNHx3GC/hHS03yYTSbKJk7EbrMjSxK5uTn4R0fRVBWL2UxXVxflZWWsXbuOK6/8Bs3NzUyb VsPmTZvIyszC4/XicDiwWCzY7XY2btzEt265BZfLxcDpfgxGI5FIFFGSkESB/OwJdJ48wd69e5lW Uz21u6fn4GXfuKr58P79vPDii38dMNs2rsVuNV+QmZHxwubNm6mvrxfuuusuampqiAX9xGNRREHk 8JEjTMjJ47PVqzEYDJjNZgRBwOPxcKCulvz8PLZs3kRmRjqqIjN71kwK8vNIxKKUFBcRCIx7iMlo wD86Qnp6GrIkEhjzY7GYsdttCIJARmYmBk0llUxQkJ/H2vUbOO+88+ju7kZVVWpra5lYUcGmzZs5 evQIVquN7Nw8kvEobreLgH8El91GWXk5Bw8dpr6+XiotKbnqphtuWnXO4vMH/mqPefWNFUp97d4n nU5n6TvvvMNNN91ERWXFeM4giabIJFNJYvE4XSe7qa6uZs+ePRQUFODzpeH3+5k9o5rBgQHycnP4 cs0XFBUVE4mEMRqNWMxGJEBRVQRBwGg0YjKZkEQRXddxOp1kZWUhCAI6OjarDafDTu2+vZSWlBCO Jdi6dRuapiLLMiajEcVgpqSkCIvZzNjYGI2NDZjMZvRkAoMsIegJkjpMnjyZD1d9SEFenpCVkVZ2 530/+Oq1V17+TzXOXwQmEQk+4vX67vro40/IzSniwiUXoIgiRk1BTUUQJIlAQmLDtp2YjUYO1dfy /e/fz47tW7FaTHSfOkEsGsViseBwOCgqKsJsMqAqEmaTEU3TSAKyJJFMJlEUBV3XiUQiKIoyvodE gng8jqaqiALEohGMBg2jQcM/OsoVly/nWGsbBs2AJMt0dbTT1XGclpYWPB4PTqeT/r4eqiZNIqmD pGhoBgPhSJSZc+bw9AsvCBOrphacaG0au/WWb21/4Pv38fKrr/9lYD7/5EM0RbZ7PJ6PRVFUamtr uen6G7BajSTiMRRJIJWMk0KkobkNu9XKxJIiplVP4U9//BPz583FbrNhMhppb28nkUjQ19eH2WzG YbeTSMSRpPFXJpNJUqkUqVQKRVGQJGk8aZ5pKFVVJR6PEwwGkWWZSCSCx+NBFEUKCwvQEWhtPUYi mWRwaIgpk6vw+rwkEnF8Xi+trS1cc/XVhENBfF4v8XhsvM+SZRTNQHtHJ6dOndKrJ1fNUjXtq8UX Lev591iI//7HssuuJCsr68mysjLjxx9/zLkLF2KzW0glE5hMKpKoIykavf0DKKoy7hXG8XC48sor zhqUmZnJ9OnTKS0tpbi4mEQigSzLZ3NQPB4nGo1iNBoxGo0oioKiKMiyTCqVAiAcDqMoCg6HA0EQ cLvdyLKMqqqEQyHGRkeZWFLMnNkz0VQFTRaQSXLp0gvxuR1Mr57KSy+9xLp16zhx8gSSJJHm8yKJ AoKe5Af33UdLU4Ogg6m9vf26scCY8S+GUltzA1MnTyrq6+t7+OTJk97u7m6WX3IJqixgs5pIJWII QgpRVkDWOHykgeKifFw2M6IkoqoKmqqgyBKaphKNxohGozgcDnw+H6P+UQQBBEFAFEUMBsNZ79H1 cfokGo2O5xV9nMWTZZlEIkEikSAWi6HrOtFodBwITSUrawKRSISiokLS3E5cLiehYACX04GmKRQW lbDwnAXEYlGCgQDRcJhYPE4ymSQYDqMqKtu3b9dnz549Z8PGjZ9u2LCx+z95TGFpOfv3106pqKgo 279/PzNmzMBoNCJJoKeSGDQVRZExmSy0tx+nqKiI3t5eBF0nEo0SCoWQJPlsSf/JJ5/w85//nMce e4zmlhaEvxA+uj4Oin6GjhCE8WZfEATC4TCJRAJRFIlEIqRSKfx+P+FwGFWW6e/ro7e3m0g4hCxJ xMJhYuEwmiwjCQIWo5GxsTE++GAVMO7JsiwjAna7A1XVOO+8c6mrqxPcbrcuCsLj/8lj3lrxBh99 /AnLL77g40hCd+0/cFRYvnwZRhUcFgOxeIyUIKAjoZlsdHZ20dt9grKSYhqbmsnLK0QQRRAEDAYj iqoxa85cZs2eTUnpRHbt2o3FasXlciMKIrKioCgqsXgCRVEJBIJoBiOhUBghBbFoDFU1kEymSKZS iIJAKBKlqa2DLbv38vzzzxGOREkkUxQUFiLLEoqmoBoMaEYj8WQSk9nMvroDXHb5pSjS+CkqKQqJ RAJJltFUFfQUbq+XY8dahXSfL//uu+7+/O2VK3vOesyN37yZF55/7kqzxeqpq6sTpk6uxGk1Y1Bk YrE4iqKSSqYQBJHBwUFaW4+Rm5tLZmYmw8PDHDvWgqIoZ70hkUgQDodJT09nwoQJ3HDDDQwOjFfG msGA0WjCYrYA4Pf7MRqN+P3+8bBK6aiahiiJGM1mZEUBUaSjo5P169axecM67rzzTm699VaqqqoY HR0FQDsDpCCI2Gx2BgeHSE9P5+s9X2MwjqcPIZnEaDAgkMKgqeipJHPmzGHjxo3YbDZWr/5sUWtT 4/8OJV3XWbv2qwszsrJdx1rbmDathkQ0iCYJaKqBSCSK0WhClhXq6urO0gbHjh1j5syZ7N9fx9jY GJqmkUqliEWjmM1mEonEmdrGx8XLltHRdYKxYIjW9uN89Oln9PX1EQwGGRoaQj1T0wQj4fFqVZZx e9wcbWzk9888xxtvvc3B+v089/TvmVxVxbZt29izZw+SJOHz+ZA1DYPJhNFsJhSJ8MZbb1FSUkJF RQXvv/8esViMVCqBLIokolGCY6OosoymaSiKQiQS0SdPnnz/pk2bxLOh5HY5JJfL9bw/ELS0tBwT pldPxmc3ogg6SCpmi43RkTHWrd/AwNAwkiTR39/L/HnzEEWBispKnn76aS666CJGRkbGj92Ujs1m o6+vD6PRiM3hxJeWzp6v97Kvdj9l5RXYrWZ0XWdwcJBAIIAsy8iyjD8wRjga4cOPPyI7N5/a+kP0 9nTzkx89RF3tPmRFpbS0lOnTp1NYWDh+qqkGRFlhaHiYZ//wHFdfcw1paelnisJSKirKCQUCRMIh RFFGkCQkSSQcS+Jxezh2rEXIyyuwlpaWvvbKa6+NSt+68TpOnh7Qc7Myf9HRdUKz26xMnlSOqsgI 6EiyRCKZxOXx0HXyFEldJ5FIkJWZidlkwmq1ERjzI4giFquVhsZG1q3fyNx582k51kpuXt44kR0O Y7fb6Ojo4Hh7Gzu2bWHXrt3MnTsPq91GMpli9eersTvcdHV3097Vxdq169m5dTsXXbCYubNnEY1E uGTZMsrKynG63GiaAVUzkNIFamvrcDkdPP6vv2b27FlMnlRJX18fs2bOJBKJsHfffixmE4Ikoqkq kgA6KWRZweFw8dbK9zj//EVsWPule8furz8WX39rJdMnVfzUajFbe3t7ycvNQUQnnkgiyRoIkEjE efmVlxkcHhqPP0Fg4sSJGAwGNE1D13WmTJnC7j172L5jJ929fWzdtp27vvMdunt60QxGQGBwcIjy 8jI0VebxX/+Kb950E4lkklRK59333mNqdQ3bd+6m8VgbO3Z/zbnnLuKKyy+nbt9ePC4X8+fPR9UM xONx9FSKvr5+RkbHeOGPL7Jq1Sqam5pI8/m4YPFiSCWJhsO88/bbGE1mrvjG1dicLhTVwMDQEIlU EqvFjCIKmExG7E4n0XiMUHDMfjbHHDp0aL7FYiEQCJCZ5kMSBWwWM4Kgoygyzc0tnH/+Yiorq0jE IphMRnKzJ2C1mAgFx85UlaM4HU56e3pJpVLMmzePjIwM9u7di9/v57XXXsVkNrNr1y4mTZrMDTd8 E1EUGR4e5qmnnsJut1NdU820mmocNgsjw0NsWL+OLZs2sWzZMrxeL7IsI0kSRqORurp6Vq4cJ+Hf fPNNlixZQlNTExdddCEAiqKQlpbG9ddfRywW48MPP0BRNAwGI16vD0VSCAZCjAXGCIcjeD1eOjs6 cTqdyw83tVpFgGAwaO7v6yMZHzdaEgXQk6SSCZIJqJ46jZ7uXj777DOGh4dRZYn+vl7MRiNWk4m2 tnbq6+s5cOAA8+bPx2Qy8e6772I0Gqmvr+fgwYM0NjYhIHLsWBuNDc3cdtsd2O12/vjHP3Lo0GEu ueQShoeGOXWyky+/XIPP6+aiC5YwZepk+vr6yMjIwGAw8MILLyAIAl+s+QJd19m5cydlZeX4/X78 fj+awXA2z5nNZr7e8zW7du0iLy+fPXu+pru7l3gsQSQaZXTUjyyNs7vFJcU0NDYwYcIEnn3qt7ni wUMH3aIoztVBd9psKLKEKApEIxGikTBj/gADAwO0tbVzzjkLmTd3DvPmzMZuH88tfX29CALjHuN0 kpWZydKlS/niiy9YuHAhsiyzatUqBgaGSCV19u+vo7e3l3MWLGTlypX88Ic/5NFHfzYeomcKtW9c cRkzp9XQ3NTAlZdfTiQSIRwOMzw8TFdXJ8FgkFMnT+JL8zFv3jzmzZtLIBAgLy+PVDJJMplEFASC wSATsrM5b9Eidu3axfz585EkGZPJjNFowudNIxqNoGoaGRkZDA0OYbVaGB0dNYk7tm+z5OXlEY1G Bc1iwaBJxMIBBFkmpZqwud00HDtGShQZGh5BkTX21x4gEIiCaOB4Rw8Wt4PFF19IXmERoXCC3/7m Ga688goSiQQLFy5k8+bNlJdPpP14G1arBZfbyVhojDtvv40P3n8Ph82K2WhAkyVKyicSDgT56P1V PPzwwyDBWCCAwWCgt/80omompWt4PB4yMp00Hq3n4QceZvbMGjZt2sDomB/VoBFNJIlFwzQ3NfL5 6tU88vNfsHXXLnbu3UvvQD+9/b2E46HxkzAVI9PjIBaNIGgWfXJpQZk0ffq0TEWSvnvixAk0o5Hc rAwUSUAQJBTVQFdXFwcOHsJktjAyOopBVcjKysJqs3Lk6FHiyQQ2k4bTbkcWBXZu28ply5dht1vx +0dZ8/nnXH/9dVitNpqbm/jwww+5/fbb8LqcZ5vKyspKRFHEYrGgGcbfeffdd2M2m7FZbaz54gtU RcFmd9DR2YXP48Xrc5Ofn897765iZHiU5Zctx+v2YLPakM/0YBazCc1gxJuWzp/++CLBQIDMrEyM morLYUdVFOLJFLIsk9Rhb+1+Jk+ZKvT39tSLoVBo8fjocwRZVonFEoiCTDgcIRAIcvz4cVRVQRAE HA4H/f39ZGRm0tHZwemB0wwND9N7qhsxlSTN5eLO225GFmJ0d5+ir6ebtDQvVrMJRZZ47dVX+MmP HmLypEpkeZyLcTqdGAwGHA4HqqqepR/S09PPVNNJrrrqKp588kkikQhlZWW88eYrzJ0zh4yMCfz4 xz/h4KH9fPvmb1JXtw+DphCPR4nFImer6TH/GB6PB7fbjXqmYxdFiVAohABnejd1vLMXBJLJVIV0 7sJzppiNxmVDQ0O4velk+XyYjQZMJjOiLGM2m8jIzKK3r5/+/tNccfllNDY2cODgQdLS0igrL0NT TSSSIMoiRrOJw0cP89mnq5kxfToXXnABIyMjfPTRh9xxxx2cM38eqWQCj9uFdubo/XNnHY/HESWJ aDTK5MmTOdN6YzSamD1nDrv37GHJBRciCkl27drNJZddw9DgaQoL8pg6uQqvx4PL6UBVFeLRKNFY DKPBhC4IVFRO4tNPPyGRiJOZkYbFZARdJ5FIouuAKLF163Zqpk0jGPBvk5PJ5ChAIh5HEMbpA9BJ JnWOtbZTu38PRpMZtzed+fPn896qVWiaQmlZGT6fl9KyMlJJBb9/hFBolCPNLWTnF/D0U78jGo0S i8XYsH4t3/3ud8nLy0OSJGRZJh6JoMvj/VU4FMJkMiEKAiazGVVVGRsbQ1EUNFVDskrYSkvZsWs3 X3zxBcXFE4jHkixbchE3fPM63B4jRsUAwNDw8Fl6wmqxEQqHScQTNDY2ct3113O6vw9JHCcVRFEk lUqAkELQdZLJJJIsk4jHVWn27NnTTEbDZROyswnHI2RlZCIDophCFBNUTZpKx8k+sibksOGrNRg1 E/m5hQhIbFy3ie1bd5JMjFFVVUl6ZibZ2fkoqolwOISAgMViYtnSpbgcDnSdM0RVEkUz8Mc/voLV 5iQSS9DT0weCRFfXSdxuH8fbOzje3knLsXZWffIJJaUTKZtYyrHmBqZXT6ewIJ/cnAz27dtNui+D 8MgYfb39oIPJaEYzGojFoiAI9J/ux2m3oSoKFRNLiZ0hygRBIBIdRbPaiSOzY+cuFsyYwbG21i5Z 1dR9g4ODZGdnYzKZCYdCaEaVRDyOwWAgFAphMhmpr6ujurqGwqJ89u3bhyDAjFlTKSgoRBLg1KmT xOJJzBYr2Tm5BEaNDJw+TSAYIRLpwWA0YTAYkc7wvENDg/j9fhYuPIfR0dGzHI2qqmeJK0mS6Ont 5d+e+DW3ffsW9GSSq6/6BuFwhHg8QTQWx2KxsXfvPnJzi/F4vPgjcboajzF5chX+sUHMVivZ2Tm0 He+gpMRL58lT5EzIpLenm0AwjCxpRMIx4noKo8FAPB7D4/YclGfOmtX/1erPsNvt9AwOIkoioigS iyVweZz09baRSCRwuV3E43GaGhu45pqrcLlc42LCcJjRoUHGAiE2rFvLqe5uMifksHjxYiZXTeLg gXpMJhuRSBSDwThOcGsaO3fu5MYbbyQWi2E+w+z/mbT6M0lls9n46quv+OEDDyCSQhAFQsEAA0N+ nnn2Ge6///vMmTcfWZbo7h1g3bp1tLa10XSshQ2bNvKnPzzFunXrOdndy+y5c9mwaTORSIT5c2dD KkkgECArLYPRcJSRQBCDwUAsHmF0dLRT0HXdtOzCxa1XXnFFRvvJU9RUVuAwqiTiUVSjyltvvUdR +SSOHG3g1ptvYvfuXQQCQXp7ewmHw5ROnMgVl1xAIBRi1B+gr7+fpuYWJuQWMGVyFcWFeZw4cRJJ AFmW0XUdRVF49913+enPHmP58uWIoojP5yMajdLb28vQiB+TQUVRFE6eOsGKFa9jMmgYNJXt27cT jCS5+ppr6ezspLGxkXgijt1soqm5mXA0gsfrxWQ2caKjkynVNbQf7yQtM4OC/ELq6+vo7DjO9Jpq TAYNVTBgcro42NBAV2cb1ZUT2bO37mJZEITQgjkzjaYzCoNkeRnhaJR4LII/NIbdbqfjeBuLFy3i ueeeY3BgEJPRRH5+Pueecy4msxmP14sWCNLT248owJzZs+jpHyAcCnGqpxdFVenq7MRsMuHzejh4 8CDFpRNpbTtGJBJmxYoV45IPVeXIkSPU7ttHeUU5wWAAQRBw2R2EwkG2b99BMp7kqutu4MOPPuLA gTpS8TgzZkwnKzONnOxM+vr7cblcRKIRCnLzaWpqxul04LDZWffVWmpqppLmdXH40GFmz5qNJKnE kwk62tsoKS5gYGAQfyDYLwFcfunymvT09ApBEFEVGUVVkGURq9VK1aTJJGJRmpsasTucnL9oIbNm T+fW225B1WQ6O9s5PTRCfn4+g4ODmIwadpuVdI+LRCxCNBwmFAox4g9w4uQpPC4b9fX1XHPDzXzz hmu4/PJLiSdiGIwakWiY3Tt34PW6KSkuJGtCOhnpaYz5/Zw81YOsqMxfeB7fufcHfLVuPSZNYfGi hVROLCYtPYtNmzYTi8UZ9Y/hcXvxup047HaKioo4VH+QhqMNjAwNUFFeQmZGJi6Hl4ig43K7+PKL 1SxdulSvP1AvLLpo+aMiwJQpU96Jx+P6xLIyRFFE1VREUSSZTDIwMEAgECAaiZKdnU1l5SQOHDjE d7/7PX7600fp7u6lv78fo9GI2+0+W5PYDCbcdicuuwM9lsBsMrF/fy1Wq5UJWVl0d3cjCAIGg4FE IkFnZyfhcJgjR8ZHrIIgMDQ0RDQaxWAw0NPTTVVVFXfeeSeH6veTleZhzqyZVJSVE4lE8AfGSMtI x+Pzcnqgn98//RS/f+oZNmzaRO2+OvKLCjFoBkRJ4sSJLsxmM6FQmFR9DlaEAAATk0lEQVQyhaqq BAIBJEkS+vr6915x2fLT0qZ1X3L5VdceK8zP/bnH6yM45sdsNCCJ40fr8NAIra2tlE6ciNfr4623 3ubEiZNkZk3gjjvuZMqUqUyfMY3+vl4cDicDp/sxm82oqobT7SIUiVA8cSLNLS20H2+HVIJZs2fT 0trOzGnVlJSUsHnzZmRZZvPmzeyvreX+++9nZGQYt9tFPBFncGCQ3Lw8Ojs6cft8XLb0Yi6+YAll paVIkojd4cRkc/DmmysoKi5h7rwFnH/+EpKpFAcOHGZgZJiammn4vGkUFxUwOHQam92BphqIoxOL xWltaSY3J4fu7lN1F19y6TvSGyve5qP3VwoHDhy4ubyy0mFQFVLJ+Jn5kEZ7+3FESUIUJYKhMKFI hLkLFnDJpZfS2dXFG2+9xScffkBpSQmZmRmkkgnMZjMmuxXVaEQxGTnU2MDvfv8U+bl5GFSZObPn 4PKmk+bzcPz4cSZOnEhDw1EaGhp58oknCATGMJmMKKpCMpGksbGRwqJiiouLcXt9OEwaORMmoMgS RqMZk9nCxq3b2Lx5C23txzlytIHsnBwWLzqfufPnE08k2bJjJ26HE5NRw+1xogOpJJhsVt5//31y JkzAbDYzY8aMb73x1jsnZYArrr4utXTZsi+SgaHv6pqV3sExJvgMqIkEqiyQke7lxMlTHG1o4rrr bmJoZJCbb7waSdZYdO4S7r33PtLT0+noOM7pwRF6e3ppbW0jgUzWhGw2rv2Ck11d3HT9dSxatIh4 CvRkDJPJTGVlFZIkkp6eyZw58xHPVMboSYL+MeLxBJFYHF0UGQmGOdHdQ0nuBMLxKIIgYzAaGA0E +fyTj/nRDx9k4cKFvPrKq/zowQexWmz89re/pby0lP6eHsJhPw5HLkF/AEESSYgCkqBTt28vP/7x j2lpOTbk94/Vwb+Ts67dsLl6w6cr9y9cspT+0wO4HVY0IYHFaKS7t5ev9+6jrLwCVbVQf2A/kpxi 2rSZaIqFcCLGG6+/xs5dO7HbbVRVVVJUUMzh5lZOnx5kdLCP5UsvQFVUmpuamDd/HnPnzmXylCnE YjFGRkZwOh0YjSZ6enoJBgL09/WQnuYjFouxt7aWV197g9b2Ljw+N4vPmce3v/1tXG4vkWiER372 cwJ+P88++ywOhwOvz8f+2loaG5o5cuQIU6dOxe/309DUwOyZszBpRuwuF7qiMDoyyLsr3+M73/kO jz/+m41PP/3U4pLyCl0C2LZtG4vOXdhTWJB/2/z5822aIpNKJtEFEVnQSaZSrF79Oddccy09Pac5 1trCtddexYYNm4lFE7z80h+pLC/n+/d/j2/fchMXLF6M1+MmEAzR3t5KWXEB93/ve1RWVpCfn8/R I0dYteoDPvjwAyKRMGVlE0mlUgiCgNPtxefzkUgkOHXqFJqmkZbmY9u2bQSDATRNo7Wllbq6feTm 5eNyOll26WVcftll3HLLLezZs4eBgQE0TcPnTSMcDnP48GGmT5/O0PAQRoMBr8eLrKiIisLHH33A 4sVLOHDgACUlJf9r+RVXHjg7PnnttdcAyMpI71UV6cqCnCw0k5mhkVFMiojD6WT6jBmMjQX48st1 zJ07G1kRiSeS7Nixi4ceuI+K8jJcTjsjI8MIeopjLc24vT4CY2Pcc9ft4wMufXzQVVJcRE72BFwe F+XlZbz44p9oaWlm3ry5BMPjtKPDbic3J5e+vl4i4RATJ06kpqaaB37wAPPnzSEtLZ0nnvgNjz/x FMePt+FyOvnZz35GMBhk165dGI1GXC43uq7T09PDpEmT2LBxA9NrpuFyjif1QCTMO++8zfJLluuN jY0dj/3q17f8hxHtn9c7H3164g9P/uuPptdMxWR3EkvoqMQZHhkBQeTgwUOUlU3C43Gik+SN11ew ZPFFOK0GFEXCoKoYNJVwKEDOhGyMZiuZmRkU5GRz8kQng4NDKKpyViI2tbqaSDRCNBYjJzubRx/9 GbPnLsRqtaIDggBet4uRoUE8Xg8DAwM4HE5sVgser4dvXPkNFp2/kLb2Tl5+6UUyMzMxGDRyc3Op q6snMzMLRVFobz9OeXk506ZPx2G3ockq8WSSt997l+uvuxZdR9i1a9cjRxuba/+MxX+QgcyYUjU6 aebs348lYujxGBWFpaQkOyabBU2F7o4u+gd60UUJl8vH9ddczVVXXsSpvkEMZjuhWApd1DDbfIRi caKhMSxGlYamJiwOH1k5RQyOhFm/cQfBcIo/PP0sY8OjTCwqobigiNu/fRu//82vSEYDxCMhEvEk m7ftpnjSVJKCxNSpNaiKRDgchpTO6MgQGT4v37/nDv71V49z9EgjH3+0msyMbEpLyojrKXSSDA32 YDTI6PEQoVCAsXiUzr4+jnedwma18uJLf+K9Dz9Z9e+x+A/A7Ni5hcmVlT/95S//bUzTDKSle1A0 hVgkjiCoLL1kGUZNoaujnVgshi89nXdWvk9BQT59fX0YDAZUVcVg0MjJyWNiWQXTps1ganUNp/tP oygKE0tLmTVrFocPH+aKK64kmQKP10djUzP5BUV861vf4sc/+QmqppFK6Tgcdo63t2G1WMjOziYW i51VXf257+rt7SUnJ4fm5mba2lqRJIntO7aTl5vLmjVruPrqaxgbG8Nic+B0udFTKX735BPc+u1v 6cMjI8krr/jGUkEQ/oMW7z+E0quvvs7q1Wvi995zz7Gjhw9dXTW5ktLySnp7+hB0AVkRmDixlNp9 e7GYzRgsNnRBZGhgALPZTHNzMzt37iQ/P58jDQ340tIIBIKsXbuOFFBfV8+JEyfw+XwMDg4iKRLJ lE4kGmNwcBBBEEnpSTTNgM1mx2KxoKgqH338EdOn1eAfGcVmtxEYGyMcDp/Vz0SjMQ4ebiAzI4PC wkLS0tLIzMwc7/Qz0smeMAGXy0U0nkAXJDZt3EhmZiZVleXC+++v2ltYWPjIPXffpb/1zsq/DAzA V59/yrdv/06DJnNxSWlRlmIwkpY2gd5TPUCcZCxKQX4+W7fvYGBohI4Tp5g/ayYnT52isLAQs9lM f38/qsHIxk2b6entY87cedTV7ic3N49IJML777/PbbfdhiTLfPHFGkZGRsjIzGJ/XR3RaJiiomJW r/6ccxeeSzQapbZ2H6dP99PW2kooFDzL01osFhKJBJqm0dM7QFVVFRkZGWzfvp1Jkybxh+eeY/as mfi8bkwmM8NjIXpPD/CbJ5/kvnu+ox9vOxbq7hv68S//7fEj/x6U/xRKABcuu5Qj9bVcfdVVD/3+ qd+mBgYGsDuclFdMQlZUkok4bqcDv9+P1WplYHAYTRu/FbJ9+3YyMjL47LPPGBsLMGfOXKKxOJ9+ tprqmmnE43GOHz/Ovffey8aNG6mrP0BxSSmCKCOKEna7k97ePgYGBlFV9YwKS6Cvr5/S0onk5ORy 9GgD7cePMzQ0zPDwCOFwhIGBQYpLivn8iy843nGcgoICVq5cyR23305ZWRmKouL3+7Hb7fzyl7/i 2WefpbunJ/X5Z5/tWPHOO+93tbf9/2H4y6rN5//0Ip+tWds5Z/rsxtH+vqsmlhTpST0pmCx2EtEw 0UiEgYHTzJo5jVNdHXT39hKORMgvKCAaiyFKIhajxtbNW0jzZZCemcm+vXuJxWK0tLTgcDjQdR3/ 4DBmg5HKigoGTw/gcbrQLDZESSYzY7xliEejbNiwiYrySkZGx/B60zGZrOjIGIxmvlq7Hq83HavL TigUQpZktm/bRl9vL9dcdRmKojAWDOH1pnPXnbdz43VXY7FaefmV18S1W3YWv/LsE5z7F27C/ZfK 8P3793P3vfc1pPt8M2VVKc5IT9eLSkqEsbFRRvx+8guLUBSZgoJ8NKMJGBcBiaJIZUUFqWSC0tKJ aJqBA4cOUVBQQDQSYfHixRiNRkZHRykqLiYzK4sv1nzBWGCMykmVnB4aoqKinM2bN3HOgvn09PQQ CISor68nmUwSCoVYvXo1xcXFhMNhPB4PiUSC9z54n87jHYQCAbKzs7nj9jtQVIVEKoXL6eFffvVL 8vJymTlrDq+9/nr4jjvuqHxv1QeDn325/i/a/18C8+KLL/KLR37Es396+e3R0eGawoK8UkXUKSyr xB8IkozHAR1FEIil4NNPP+XCCy8kFApx8OBBigoLOXLkKB9++DGVkyaRmZGB1+MhHo+zYcMGHHYH r735BidOneTipUs5f/FiDh89AoJAT3c3DpuVGdOms2HDBgLBEKqqcvDgQQRBYPHixWzfvp2mpqZx lZamEYnHcFjtDA4Ocu/3vkcqmUIzGZAlhRdfeQWz2cp5ixaxfceOkWnTpn/3pm/fvvm/sv3/CAzA lu07eOZ3T/L8i6+sVCWW1kytygxG40Jp+SSGBgcJ+IcxqDLNbceZNWsWR48exWQycd5557F921ac ThfTpk+nuaWF66+7juwJE5g/fz59fX1omkb5pErS0tM5eOggTpcLVdPY+/VeFiyYT5rPS2ZmBo8+ +ig1NdOZOnUqmZmZ1NXVUVVVxcmTJ7n11lsB2LlzJ+eefx5bt2zhF4/+HBgfjWiakUcfewxZUbno kkv0Des3nOzo6Hjvd8889/ivHnuUTVu2/n3AAHy5dtzVbrjq8k9WffL5MrvV7LUYVAqKikgmdfoG /RRkeZBEyC8oZPfXX3OsvYOqyZOQZJm+/j46OjvIycpAkgRGRoapmVbDu++vYvr06WzZvJnysnJe euklZEmisqKKfXv3cfNNt3D9jTdhNJpRNY1Dhw9zemCAZZdcwotvvM7S5Zfw/Asv0NzcwsUXXsSx lha+e/d3sVjGtX2xWIx777uXOXPmMn36DL76am334MDAEx999sVjwP8RFPgbL4vqum679IJz9ixY sKB04XnnC+VVU4X+3j5OtTdiMI1r7sbbhjIOHDkKuo7X58NoNPLh++9x+2234XA48PjSCEVirF+/ nmPHjp1l8bKyshBFieXLl/OLx36BIivMmjWL/r4+srKyOHjwIEeOHGHJ0gvZtXMn1ZOnQCJFZnoG 0USchQsXIooitbW1PP/889x2++0giWzZsjXW3t7x1pYdO2/9a239m+5EPvbYY9Hmts7nPB7P1Pr6 A2V5udmIOjgyJtDfdxo9lSQ3Iw2zUWUsHCXtTPtvtVjIzEhj27btdHV1UlBYhKoZSEtLw2w2k0wm KSoq4tJLL8VoNHPzzTdx8cUXYzab6ersJJWI8/nqz5hcVcUly5bxxisv8cPv308yEmH27JmYzQZK yypIpVI89NBDHDp0iHvuuYdAKMTHH38arK6edt9Lr73+87/F1r/5evHvf/NrSionyVvWr//OsYbG Z2668QZyikrwelz093STjEcQBYF4QkdVVcxmMy0tLTQ1HiWlw/DwEIXFJby+4m2yMjPxnfGoQ4cO 0dbWRlXVZLKzJzB37lz27duH1WJBlURmzJiByWTi8OHDVE+pJhyJYDKZMFhMqKrGijfeZO3atdx1 1124XC6ampv56NPPuPba62oeePhHdT/90cP88t8e/78b+PcCA7Bxw1csOv9CPnjrjemvvvLSO6XF +flzFyyUpk6bSTwFTU3NWGUBp8tFKpUkHotjMKrE4nH6+/tpbT/OxPJKOjo66ezswGQy4fOlEY/H CEeCCILI8NAQ5557LocPHuSceXOJx+Mk4gnMZhP+sSSZWVkMj/lZt3kj++rqyHU7OPe88wiHw/rn n38utLa1rdl78MjSv8c++AuV71+zFp0/rnMbON23b83mHcURXV7x/J9eCb3wwnPU7duhZ2e5ke12 mjo76R8LEJEk/KEQ4VCAvNxsFi2cz4Q0J7IeRROTDPWdpCDbRzQwTHlRAUsWzufyZRdhlAXmzZlN MK6jmO2IBguoZiJCnGdffp577r+Hnu4TXH7JxVRMmsq+/Qf4zr33h6bNX3D53oNHlr707FN/Ly7/ /Y9ePPLQD/jVE7/jpw89YE3qyac//uTDWy688CK9orxCyM7OxuN2E48nOH68g3giMe4dXh9WqwVR lIjFYuNSEAFMRiOBQBBFURBEAavFSigUwj82RktLC9u2bSMUClFUWEhFRTnJVApZkti/fz+rP10z 9s2bb/rR4iWLX15w3qLYoYP1VE2e+j8HzJ/Xyrde47obb2H79k1ljzzyyDMDp7rOmzJlslhQUKhP q6kRDFYnKWROnDxBKBQiGAgSjoxfvTEaTSQScYxGI9Fo7MxlihCpVAo9lUTSU9gdDrKzs7HbbCRi Yfbt3cvBQ4eQJOlUWprvl2++98l7giAMv/3G69xw87f+2/b8wz+s89TTv+H++x7EPzqU/+wzT136 zDPP/ECWlaypU6vF9PRMiooKsdvtSJKE2WLGYrEQCUcYHR09O9Q3mc3EYzFS+rictqmpUY9EIsLx jg6amhqJR+InvV7P3isuv+LThx/52Zv/aBvgn/Qppo8/WMnl37gOgDVrPhfDsWSJGAumv73ized2 7dpZHgxGEEWdzMwM3ev1CRkZGQSDQbxeL4lEAqPRyOHDh+nv7ycUiRBLwTnnnLNFUZT6JUuWrB0Z Da2vmTYttWD+vH/G9oF/4jeq/ry2797D/Nmzzv7WdV1paG5xbtq40fXqK6/U5ORk28fGxlLJZLIS 6DUajQH/qN+QnpHelZ9feGBwcEB67dVXOgVB8P/5GZ98vIrLLr/qn7rv/w8NvZCOTzTlUQAAAABJ RU5ErkJggg== " + height="40" + width="40" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/5 dollarsoff.svg b/plugins/currency/images/5 dollarsoff.svg new file mode 100644 index 0000000..e16f9a7 --- /dev/null +++ b/plugins/currency/images/5 dollarsoff.svg @@ -0,0 +1,95 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="55" + version="1.1" + viewBox="0 0 110 55" + width="110" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="5 dollarsoff.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="2" + inkscape:cx="-9.75" + inkscape:cy="58.615385" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><image + y="0" + x="0" + id="image3048" + xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a +HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy +MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AG4DASIA +AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA +AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 +ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm +p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA +AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx +BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK +U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 +uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCWfKqo +XcMf3TiqcjPLkEuSOQADxVpnJABOc1RtITFqUkZuHEn3lBPyuMdD7jOcZ966Fojaaadya2iyDvEm +PdSP1q7HaQOBkN+dRW1xNJI8VxCI5U5BU8OPUf59KsKMHPNHNoNSl3EuCbW1xErYHfrjvz+v/wCv +FPRt0SMepUE1HfsTasAB+PaoLiRY9NchygEPDL1XjgiueW5pG+7KF9re2VobSPzXU4aRjhF/xrNe +71FGLG8QnIBUAYB/Kk0rSWv0eQy+WiMBx1Zuv+frWl/wi5Kt5dwwz1DDOf8AOaRyzryb0ZBbapKp +AkdZgeSUGGA/ka6K0uyiCSIgq6gg9ciuOksJrS4aORgNnXackitLRrorI1sCAhBZM9sYzTVupUKr +l7stTpzqFwD1X8qPt92ULjy9o68c/XGaotMkWDIcAnBY9AaebhVj8sGPLY+bPPTGOvbkfhWvu2HG +Cb2KGs306yW6xvKrzSHd5EYZiAp4AII64qXTZxNbtmaWV1cq/nIFdDgcEAAe/wCNNvDdHy3tZEV0 +JyjjKuD645FR2UcsLTzTNG087Bn2g7RgAAD8BRZmii76bFqOMFckEnHrVJYWkEqYKXDYmjbrh/4f +0wp9QCKuXBkitHKrztPJbHb9azry7y5MUpRxCAAwGcjnB9D05HernJXMnzGhZXa3s27yysipwD0K +tjn8x/nmrrDHtWBZ30UJAUnKsVePcCI052gH2IAAz/Efw047uGR9gbDehBH+etSkn1LXNa7EvPOE +ZKZ2ng46r7j1+n/6i6e183TZIVXfmLCq3GeOAasAb/lHJHXjOPrUqqVUDqRke+RjOfTr71yzbua3 +ujndKW6jtbX7Njy3fBVm/wBrnIx6d8jp+Fa7i7F42IpGiBBDicgAf7uMHv1rKnEltqzGORkjyHPl +x78KRgkAe/ce3rW7a3AKZVpXUqR+8Xafb0zyB+XvVo4JKzsZPiGDyXjmIGefM8s/ewM/0x/kVm2V +yLe7DfPIyOEJXAJjfoc+nGfTmtrV5AtlM8kPm/JjpnHGAfbjisLR9Omur4XUgk8qLBQspwfQDnjt +Qyqa10Nq6YxTeWGYtgFdqA7eo69Onf2FRiWGZY4mNuWGQoaIDPfscfy71NdLKZvk3YwOhf8ApUBj +m3Z2vu6ZzJ/jWsUdSsT7WjGMIFHZRihdzjjp61CN5YApIT0P3yPyNX1gZR1FbJJbjlV0tETUA72p +REVmYhQGGRycVzlzGsjFvMaSUOeF3AH0OOmM81t6hNh4kXGcFixPA6YGO5JxWdLZQ3sPySIJTG2w +5xk5yMY6jr+VYcrZDfczbiRRfLAAFztaTGTg8YP8vxNXLdoAhuECssT4ZX3fIcnBGPoOcipkso5J +nmeWOQzx5ZgBlGHtzkdiPpS2Vo9rsjaZFdyWMe4EbiemM/UfUUcrHdMtvdoliZxIzeTKAVPdGPA6 +Z78+nSrkNylzG2whvmBbPY8/4ms6Ky8o3MG0+VPEcDOdpHGM/j1/wq7BAYpY3HdNrgdCQOv6Vm1c +tJrcZd2iTlZNkbSL03jgj0NVLee+uL57KOGCBYjgtksAMZGOnatW5mhtbd55ztRBkmsI6lLEbm8W +JY2+VQGznOPu+55BPpjH1lXMK/La/U19RlhsrB0nlKll+U/xMR6e9S2GoQ6lZLLDwR8rqeNprlDp +93cBru5bc7jd85wcZ7Z4xz0qK2uLjTrv7RCdw4Ei54ZfQ/0NVYypz5dDspcjOP0piM7EKMEniiK4 +hvLdJ4WJjcZGeo9j71X1KS9t7BptOVHuIcsYmTd5q9xxyD6YraMrI6paRvuRSa5Y2sckrpcvAgJ8 +9FBVyB25zz0B/kOa1oZEuLWC4VSqyxK4UnpkZrhP7Wtr/ThYGBoHlGB5oIhidhhnx27ke59zXdxR +pa2sFur7lijVFYn7wAwDUczZzwblLUyW1DT5ODLnBB+63Y5Hb1phudOgKMgJIGBgsMDAH8gPyoor +WOxrfmkrjEutPULsiIx0w7D/AD0H5Uq3FgJFkEB3Kcg724Oc/wA+aKKatY15I32NBJI5kWRW27hn +aQaeGVf4gR9KKK5ZSaZV+hHdJDOqLPHvCsHUE9x3qFrSycozRZMZyu5mOCTknr1J70UUMqMIvdDX +sbJz80eR67m5qa20W0nRkEShQOhLf40UU7WMqqUYtpGhb6QlomyAqqZzjnrUxtCDzIv5Giiq5nax +xqpK9yq8rpIyec/y+hNMaVWA3NnHrmiiqex0p2Vz/9k= +" + height="55" + width="110" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/5 dollarssmall.svg b/plugins/currency/images/5 dollarssmall.svg new file mode 100644 index 0000000..91e4b3e --- /dev/null +++ b/plugins/currency/images/5 dollarssmall.svg @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="27.5" + version="1.1" + viewBox="0 0 55 27.5" + width="55" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="5 dollarssmall.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="18.327273" + inkscape:cx="29.409723" + inkscape:cy="16.205357" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> +<image + y="0" + x="0" + id="image3048" + xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AG4DASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCWfKqo XcMf3TiqcjPLkEuSOQADxVpnJABOc1RtITFqUkZuHEn3lBPyuMdD7jOcZ966Fojaaadya2iyDvEm PdSP1q7HaQOBkN+dRW1xNJI8VxCI5U5BU8OPUf59KsKMHPNHNoNSl3EuCbW1xErYHfrjvz+v/wCv FPRt0SMepUE1HfsTasAB+PaoLiRY9NchygEPDL1XjgiueW5pG+7KF9re2VobSPzXU4aRjhF/xrNe 71FGLG8QnIBUAYB/Kk0rSWv0eQy+WiMBx1Zuv+frWl/wi5Kt5dwwz1DDOf8AOaRyzryb0ZBbapKp AkdZgeSUGGA/ka6K0uyiCSIgq6gg9ciuOksJrS4aORgNnXackitLRrorI1sCAhBZM9sYzTVupUKr l7stTpzqFwD1X8qPt92ULjy9o68c/XGaotMkWDIcAnBY9AaebhVj8sGPLY+bPPTGOvbkfhWvu2HG Cb2KGs306yW6xvKrzSHd5EYZiAp4AII64qXTZxNbtmaWV1cq/nIFdDgcEAAe/wCNNvDdHy3tZEV0 JyjjKuD645FR2UcsLTzTNG087Bn2g7RgAAD8BRZmii76bFqOMFckEnHrVJYWkEqYKXDYmjbrh/4f 0wp9QCKuXBkitHKrztPJbHb9azry7y5MUpRxCAAwGcjnB9D05HernJXMnzGhZXa3s27yysipwD0K tjn8x/nmrrDHtWBZ30UJAUnKsVePcCI052gH2IAAz/Efw047uGR9gbDehBH+etSkn1LXNa7EvPOE ZKZ2ng46r7j1+n/6i6e183TZIVXfmLCq3GeOAasAb/lHJHXjOPrUqqVUDqRke+RjOfTr71yzbua3 ujndKW6jtbX7Njy3fBVm/wBrnIx6d8jp+Fa7i7F42IpGiBBDicgAf7uMHv1rKnEltqzGORkjyHPl x78KRgkAe/ce3rW7a3AKZVpXUqR+8Xafb0zyB+XvVo4JKzsZPiGDyXjmIGefM8s/ewM/0x/kVm2V yLe7DfPIyOEJXAJjfoc+nGfTmtrV5AtlM8kPm/JjpnHGAfbjisLR9Omur4XUgk8qLBQspwfQDnjt Qyqa10Nq6YxTeWGYtgFdqA7eo69Onf2FRiWGZY4mNuWGQoaIDPfscfy71NdLKZvk3YwOhf8ApUBj m3Z2vu6ZzJ/jWsUdSsT7WjGMIFHZRihdzjjp61CN5YApIT0P3yPyNX1gZR1FbJJbjlV0tETUA72p REVmYhQGGRycVzlzGsjFvMaSUOeF3AH0OOmM81t6hNh4kXGcFixPA6YGO5JxWdLZQ3sPySIJTG2w 5xk5yMY6jr+VYcrZDfczbiRRfLAAFztaTGTg8YP8vxNXLdoAhuECssT4ZX3fIcnBGPoOcipkso5J nmeWOQzx5ZgBlGHtzkdiPpS2Vo9rsjaZFdyWMe4EbiemM/UfUUcrHdMtvdoliZxIzeTKAVPdGPA6 Z78+nSrkNylzG2whvmBbPY8/4ms6Ky8o3MG0+VPEcDOdpHGM/j1/wq7BAYpY3HdNrgdCQOv6Vm1c tJrcZd2iTlZNkbSL03jgj0NVLee+uL57KOGCBYjgtksAMZGOnatW5mhtbd55ztRBkmsI6lLEbm8W JY2+VQGznOPu+55BPpjH1lXMK/La/U19RlhsrB0nlKll+U/xMR6e9S2GoQ6lZLLDwR8rqeNprlDp 93cBru5bc7jd85wcZ7Z4xz0qK2uLjTrv7RCdw4Ei54ZfQ/0NVYypz5dDspcjOP0piM7EKMEniiK4 hvLdJ4WJjcZGeo9j71X1KS9t7BptOVHuIcsYmTd5q9xxyD6YraMrI6paRvuRSa5Y2sckrpcvAgJ8 9FBVyB25zz0B/kOa1oZEuLWC4VSqyxK4UnpkZrhP7Wtr/ThYGBoHlGB5oIhidhhnx27ke59zXdxR pa2sFur7lijVFYn7wAwDUczZzwblLUyW1DT5ODLnBB+63Y5Hb1phudOgKMgJIGBgsMDAH8gPyoor WOxrfmkrjEutPULsiIx0w7D/AD0H5Uq3FgJFkEB3Kcg724Oc/wA+aKKatY15I32NBJI5kWRW27hn aQaeGVf4gR9KKK5ZSaZV+hHdJDOqLPHvCsHUE9x3qFrSycozRZMZyu5mOCTknr1J70UUMqMIvdDX sbJz80eR67m5qa20W0nRkEShQOhLf40UU7WMqqUYtpGhb6QlomyAqqZzjnrUxtCDzIv5Giiq5nax xqpK9yq8rpIyec/y+hNMaVWA3NnHrmiiqex0p2Vz/9k= " + height="27.5" + width="55" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/50 centsoff.svg b/plugins/currency/images/50 centsoff.svg new file mode 100644 index 0000000..2992ae5 --- /dev/null +++ b/plugins/currency/images/50 centsoff.svg @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="80" + version="1.1" + viewBox="0 0 80 80" + width="80" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="50 centsoff.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="1" + inkscape:cx="-230.56607" + inkscape:cy="136" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><image + y="0" + x="0" + id="image3361" + xlink:href="data:image/png;base64,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 " + height="80" + width="80" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/50 centssmall.svg b/plugins/currency/images/50 centssmall.svg new file mode 100644 index 0000000..533e287 --- /dev/null +++ b/plugins/currency/images/50 centssmall.svg @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="40" + version="1.1" + viewBox="0 0 40 40" + width="40" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="50 centssmall.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="1" + inkscape:cx="-57.06607" + inkscape:cy="190" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><image + y="0" + x="0" + id="image3046" + xlink:href="data:image/png;base64,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 " + height="40" + width="40" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/50 dollarsoff.svg b/plugins/currency/images/50 dollarsoff.svg new file mode 100644 index 0000000..48169d9 --- /dev/null +++ b/plugins/currency/images/50 dollarsoff.svg @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="55" + version="1.1" + viewBox="0 0 129 55" + width="129" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="50 dollarsoff.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="1" + inkscape:cx="-320.60686" + inkscape:cy="43.999999" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><image + y="-4.21012e-07" + x="1.7763568e-15" + id="image3048" + xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AIEDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDV8xUf y2JJAUlsccnA/WoHitZHyVyz+uRnIP8AQGrmQT0xUFy5jjJU7WPQ9q+VvrZHZGTWqKxS1bduj6Mw 6ntgn+QqN2s4wSCAqnqMnGDj+bfrVmCWYr/yzZgDg88/hSSTEFjKu0/pWkYu6uDm+W1zJvJrW0jS Ro3ZXbYAg5PGO59BW7a3RklaCKFbdQckyNk5PJHXrnPTNczq0yXNxbWyhtxkD5I4xyK2vI2sxVmM ipz9BycehwD+hr3aMbQTe55l3JttlqHUXudWFlbtGzL/AKyTOR9B61tyI9soLfMoHJ9Pzrg/DkiC 5kupbkRIhyeOSTk4H+Fdiuu2Uts0rTgwAhHYoRyQeMevH61rOmpFqbiYNz4jt7i5LR29yCo2EMg6 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 " + height="55" + width="129" /></svg>
\ No newline at end of file diff --git a/plugins/currency/images/50 dollarssmall.svg b/plugins/currency/images/50 dollarssmall.svg new file mode 100644 index 0000000..4312f4a --- /dev/null +++ b/plugins/currency/images/50 dollarssmall.svg @@ -0,0 +1,105 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + enable-background="new 0 0 55 55" + height="23.449612" + version="1.1" + viewBox="0 0 55 23.449612" + width="55" + x="0px" + xml:space="preserve" + y="0px" + id="svg2" + inkscape:version="0.48.1 r9760" + sodipodi:docname="50 dollarssmall.svg"><metadata + id="metadata23"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs21" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="725" + id="namedview19" + showgrid="false" + inkscape:zoom="1" + inkscape:cx="57.883638" + inkscape:cy="30.486034" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> +<image + y="0" + x="0" + id="image3048" + xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a +HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy +MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AIEDASIA +AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA +AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 +ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm +p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA +AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx +BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK +U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 +uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDV8xUf +y2JJAUlsccnA/WoHitZHyVyz+uRnIP8AQGrmQT0xUFy5jjJU7WPQ9q+VvrZHZGTWqKxS1bduj6Mw +6ntgn+QqN2s4wSCAqnqMnGDj+bfrVmCWYr/yzZgDg88/hSSTEFjKu0/pWkYu6uDm+W1zJvJrW0jS +Ro3ZXbYAg5PGO59BW7a3RklaCKFbdQckyNk5PJHXrnPTNczq0yXNxbWyhtxkD5I4xyK2vI2sxVmM +ipz9BycehwD+hr3aMbQTe55l3JttlqHUXudWFlbtGzL/AKyTOR9B61tyI9soLfMoHJ9Pzrg/DkiC +5kupbkRIhyeOSTk4H+Fdiuu2Uts0rTgwAhHYoRyQeMevH61rOmpFqbiYNz4jt7i5LR29yCo2EMg6 +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 +" + height="23.449612" + width="55" /></svg>
\ No newline at end of file diff --git a/plugins/wedo_plugin/99-lego-WeDo.rules b/plugins/wedo_plugin/99-lego-WeDo.rules new file mode 100644 index 0000000..7c8beea --- /dev/null +++ b/plugins/wedo_plugin/99-lego-WeDo.rules @@ -0,0 +1 @@ +SYSFS{idVendor}=="0694", SYSFS{idProduct}=="0003", MODE="0666" diff --git a/plugins/wedo_plugin/WeDoMore.py b/plugins/wedo_plugin/WeDoMore.py new file mode 100644 index 0000000..719c7af --- /dev/null +++ b/plugins/wedo_plugin/WeDoMore.py @@ -0,0 +1,192 @@ +#Copyright (c) 2011, 2012, Ian Daniher +#Copyright (c) 2012, Tony Forster, Walter Bender +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +import sys +import os +sys.path.append(os.path.dirname(__file__)) +import usb.core + +import logging +logger = logging.getLogger('WeDoMore') + + +UNAVAILABLE = None +TILTSENSOR = [38, 39] +DISTANCESENSOR = [176, 177, 178, 179] +MOTOR = [0, 1, 2, 3, 238, 239] +TILT_FORWARD = 0 +TILT_LEFT = 1 +TILT_RIGHT = 2 +TILT_BACK = 3 +NO_TILT = -1 + + +def scan_for_devices(): + ''' Find all available devices ''' + return usb.core.find(find_all=True, idVendor=0x0694, idProduct=0x0003) + + +class WeDo: + def __init__(self, device=None): + """Find a USB device with the VID and PID of the Lego + WeDo. If the HID kernel driver is active, detatch + it.""" + self.dev = None + self.number = 0 + self.dev = device + if self.dev is None: + logging.debug("No Lego WeDo found") + else: + status = self.init_device() + if status is UNAVAILABLE: + logging.debug("WARNING: Could not talk to WeDo device.") + self.valMotorA = 0 + self.valMotorB = 0 + + def init_device(self): + ''' Reinit device associated with the WeDo instance ''' + if self.dev is not None: + try: + if self.dev.is_kernel_driver_active(0): + try: + self.dev.detach_kernel_driver(0) + except: # usb.core.USBError as e: + e = '' + logger.error( + "Could not detatch kernel driver: %s" % (str(e))) + return UNAVAILABLE + except: # usb.core.USBError as e: + e = '' + logger.error("Could not talk to WeDo device: %s" % (str(e))) + return UNAVAILABLE + self.endpoint = self.dev[0][(0,0)][0] + return True + + def getRawData(self): + """Read 64 bytes from the WeDo's endpoint, but only + return the last eight.""" + try: + data = list(self.endpoint.read(64)[-8:]) + except: # usb.core.USBError as e: + e = '' + logger.error("Could not read from WeDo device: %s" % (str(e))) + return UNAVAILABLE + return data + + def processMotorValues(self, value): + """Check to make sure motor values are sane.""" + retValue = int(value) + if 0 < value < 101: + retValue += 27 + elif -101 < value < 0: + retValue -= 27 + elif value == 0: + retValue = 0 + return retValue + + def setMotors(self, valMotorA, valMotorB): + """Arguments should be in form of a number between 0 + and 100, positive or negative. Magic numbers used for + the ctrl_transfer derived from sniffing USB coms.""" + if self.dev is None: + return + self.valMotorA = self.processMotorValues(valMotorA) + self.valMotorB = self.processMotorValues(valMotorB) + data = [64, self.valMotorA&0xFF, self.valMotorB&0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00] + try: + self.dev.ctrl_transfer(bmRequestType = 0x21, bRequest = 0x09, + wValue = 0x0200, wIndex = 0, + data_or_wLength = data) + except: # usb.core.USBError as e: + e = '' + logger.error("Could not write to driver: %s" % (str(e))) + + def getData(self): + """Sensor data is contained in the 2nd and 4th byte, with + sensor IDs being contained in the 3rd and 5th byte + respectively.""" + rawData = self.getRawData() + if rawData is not None: + sensorData = {rawData[3]: rawData[2], rawData[5]: rawData[4]} + else: + sensorData = {} + return sensorData + + def processTilt(self, v): + """Use a series of elif/value-checks to process the tilt + sensor data.""" + if v in range(10, 40): + return TILT_BACK + elif v in range(60, 90): + return TILT_RIGHT + elif v in range(170, 190): + return TILT_FORWARD + elif v in range(220, 240): + return TILT_LEFT + elif v in range(120, 140): + return NO_TILT + else: + return NO_TILT + + def getTilt(self): + if self.dev is None: + return UNAVAILABLE + data = self.getData() + for num in data.keys(): + if num in TILTSENSOR: + return self.processTilt(data[num]) + return UNAVAILABLE + + def getDistance(self): + if self.dev is None: + return UNAVAILABLE + data = self.getData() + for num in data.keys(): + if num in DISTANCESENSOR: + return data[num] - 69 + return UNAVAILABLE + + # TODO: check motor availability + + def setMotorA(self, valMotorA): + self.setMotors(valMotorA, self.valMotorB) + return self.valMotorA + + def setMotorB(self, valMotorB): + self.setMotors(self.valMotorA, valMotorB) + return self.valMotorB + + def getMotorA(self): + if self.dev is None: + return UNAVAILABLE + if self.valMotorA == 0: + return 0 + elif self.valMotorA < 0: + return self.valMotorA + 27 + else: + return self.valMotorA - 27 + + def getMotorB(self): + if self.dev is None: + return UNAVAILABLE + if self.valMotorB == 0: + return 0 + elif self.valMotorB < 0: + return self.valMotorB + 27 + else: + return self.valMotorB - 27 diff --git a/plugins/wedo_plugin/__init__.py b/plugins/wedo_plugin/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/plugins/wedo_plugin/__init__.py diff --git a/plugins/wedo_plugin/icons/WeDooff.svg b/plugins/wedo_plugin/icons/WeDooff.svg new file mode 100644 index 0000000..cc43d44 --- /dev/null +++ b/plugins/wedo_plugin/icons/WeDooff.svg @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + width="55" + height="55" + viewBox="0 0 55 55" + id="svg2" + xml:space="preserve" + inkscape:version="0.47 r22583" + sodipodi:docname="WeDooff.svg"><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="640" + inkscape:window-height="504" + id="namedview10" + showgrid="false" + inkscape:zoom="4.2909091" + inkscape:cx="27.5" + inkscape:cy="27.5" + inkscape:window-x="0" + inkscape:window-y="24" + inkscape:window-maximized="0" + inkscape:current-layer="svg2" /><metadata + id="metadata15"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs13"><inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 27.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="55 : 27.5 : 1" + inkscape:persp3d-origin="27.5 : 18.333333 : 1" + id="perspective12" /> + + + + + </defs><rect + width="55" + height="55" + x="0" + y="0" + id="rect3269" + style="fill:#282828;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path + d="m 11.421095,15.380686 c 0,2.0569 1.66964,3.72654 3.72654,3.72654 2.05489,0 3.72453,-1.66964 3.72453,-3.72654 0,-2.05489 -1.66897,-3.72788 -3.72453,-3.72788 -2.0569,0 -3.72654,1.67299 -3.72654,3.72788 z" + id="path7" + style="fill:#ffffff;fill-opacity:1" /><path + style="fill:#ffffff;fill-opacity:1" + id="path2823" + d="m 35.421095,15.380686 c 0,2.0569 1.66964,3.72654 3.72654,3.72654 2.05489,0 3.72453,-1.66964 3.72453,-3.72654 0,-2.05489 -1.66897,-3.72788 -3.72453,-3.72788 -2.0569,0 -3.72654,1.67299 -3.72654,3.72788 z" /><path + d="m 35.421095,39.380686 c 0,2.0569 1.66964,3.72654 3.72654,3.72654 2.05489,0 3.72453,-1.66964 3.72453,-3.72654 0,-2.05489 -1.66897,-3.72788 -3.72453,-3.72788 -2.0569,0 -3.72654,1.67299 -3.72654,3.72788 z" + id="path2825" + style="fill:#ffffff;fill-opacity:1" /><path + style="fill:#ffffff;fill-opacity:1" + id="path2827" + d="m 11.421095,39.380686 c 0,2.0569 1.66964,3.72654 3.72654,3.72654 2.05489,0 3.72453,-1.66964 3.72453,-3.72654 0,-2.05489 -1.66897,-3.72788 -3.72453,-3.72788 -2.0569,0 -3.72654,1.67299 -3.72654,3.72788 z" /></svg> diff --git a/plugins/wedo_plugin/icons/WeDoon.svg b/plugins/wedo_plugin/icons/WeDoon.svg new file mode 100644 index 0000000..16d54d2 --- /dev/null +++ b/plugins/wedo_plugin/icons/WeDoon.svg @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + width="55" + height="55" + viewBox="0 0 55 55" + id="svg2" + xml:space="preserve" + inkscape:version="0.47 r22583" + sodipodi:docname="WeDoon.svg"><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="640" + inkscape:window-height="504" + id="namedview10" + showgrid="false" + inkscape:zoom="4.2909091" + inkscape:cx="27.5" + inkscape:cy="27.5" + inkscape:window-x="0" + inkscape:window-y="24" + inkscape:window-maximized="0" + inkscape:current-layer="svg2" /><metadata + id="metadata15"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs13"><inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 27.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="55 : 27.5 : 1" + inkscape:persp3d-origin="27.5 : 18.333333 : 1" + id="perspective12" /> + + + + + </defs><rect + width="55" + height="55" + x="0" + y="0" + id="rect3269" + style="fill:#ffd200;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path + d="m 11.421095,15.380686 c 0,2.0569 1.66964,3.72654 3.72654,3.72654 2.05489,0 3.72453,-1.66964 3.72453,-3.72654 0,-2.05489 -1.66897,-3.72788 -3.72453,-3.72788 -2.0569,0 -3.72654,1.67299 -3.72654,3.72788 z" + id="path7" + style="fill:#ff0000;fill-opacity:1" /><path + style="fill:#ff0000;fill-opacity:1" + id="path2823" + d="m 35.421095,15.380686 c 0,2.0569 1.66964,3.72654 3.72654,3.72654 2.05489,0 3.72453,-1.66964 3.72453,-3.72654 0,-2.05489 -1.66897,-3.72788 -3.72453,-3.72788 -2.0569,0 -3.72654,1.67299 -3.72654,3.72788 z" /><path + d="m 35.421095,39.380686 c 0,2.0569 1.66964,3.72654 3.72654,3.72654 2.05489,0 3.72453,-1.66964 3.72453,-3.72654 0,-2.05489 -1.66897,-3.72788 -3.72453,-3.72788 -2.0569,0 -3.72654,1.67299 -3.72654,3.72788 z" + id="path2825" + style="fill:#ff0000;fill-opacity:1" /><path + style="fill:#ff0000;fill-opacity:1" + id="path2827" + d="m 11.421095,39.380686 c 0,2.0569 1.66964,3.72654 3.72654,3.72654 2.05489,0 3.72453,-1.66964 3.72453,-3.72654 0,-2.05489 -1.66897,-3.72788 -3.72453,-3.72788 -2.0569,0 -3.72654,1.67299 -3.72654,3.72788 z" /></svg>
\ No newline at end of file diff --git a/plugins/wedo_plugin/plugin.info b/plugins/wedo_plugin/plugin.info new file mode 100644 index 0000000..b66e1fa --- /dev/null +++ b/plugins/wedo_plugin/plugin.info @@ -0,0 +1,5 @@ +[Plugin] +name=wedo_plugin +palette=wedo +version=2.2 + diff --git a/plugins/wedo_plugin/usb/__init__.py b/plugins/wedo_plugin/usb/__init__.py new file mode 100644 index 0000000..8909cf2 --- /dev/null +++ b/plugins/wedo_plugin/usb/__init__.py @@ -0,0 +1,92 @@ +# Copyright (C) 2009-2011 Wander Lairson Costa +# +# The following terms apply to all files associated +# with the software unless explicitly disclaimed in individual files. +# +# The authors hereby grant permission to use, copy, modify, distribute, +# and license this software and its documentation for any purpose, provided +# that existing copyright notices are retained in all copies and that this +# notice is included verbatim in any distributions. No written agreement, +# license, or royalty fee is required for any of the authorized uses. +# Modifications to this software may be copyrighted by their authors +# and need not follow the licensing terms described here, provided that +# the new terms are clearly indicated on the first page of each file where +# they apply. +# +# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +# MODIFICATIONS. + +r"""PyUSB - Easy USB access in Python + +This package exports the following modules and subpackages: + + core - the main USB implementation + legacy - the compatibility layer with 0.x version + backend - the support for backend implementations. + +Since version 1.0, main PyUSB implementation lives in the 'usb.core' +module. New applications are encouraged to use it. +""" + +import logging +import os + +__author__ = 'Wander Lairson Costa' + +__all__ = ['legacy', 'core', 'backend', 'util'] + + +def _setup_log(): + from usb import _debug + logger = logging.getLogger('usb') + debug_level = os.getenv('PYUSB_DEBUG_LEVEL') + + if debug_level is not None: + _debug.enable_tracing(True) + filename = os.getenv('PYUSB_LOG_FILENAME') + + LEVELS = {'debug': logging.DEBUG, + 'info': logging.INFO, + 'warning': logging.WARNING, + 'error': logging.ERROR, + 'critical': logging.CRITICAL} + + level = LEVELS.get(debug_level, logging.CRITICAL + 10) + logger.setLevel(level = level) + + try: + handler = logging.FileHandler(filename) + except: + handler = logging.StreamHandler() + + fmt = logging.Formatter('%(asctime)s %(levelname)s:%(name)s:%(message)s') + handler.setFormatter(fmt) + logger.addHandler(handler) + else: + class NullHandler(logging.Handler): + def emit(self, record): + pass + + # We set the log level to avoid delegation to the + # parent log handler (if there is one). + # Thanks to Chris Clark to pointing this out. + logger.setLevel(logging.CRITICAL + 10) + + logger.addHandler(NullHandler()) + + +_setup_log() + +# We import all 'legacy' module symbols to provide compatility +# with applications that use 0.x versions. +from usb.legacy import * diff --git a/plugins/wedo_plugin/usb/_debug.py b/plugins/wedo_plugin/usb/_debug.py new file mode 100644 index 0000000..13b0ced --- /dev/null +++ b/plugins/wedo_plugin/usb/_debug.py @@ -0,0 +1,77 @@ +# Copyright (C) 2009-2011 Wander Lairson Costa +# +# The following terms apply to all files associated +# with the software unless explicitly disclaimed in individual files. +# +# The authors hereby grant permission to use, copy, modify, distribute, +# and license this software and its documentation for any purpose, provided +# that existing copyright notices are retained in all copies and that this +# notice is included verbatim in any distributions. No written agreement, +# license, or royalty fee is required for any of the authorized uses. +# Modifications to this software may be copyrighted by their authors +# and need not follow the licensing terms described here, provided that +# the new terms are clearly indicated on the first page of each file where +# they apply. +# +# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +# MODIFICATIONS. + +__author__ = 'Wander Lairson Costa' + +__all__ = ['methodtrace', 'functiontrace'] + +import logging +import usb._interop as _interop + +_enable_tracing = False + +def enable_tracing(enable): + global _enable_tracing + _enable_tracing = enable + +def _trace_function_call(logger, fname, *args, **named_args): + logger.debug( + # TODO: check if 'f' is a method or a free function + fname + '(' + \ + ', '.join((str(val) for val in args)) + \ + ', '.join((name + '=' + str(val) for name, val in named_args.items())) + ')' + ) + +# decorator for methods calls tracing +def methodtrace(logger): + def decorator_logging(f): + if not _enable_tracing: + return f + def do_trace(*args, **named_args): + # this if is just a optimization to avoid unecessary string formatting + if logging.DEBUG >= logger.getEffectiveLevel(): + fn = type(args[0]).__name__ + '.' + f.__name__ + _trace_function_call(logger, fn, *args[1:], **named_args) + return f(*args, **named_args) + _interop._update_wrapper(do_trace, f) + return do_trace + return decorator_logging + +# decorator for methods calls tracing +def functiontrace(logger): + def decorator_logging(f): + if not _enable_tracing: + return f + def do_trace(*args, **named_args): + # this if is just a optimization to avoid unecessary string formatting + if logging.DEBUG >= logger.getEffectiveLevel(): + _trace_function_call(logger, f.__name__, *args, **named_args) + return f(*args, **named_args) + _interop._update_wrapper(do_trace, f) + return do_trace + return decorator_logging diff --git a/plugins/wedo_plugin/usb/_interop.py b/plugins/wedo_plugin/usb/_interop.py new file mode 100644 index 0000000..6069d5e --- /dev/null +++ b/plugins/wedo_plugin/usb/_interop.py @@ -0,0 +1,135 @@ +# Copyright (C) 2009-2011 Wander Lairson Costa +# +# The following terms apply to all files associated +# with the software unless explicitly disclaimed in individual files. +# +# The authors hereby grant permission to use, copy, modify, distribute, +# and license this software and its documentation for any purpose, provided +# that existing copyright notices are retained in all copies and that this +# notice is included verbatim in any distributions. No written agreement, +# license, or royalty fee is required for any of the authorized uses. +# Modifications to this software may be copyrighted by their authors +# and need not follow the licensing terms described here, provided that +# the new terms are clearly indicated on the first page of each file where +# they apply. +# +# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +# MODIFICATIONS. + +# All the hacks necessary to assure compatibility across all +# supported versions come here. +# Please, note that there is one version check for each +# hack we need to do, this makes maintenance easier... ^^ + +import sys +import array + +__all__ = ['_reduce', '_set', '_next', '_groupby', '_sorted', '_update_wrapper'] + +# we support Python >= 2.3 +assert sys.hexversion >= 0x020300f0 + +# On Python 3, reduce became a functools module function +try: + import functools + _reduce = functools.reduce +except (ImportError, AttributeError): + _reduce = reduce + +# we only have the builtin set type since 2.5 version +try: + _set = set +except NameError: + import sets + _set = sets.Set + +# On Python >= 2.6, we have the builtin next() function +# On Python 2.5 and before, we have to call the iterator method next() +def _next(iter): + try: + return next(iter) + except NameError: + return iter.next() + +# groupby is available only since 2.4 version +try: + import itertools + _groupby = itertools.groupby +except (ImportError, AttributeError): + # stolen from Python docs + class _groupby(object): + # [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B + # [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D + def __init__(self, iterable, key=None): + if key is None: + key = lambda x: x + self.keyfunc = key + self.it = iter(iterable) + self.tgtkey = self.currkey = self.currvalue = object() + def __iter__(self): + return self + def next(self): + while self.currkey == self.tgtkey: + self.currvalue = _next(self.it) # Exit on StopIteration + self.currkey = self.keyfunc(self.currvalue) + self.tgtkey = self.currkey + return (self.currkey, self._grouper(self.tgtkey)) + def _grouper(self, tgtkey): + while self.currkey == tgtkey: + yield self.currvalue + self.currvalue = _next(self.it) # Exit on StopIteration + self.currkey = self.keyfunc(self.currvalue) + +# builtin sorted function is only availale since 2.4 version +try: + _sorted = sorted +except NameError: + def _sorted(l, key=None, reverse=False): + # sort function on Python 2.3 does not + # support 'key' parameter + class KeyToCmp(object): + def __init__(self, K): + self.key = K + def __call__(self, x, y): + kx = self.key(x) + ky = self.key(y) + if kx < ky: + return reverse and 1 or -1 + elif kx > ky: + return reverse and -1 or 1 + else: + return 0 + tmp = list(l) + tmp.sort(KeyToCmp(key)) + return tmp + +try: + import functools + _update_wrapper = functools.update_wrapper +except (ImportError, AttributeError): + def _update_wrapper(wrapper, wrapped): + wrapper.__name__ = wrapped.__name__ + wrapper.__module__ = wrapped.__module__ + wrapper.__doc__ = wrapped.__doc__ + wrapper.__dict__ = wrapped.__dict__ + +def as_array(data=None): + if data is None: + return array.array('B') + try: + return array.array('B', data) + except TypeError: + # When you pass a unicode string, you got a TypeError + # if first parameter is not 'u' + return array.array('u', data) + diff --git a/plugins/wedo_plugin/usb/backend/__init__.py b/plugins/wedo_plugin/usb/backend/__init__.py new file mode 100644 index 0000000..67ee00f --- /dev/null +++ b/plugins/wedo_plugin/usb/backend/__init__.py @@ -0,0 +1,368 @@ +# Copyright (C) 2009-2011 Wander Lairson Costa +# +# The following terms apply to all files associated +# with the software unless explicitly disclaimed in individual files. +# +# The authors hereby grant permission to use, copy, modify, distribute, +# and license this software and its documentation for any purpose, provided +# that existing copyright notices are retained in all copies and that this +# notice is included verbatim in any distributions. No written agreement, +# license, or royalty fee is required for any of the authorized uses. +# Modifications to this software may be copyrighted by their authors +# and need not follow the licensing terms described here, provided that +# the new terms are clearly indicated on the first page of each file where +# they apply. +# +# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +# MODIFICATIONS. + +r"""usb.backend - Backend interface. + +This module exports: + +IBackend - backend interface. + +Backends are Python objects which implement the IBackend interface. +The easiest way to do so is inherinting from IBackend. + +PyUSB already provides backends for libusb versions 0.1 and 1.0, +and OpenUSB library. Backends modules included with PyUSB are required to +export the get_backend() function, which returns an instance of a backend +object. You can provide your own customized backend if you +want to. Bellow you find a skeleton of a backend implementation module: + +import usb.backend + +class MyBackend(usb.backend.IBackend): + pass + +def get_backend(): + return MyBackend() + +You can use your customized backend by passing it as the backend parameter of the +usb.core.find() function. For example: + +import custom_backend +import usb.core + +myidVendor = 0xfffe +myidProduct = 0x0001 + +mybackend = custom_backend.get_backend() + +dev = usb.core.find(backend = mybackend, idProduct=myidProduct, + idVendor=myidVendor) + +For custom backends, you are not required to supply the get_backend() function, +since the application code will instantiate the backend. + +If you do not provide a backend to the find() function, it will use one of the +defaults backend according to its internal rules. For details, consult the +find() function documentation. +""" + +__author__ = 'Wander Lairson Costa' + +__all__ = ['IBackend', 'libusb01', 'libusb10', 'openusb'] + +def _not_implemented(func): + raise NotImplementedError(func.__name__) + +class IBackend(object): + r"""Backend interface. + + IBackend is the basic interface for backend implementations. By default, + the methods of the interface raise a NotImplementedError exception. A + backend implementation should replace the methods to provide the funcionality + necessary. + + As Python is a dynamic typed language, you are not obligated to inherit from + IBackend: everything that bahaves like an IBackend is an IBackend. But you + are strongly recommended to do so, inheriting from IBackend provides consistent + default behavior. + """ + def enumerate_devices(self): + r"""This function is required to return an iterable object which + yields an implementation defined device identification for each + USB device found in the system. + + The device identification object is used as argument to other methods + of the interface. + """ + _not_implemented(self.enumerate_devices) + + def get_device_descriptor(self, dev): + r"""Return the device descriptor of the given device. + + The object returned is required to have all the Device Descriptor + fields accessible as member variables. They must be convertible (but + not required to be equal) to the int type. + + dev is an object yielded by the iterator returned by the enumerate_devices() + method. + """ + _not_implemented(self.get_device_descriptor) + + def get_configuration_descriptor(self, dev, config): + r"""Return a configuration descriptor of the given device. + + The object returned is required to have all the Configuration Descriptor + fields acessible as member variables. They must be convertible (but + not required to be equal) to the int type. + + The dev parameter is the already described device identification object. + config is the logical index of the configuration (not the bConfigurationValue + field). By "logical index" we mean the relative order of the configurations + returned by the peripheral as a result of GET_DESCRIPTOR request. + """ + _not_implemented(self.get_configuration_descriptor) + + def get_interface_descriptor(self, dev, intf, alt, config): + r"""Return an interface descriptor of the given device. + + The object returned is required to have all the Interface Descriptor + fields accessible as member variables. They must be convertible (but + not required to be equal) to the int type. + + The dev parameter is the already described device identification object. + The intf parameter is the interface logical index (not the bInterfaceNumber field) + and alt is the alternate setting logical index (not the bAlternateSetting value). + Not every interface has more than one alternate setting. In this case, the alt + parameter should be zero. config is the configuration logical index (not the + bConfigurationValue field). + """ + _not_implemented(self.get_interface_descriptor) + + def get_endpoint_descriptor(self, dev, ep, intf, alt, config): + r"""Return an endpoint descriptor of the given device. + + The object returned is required to have all the Endpoint Descriptor + fields acessible as member variables. They must be convertible (but + not required to be equal) to the int type. + + The ep parameter is the endpoint logical index (not the bEndpointAddress + field) of the endpoint descriptor desired. intf, alt and config are the same + values already described in the get_interface_descriptor() method. + """ + _not_implemented(self.get_endpoint_descriptor) + + def open_device(self, dev): + r"""Open the device for data exchange. + + This method opens the device identified by the dev parameter for communication. + This method must be called before calling any communication related method, such + as transfer methods. + + It returns a handle identifying the communication instance. This handle must be + passed to the communication methods. + """ + _not_implemented(self.open_device) + + def close_device(self, dev_handle): + r"""Close the device handle. + + This method closes the device communication channel and releases any + system resources related to it. + """ + _not_implemented(self.close_device) + + def set_configuration(self, dev_handle, config_value): + r"""Set the active device configuration. + + This method should be called to set the active configuration + of the device. The dev_handle parameter is the value returned + by the open_device() method and the config_value parameter is the + bConfigurationValue field of the related configuration descriptor. + """ + _not_implemented(self.set_configuration) + + def get_configuration(self, dev_handle): + r"""Get the current active device configuration. + + This method returns the bConfigurationValue of the currently + active configuration. Depending on the backend and the OS, + either a cached value may be returned or a control request may + be issued. The dev_handle parameter is the value returned by + the open_device method. + """ + _not_implemented(self.get_configuration) + + def set_interface_altsetting(self, dev_handle, intf, altsetting): + r"""Set the interface alternate setting. + + This method should only be called when the interface has more than + one alternate setting. The dev_handle is the value returned by the + open_device() method. intf and altsetting are respectivelly the + bInterfaceNumber and bAlternateSetting fields of the related interface. + """ + _not_implemented(self.set_interface_altsetting) + + def claim_interface(self, dev_handle, intf): + r"""Claim the given interface. + + Interface claiming is not related to USB spec itself, but it is + generally an necessary call of the USB libraries. It requests exclusive + access to the interface on the system. This method must be called + before using one of the transfer methods. + + dev_handle is the value returned by the open_device() method and + intf is the bInterfaceNumber field of the desired interface. + """ + _not_implemented(self.claim_interface) + + def release_interface(self, dev_handle, intf): + r"""Release the claimed interface. + + dev_handle and intf are the same parameters of the claim_interface + method. + """ + _not_implemented(self.release_interface) + + def bulk_write(self, dev_handle, ep, intf, data, timeout): + r"""Perform a bulk write. + + dev_handle is the value returned by the open_device() method. + The ep parameter is the bEndpointAddress field whose endpoint + the data will be sent to. intf is the bInterfaceNumber field + of the interface containing the endpoint. The data parameter + is the data to be sent. It must be an instance of the array.array + class. The timeout parameter specifies a time limit to the operation + in miliseconds. + + The method returns the number of bytes written. + """ + _not_implemented(self.bulk_write) + + def bulk_read(self, dev_handle, ep, intf, size, timeout): + r"""Perform a bulk read. + + dev_handle is the value returned by the open_device() method. + The ep parameter is the bEndpointAddress field whose endpoint + the data will be received from. intf is the bInterfaceNumber field + of the interface containing the endpoint. The size parameter + is the number of bytes to be read. The timeout parameter specifies + a time limit to the operation in miliseconds. + + The method returns an array.array object containing the data read. + """ + _not_implemented(self.bulk_read) + + def intr_write(self, dev_handle, ep, intf, data, timeout): + r"""Perform an interrupt write. + + dev_handle is the value returned by the open_device() method. + The ep parameter is the bEndpointAddress field whose endpoint + the data will be sent to. intf is the bInterfaceNumber field + of the interface containing the endpoint. The data parameter + is the data to be sent. It must be an instance of the array.array + class. The timeout parameter specifies a time limit to the operation + in miliseconds. + + The method returns the number of bytes written. + """ + _not_implemented(self.intr_write) + + def intr_read(self, dev_handle, ep, intf, size, timeout): + r"""Perform an interrut read. + + dev_handle is the value returned by the open_device() method. + The ep parameter is the bEndpointAddress field whose endpoint + the data will be received from. intf is the bInterfaceNumber field + of the interface containing the endpoint. The size parameter + is the number of bytes to be read. The timeout parameter specifies + a time limit to the operation in miliseconds. + + The method returns an array.array object containing the data read. + """ + _not_implemented(self.intr_read) + + def iso_write(self, dev_handle, ep, intf, data, timeout): + r"""Perform an isochronous write. + + dev_handle is the value returned by the open_device() method. + The ep parameter is the bEndpointAddress field whose endpoint + the data will be sent to. intf is the bInterfaceNumber field + of the interface containing the endpoint. The data parameter + is the data to be sent.It must be an instance of the array.array + class. The timeout parameter specifies a time limit to the operation + in miliseconds. + + The method returns the number of bytes written. + """ + _not_implemented(self.iso_write) + + def iso_read(self, dev_handle, ep, intf, size, timeout): + r"""Perform an isochronous read. + + dev_handle is the value returned by the open_device() method. + The ep parameter is the bEndpointAddress field whose endpoint + the data will be received from. intf is the bInterfaceNumber field + of the interface containing the endpoint. The size parameter + is the number of bytes to be read. The timeout parameter specifies + a time limit to the operation in miliseconds. + + The method returns an array.array object containing the data read. + """ + _not_implemented(self.iso_read) + + def ctrl_transfer(self, + dev_handle, + bmRequestType, + bRequest, + wValue, + wIndex, + data_or_wLength, + timeout): + r"""Perform a control transfer on the endpoint 0. + + The direction of the transfer is inferred from the bmRequestType + field of the setup packet. + + dev_handle is the value returned by the open_device() method. + bmRequestType, bRequest, wValue and wIndex are the same fields + of the setup packet. data_or_wLength is either the payload to be sent + to the device, if any, as an array.array object (None there is no + payload) for OUT requests in the data stage or the wLength field + specifying the number of bytes to read for IN requests in the data + stage. The timeout parameter specifies a time limit to the operation + in miliseconds. + + Return the number of bytes written (for OUT transfers) or the data + read (for IN transfers), as an array.array object. + """ + _not_implemented(self.ctrl_transfer) + + def reset_device(self, dev_handle): + r"""Reset the device.""" + _not_implemented(self.reset_device) + + def is_kernel_driver_active(self, dev_handle, intf): + r"""Determine if a kernel driver is active on an interface. + + If a kernel driver is active, you cannot claim the interface, + and the backend will be unable to perform I/O. + """ + _not_implemented(self.is_kernel_driver_active) + + def detach_kernel_driver(self, dev_handle, intf): + r"""Detach a kernel driver from an interface. + + If successful, you will then be able to claim the interface + and perform I/O. + """ + _not_implemented(self.detach_kernel_driver) + + def attach_kernel_driver(self, dev_handle, intf): + r"""Re-attach an interface's kernel driver, which was previously + detached using detach_kernel_driver().""" + _not_implemented(self.attach_kernel_driver) diff --git a/plugins/wedo_plugin/usb/backend/libusb01.py b/plugins/wedo_plugin/usb/backend/libusb01.py new file mode 100644 index 0000000..cf344c0 --- /dev/null +++ b/plugins/wedo_plugin/usb/backend/libusb01.py @@ -0,0 +1,582 @@ +# Copyright (C) 2009-2011 Wander Lairson Costa +# +# The following terms apply to all files associated +# with the software unless explicitly disclaimed in individual files. +# +# The authors hereby grant permission to use, copy, modify, distribute, +# and license this software and its documentation for any purpose, provided +# that existing copyright notices are retained in all copies and that this +# notice is included verbatim in any distributions. No written agreement, +# license, or royalty fee is required for any of the authorized uses. +# Modifications to this software may be copyrighted by their authors +# and need not follow the licensing terms described here, provided that +# the new terms are clearly indicated on the first page of each file where +# they apply. +# +# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +# MODIFICATIONS. + +from ctypes import * +import ctypes.util +import os +import usb.backend +import usb.util +import sys +from usb.core import USBError +from usb._debug import methodtrace +import usb._interop as _interop +import logging + +__author__ = 'Wander Lairson Costa' + +__all__ = ['get_backend'] + +_logger = logging.getLogger('usb.backend.libusb01') + +# usb.h + +_PC_PATH_MAX = 4 + +if sys.platform != 'win32' and sys.platform != 'cygwin': + _PATH_MAX = os.pathconf('.', _PC_PATH_MAX) +else: + _PATH_MAX = 511 + +# libusb-win32 makes all structures packed, while +# default libusb only does for some structures +# _PackPolicy defines the structure packing according +# to the platform. +class _PackPolicy(object): + pass + +if sys.platform == 'win32' or sys.platform == 'cygwin': + _PackPolicy._pack_ = 1 + +# Data structures + +class _usb_descriptor_header(Structure): + _pack_ = 1 + _fields_ = [('blength', c_uint8), + ('bDescriptorType', c_uint8)] + +class _usb_string_descriptor(Structure): + _pack_ = 1 + _fields_ = [('bLength', c_uint8), + ('bDescriptorType', c_uint8), + ('wData', c_uint16)] + +class _usb_endpoint_descriptor(Structure, _PackPolicy): + _fields_ = [('bLength', c_uint8), + ('bDescriptorType', c_uint8), + ('bEndpointAddress', c_uint8), + ('bmAttributes', c_uint8), + ('wMaxPacketSize', c_uint16), + ('bInterval', c_uint8), + ('bRefresh', c_uint8), + ('bSynchAddress', c_uint8), + ('extra', POINTER(c_uint8)), + ('extralen', c_int)] + +class _usb_interface_descriptor(Structure, _PackPolicy): + _fields_ = [('bLength', c_uint8), + ('bDescriptorType', c_uint8), + ('bInterfaceNumber', c_uint8), + ('bAlternateSetting', c_uint8), + ('bNumEndpoints', c_uint8), + ('bInterfaceClass', c_uint8), + ('bInterfaceSubClass', c_uint8), + ('bInterfaceProtocol', c_uint8), + ('iInterface', c_uint8), + ('endpoint', POINTER(_usb_endpoint_descriptor)), + ('extra', POINTER(c_uint8)), + ('extralen', c_int)] + +class _usb_interface(Structure, _PackPolicy): + _fields_ = [('altsetting', POINTER(_usb_interface_descriptor)), + ('num_altsetting', c_int)] + +class _usb_config_descriptor(Structure, _PackPolicy): + _fields_ = [('bLength', c_uint8), + ('bDescriptorType', c_uint8), + ('wTotalLength', c_uint16), + ('bNumInterfaces', c_uint8), + ('bConfigurationValue', c_uint8), + ('iConfiguration', c_uint8), + ('bmAttributes', c_uint8), + ('bMaxPower', c_uint8), + ('interface', POINTER(_usb_interface)), + ('extra', POINTER(c_uint8)), + ('extralen', c_int)] + +class _usb_device_descriptor(Structure, _PackPolicy): + _pack_ = 1 + _fields_ = [('bLength', c_uint8), + ('bDescriptorType', c_uint8), + ('bcdUSB', c_uint16), + ('bDeviceClass', c_uint8), + ('bDeviceSubClass', c_uint8), + ('bDeviceProtocol', c_uint8), + ('bMaxPacketSize0', c_uint8), + ('idVendor', c_uint16), + ('idProduct', c_uint16), + ('bcdDevice', c_uint16), + ('iManufacturer', c_uint8), + ('iProduct', c_uint8), + ('iSerialNumber', c_uint8), + ('bNumConfigurations', c_uint8)] + +class _usb_device(Structure, _PackPolicy): + pass + +class _usb_bus(Structure, _PackPolicy): + pass + +_usb_device._fields_ = [('next', POINTER(_usb_device)), + ('prev', POINTER(_usb_device)), + ('filename', c_int8 * (_PATH_MAX + 1)), + ('bus', POINTER(_usb_bus)), + ('descriptor', _usb_device_descriptor), + ('config', POINTER(_usb_config_descriptor)), + ('dev', c_void_p), + ('devnum', c_uint8), + ('num_children', c_ubyte), + ('children', POINTER(POINTER(_usb_device)))] + +_usb_bus._fields_ = [('next', POINTER(_usb_bus)), + ('prev', POINTER(_usb_bus)), + ('dirname', c_char * (_PATH_MAX + 1)), + ('devices', POINTER(_usb_device)), + ('location', c_uint32), + ('root_dev', POINTER(_usb_device))] + +_usb_dev_handle = c_void_p + +class _DeviceDescriptor: + def __init__(self, dev): + desc = dev.descriptor + self.bLength = desc.bLength + self.bDescriptorType = desc.bDescriptorType + self.bcdUSB = desc.bcdUSB + self.bDeviceClass = desc.bDeviceClass + self.bDeviceSubClass = desc.bDeviceSubClass + self.bDeviceProtocol = desc.bDeviceProtocol + self.bMaxPacketSize0 = desc.bMaxPacketSize0 + self.idVendor = desc.idVendor + self.idProduct = desc.idProduct + self.bcdDevice = desc.bcdDevice + self.iManufacturer = desc.iManufacturer + self.iProduct = desc.iProduct + self.iSerialNumber = desc.iSerialNumber + self.bNumConfigurations = desc.bNumConfigurations + self.address = dev.devnum + self.bus = dev.bus[0].location + +_lib = None + +def _load_library(): + if sys.platform != 'cygwin': + candidates = ('usb-0.1', 'usb', 'libusb0') + for candidate in candidates: + libname = ctypes.util.find_library(candidate) + if libname is not None: break + else: + # corner cases + # cygwin predefines library names with 'cyg' instead of 'lib' + try: + return CDLL('cygusb0.dll') + except: + _logger.error('Libusb 0 could not be loaded in cygwin', exc_info=True) + + raise OSError('USB library could not be found') + return CDLL(libname) + +def _setup_prototypes(lib): + # usb_dev_handle *usb_open(struct usb_device *dev); + lib.usb_open.argtypes = [POINTER(_usb_device)] + lib.usb_open.restype = _usb_dev_handle + + # int usb_close(usb_dev_handle *dev); + lib.usb_close.argtypes = [_usb_dev_handle] + + # int usb_get_string(usb_dev_handle *dev, + # int index, + # int langid, + # char *buf, + # size_t buflen); + lib.usb_get_string.argtypes = [ + _usb_dev_handle, + c_int, + c_int, + c_char_p, + c_size_t + ] + + # int usb_get_string_simple(usb_dev_handle *dev, + # int index, + # char *buf, + # size_t buflen); + lib.usb_get_string_simple.argtypes = [ + _usb_dev_handle, + c_int, + c_char_p, + c_size_t + ] + + # int usb_get_descriptor_by_endpoint(usb_dev_handle *udev, + # int ep, + # unsigned char type, + # unsigned char index, + # void *buf, + # int size); + lib.usb_get_descriptor_by_endpoint.argtypes = [ + _usb_dev_handle, + c_int, + c_ubyte, + c_ubyte, + c_void_p, + c_int + ] + + # int usb_get_descriptor(usb_dev_handle *udev, + # unsigned char type, + # unsigned char index, + # void *buf, + # int size); + lib.usb_get_descriptor.argtypes = [ + _usb_dev_handle, + c_ubyte, + c_ubyte, + c_void_p, + c_int + ] + + # int usb_bulk_write(usb_dev_handle *dev, + # int ep, + # const char *bytes, + # int size, + # int timeout); + lib.usb_bulk_write.argtypes = [ + _usb_dev_handle, + c_int, + c_char_p, + c_int, + c_int + ] + + # int usb_bulk_read(usb_dev_handle *dev, + # int ep, + # char *bytes, + # int size, + # int timeout); + lib.usb_bulk_read.argtypes = [ + _usb_dev_handle, + c_int, + c_char_p, + c_int, + c_int + ] + + # int usb_interrupt_write(usb_dev_handle *dev, + # int ep, + # const char *bytes, + # int size, + # int timeout); + lib.usb_interrupt_write.argtypes = [ + _usb_dev_handle, + c_int, + c_char_p, + c_int, + c_int + ] + + # int usb_interrupt_read(usb_dev_handle *dev, + # int ep, + # char *bytes, + # int size, + # int timeout); + lib.usb_interrupt_read.argtypes = [ + _usb_dev_handle, + c_int, + c_char_p, + c_int, + c_int + ] + + # int usb_control_msg(usb_dev_handle *dev, + # int requesttype, + # int request, + # int value, + # int index, + # char *bytes, + # int size, + # int timeout); + lib.usb_control_msg.argtypes = [ + _usb_dev_handle, + c_int, + c_int, + c_int, + c_int, + c_char_p, + c_int, + c_int + ] + + # int usb_set_configuration(usb_dev_handle *dev, int configuration); + lib.usb_set_configuration.argtypes = [_usb_dev_handle, c_int] + + # int usb_claim_interface(usb_dev_handle *dev, int interface); + lib.usb_claim_interface.argtypes = [_usb_dev_handle, c_int] + + # int usb_release_interface(usb_dev_handle *dev, int interface); + lib.usb_release_interface.argtypes = [_usb_dev_handle, c_int] + + # int usb_set_altinterface(usb_dev_handle *dev, int alternate); + lib.usb_set_altinterface.argtypes = [_usb_dev_handle, c_int] + + # int usb_resetep(usb_dev_handle *dev, unsigned int ep); + lib.usb_resetep.argtypes = [_usb_dev_handle, c_int] + + # int usb_clear_halt(usb_dev_handle *dev, unsigned int ep); + lib.usb_clear_halt.argtypes = [_usb_dev_handle, c_int] + + # int usb_reset(usb_dev_handle *dev); + lib.usb_reset.argtypes = [_usb_dev_handle] + + # char *usb_strerror(void); + lib.usb_strerror.argtypes = [] + lib.usb_strerror.restype = c_char_p + + # void usb_set_debug(int level); + lib.usb_set_debug.argtypes = [c_int] + + # struct usb_device *usb_device(usb_dev_handle *dev); + lib.usb_device.argtypes = [_usb_dev_handle] + lib.usb_device.restype = POINTER(_usb_device) + + # struct usb_bus *usb_get_busses(void); + lib.usb_get_busses.restype = POINTER(_usb_bus) + +def _check(retval): + if retval is None: + errmsg = _lib.usb_strerror() + else: + ret = int(retval) + if ret < 0: + errmsg = _lib.usb_strerror() + # No error means that we need to get the error + # message from the return code + # Thanks to Nicholas Wheeler to point out the problem... + # Also see issue #2860940 + if errmsg.lower() == 'no error': + errmsg = os.strerror(-ret) + else: + return ret + raise USBError(errmsg, ret) + +# implementation of libusb 0.1.x backend +class _LibUSB(usb.backend.IBackend): + @methodtrace(_logger) + def enumerate_devices(self): + _check(_lib.usb_find_busses()) + _check(_lib.usb_find_devices()) + bus = _lib.usb_get_busses() + while bool(bus): + dev = bus[0].devices + while bool(dev): + yield dev[0] + dev = dev[0].next + bus = bus[0].next + + @methodtrace(_logger) + def get_device_descriptor(self, dev): + return _DeviceDescriptor(dev) + + @methodtrace(_logger) + def get_configuration_descriptor(self, dev, config): + if config >= dev.descriptor.bNumConfigurations: + raise IndexError('Invalid configuration index ' + str(config)) + return dev.config[config] + + @methodtrace(_logger) + def get_interface_descriptor(self, dev, intf, alt, config): + cfgdesc = self.get_configuration_descriptor(dev, config) + if intf >= cfgdesc.bNumInterfaces: + raise IndexError('Invalid interface index ' + str(interface)) + interface = cfgdesc.interface[intf] + if alt >= interface.num_altsetting: + raise IndexError('Invalid alternate setting index ' + str(alt)) + return interface.altsetting[alt] + + @methodtrace(_logger) + def get_endpoint_descriptor(self, dev, ep, intf, alt, config): + interface = self.get_interface_descriptor(dev, intf, alt, config) + if ep >= interface.bNumEndpoints: + raise IndexError('Invalid endpoint index ' + str(ep)) + return interface.endpoint[ep] + + @methodtrace(_logger) + def open_device(self, dev): + return _check(_lib.usb_open(dev)) + + @methodtrace(_logger) + def close_device(self, dev_handle): + _check(_lib.usb_close(dev_handle)) + + @methodtrace(_logger) + def set_configuration(self, dev_handle, config_value): + _check(_lib.usb_set_configuration(dev_handle, config_value)) + + @methodtrace(_logger) + def set_interface_altsetting(self, dev_handle, intf, altsetting): + _check(_lib.usb_set_altinterface(dev_handle, altsetting)) + + @methodtrace(_logger) + def get_configuration(self, dev_handle): + bmRequestType = usb.util.build_request_type( + usb.util.CTRL_IN, + usb.util.CTRL_TYPE_STANDARD, + usb.util.CTRL_RECIPIENT_DEVICE + ) + return self.ctrl_transfer(dev_handle, + bmRequestType, + 0x08, + 0, + 0, + 1, + 100 + )[0] + + + @methodtrace(_logger) + def claim_interface(self, dev_handle, intf): + _check(_lib.usb_claim_interface(dev_handle, intf)) + + @methodtrace(_logger) + def release_interface(self, dev_handle, intf): + _check(_lib.usb_release_interface(dev_handle, intf)) + + @methodtrace(_logger) + def bulk_write(self, dev_handle, ep, intf, data, timeout): + return self.__write(_lib.usb_bulk_write, + dev_handle, + ep, + intf, + data, timeout) + + @methodtrace(_logger) + def bulk_read(self, dev_handle, ep, intf, size, timeout): + return self.__read(_lib.usb_bulk_read, + dev_handle, + ep, + intf, + size, + timeout) + + @methodtrace(_logger) + def intr_write(self, dev_handle, ep, intf, data, timeout): + return self.__write(_lib.usb_interrupt_write, + dev_handle, + ep, + intf, + data, + timeout) + + @methodtrace(_logger) + def intr_read(self, dev_handle, ep, intf, size, timeout): + return self.__read(_lib.usb_interrupt_read, + dev_handle, + ep, + intf, + size, + timeout) + + @methodtrace(_logger) + def ctrl_transfer(self, + dev_handle, + bmRequestType, + bRequest, + wValue, + wIndex, + data_or_wLength, + timeout): + if usb.util.ctrl_direction(bmRequestType) == usb.util.CTRL_OUT: + address, length = data_or_wLength.buffer_info() + length *= data_or_wLength.itemsize + return _check(_lib.usb_control_msg( + dev_handle, + bmRequestType, + bRequest, + wValue, + wIndex, + cast(address, c_char_p), + length, + timeout + )) + else: + data = _interop.as_array((0,) * data_or_wLength) + read = int(_check(_lib.usb_control_msg( + dev_handle, + bmRequestType, + bRequest, + wValue, + wIndex, + cast(data.buffer_info()[0], + c_char_p), + data_or_wLength, + timeout + ))) + return data[:read] + + @methodtrace(_logger) + def reset_device(self, dev_handle): + _check(_lib.usb_reset(dev_handle)) + + @methodtrace(_logger) + def detach_kernel_driver(self, dev_handle, intf): + _check(_lib.usb_detach_kernel_driver_np(dev_handle, intf)) + + def __write(self, fn, dev_handle, ep, intf, data, timeout): + address, length = data.buffer_info() + length *= data.itemsize + return int(_check(fn( + dev_handle, + ep, + cast(address, c_char_p), + length, + timeout + ))) + + def __read(self, fn, dev_handle, ep, intf, size, timeout): + data = _interop.as_array((0,) * size) + address, length = data.buffer_info() + length *= data.itemsize + ret = int(_check(fn( + dev_handle, + ep, + cast(address, c_char_p), + length, + timeout + ))) + return data[:ret] + +def get_backend(): + global _lib + try: + if _lib is None: + _lib = _load_library() + _setup_prototypes(_lib) + _lib.usb_init() + return _LibUSB() + except Exception: + _logger.error('Error loading libusb 0.1 backend', exc_info=True) + return None diff --git a/plugins/wedo_plugin/usb/backend/libusb10.py b/plugins/wedo_plugin/usb/backend/libusb10.py new file mode 100644 index 0000000..cb2a566 --- /dev/null +++ b/plugins/wedo_plugin/usb/backend/libusb10.py @@ -0,0 +1,654 @@ +# Copyright (C) 2009-2011 Wander Lairson Costa +# +# The following terms apply to all files associated +# with the software unless explicitly disclaimed in individual files. +# +# The authors hereby grant permission to use, copy, modify, distribute, +# and license this software and its documentation for any purpose, provided +# that existing copyright notices are retained in all copies and that this +# notice is included verbatim in any distributions. No written agreement, +# license, or royalty fee is required for any of the authorized uses. +# Modifications to this software may be copyrighted by their authors +# and need not follow the licensing terms described here, provided that +# the new terms are clearly indicated on the first page of each file where +# they apply. +# +# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +# MODIFICATIONS. + +from ctypes import * +import ctypes.util +import usb.util +import sys +import logging +from usb._debug import methodtrace +import usb._interop as _interop +import errno + +__author__ = 'Wander Lairson Costa' + +__all__ = [ + 'get_backend', + 'LIBUSB_SUCESS', + 'LIBUSB_ERROR_IO', + 'LIBUSB_ERROR_INVALID_PARAM', + 'LIBUSB_ERROR_ACCESS', + 'LIBUSB_ERROR_NO_DEVICE', + 'LIBUSB_ERROR_NOT_FOUND', + 'LIBUSB_ERROR_BUSY', + 'LIBUSB_ERROR_TIMEOUT', + 'LIBUSB_ERROR_OVERFLOW', + 'LIBUSB_ERROR_PIPE', + 'LIBUSB_ERROR_INTERRUPTED', + 'LIBUSB_ERROR_NO_MEM', + 'LIBUSB_ERROR_NOT_SUPPORTED', + 'LIBUSB_ERROR_OTHER' + ] + +_logger = logging.getLogger('usb.backend.libusb10') + +# libusb.h + +# return codes + +LIBUSB_SUCCESS = 0 +LIBUSB_ERROR_IO = -1 +LIBUSB_ERROR_INVALID_PARAM = -2 +LIBUSB_ERROR_ACCESS = -3 +LIBUSB_ERROR_NO_DEVICE = -4 +LIBUSB_ERROR_NOT_FOUND = -5 +LIBUSB_ERROR_BUSY = -6 +LIBUSB_ERROR_TIMEOUT = -7 +LIBUSB_ERROR_OVERFLOW = -8 +LIBUSB_ERROR_PIPE = -9 +LIBUSB_ERROR_INTERRUPTED = -10 +LIBUSB_ERROR_NO_MEM = -11 +LIBUSB_ERROR_NOT_SUPPORTED = -12 +LIBUSB_ERROR_OTHER = -99 + +# map return codes to strings +_str_error = { + LIBUSB_SUCCESS:'Success (no error)', + LIBUSB_ERROR_IO:'Input/output error', + LIBUSB_ERROR_INVALID_PARAM:'Invalid parameter', + LIBUSB_ERROR_ACCESS:'Access denied (insufficient permissions)', + LIBUSB_ERROR_NO_DEVICE:'No such device (it may have been disconnected)', + LIBUSB_ERROR_NOT_FOUND:'Entity not found', + LIBUSB_ERROR_BUSY:'Resource busy', + LIBUSB_ERROR_TIMEOUT:'Operation timed out', + LIBUSB_ERROR_OVERFLOW:'Overflow', + LIBUSB_ERROR_PIPE:'Pipe error', + LIBUSB_ERROR_INTERRUPTED:'System call interrupted (perhaps due to signal)', + LIBUSB_ERROR_NO_MEM:'Insufficient memory', + LIBUSB_ERROR_NOT_SUPPORTED:'Operation not supported or unimplemented on this platform', + LIBUSB_ERROR_OTHER:'Unknown error' +} + +# map return code to errno values +_libusb_errno = { + LIBUSB_SUCCESS:None, + LIBUSB_ERROR_IO:errno.__dict__.get('EIO', None), + LIBUSB_ERROR_INVALID_PARAM:errno.__dict__.get('EINVAL', None), + LIBUSB_ERROR_ACCESS:errno.__dict__.get('EACCES', None), + LIBUSB_ERROR_NO_DEVICE:errno.__dict__.get('ENODEV', None), + LIBUSB_ERROR_NOT_FOUND:errno.__dict__.get('ENOENT', None), + LIBUSB_ERROR_BUSY:errno.__dict__.get('EBUSY', None), + LIBUSB_ERROR_TIMEOUT:errno.__dict__.get('ETIMEDOUT', None), + LIBUSB_ERROR_OVERFLOW:errno.__dict__.get('EOVERFLOW', None), + LIBUSB_ERROR_PIPE:errno.__dict__.get('EPIPE', None), + LIBUSB_ERROR_INTERRUPTED:errno.__dict__.get('EINTR', None), + LIBUSB_ERROR_NO_MEM:errno.__dict__.get('ENOMEM', None), + LIBUSB_ERROR_NOT_SUPPORTED:errno.__dict__.get('ENOSYS', None), + LIBUSB_ERROR_OTHER:None +} + +# Data structures + +class _libusb_endpoint_descriptor(Structure): + _fields_ = [('bLength', c_uint8), + ('bDescriptorType', c_uint8), + ('bEndpointAddress', c_uint8), + ('bmAttributes', c_uint8), + ('wMaxPacketSize', c_uint16), + ('bInterval', c_uint8), + ('bRefresh', c_uint8), + ('bSynchAddress', c_uint8), + ('extra', POINTER(c_ubyte)), + ('extra_length', c_int)] + +class _libusb_interface_descriptor(Structure): + _fields_ = [('bLength', c_uint8), + ('bDescriptorType', c_uint8), + ('bInterfaceNumber', c_uint8), + ('bAlternateSetting', c_uint8), + ('bNumEndpoints', c_uint8), + ('bInterfaceClass', c_uint8), + ('bInterfaceSubClass', c_uint8), + ('bInterfaceProtocol', c_uint8), + ('iInterface', c_uint8), + ('endpoint', POINTER(_libusb_endpoint_descriptor)), + ('extra', POINTER(c_ubyte)), + ('extra_length', c_int)] + +class _libusb_interface(Structure): + _fields_ = [('altsetting', POINTER(_libusb_interface_descriptor)), + ('num_altsetting', c_int)] + +class _libusb_config_descriptor(Structure): + _fields_ = [('bLength', c_uint8), + ('bDescriptorType', c_uint8), + ('wTotalLength', c_uint16), + ('bNumInterfaces', c_uint8), + ('bConfigurationValue', c_uint8), + ('iConfiguration', c_uint8), + ('bmAttributes', c_uint8), + ('bMaxPower', c_uint8), + ('interface', POINTER(_libusb_interface)), + ('extra', POINTER(c_ubyte)), + ('extra_length', c_int)] + +class _libusb_device_descriptor(Structure): + _fields_ = [('bLength', c_uint8), + ('bDescriptorType', c_uint8), + ('bcdUSB', c_uint16), + ('bDeviceClass', c_uint8), + ('bDeviceSubClass', c_uint8), + ('bDeviceProtocol', c_uint8), + ('bMaxPacketSize0', c_uint8), + ('idVendor', c_uint16), + ('idProduct', c_uint16), + ('bcdDevice', c_uint16), + ('iManufacturer', c_uint8), + ('iProduct', c_uint8), + ('iSerialNumber', c_uint8), + ('bNumConfigurations', c_uint8)] + +_lib = None +_init = None + +_libusb_device_handle = c_void_p + +def _load_library(): + if sys.platform != 'cygwin': + candidates = ('usb-1.0', 'libusb-1.0', 'usb') + for candidate in candidates: + libname = ctypes.util.find_library(candidate) + if libname is not None: break + else: + # corner cases + # cygwin predefines library names with 'cyg' instead of 'lib' + try: + return CDLL('cygusb-1.0.dll') + except Exception: + _logger.error('Libusb 1.0 could not be loaded in cygwin', exc_info=True) + + raise OSError('USB library could not be found') + # Windows backend uses stdcall calling convention + if sys.platform == 'win32': + l = WinDLL(libname) + else: + l = CDLL(libname) + # On FreeBSD 8/9, libusb 1.0 and libusb 0.1 are in the same shared + # object libusb.so, so if we found libusb library name, we must assure + # it is 1.0 version. We just try to get some symbol from 1.0 version + if not hasattr(l, 'libusb_init'): + raise OSError('USB library could not be found') + return l + +def _setup_prototypes(lib): + # void libusb_set_debug (libusb_context *ctx, int level) + lib.libusb_set_debug.argtypes = [c_void_p, c_int] + + # int libusb_init (libusb_context **context) + lib.libusb_init.argtypes = [POINTER(c_void_p)] + + # void libusb_exit (struct libusb_context *ctx) + lib.libusb_exit.argtypes = [c_void_p] + + # ssize_t libusb_get_device_list (libusb_context *ctx, + # libusb_device ***list) + lib.libusb_get_device_list.argtypes = [ + c_void_p, + POINTER(POINTER(c_void_p)) + ] + + # void libusb_free_device_list (libusb_device **list, + # int unref_devices) + lib.libusb_free_device_list.argtypes = [ + POINTER(c_void_p), + c_int + ] + + # libusb_device *libusb_ref_device (libusb_device *dev) + lib.libusb_ref_device.argtypes = [c_void_p] + lib.libusb_ref_device.restype = c_void_p + + # void libusb_unref_device(libusb_device *dev) + lib.libusb_unref_device.argtypes = [c_void_p] + + # int libusb_open(libusb_device *dev, libusb_device_handle **handle) + lib.libusb_open.argtypes = [c_void_p, POINTER(_libusb_device_handle)] + + # void libusb_close(libusb_device_handle *dev_handle) + lib.libusb_close.argtypes = [_libusb_device_handle] + + # int libusb_set_configuration(libusb_device_handle *dev, + # int configuration) + lib.libusb_set_configuration.argtypes = [_libusb_device_handle, c_int] + + # int libusb_get_configuration(libusb_device_handle *dev, + # int *config) + lib.libusb_get_configuration.argtypes = [_libusb_device_handle, POINTER(c_int)] + + # int libusb_claim_interface(libusb_device_handle *dev, + # int interface_number) + lib.libusb_claim_interface.argtypes = [_libusb_device_handle, c_int] + + # int libusb_release_interface(libusb_device_handle *dev, + # int interface_number) + lib.libusb_release_interface.argtypes = [_libusb_device_handle, c_int] + + # int libusb_set_interface_alt_setting(libusb_device_handle *dev, + # int interface_number, + # int alternate_setting) + lib.libusb_set_interface_alt_setting.argtypes = [ + _libusb_device_handle, + c_int, + c_int + ] + + # int libusb_reset_device (libusb_device_handle *dev) + lib.libusb_reset_device.argtypes = [_libusb_device_handle] + + # int libusb_kernel_driver_active(libusb_device_handle *dev, + # int interface) + lib.libusb_kernel_driver_active.argtypes = [ + _libusb_device_handle, + c_int + ] + + # int libusb_detach_kernel_driver(libusb_device_handle *dev, + # int interface) + lib.libusb_detach_kernel_driver.argtypes = [ + _libusb_device_handle, + c_int + ] + + # int libusb_attach_kernel_driver(libusb_device_handle *dev, + # int interface) + lib.libusb_attach_kernel_driver.argtypes = [ + _libusb_device_handle, + c_int + ] + + # int libusb_get_device_descriptor( + # libusb_device *dev, + # struct libusb_device_descriptor *desc + # ) + lib.libusb_get_device_descriptor.argtypes = [ + c_void_p, + POINTER(_libusb_device_descriptor) + ] + + # int libusb_get_config_descriptor( + # libusb_device *dev, + # uint8_t config_index, + # struct libusb_config_descriptor **config + # ) + lib.libusb_get_config_descriptor.argtypes = [ + c_void_p, + c_uint8, + POINTER(POINTER(_libusb_config_descriptor)) + ] + + # void libusb_free_config_descriptor( + # struct libusb_config_descriptor *config + # ) + lib.libusb_free_config_descriptor.argtypes = [ + POINTER(_libusb_config_descriptor) + ] + + # int libusb_get_string_descriptor_ascii(libusb_device_handle *dev, + # uint8_t desc_index, + # unsigned char *data, + # int length) + lib.libusb_get_string_descriptor_ascii.argtypes = [ + _libusb_device_handle, + c_uint8, + POINTER(c_ubyte), + c_int + ] + + # int libusb_control_transfer(libusb_device_handle *dev_handle, + # uint8_t bmRequestType, + # uint8_t bRequest, + # uint16_t wValue, + # uint16_t wIndex, + # unsigned char *data, + # uint16_t wLength, + # unsigned int timeout) + lib.libusb_control_transfer.argtypes = [ + _libusb_device_handle, + c_uint8, + c_uint8, + c_uint16, + c_uint16, + POINTER(c_ubyte), + c_uint16, + c_uint + ] + + #int libusb_bulk_transfer( + # struct libusb_device_handle *dev_handle, + # unsigned char endpoint, + # unsigned char *data, + # int length, + # int *transferred, + # unsigned int timeout + # ) + lib.libusb_bulk_transfer.argtypes = [ + _libusb_device_handle, + c_ubyte, + POINTER(c_ubyte), + c_int, + POINTER(c_int), + c_uint + ] + + # int libusb_interrupt_transfer( + # libusb_device_handle *dev_handle, + # unsigned char endpoint, + # unsigned char *data, + # int length, + # int *actual_length, + # unsigned int timeout + # ); + lib.libusb_interrupt_transfer.argtypes = [ + _libusb_device_handle, + c_ubyte, + POINTER(c_ubyte), + c_int, + POINTER(c_int), + c_uint + ] + + # uint8_t libusb_get_bus_number(libusb_device *dev) + lib.libusb_get_bus_number.argtypes = [c_void_p] + lib.libusb_get_bus_number.restype = c_uint8 + + # uint8_t libusb_get_device_address(libusb_device *dev) + lib.libusb_get_device_address.argtypes = [c_void_p] + lib.libusb_get_device_address.restype = c_uint8 + + + +# check a libusb function call +def _check(retval): + if isinstance(retval, int): + retval = c_int(retval) + if isinstance(retval, c_int): + if retval.value < 0: + from usb.core import USBError + ret = retval.value + raise USBError(_str_error[ret], ret, _libusb_errno[ret]) + return retval + +# wrap a device +class _Device(object): + def __init__(self, devid): + self.devid = _lib.libusb_ref_device(devid) + def __del__(self): + _lib.libusb_unref_device(self.devid) + +# wrap a descriptor and keep a reference to another object +# Thanks to Thomas Reitmayr. +class _WrapDescriptor(object): + def __init__(self, desc, obj = None): + self.obj = obj + self.desc = desc + def __getattr__(self, name): + return getattr(self.desc, name) + +# wrap a configuration descriptor +class _ConfigDescriptor(object): + def __init__(self, desc): + self.desc = desc + def __del__(self): + _lib.libusb_free_config_descriptor(self.desc) + def __getattr__(self, name): + return getattr(self.desc.contents, name) + +# initialize and finalize the library +class _Initializer(object): + def __init__(self): + _check(_lib.libusb_init(None)) + def __del__(self): + _lib.libusb_exit(None) + + +# iterator for libusb devices +class _DevIterator(object): + def __init__(self): + self.dev_list = POINTER(c_void_p)() + self.num_devs = _check(_lib.libusb_get_device_list( + None, + byref(self.dev_list)) + ).value + def __iter__(self): + for i in range(self.num_devs): + yield _Device(self.dev_list[i]) + def __del__(self): + _lib.libusb_free_device_list(self.dev_list, 1) + +# implementation of libusb 1.0 backend +class _LibUSB(usb.backend.IBackend): + @methodtrace(_logger) + def enumerate_devices(self): + return _DevIterator() + + @methodtrace(_logger) + def get_device_descriptor(self, dev): + dev_desc = _libusb_device_descriptor() + _check(_lib.libusb_get_device_descriptor(dev.devid, byref(dev_desc))) + dev_desc.bus = _lib.libusb_get_bus_number(dev.devid) + dev_desc.address = _lib.libusb_get_device_address(dev.devid) + return dev_desc + + @methodtrace(_logger) + def get_configuration_descriptor(self, dev, config): + cfg = POINTER(_libusb_config_descriptor)() + _check(_lib.libusb_get_config_descriptor(dev.devid, + config, byref(cfg))) + return _ConfigDescriptor(cfg) + + @methodtrace(_logger) + def get_interface_descriptor(self, dev, intf, alt, config): + cfg = self.get_configuration_descriptor(dev, config) + if intf >= cfg.bNumInterfaces: + raise IndexError('Invalid interface index ' + str(intf)) + i = cfg.interface[intf] + if alt >= i.num_altsetting: + raise IndexError('Invalid alternate setting index ' + str(alt)) + return _WrapDescriptor(i.altsetting[alt], cfg) + + @methodtrace(_logger) + def get_endpoint_descriptor(self, dev, ep, intf, alt, config): + i = self.get_interface_descriptor(dev, intf, alt, config) + if ep > i.bNumEndpoints: + raise IndexError('Invalid endpoint index ' + str(ep)) + return _WrapDescriptor(i.endpoint[ep], i) + + @methodtrace(_logger) + def open_device(self, dev): + handle = _libusb_device_handle() + _check(_lib.libusb_open(dev.devid, byref(handle))) + return handle + + @methodtrace(_logger) + def close_device(self, dev_handle): + _lib.libusb_close(dev_handle) + + @methodtrace(_logger) + def set_configuration(self, dev_handle, config_value): + _check(_lib.libusb_set_configuration(dev_handle, config_value)) + + @methodtrace(_logger) + def get_configuration(self, dev_handle): + config = c_int() + _check(_lib.libusb_get_configuration(dev_handle, byref(config))) + return config.value + + @methodtrace(_logger) + def set_interface_altsetting(self, dev_handle, intf, altsetting): + _check(_lib.libusb_set_interface_alt_setting(dev_handle, + intf, + altsetting)) + + @methodtrace(_logger) + def claim_interface(self, dev_handle, intf): + _check(_lib.libusb_claim_interface(dev_handle, intf)) + + @methodtrace(_logger) + def release_interface(self, dev_handle, intf): + _check(_lib.libusb_release_interface(dev_handle, intf)) + + @methodtrace(_logger) + def bulk_write(self, dev_handle, ep, intf, data, timeout): + return self.__write(_lib.libusb_bulk_transfer, + dev_handle, + ep, + intf, + data, + timeout) + + @methodtrace(_logger) + def bulk_read(self, dev_handle, ep, intf, size, timeout): + return self.__read(_lib.libusb_bulk_transfer, + dev_handle, + ep, + intf, + size, + timeout) + + @methodtrace(_logger) + def intr_write(self, dev_handle, ep, intf, data, timeout): + return self.__write(_lib.libusb_interrupt_transfer, + dev_handle, + ep, + intf, + data, + timeout) + + @methodtrace(_logger) + def intr_read(self, dev_handle, ep, intf, size, timeout): + return self.__read(_lib.libusb_interrupt_transfer, + dev_handle, + ep, + intf, + size, + timeout) + +# TODO: implement isochronous +# @methodtrace(_logger) +# def iso_write(self, dev_handle, ep, intf, data, timeout): +# pass + + +# @methodtrace(_logger) +# def iso_read(self, dev_handle, ep, intf, size, timeout): +# pass + + @methodtrace(_logger) + def ctrl_transfer(self, + dev_handle, + bmRequestType, + bRequest, + wValue, + wIndex, + data_or_wLength, + timeout): + if usb.util.ctrl_direction(bmRequestType) == usb.util.CTRL_OUT: + buff = data_or_wLength + else: + buff = _interop.as_array((0,) * data_or_wLength) + + addr, length = buff.buffer_info() + length *= buff.itemsize + + ret = _check(_lib.libusb_control_transfer(dev_handle, + bmRequestType, + bRequest, + wValue, + wIndex, + cast(addr, + POINTER(c_ubyte)), + length, + timeout)) + + if usb.util.ctrl_direction(bmRequestType) == usb.util.CTRL_OUT: + return ret.value + else: + return buff[:ret.value] + + @methodtrace(_logger) + def reset_device(self, dev_handle): + _check(_lib.libusb_reset_device(dev_handle)) + + @methodtrace(_logger) + def is_kernel_driver_active(self, dev_handle, intf): + return bool(_check(_lib.libusb_kernel_driver_active(dev_handle, intf))) + + @methodtrace(_logger) + def detach_kernel_driver(self, dev_handle, intf): + _check(_lib.libusb_detach_kernel_driver(dev_handle, intf)) + + @methodtrace(_logger) + def attach_kernel_driver(self, dev_handle, intf): + _check(_lib.libusb_attach_kernel_driver(dev_handle, intf)) + + def __write(self, fn, dev_handle, ep, intf, data, timeout): + address, length = data.buffer_info() + length *= data.itemsize + transferred = c_int() + _check(fn(dev_handle, + ep, + cast(address, POINTER(c_ubyte)), + length, + byref(transferred), + timeout)) + return transferred.value + + def __read(self, fn, dev_handle, ep, intf, size, timeout): + data = _interop.as_array((0,) * size) + address, length = data.buffer_info() + length *= data.itemsize + transferred = c_int() + _check(fn(dev_handle, + ep, + cast(address, POINTER(c_ubyte)), + length, + byref(transferred), + timeout)) + return data[:transferred.value] + +def get_backend(): + global _lib, _init + try: + if _lib is None: + _lib = _load_library() + _setup_prototypes(_lib) + _init = _Initializer() + return _LibUSB() + except Exception: + _logger.error('Error loading libusb 1.0 backend', exc_info=True) + return None diff --git a/plugins/wedo_plugin/usb/backend/openusb.py b/plugins/wedo_plugin/usb/backend/openusb.py new file mode 100644 index 0000000..23e4d45 --- /dev/null +++ b/plugins/wedo_plugin/usb/backend/openusb.py @@ -0,0 +1,707 @@ +# Copyright (C) 2009-2011 Wander Lairson Costa +# +# The following terms apply to all files associated +# with the software unless explicitly disclaimed in individual files. +# +# The authors hereby grant permission to use, copy, modify, distribute, +# and license this software and its documentation for any purpose, provided +# that existing copyright notices are retained in all copies and that this +# notice is included verbatim in any distributions. No written agreement, +# license, or royalty fee is required for any of the authorized uses. +# Modifications to this software may be copyrighted by their authors +# and need not follow the licensing terms described here, provided that +# the new terms are clearly indicated on the first page of each file where +# they apply. +# +# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +# MODIFICATIONS. + +from ctypes import * +import ctypes.util +import usb.util +from usb._debug import methodtrace +import logging +import errno + +__author__ = 'Wander Lairson Costa' + +__all__ = [ + 'get_backend' + 'OPENUSB_SUCCESS' + 'OPENUSB_PLATFORM_FAILURE' + 'OPENUSB_NO_RESOURCES' + 'OPENUSB_NO_BANDWIDTH' + 'OPENUSB_NOT_SUPPORTED' + 'OPENUSB_HC_HARDWARE_ERROR' + 'OPENUSB_INVALID_PERM' + 'OPENUSB_BUSY' + 'OPENUSB_BADARG' + 'OPENUSB_NOACCESS' + 'OPENUSB_PARSE_ERROR' + 'OPENUSB_UNKNOWN_DEVICE' + 'OPENUSB_INVALID_HANDLE' + 'OPENUSB_SYS_FUNC_FAILURE' + 'OPENUSB_NULL_LIST' + 'OPENUSB_CB_CONTINUE' + 'OPENUSB_CB_TERMINATE' + 'OPENUSB_IO_STALL' + 'OPENUSB_IO_CRC_ERROR' + 'OPENUSB_IO_DEVICE_HUNG' + 'OPENUSB_IO_REQ_TOO_BIG' + 'OPENUSB_IO_BIT_STUFFING' + 'OPENUSB_IO_UNEXPECTED_PID' + 'OPENUSB_IO_DATA_OVERRUN' + 'OPENUSB_IO_DATA_UNDERRUN' + 'OPENUSB_IO_BUFFER_OVERRUN' + 'OPENUSB_IO_BUFFER_UNDERRUN' + 'OPENUSB_IO_PID_CHECK_FAILURE' + 'OPENUSB_IO_DATA_TOGGLE_MISMATCH' + 'OPENUSB_IO_TIMEOUT' + 'OPENUSB_IO_CANCELED' + ] + +_logger = logging.getLogger('usb.backend.openusb') + +OPENUSB_SUCCESS = 0 +OPENUSB_PLATFORM_FAILURE = -1 +OPENUSB_NO_RESOURCES = -2 +OPENUSB_NO_BANDWIDTH = -3 +OPENUSB_NOT_SUPPORTED = -4 +OPENUSB_HC_HARDWARE_ERROR = -5 +OPENUSB_INVALID_PERM = -6 +OPENUSB_BUSY = -7 +OPENUSB_BADARG = -8 +OPENUSB_NOACCESS = -9 +OPENUSB_PARSE_ERROR = -10 +OPENUSB_UNKNOWN_DEVICE = -11 +OPENUSB_INVALID_HANDLE = -12 +OPENUSB_SYS_FUNC_FAILURE = -13 +OPENUSB_NULL_LIST = -14 +OPENUSB_CB_CONTINUE = -20 +OPENUSB_CB_TERMINATE = -21 +OPENUSB_IO_STALL = -50 +OPENUSB_IO_CRC_ERROR = -51 +OPENUSB_IO_DEVICE_HUNG = -52 +OPENUSB_IO_REQ_TOO_BIG = -53 +OPENUSB_IO_BIT_STUFFING = -54 +OPENUSB_IO_UNEXPECTED_PID = -55 +OPENUSB_IO_DATA_OVERRUN = -56 +OPENUSB_IO_DATA_UNDERRUN = -57 +OPENUSB_IO_BUFFER_OVERRUN = -58 +OPENUSB_IO_BUFFER_UNDERRUN = -59 +OPENUSB_IO_PID_CHECK_FAILURE = -60 +OPENUSB_IO_DATA_TOGGLE_MISMATCH = -61 +OPENUSB_IO_TIMEOUT = -62 +OPENUSB_IO_CANCELED = -63 + +_openusb_errno = { + OPENUSB_SUCCESS:None, + OPENUSB_PLATFORM_FAILURE:None, + OPENUSB_NO_RESOURCES:errno.__dict__.get('ENOMEM', None), + OPENUSB_NO_BANDWIDTH:None, + OPENUSB_NOT_SUPPORTED:errno.__dict__.get('ENOSYS', None), + OPENUSB_HC_HARDWARE_ERROR:errno.__dict__.get('EIO', None), + OPENUSB_INVALID_PERM:errno.__dict__.get('EBADF', None), + OPENUSB_BUSY:errno.__dict__.get('EBUSY', None), + OPENUSB_BADARG:errno.__dict__.get('EINVAL', None), + OPENUSB_NOACCESS:errno.__dict__.get('EACCES', None), + OPENUSB_PARSE_ERROR:None, + OPENUSB_UNKNOWN_DEVICE:errno.__dict__.get('ENODEV', None), + OPENUSB_INVALID_HANDLE:errno.__dict__.get('EINVAL', None), + OPENUSB_SYS_FUNC_FAILURE:None, + OPENUSB_NULL_LIST:None, + OPENUSB_CB_CONTINUE:None, + OPENUSB_CB_TERMINATE:None, + OPENUSB_IO_STALL:errno.__dict__.get('EIO', None), + OPENUSB_IO_CRC_ERROR:errno.__dict__.get('EIO', None), + OPENUSB_IO_DEVICE_HUNG:errno.__dict__.get('EIO', None), + OPENUSB_IO_REQ_TOO_BIG:errno.__dict__.get('E2BIG', None), + OPENUSB_IO_BIT_STUFFING:None, + OPENUSB_IO_UNEXPECTED_PID:errno.__dict__.get('ESRCH', None), + OPENUSB_IO_DATA_OVERRUN:errno.__dict__.get('EOVERFLOW', None), + OPENUSB_IO_DATA_UNDERRUN:None, + OPENUSB_IO_BUFFER_OVERRUN:errno.__dict__.get('EOVERFLOW', None), + OPENUSB_IO_BUFFER_UNDERRUN:None, + OPENUSB_IO_PID_CHECK_FAILURE:None, + OPENUSB_IO_DATA_TOGGLE_MISMATCH:None, + OPENUSB_IO_TIMEOUT:errno.__dict__.get('ETIMEDOUT', None), + OPENUSB_IO_CANCELED:errno.__dict__.get('EINTR', None) +} + +class _usb_endpoint_desc(Structure): + _fields_ = [('bLength', c_uint8), + ('bDescriptorType', c_uint8), + ('bEndpointAddress', c_uint8), + ('bmAttributes', c_uint8), + ('wMaxPacketSize', c_uint16), + ('bInterval', c_uint8), + ('bRefresh', c_uint8), + ('bSynchAddress', c_uint8)] + +class _usb_interface_desc(Structure): + _fields_ = [('bLength', c_uint8), + ('bDescriptorType', c_uint8), + ('bInterfaceNumber', c_uint8), + ('bAlternateSetting', c_uint8), + ('bNumEndpoints', c_uint8), + ('bInterfaceClass', c_uint8), + ('bInterfaceSubClass', c_uint8), + ('bInterfaceProtocol', c_uint8), + ('iInterface', c_uint8)] + +class _usb_config_desc(Structure): + _fields_ = [('bLength', c_uint8), + ('bDescriptorType', c_uint8), + ('wTotalLength', c_uint16), + ('bNumInterfaces', c_uint8), + ('bConfigurationValue', c_uint8), + ('iConfiguration', c_uint8), + ('bmAttributes', c_uint8), + ('bMaxPower', c_uint8)] + +class _usb_device_desc(Structure): + _fields_ = [('bLength', c_uint8), + ('bDescriptorType', c_uint8), + ('bcdUSB', c_uint16), + ('bDeviceClass', c_uint8), + ('bDeviceSubClass', c_uint8), + ('bDeviceProtocol', c_uint8), + ('bMaxPacketSize0', c_uint8), + ('idVendor', c_uint16), + ('idProduct', c_uint16), + ('bcdDevice', c_uint16), + ('iManufacturer', c_uint8), + ('iProduct', c_uint8), + ('iSerialNumber', c_uint8), + ('bNumConfigurations', c_uint8)] + +class _openusb_request_result(Structure): + _fields_ = [('status', c_int32), + ('transfered_bytes', c_uint32)] + +class _openusb_ctrl_request(Structure): + class _openusb_ctrl_setup(Structure): + _fields_ = [('bmRequestType', c_uint8), + ('bRequest', c_uint8), + ('wValue', c_uint16), + ('wIndex', c_uint16)] + _fields_ = [('payload', POINTER(c_uint8)), + ('length', c_uint32), + ('timeout', c_uint32), + ('flags', c_uint32), + ('result', _openusb_request_result), + ('next', c_void_p)] + +class _openusb_intr_request(Structure): + _fields_ = [('interval', c_uint16), + ('payload', POINTER(c_uint8)), + ('length', c_uint32), + ('timeout', c_uint32), + ('flags', c_uint32), + ('result', _openusb_request_result), + ('next', c_void_p)] + +class _openusb_bulk_request(Structure): + _fields_ = [('payload', POINTER(c_uint8)), + ('length', c_uint32), + ('timeout', c_uint32), + ('flags', c_uint32), + ('result', _openusb_request_result), + ('next', c_void_p)] + +class _openusb_isoc_pkts(Structure): + class _openusb_isoc_packet(Structure): + _fields_ = [('payload', POINTER(c_uint8)), + ('length', c_uint32)] + _fields_ = [('num_packets', c_uint32), + ('packets', POINTER(_openusb_isoc_packet))] + +class _openusb_isoc_request(Structure): + _fields_ = [('start_frame', c_uint32), + ('flags', c_uint32), + ('pkts', _openusb_isoc_pkts), + ('isoc_results', POINTER(_openusb_request_result)), + ('isoc_status', c_int32), + ('next', c_void_p)] + +_openusb_devid = c_uint64 +_openusb_busid = c_uint64 +_openusb_handle = c_uint64 +_openusb_dev_handle = c_uint64 + +_lib = None +_ctx = None + +def _load_library(): + libname = ctypes.util.find_library('openusb') + if libname is None: + raise OSError('USB library could not be found') + return CDLL(libname) + +def _setup_prototypes(lib): + # int32_t openusb_init(uint32_t flags , openusb_handle_t *handle); + lib.openusb_init.argtypes = [c_uint32, POINTER(_openusb_handle)] + lib.openusb_init.restype = c_int32 + + # void openusb_fini(openusb_handle_t handle ); + lib.openusb_fini.argtypes = [_openusb_handle] + + # uint32_t openusb_get_busid_list(openusb_handle_t handle, + # openusb_busid_t **busids, + # uint32_t *num_busids); + lib.openusb_get_busid_list.argtypes = [ + _openusb_handle, + POINTER(POINTER(_openusb_busid)), + POINTER(c_uint32) + ] + + # void openusb_free_busid_list(openusb_busid_t * busids); + lib.openusb_free_busid_list.argtypes = [POINTER(_openusb_busid)] + + # uint32_t openusb_get_devids_by_bus(openusb_handle_t handle, + # openusb_busid_t busid, + # openusb_devid_t **devids, + # uint32_t *num_devids); + lib.openusb_get_devids_by_bus.argtypes = [ + _openusb_handle, + _openusb_busid, + POINTER(POINTER(_openusb_devid)), + POINTER(c_uint32) + ] + + lib.openusb_get_devids_by_bus.restype = c_int32 + + # void openusb_free_devid_list(openusb_devid_t * devids); + lib.openusb_free_devid_list.argtypes = [POINTER(_openusb_devid)] + + # int32_t openusb_open_device(openusb_handle_t handle, + # openusb_devid_t devid , + # uint32_t flags, + # openusb_dev_handle_t *dev); + lib.openusb_open_device.argtypes = [ + _openusb_handle, + _openusb_devid, + c_uint32, + POINTER(_openusb_dev_handle) + ] + + lib.openusb_open_device.restype = c_int32 + + # int32_t openusb_close_device(openusb_dev_handle_t dev); + lib.openusb_close_device.argtypes = [_openusb_dev_handle] + lib.openusb_close_device.restype = c_int32 + + # int32_t openusb_set_configuration(openusb_dev_handle_t dev, + # uint8_t cfg); + lib.openusb_set_configuration.argtypes = [_openusb_dev_handle, c_uint8] + lib.openusb_set_configuration.restype = c_int32 + + # int32_t openusb_get_configuration(openusb_dev_handle_t dev, + # uint8_t *cfg); + lib.openusb_get_configuration.argtypes = [_openusb_dev_handle, POINTER(c_uint8)] + lib.openusb_get_configuration.restype = c_int32 + + # int32_t openusb_claim_interface(openusb_dev_handle_t dev, + # uint8_t ifc, + # openusb_init_flag_t flags); + lib.openusb_claim_interface.argtypes = [ + _openusb_dev_handle, + c_uint8, + c_int + ] + + lib.openusb_claim_interface.restype = c_int32 + + # int32_t openusb_release_interface(openusb_dev_handle_t dev, + # uint8_t ifc); + lib.openusb_release_interface.argtypes = [ + _openusb_dev_handle, + c_uint8 + ] + + lib.openusb_release_interface.restype = c_int32 + + # int32_topenusb_set_altsetting(openusb_dev_handle_t dev, + # uint8_t ifc, + # uint8_t alt); + lib.openusb_set_altsetting.argtypes = [ + _openusb_dev_handle, + c_uint8, + c_uint8 + ] + lib.openusb_set_altsetting.restype = c_int32 + + # int32_t openusb_reset(openusb_dev_handle_t dev); + lib.openusb_reset.argtypes = [_openusb_dev_handle] + lib.openusb_reset.restype = c_int32 + + # int32_t openusb_parse_device_desc(openusb_handle_t handle, + # openusb_devid_t devid, + # uint8_t *buffer, + # uint16_t buflen, + # usb_device_desc_t *devdesc); + lib.openusb_parse_device_desc.argtypes = [ + _openusb_handle, + _openusb_devid, + POINTER(c_uint8), + c_uint16, + POINTER(_usb_device_desc) + ] + + lib.openusb_parse_device_desc.restype = c_int32 + + # int32_t openusb_parse_config_desc(openusb_handle_t handle, + # openusb_devid_t devid, + # uint8_t *buffer, + # uint16_t buflen, + # uint8_t cfgidx, + # usb_config_desc_t *cfgdesc); + lib.openusb_parse_config_desc.argtypes = [ + _openusb_handle, + _openusb_devid, + POINTER(c_uint8), + c_uint16, + c_uint8, + POINTER(_usb_config_desc) + ] + lib.openusb_parse_config_desc.restype = c_int32 + + # int32_t openusb_parse_interface_desc(openusb_handle_t handle, + # openusb_devid_t devid, + # uint8_t *buffer, + # uint16_t buflen, + # uint8_t cfgidx, + # uint8_t ifcidx, + # uint8_t alt, + # usb_interface_desc_t *ifcdesc); + lib.openusb_parse_interface_desc.argtypes = [ + _openusb_handle, + _openusb_devid, + POINTER(c_uint8), + c_uint16, + c_uint8, + c_uint8, + c_uint8, + POINTER(_usb_interface_desc) + ] + + lib.openusb_parse_interface_desc.restype = c_int32 + + # int32_t openusb_parse_endpoint_desc(openusb_handle_t handle, + # openusb_devid_t devid, + # uint8_t *buffer, + # uint16_t buflen, + # uint8_t cfgidx, + # uint8_t ifcidx, + # uint8_t alt, + # uint8_t eptidx, + # usb_endpoint_desc_t *eptdesc); + lib.openusb_parse_endpoint_desc.argtypes = [ + _openusb_handle, + _openusb_devid, + POINTER(c_uint8), + c_uint16, + c_uint8, + c_uint8, + c_uint8, + c_uint8, + POINTER(_usb_endpoint_desc) + ] + + lib.openusb_parse_interface_desc.restype = c_int32 + + # const char *openusb_strerror(int32_t error ); + lib.openusb_strerror.argtypes = [c_int32] + lib.openusb_strerror.restype = c_char_p + + # int32_t openusb_ctrl_xfer(openusb_dev_handle_t dev, + # uint8_t ifc, + # uint8_t ept, + # openusb_ctrl_request_t *ctrl); + lib.openusb_ctrl_xfer.argtypes = [ + _openusb_dev_handle, + c_uint8, + c_uint8, + POINTER(_openusb_ctrl_request) + ] + + lib.openusb_ctrl_xfer.restype = c_int32 + + # int32_t openusb_intr_xfer(openusb_dev_handle_t dev, + # uint8_t ifc, + # uint8_t ept, + # openusb_intr_request_t *intr); + lib.openusb_intr_xfer.argtypes = [ + _openusb_dev_handle, + c_uint8, + c_uint8, + POINTER(_openusb_intr_request) + ] + + lib.openusb_bulk_xfer.restype = c_int32 + + # int32_t openusb_bulk_xfer(openusb_dev_handle_t dev, + # uint8_t ifc, + # uint8_t ept, + # openusb_bulk_request_t *bulk); + lib.openusb_bulk_xfer.argtypes = [ + _openusb_dev_handle, + c_uint8, + c_uint8, + POINTER(_openusb_bulk_request) + ] + + lib.openusb_bulk_xfer.restype = c_int32 + + # int32_t openusb_isoc_xfer(openusb_dev_handle_t dev, + # uint8_t ifc, + # uint8_t ept, + # openusb_isoc_request_t *isoc); + lib.openusb_isoc_xfer.argtypes = [ + _openusb_dev_handle, + c_uint8, + c_uint8, + POINTER(_openusb_isoc_request) + ] + + lib.openusb_isoc_xfer.restype = c_int32 + +def _check(retval): + ret = retval.value + if ret != 0: + from usb.core import USBError + raise USBError(_lib.openusb_strerror(ret), ret, _openusb_errno[ret]) + return retval + +class _Context(object): + def __init__(self): + self.handle = _openusb_handle() + _check(_lib.openusb_init(0, byref(self.handle))) + def __del__(self): + _lib.openusb_fini(self.handle) + +class _BusIterator(object): + def __init__(self): + self.buslist = POINTER(openusb_busid)() + num_busids = c_uint32() + _check(_lib.openusb_get_busid_list(_ctx.handle, + byref(self.buslist), + byref(num_busids))) + self.num_busids = num_busids.value + def __iter__(self): + for i in range(self.num_busids): + yield self.buslist[i] + def __del__(self): + _lib.openusb_free_busid_list(self.buslist) + +class _DevIterator(object): + def __init__(self, busid): + self.devlist = POINTER(_openusb_devid)() + num_devids = c_uint32() + _check(_lib.openusb_get_devids_by_bus(_ctx.handle, + busid, + byref(self.devlist), + byref(num_devids))) + self.num_devids = num_devids.value + def __iter__(self): + for i in range(self.num_devids): + yield self.devlist[i] + def __del__(self): + _lib.openusb_free_devid_list(self.devlist) + +class _OpenUSB(usb.backend.IBackend): + @methodtrace(_logger) + def enumerate_devices(self): + for bus in _BusIterator(): + for devid in _DevIterator(bus): + yield devid + + @methodtrace(_logger) + def get_device_descriptor(self, dev): + desc = _usb_device_desc() + _check(_lib.openusb_parse_device_desc(_ctx.handle, + dev, + None, + 0, + byref(desc))) + desc.bus = None + desc.address = None + return desc + + @methodtrace(_logger) + def get_configuration_descriptor(self, dev, config): + desc = _usb_config_desc() + _check(_lib.openusb_parse_config_desc(_ctx.handle, + dev, + None, + 0, + config, + byref(desc))) + return desc + + @methodtrace(_logger) + def get_interface_descriptor(self, dev, intf, alt, config): + desc = _usb_interface_desc() + _check(_lib.openusb_parse_interface_desc(_ctx.handle, + dev, + None, + 0, + config, + intf, + alt, + byref(desc))) + return desc + + @methodtrace(_logger) + def get_endpoint_descriptor(self, dev, ep, intf, alt, config): + desc = _usb_endpoint_desc() + _check(_lib.openusb_parse_endpoint_desc(_ctx.handle, + dev, + None, + 0, + config, + intf, + alt, + ep, + byref(desc))) + return desc + + @methodtrace(_logger) + def open_device(self, dev): + handle = _openusb_dev_handle() + _check(_lib.openusb_open_device(_ctx.handle, dev, 0, byref(handle))) + return handle + + @methodtrace(_logger) + def close_device(self, dev_handle): + _lib.openusb_close_device(dev_handle) + + @methodtrace(_logger) + def set_configuration(self, dev_handle, config_value): + _check(_lib.openusb_set_configuration(dev_handle, config_value)) + + @methodtrace(_logger) + def get_configuration(self, dev_handle): + config = c_uint8() + _check(_lib.openusb_get_configuration(dev_handle, byref(config))) + return config.value + + @methodtrace(_logger) + def set_interface_altsetting(self, dev_handle, intf, altsetting): + _check(_lib.set_altsetting(dev_handle, intf, altsetting)) + + @methodtrace(_logger) + def claim_interface(self, dev_handle, intf): + _check(_lib.openusb_claim_interface(dev_handle, intf, 0)) + + @methodtrace(_logger) + def release_interface(self, dev_handle, intf): + _lib.openusb_release_interface(dev_handle, intf) + + @methodtrace(_logger) + def bulk_write(self, dev_handle, ep, intf, data, timeout): + request = _openusb_bulk_request() + memset(byref(request), 0, sizeof(request)) + request.payload, request.length = data.buffer_info() + request.timeout = timeout + _check(_lib.openusb_bulk_xfer(dev_handle, intf, ep, byref(request))) + return request.transfered_bytes.value + + @methodtrace(_logger) + def bulk_read(self, dev_handle, ep, intf, size, timeout): + request = _openusb_bulk_request() + buffer = array.array('B', '\x00' * size) + memset(byref(request), 0, sizeof(request)) + request.payload, request.length = buffer.buffer_info() + request.timeout = timeout + _check(_lib.openusb_bulk_xfer(dev_handle, intf, ep, byref(request))) + return buffer[:request.transfered_bytes.value] + + @methodtrace(_logger) + def intr_write(self, dev_handle, ep, intf, data, timeout): + request = _openusb_intr_request() + memset(byref(request), 0, sizeof(request)) + payload, request.length = data.buffer_info() + request.payload = cast(payload, POINTER(c_uint8)) + request.timeout = timeout + _check(_lib.openusb_intr_xfer(dev_handle, intf, ep, byref(request))) + return request.transfered_bytes.value + + @methodtrace(_logger) + def intr_read(self, dev_handle, ep, intf, size, timeout): + request = _openusb_intr_request() + buffer = array.array('B', '\x00' * size) + memset(byref(request), 0, sizeof(request)) + payload, request.length = buffer.buffer_info() + request.payload = cast(payload, POINTER(c_uint8)) + request.timeout = timeout + _check(_lib.openusb_intr_xfer(dev_handle, intf, ep, byref(request))) + return buffer[:request.transfered_bytes.value] + +# TODO: implement isochronous +# @methodtrace(_logger) +# def iso_write(self, dev_handle, ep, intf, data, timeout): +# pass + +# @methodtrace(_logger) +# def iso_read(self, dev_handle, ep, intf, size, timeout): +# pass + + @methodtrace(_logger) + def ctrl_transfer(self, + dev_handle, + bmRequestType, + bRequest, + wValue, + wIndex, + data_or_wLength, + timeout): + request = _openusb_ctrl_request() + request.setup.bmRequestType = bmRequestType + request.setup.bRequest = bRequest + request.setup.wValue + request.setup.wIndex + request.timeout = timeout + + direction = usb.util.ctrl_direction(bmRequestType) + + if direction == ENDPOINT_OUT: + buffer = data_or_wLength + else: + buffer = array.array('B', '\x00' * data_or_wLength) + + payload, request.length = buffer.buffer_info() + request.payload = cast(payload, POINTER(c_uint8)) + + ret = _check(_lib.openusb_ctrl_xfer(dev_handle, 0, 0, byref(request))) + + if direction == ENDPOINT_OUT: + ret + else: + buffer[:ret] + + @methodtrace(_logger) + def reset_device(self, dev_handle): + _check(_lib.openusb_reset(dev_handle)) + +def get_backend(): + try: + global _lib, _ctx + if _lib is None: + _lib = _load_library() + _setup_prototypes(_lib) + _ctx = _Context() + return _OpenUSB() + except Exception: + _logger.error('Error loading OpenUSB backend', exc_info=True) + return None diff --git a/plugins/wedo_plugin/usb/control.py b/plugins/wedo_plugin/usb/control.py new file mode 100644 index 0000000..8647c14 --- /dev/null +++ b/plugins/wedo_plugin/usb/control.py @@ -0,0 +1,252 @@ +# Copyright (C) 2009-2011 Wander Lairson Costa +# +# The following terms apply to all files associated +# with the software unless explicitly disclaimed in individual files. +# +# The authors hereby grant permission to use, copy, modify, distribute, +# and license this software and its documentation for any purpose, provided +# that existing copyright notices are retained in all copies and that this +# notice is included verbatim in any distributions. No written agreement, +# license, or royalty fee is required for any of the authorized uses. +# Modifications to this software may be copyrighted by their authors +# and need not follow the licensing terms described here, provided that +# the new terms are clearly indicated on the first page of each file where +# they apply. +# +# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +# MODIFICATIONS. + +r"""usb.control - USB standard control requests + +This module exports: + +get_status - get recipeint status +clear_feature - clear a recipient feature +set_feature - set a recipient feature +get_descriptor - get a device descriptor +set_descriptor - set a device descriptor +get_configuration - get a device configuration +set_configuration - set a device configuration +get_interface - get a device interface +set_interface - set a device interface +""" + +__author__ = 'Wander Lairson Costa' + +__all__ = ['get_status', + 'clear_feature', + 'set_feature', + 'get_descriptor', + 'set_descriptor', + 'get_configuration', + 'set_configuration', + 'get_interface', + 'set_interface', + 'ENDPOINT_HALT', + 'FUNCTION_SUSPEND', + 'DEVICE_REMOTE_WAKEUP', + 'U1_ENABLE', + 'U2_ENABLE', + 'LTM_ENABLE'] + +import usb.util as util +import usb.core as core + +def _parse_recipient(recipient, direction): + if recipient is None: + r = util.CTRL_RECIPIENT_DEVICE + wIndex = 0 + elif isinstance(recipient, core.Interface): + r = util.CTRL_RECIPIENT_INTERFACE + wIndex = recipient.bInterfaceNumber + elif isinstance(recipient, core.Endpoint): + r = util.CTRL_RECIPIENT_ENDPOINT + wIndex = recipient.bEndpointAddress + else: + raise ValueError('Invalid recipient.') + bmRequestType = util.build_request_type( + direction, + util.CTRL_TYPE_STANDARD, + r + ) + return (bmRequestType, wIndex) + +# standard feature selectors from USB 2.0/3.0 +ENDPOINT_HALT = 0 +FUNCTION_SUSPEND = 0 +DEVICE_REMOTE_WAKEUP = 1 +U1_ENABLE = 48 +U2_ENABLE = 49 +LTM_ENABLE = 50 + +def get_status(dev, recipient = None): + r"""Return the status for the specified recipient. + + dev is the Device object to which the request will be + sent to. + + The recipient can be None (on which the status will be queried + on the device), an Interface or Endpoint descriptors. + + The status value is returned as an integer with the lower + word being the two bytes status value. + """ + bmRequestType, wIndex = _parse_recipient(recipient, util.CTRL_IN) + ret = dev.ctrl_transfer(bmRequestType = bmRequestType, + bRequest = 0x00, + wIndex = wIndex, + data_or_wLength = 2) + return ret[0] | (ret[1] << 8) + +def clear_feature(dev, feature, recipient = None): + r"""Clear/disable a specific feature. + + dev is the Device object to which the request will be + sent to. + + feature is the feature you want to disable. + + The recipient can be None (on which the status will be queried + on the device), an Interface or Endpoint descriptors. + """ + bmRequestType, wIndex = _parse_recipient(recipient, util.CTRL_OUT) + dev.ctrl_transfer(bmRequestType = bmRequestType, + bRequest = 0x01, + wIndex = wIndex, + wValue = feature) + +def set_feature(dev, feature, recipient = None): + r"""Set/enable a specific feature. + + dev is the Device object to which the request will be + sent to. + + feature is the feature you want to enable. + + The recipient can be None (on which the status will be queried + on the device), an Interface or Endpoint descriptors. + """ + bmRequestType, wIndex = _parse_recipient(recipient, util.CTRL_OUT) + dev.ctrl_transfer(bmRequestType = bmRequestType, + bRequest = 0x03, + wIndex = wIndex, + wValue = feature) + +def get_descriptor(dev, desc_size, desc_type, desc_index, wIndex = 0): + r"""Return the specified descriptor. + + dev is the Device object to which the request will be + sent to. + + desc_size is the descriptor size. + + desc_type and desc_index are the descriptor type and index, + respectively. wIndex index is used for string descriptors + and represents the Language ID. For other types of descriptors, + it is zero. + """ + wValue = desc_index | (desc_type << 8) + bmRequestType = util.build_request_type( + util.CTRL_IN, + util.CTRL_TYPE_STANDARD, + util.CTRL_RECIPIENT_DEVICE + ) + return dev.ctrl_transfer( + bmRequestType = bmRequestType, + bRequest = 0x06, + wValue = wValue, + wIndex = wIndex, + data_or_wLength = desc_size + ) + +def set_descriptor(dev, desc, desc_type, desc_index, wIndex = None): + r"""Update an existing descriptor or add a new one. + + dev is the Device object to which the request will be + sent to. + + The desc parameter is the descriptor to be sent to the device. + desc_type and desc_index are the descriptor type and index, + respectively. wIndex index is used for string descriptors + and represents the Language ID. For other types of descriptors, + it is zero. + """ + wValue = desc_index | (desc_type << 8) + bmRequestType = util.build_request_type( + util.CTRL_OUT, + util.CTRL_TYPE_STANDARD, + util.CTRL_RECIPIENT_DEVICE + ) + dev.ctrl_transfer( + bmRequestType = bmRequestType, + bRequest = 0x07, + wValue = wValue, + wIndex = wIndex, + data_or_wLength = desc + ) + +def get_configuration(dev): + r"""Get the current active configuration of the device. + + dev is the Device object to which the request will be + sent to. + + This function differs from the Device.get_active_configuration + method because the later may use cached data, while this + function always does a device request. + """ + bmRequestType = util.build_request_type( + util.CTRL_IN, + util.CTRL_TYPE_STANDARD, + util.CTRL_RECIPIENT_DEVICE + ) + return dev.ctrl_transfer( + bmRequestType, + bRequest = 0x08, + data_or_wLength = 1 + )[0] + +def set_configuration(dev, bConfigurationNumber): + r"""Set the current device configuration. + + dev is the Device object to which the request will be + sent to. + """ + dev.set_configuration(bConfigurationNumber) + +def get_interface(dev, bInterfaceNumber): + r"""Get the current alternate setting of the interface. + + dev is the Device object to which the request will be + sent to. + """ + bmRequestType = util.build_request_type( + util.CTRL_IN, + util.CTRL_TYPE_STANDARD, + util.CTRL_RECIPIENT_INTERFACE + ) + return dev.ctrl_transfer( + bmRequestType = bmRequestType, + bRequest = 0x0a, + wIndex = bInterfaceNumber, + data_or_wLength = 1 + )[0] + +def set_interface(dev, bInterfaceNumber, bAlternateSetting): + r"""Set the alternate setting of the interface. + + dev is the Device object to which the request will be + sent to. + """ + dev.set_interface_altsetting(bInterfaceNumber, bAlternateSetting) + diff --git a/plugins/wedo_plugin/usb/core.py b/plugins/wedo_plugin/usb/core.py new file mode 100644 index 0000000..c90d011 --- /dev/null +++ b/plugins/wedo_plugin/usb/core.py @@ -0,0 +1,856 @@ +# Copyright (C) 2009-2011 Wander Lairson Costa +# +# The following terms apply to all files associated +# with the software unless explicitly disclaimed in individual files. +# +# The authors hereby grant permission to use, copy, modify, distribute, +# and license this software and its documentation for any purpose, provided +# that existing copyright notices are retained in all copies and that this +# notice is included verbatim in any distributions. No written agreement, +# license, or royalty fee is required for any of the authorized uses. +# Modifications to this software may be copyrighted by their authors +# and need not follow the licensing terms described here, provided that +# the new terms are clearly indicated on the first page of each file where +# they apply. +# +# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +# MODIFICATIONS. + +r"""usb.core - Core USB features. + +This module exports: + +Device - a class representing a USB device. +Configuration - a class representing a configuration descriptor. +Interface - a class representing an interface descriptor. +Endpoint - a class representing an endpoint descriptor. +find() - a function to find USB devices. +""" + +__author__ = 'Wander Lairson Costa' + +__all__ = ['Device', 'Configuration', 'Interface', 'Endpoint', 'find'] + +import usb.util as util +import copy +import operator +import usb._interop as _interop +import logging + +_logger = logging.getLogger('usb.core') + +_DEFAULT_TIMEOUT = 1000 + +def _set_attr(input, output, fields): + for f in fields: + setattr(output, f, int(getattr(input, f))) + +class _ResourceManager(object): + def __init__(self, dev, backend): + self.backend = backend + self._active_cfg_index = None + self.dev = dev + self.handle = None + self._claimed_intf = _interop._set() + self._alt_set = {} + self._ep_type_map = {} + + def managed_open(self): + if self.handle is None: + self.handle = self.backend.open_device(self.dev) + return self.handle + + def managed_close(self): + if self.handle is not None: + self.backend.close_device(self.handle) + self.handle = None + + def managed_set_configuration(self, device, config): + if config is None: + cfg = device[0] + elif isinstance(config, Configuration): + cfg = config + elif config == 0: # unconfigured state + class FakeConfiguration(object): + def __init__(self): + self.index = None + self.bConfigurationValue = 0 + cfg = FakeConfiguration() + else: + cfg = util.find_descriptor(device, bConfigurationValue=config) + self.managed_open() + self.backend.set_configuration(self.handle, cfg.bConfigurationValue) + # cache the index instead of the object to avoid cyclic references + # of the device and Configuration (Device tracks the _ResourceManager, + # which tracks the Configuration, which tracks the Device) + self._active_cfg_index = cfg.index + # after changing configuration, our alternate setting and endpoint type caches + # are not valid anymore + self._ep_type_map.clear() + self._alt_set.clear() + + def managed_claim_interface(self, device, intf): + self.managed_open() + if intf is None: + cfg = self.get_active_configuration(device) + i = cfg[(0,0)].bInterfaceNumber + elif isinstance(intf, Interface): + i = intf.bInterfaceNumber + else: + i = intf + if i not in self._claimed_intf: + self.backend.claim_interface(self.handle, i) + self._claimed_intf.add(i) + + def managed_release_interface(self, device, intf): + if intf is None: + cfg = self.get_active_configuration(device) + i = cfg[(0,0)].bInterfaceNumber + elif isinstance(intf, Interface): + i = intf.bInterfaceNumber + else: + i = intf + if i in self._claimed_intf: + self.backend.release_interface(self.handle, i) + self._claimed_intf.remove(i) + + def managed_set_interface(self, device, intf, alt): + if intf is None: + i = self.get_interface(device, intf) + elif isinstance(intf, Interface): + i = intf + else: + cfg = self.get_active_configuration(device) + if alt is not None: + i = util.find_descriptor(cfg, bInterfaceNumber=intf, bAlternateSetting=alt) + else: + i = util.find_descriptor(cfg, bInterfaceNumber=intf) + self.managed_claim_interface(device, i) + if alt is None: + alt = i.bAlternateSetting + self.backend.set_interface_altsetting(self.handle, i.bInterfaceNumber, alt) + self._alt_set[i.bInterfaceNumber] = alt + + def get_interface(self, device, intf): + # TODO: check the viability of issuing a GET_INTERFACE + # request when we don't have a alternate setting cached + if intf is None: + cfg = self.get_active_configuration(device) + return cfg[(0,0)] + elif isinstance(intf, Interface): + return intf + else: + cfg = self.get_active_configuration(device) + if intf in self._alt_set: + return util.find_descriptor(cfg, + bInterfaceNumber=intf, + bAlternateSetting=self._alt_set[intf]) + else: + return util.find_descriptor(cfg, bInterfaceNumber=intf) + + def get_active_configuration(self, device): + if self._active_cfg_index is None: + self.managed_open() + cfg = util.find_descriptor( + device, + bConfigurationValue=self.backend.get_configuration(self.handle) + ) + if cfg is None: + raise USBError('Configuration not set') + self._active_cfg_index = cfg.index + return cfg + return device[self._active_cfg_index] + + def get_endpoint_type(self, device, address, intf): + intf = self.get_interface(device, intf) + key = (address, intf.bInterfaceNumber, intf.bAlternateSetting) + try: + return self._ep_type_map[key] + except KeyError: + e = util.find_descriptor(intf, bEndpointAddress=address) + etype = util.endpoint_type(e.bmAttributes) + self._ep_type_map[key] = etype + return etype + + def release_all_interfaces(self, device): + claimed = copy.copy(self._claimed_intf) + for i in claimed: + self.managed_release_interface(device, i) + + def dispose(self, device, close_handle = True): + self.release_all_interfaces(device) + if close_handle: + self.managed_close() + self._ep_type_map.clear() + self._alt_set.clear() + self._active_cfg_index = None + +class USBError(IOError): + r"""Exception class for USB errors. + + Backends must raise this exception when USB related errors occur. + The backend specific error code is available through the + 'backend_error_code' member variable. + """ + + def __init__(self, strerror, error_code = None, errno = None): + r"""Initialize the object. + + This initializes the USBError object. The strerror and errno are passed + to the parent object. The error_code parameter is attributed to the + backend_error_code member variable. + """ + IOError.__init__(self, errno, strerror) + self.backend_error_code = error_code + +class Endpoint(object): + r"""Represent an endpoint object. + + This class contains all fields of the Endpoint Descriptor + according to the USB Specification. You may access them as class + properties. For example, to access the field bEndpointAddress + of the endpoint descriptor: + + >>> import usb.core + >>> dev = usb.core.find() + >>> for cfg in dev: + >>> for i in cfg: + >>> for e in i: + >>> print e.bEndpointAddress + """ + + def __init__(self, device, endpoint, interface = 0, + alternate_setting = 0, configuration = 0): + r"""Initialize the Endpoint object. + + The device parameter is the device object returned by the find() + function. endpoint is the endpoint logical index (not the endpoint address). + The configuration parameter is the logical index of the + configuration (not the bConfigurationValue field). The interface + parameter is the interface logical index (not the bInterfaceNumber field) + and alternate_setting is the alternate setting logical index (not the + bAlternateSetting value). Not every interface has more than one alternate + setting. In this case, the alternate_setting parameter should be zero. + By "logical index" we mean the relative order of the configurations returned by the + peripheral as a result of GET_DESCRIPTOR request. + """ + self.device = device + intf = Interface(device, interface, alternate_setting, configuration) + self.interface = intf.bInterfaceNumber + self.index = endpoint + + backend = device._ctx.backend + + desc = backend.get_endpoint_descriptor( + device._ctx.dev, + endpoint, + interface, + alternate_setting, + configuration + ) + + _set_attr( + desc, + self, + ( + 'bLength', + 'bDescriptorType', + 'bEndpointAddress', + 'bmAttributes', + 'wMaxPacketSize', + 'bInterval', + 'bRefresh', + 'bSynchAddress' + ) + ) + + def write(self, data, timeout = None): + r"""Write data to the endpoint. + + The parameter data contains the data to be sent to the endpoint and + timeout is the time limit of the operation. The transfer type and + endpoint address are automatically inferred. + + The method returns the number of bytes written. + + For details, see the Device.write() method. + """ + return self.device.write(self.bEndpointAddress, data, self.interface, timeout) + + def read(self, size, timeout = None): + r"""Read data from the endpoint. + + The parameter size is the number of bytes to read and timeout is the + time limit of the operation.The transfer type and endpoint address + are automatically inferred. + + The method returns an array.array object with the data read. + + For details, see the Device.read() method. + """ + return self.device.read(self.bEndpointAddress, size, self.interface, timeout) + +class Interface(object): + r"""Represent an interface object. + + This class contains all fields of the Interface Descriptor + according to the USB Specification. You may access them as class + properties. For example, to access the field bInterfaceNumber + of the interface descriptor: + + >>> import usb.core + >>> dev = usb.core.find() + >>> for cfg in dev: + >>> for i in cfg: + >>> print i.bInterfaceNumber + """ + + def __init__(self, device, interface = 0, + alternate_setting = 0, configuration = 0): + r"""Initialize the interface object. + + The device parameter is the device object returned by the find() + function. The configuration parameter is the logical index of the + configuration (not the bConfigurationValue field). The interface + parameter is the interface logical index (not the bInterfaceNumber field) + and alternate_setting is the alternate setting logical index (not the + bAlternateSetting value). Not every interface has more than one alternate + setting. In this case, the alternate_setting parameter should be zero. + By "logical index" we mean the relative order of the configurations returned by the + peripheral as a result of GET_DESCRIPTOR request. + """ + self.device = device + self.alternate_index = alternate_setting + self.index = interface + self.configuration = configuration + + backend = device._ctx.backend + + desc = backend.get_interface_descriptor( + self.device._ctx.dev, + interface, + alternate_setting, + configuration + ) + + _set_attr( + desc, + self, + ( + 'bLength', + 'bDescriptorType', + 'bInterfaceNumber', + 'bAlternateSetting', + 'bNumEndpoints', + 'bInterfaceClass', + 'bInterfaceSubClass', + 'bInterfaceProtocol', + 'iInterface', + ) + ) + + def set_altsetting(self): + r"""Set the interface alternate setting.""" + self.device.set_interface_altsetting( + self.bInterfaceNumber, + self.bAlternateSetting + ) + + def __iter__(self): + r"""Iterate over all endpoints of the interface.""" + for i in range(self.bNumEndpoints): + yield Endpoint( + self.device, + i, + self.index, + self.alternate_index, + self.configuration + ) + def __getitem__(self, index): + r"""Return the Endpoint object in the given position.""" + return Endpoint( + self.device, + index, + self.index, + self.alternate_index, + self.configuration + ) + +class Configuration(object): + r"""Represent a configuration object. + + This class contains all fields of the Configuration Descriptor + according to the USB Specification. You may access them as class + properties. For example, to access the field bConfigurationValue + of the configuration descriptor: + + >>> import usb.core + >>> dev = usb.core.find() + >>> for cfg in dev: + >>> print cfg.bConfigurationValue + """ + + def __init__(self, device, configuration = 0): + r"""Initialize the configuration object. + + The device parameter is the device object returned by the find() + function. The configuration parameter is the logical index of the + configuration (not the bConfigurationValue field). By "logical index" + we mean the relative order of the configurations returned by the + peripheral as a result of GET_DESCRIPTOR request. + """ + self.device = device + self.index = configuration + + backend = device._ctx.backend + + desc = backend.get_configuration_descriptor( + self.device._ctx.dev, + configuration + ) + + _set_attr( + desc, + self, + ( + 'bLength', + 'bDescriptorType', + 'wTotalLength', + 'bNumInterfaces', + 'bConfigurationValue', + 'iConfiguration', + 'bmAttributes', + 'bMaxPower' + ) + ) + + def set(self): + r"""Set this configuration as the active one.""" + self.device.set_configuration(self.bConfigurationValue) + + def __iter__(self): + r"""Iterate over all interfaces of the configuration.""" + for i in range(self.bNumInterfaces): + alt = 0 + try: + while True: + yield Interface(self.device, i, alt, self.index) + alt += 1 + except (USBError, IndexError): + pass + def __getitem__(self, index): + r"""Return the Interface object in the given position. + + index is a tuple of two values with interface index and + alternate setting index, respectivally. Example: + + >>> interface = config[(0, 0)] + """ + return Interface(self.device, index[0], index[1], self.index) + + +class Device(object): + r"""Device object. + + This class contains all fields of the Device Descriptor according + to the USB Specification. You may access them as class properties. + For example, to access the field bDescriptorType of the device + descriptor: + + >>> import usb.core + >>> dev = usb.core.find() + >>> dev.bDescriptorType + + Additionally, the class provides methods to communicate with + the hardware. Typically, an application will first call the + set_configuration() method to put the device in a known configured + state, optionally call the set_interface_altsetting() to select the + alternate setting (if there is more than one) of the interface used, + and call the write() and read() method to send and receive data. + + When working in a new hardware, one first try would be like this: + + >>> import usb.core + >>> dev = usb.core.find(idVendor=myVendorId, idProduct=myProductId) + >>> dev.set_configuration() + >>> dev.write(1, 'test') + + This sample finds the device of interest (myVendorId and myProductId should be + replaced by the corresponding values of your device), then configures the device + (by default, the configuration value is 1, which is a typical value for most + devices) and then writes some data to the endpoint 0x01. + + Timeout values for the write, read and ctrl_transfer methods are specified in + miliseconds. If the parameter is omitted, Device.default_timeout value will + be used instead. This property can be set by the user at anytime. + """ + + def __init__(self, dev, backend): + r"""Initialize the Device object. + + Library users should normally get a Device instance through + the find function. The dev parameter is the identification + of a device to the backend and its meaning is opaque outside + of it. The backend parameter is a instance of a backend + object. + """ + self._ctx = _ResourceManager(dev, backend) + self.__default_timeout = _DEFAULT_TIMEOUT + + desc = backend.get_device_descriptor(dev) + + _set_attr( + desc, + self, + ( + 'bLength', + 'bDescriptorType', + 'bcdUSB', + 'bDeviceClass', + 'bDeviceSubClass', + 'bDeviceProtocol', + 'bMaxPacketSize0', + 'idVendor', + 'idProduct', + 'bcdDevice', + 'iManufacturer', + 'iProduct', + 'iSerialNumber', + 'bNumConfigurations', + 'address', + 'bus' + ) + ) + + self.bus = int(desc.bus) if desc.bus is not None else None + self.address = int(desc.address) if desc.address is not None else None + + def set_configuration(self, configuration = None): + r"""Set the active configuration. + + The configuration parameter is the bConfigurationValue field of the + configuration you want to set as active. If you call this method + without parameter, it will use the first configuration found. + As a device hardly ever has more than one configuration, calling + the method without parameter is enough to get the device ready. + """ + self._ctx.managed_set_configuration(self, configuration) + + def get_active_configuration(self): + r"""Return a Configuration object representing the current configuration set.""" + return self._ctx.get_active_configuration(self) + + def set_interface_altsetting(self, interface = None, alternate_setting = None): + r"""Set the alternate setting for an interface. + + When you want to use an interface and it has more than one alternate setting, + you should call this method to select the alternate setting you would like + to use. If you call the method without one or the two parameters, it will + be selected the first one found in the Device in the same way of set_configuration + method. + + Commonly, an interface has only one alternate setting and this call is + not necessary. For most of the devices, either it has more than one alternate + setting or not, it is not harmful to make a call to this method with no arguments, + as devices will silently ignore the request when there is only one alternate + setting, though the USB Spec allows devices with no additional alternate setting + return an error to the Host in response to a SET_INTERFACE request. + + If you are in doubt, you may want to call it with no arguments wrapped by + a try/except clause: + + >>> try: + >>> dev.set_interface_altsetting() + >>> except usb.core.USBError: + >>> pass + """ + self._ctx.managed_set_interface(self, interface, alternate_setting) + + def reset(self): + r"""Reset the device.""" + self._ctx.dispose(self, False) + self._ctx.backend.reset_device(self._ctx.handle) + self._ctx.dispose(self, True) + + def write(self, endpoint, data, interface = None, timeout = None): + r"""Write data to the endpoint. + + This method is used to send data to the device. The endpoint parameter + corresponds to the bEndpointAddress member whose endpoint you want to + communicate with. The interface parameter is the bInterfaceNumber field + of the interface descriptor which contains the endpoint. If you do not + provide one, the first one found will be used, as explained in the + set_interface_altsetting() method. + + The data parameter should be a sequence like type convertible to + array type (see array module). + + The timeout is specified in miliseconds. + + The method returns the number of bytes written. + """ + backend = self._ctx.backend + + fn_map = { + util.ENDPOINT_TYPE_BULK:backend.bulk_write, + util.ENDPOINT_TYPE_INTR:backend.intr_write, + util.ENDPOINT_TYPE_ISO:backend.iso_write + } + + intf = self._ctx.get_interface(self, interface) + fn = fn_map[self._ctx.get_endpoint_type(self, endpoint, intf)] + self._ctx.managed_claim_interface(self, intf) + + return fn( + self._ctx.handle, + endpoint, + intf.bInterfaceNumber, + _interop.as_array(data), + self.__get_timeout(timeout) + ) + + def read(self, endpoint, size, interface = None, timeout = None): + r"""Read data from the endpoint. + + This method is used to receive data from the device. The endpoint parameter + corresponds to the bEndpointAddress member whose endpoint you want to + communicate with. The interface parameter is the bInterfaceNumber field + of the interface descriptor which contains the endpoint. If you do not + provide one, the first one found will be used, as explained in the + set_interface_altsetting() method. The size parameters tells how many + bytes you want to read. + + The timeout is specified in miliseconds. + + The method returns an array object with the data read. + """ + backend = self._ctx.backend + + fn_map = { + util.ENDPOINT_TYPE_BULK:backend.bulk_read, + util.ENDPOINT_TYPE_INTR:backend.intr_read, + util.ENDPOINT_TYPE_ISO:backend.iso_read + } + + intf = self._ctx.get_interface(self, interface) + fn = fn_map[self._ctx.get_endpoint_type(self, endpoint, intf)] + self._ctx.managed_claim_interface(self, intf) + + return fn( + self._ctx.handle, + endpoint, + intf.bInterfaceNumber, + size, + self.__get_timeout(timeout) + ) + + + def ctrl_transfer(self, bmRequestType, bRequest, wValue=0, wIndex=0, + data_or_wLength = None, timeout = None): + r"""Do a control transfer on the endpoint 0. + + This method is used to issue a control transfer over the + endpoint 0(endpoint 0 is required to always be a control endpoint). + + The parameters bmRequestType, bRequest, wValue and wIndex are the + same of the USB Standard Control Request format. + + Control requests may or may not have a data payload to write/read. + In cases which it has, the direction bit of the bmRequestType + field is used to infere the desired request direction. For + host to device requests (OUT), data_or_wLength parameter is + the data payload to send, and it must be a sequence type convertible + to an array object. In this case, the return value is the number of data + payload written. For device to host requests (IN), data_or_wLength + is the wLength parameter of the control request specifying the + number of bytes to read in data payload. In this case, the return + value is the data payload read, as an array object. + """ + if util.ctrl_direction(bmRequestType) == util.CTRL_OUT: + a = _interop.as_array(data_or_wLength) + elif data_or_wLength is None: + a = 0 + else: + a = data_or_wLength + + self._ctx.managed_open() + + return self._ctx.backend.ctrl_transfer( + self._ctx.handle, + bmRequestType, + bRequest, + wValue, + wIndex, + a, + self.__get_timeout(timeout) + ) + + def is_kernel_driver_active(self, interface): + r"""Determine if there is kernel driver associated with the interface. + + If a kernel driver is active, and the object will be unable to perform I/O. + """ + self._ctx.managed_open() + return self._ctx.backend.is_kernel_driver_active(self._ctx.handle, interface) + + def detach_kernel_driver(self, interface): + r"""Detach a kernel driver. + + If successful, you will then be able to perform I/O. + """ + self._ctx.managed_open() + self._ctx.backend.detach_kernel_driver(self._ctx.handle, interface) + + def attach_kernel_driver(self, interface): + r"""Re-attach an interface's kernel driver, which was previously + detached using detach_kernel_driver().""" + self._ctx.managed_open() + self._ctx.backend.attach_kernel_driver(self._ctx.handle, interface) + + def __iter__(self): + r"""Iterate over all configurations of the device.""" + for i in range(self.bNumConfigurations): + yield Configuration(self, i) + + def __getitem__(self, index): + r"""Return the Configuration object in the given position.""" + return Configuration(self, index) + + def __del__(self): + self._ctx.dispose(self) + + def __get_timeout(self, timeout): + if timeout is not None: + return timeout + return self.__default_timeout + + def __set_def_tmo(self, tmo): + if tmo < 0: + raise ValueError('Timeout cannot be a negative value') + self.__default_timeout = tmo + + def __get_def_tmo(self): + return self.__default_timeout + + default_timeout = property( + __get_def_tmo, + __set_def_tmo, + doc = 'Default timeout for transfer I/O functions' + ) + +def find(find_all=False, backend = None, custom_match = None, **args): + r"""Find an USB device and return it. + + find() is the function used to discover USB devices. + You can pass as arguments any combination of the + USB Device Descriptor fields to match a device. For example: + + find(idVendor=0x3f4, idProduct=0x2009) + + will return the Device object for the device with + idVendor Device descriptor field equals to 0x3f4 and + idProduct equals to 0x2009. + + If there is more than one device which matchs the criteria, + the first one found will be returned. If a matching device cannot + be found the function returns None. If you want to get all + devices, you can set the parameter find_all to True, then find + will return an list with all matched devices. If no matching device + is found, it will return an empty list. Example: + + printers = find(find_all=True, bDeviceClass=7) + + This call will get all the USB printers connected to the system. + (actually may be not, because some devices put their class + information in the Interface Descriptor). + + You can also use a customized match criteria: + + dev = find(custom_match = lambda d: d.idProduct=0x3f4 and d.idvendor=0x2009) + + A more accurate printer finder using a customized match would be like + so: + + def is_printer(dev): + import usb.util + if dev.bDeviceClass == 7: + return True + for cfg in dev: + if usb.util.find_descriptor(cfg, bInterfaceClass=7) is not None: + return True + + printers = find(find_all=True, custom_match = is_printer) + + Now even if the device class code is in the interface descriptor the + printer will be found. + + You can combine a customized match with device descriptor fields. In this + case, the fields must match and the custom_match must return True. In the our + previous example, if we would like to get all printers belonging to the + manufacturer 0x3f4, the code would be like so: + + printers = find(find_all=True, idVendor=0x3f4, custom_match=is_printer) + + If you want to use find as a 'list all devices' function, just call + it with find_all = True: + + devices = find(find_all=True) + + Finally, you may pass a custom backend to the find function: + + find(backend = MyBackend()) + + PyUSB has builtin backends for libusb 0.1, libusb 1.0 and OpenUSB. + If you do not supply a backend explicitly, find() function will select + one of the predefineds backends according to system availability. + + Backends are explained in the usb.backend module. + """ + + def device_iter(k, v): + for dev in backend.enumerate_devices(): + d = Device(dev, backend) + if (custom_match is None or custom_match(d)) and \ + _interop._reduce( + lambda a, b: a and b, + map( + operator.eq, + v, + map(lambda i: getattr(d, i), k) + ), + True + ): + yield d + + if backend is None: + import usb.backend.libusb10 as libusb10 + import usb.backend.libusb01 as libusb01 + import usb.backend.openusb as openusb + + for m in (libusb10, openusb, libusb01): + backend = m.get_backend() + if backend is not None: + _logger.info('find(): using backend "%s"', m.__name__) + break + else: + raise ValueError('No backend available') + + k, v = args.keys(), args.values() + + if find_all: + return [d for d in device_iter(k, v)] + else: + try: + return _interop._next(device_iter(k, v)) + except StopIteration: + return None diff --git a/plugins/wedo_plugin/usb/legacy.py b/plugins/wedo_plugin/usb/legacy.py new file mode 100644 index 0000000..0c9c52c --- /dev/null +++ b/plugins/wedo_plugin/usb/legacy.py @@ -0,0 +1,334 @@ +# Copyright (C) 2009-2011 Wander Lairson Costa +# +# The following terms apply to all files associated +# with the software unless explicitly disclaimed in individual files. +# +# The authors hereby grant permission to use, copy, modify, distribute, +# and license this software and its documentation for any purpose, provided +# that existing copyright notices are retained in all copies and that this +# notice is included verbatim in any distributions. No written agreement, +# license, or royalty fee is required for any of the authorized uses. +# Modifications to this software may be copyrighted by their authors +# and need not follow the licensing terms described here, provided that +# the new terms are clearly indicated on the first page of each file where +# they apply. +# +# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +# MODIFICATIONS. + +import usb.core as core +import usb.util as util +import usb._interop as _interop +import usb.control as control + +__author__ = 'Wander Lairson Costa' + +USBError = core.USBError + +CLASS_AUDIO = 1 +CLASS_COMM = 2 +CLASS_DATA = 10 +CLASS_HID = 3 +CLASS_HUB = 9 +CLASS_MASS_STORAGE = 8 +CLASS_PER_INTERFACE = 0 +CLASS_PRINTER = 7 +CLASS_VENDOR_SPEC = 255 +DT_CONFIG = 2 +DT_CONFIG_SIZE = 9 +DT_DEVICE = 1 +DT_DEVICE_SIZE = 18 +DT_ENDPOINT = 5 +DT_ENDPOINT_AUDIO_SIZE = 9 +DT_ENDPOINT_SIZE = 7 +DT_HID = 33 +DT_HUB = 41 +DT_HUB_NONVAR_SIZE = 7 +DT_INTERFACE = 4 +DT_INTERFACE_SIZE = 9 +DT_PHYSICAL = 35 +DT_REPORT = 34 +DT_STRING = 3 +ENDPOINT_ADDRESS_MASK = 15 +ENDPOINT_DIR_MASK = 128 +ENDPOINT_IN = 128 +ENDPOINT_OUT = 0 +ENDPOINT_TYPE_BULK = 2 +ENDPOINT_TYPE_CONTROL = 0 +ENDPOINT_TYPE_INTERRUPT = 3 +ENDPOINT_TYPE_ISOCHRONOUS = 1 +ENDPOINT_TYPE_MASK = 3 +ERROR_BEGIN = 500000 +MAXALTSETTING = 128 +MAXCONFIG = 8 +MAXENDPOINTS = 32 +MAXINTERFACES = 32 +RECIP_DEVICE = 0 +RECIP_ENDPOINT = 2 +RECIP_INTERFACE = 1 +RECIP_OTHER = 3 +REQ_CLEAR_FEATURE = 1 +REQ_GET_CONFIGURATION = 8 +REQ_GET_DESCRIPTOR = 6 +REQ_GET_INTERFACE = 10 +REQ_GET_STATUS = 0 +REQ_SET_ADDRESS = 5 +REQ_SET_CONFIGURATION = 9 +REQ_SET_DESCRIPTOR = 7 +REQ_SET_FEATURE = 3 +REQ_SET_INTERFACE = 11 +REQ_SYNCH_FRAME = 12 +TYPE_CLASS = 32 +TYPE_RESERVED = 96 +TYPE_STANDARD = 0 +TYPE_VENDOR = 64 + +class Endpoint(object): + r"""Endpoint descriptor object.""" + def __init__(self, ep): + self.address = ep.bEndpointAddress + self.interval = ep.bInterval + self.maxPacketSize = ep.wMaxPacketSize + self.type = util.endpoint_type(ep.bmAttributes) + +class Interface(object): + r"""Interface descriptor object.""" + def __init__(self, intf): + self.alternateSetting = intf.bAlternateSetting + self.interfaceNumber = intf.bInterfaceNumber + self.iInterface = intf.iInterface + self.interfaceClass = intf.bInterfaceClass + self.interfaceSubClass = intf.bInterfaceSubClass + self.interfaceProtocol = intf.bInterfaceProtocol + self.endpoints = [Endpoint(e) for e in intf] + +class Configuration(object): + r"""Configuration descriptor object.""" + def __init__(self, cfg): + self.iConfiguration = cfg.iConfiguration + self.maxPower = cfg.bMaxPower << 2 + self.remoteWakeup = (cfg.bmAttributes >> 5) & 1 + self.selfPowered = (cfg.bmAttributes >> 6) & 1 + self.totalLength = cfg.wTotalLength + self.value = cfg.bConfigurationValue + self.interfaces = [ + list(g) for k, g in _interop._groupby( + _interop._sorted( + [Interface(i) for i in cfg], + key=lambda i: i.interfaceNumber + ), + lambda i: i.alternateSetting) + ] + +class DeviceHandle(object): + def __init__(self, dev): + self.dev = dev + self.__claimed_interface = -1 + + def bulkWrite(self, endpoint, buffer, timeout = 100): + r"""Perform a bulk write request to the endpoint specified. + + Arguments: + endpoint: endpoint number. + buffer: sequence data buffer to write. + This parameter can be any sequence type. + timeout: operation timeout in miliseconds. (default: 100) + Returns the number of bytes written. + """ + return self.dev.write(endpoint, buffer, self.__claimed_interface, timeout) + + def bulkRead(self, endpoint, size, timeout = 100): + r"""Performs a bulk read request to the endpoint specified. + + Arguments: + endpoint: endpoint number. + size: number of bytes to read. + timeout: operation timeout in miliseconds. (default: 100) + Return a tuple with the data read. + """ + return self.dev.read(endpoint, size, self.__claimed_interface, timeout) + + def interruptWrite(self, endpoint, buffer, timeout = 100): + r"""Perform a interrupt write request to the endpoint specified. + + Arguments: + endpoint: endpoint number. + buffer: sequence data buffer to write. + This parameter can be any sequence type. + timeout: operation timeout in miliseconds. (default: 100) + Returns the number of bytes written. + """ + return self.dev.write(endpoint, buffer, self.__claimed_interface, timeout) + + def interruptRead(self, endpoint, size, timeout = 100): + r"""Performs a interrupt read request to the endpoint specified. + + Arguments: + endpoint: endpoint number. + size: number of bytes to read. + timeout: operation timeout in miliseconds. (default: 100) + Return a tuple with the data read. + """ + return self.dev.read(endpoint, size, self.__claimed_interface, timeout) + + def controlMsg(self, requestType, request, buffer, value = 0, index = 0, timeout = 100): + r"""Perform a control request to the default control pipe on a device. + + Arguments: + requestType: specifies the direction of data flow, the type + of request, and the recipient. + request: specifies the request. + buffer: if the transfer is a write transfer, buffer is a sequence + with the transfer data, otherwise, buffer is the number of + bytes to read. + value: specific information to pass to the device. (default: 0) + index: specific information to pass to the device. (default: 0) + timeout: operation timeout in miliseconds. (default: 100) + Return the number of bytes written. + """ + return self.dev.ctrl_transfer( + requestType, + request, + wValue = value, + wIndex = index, + data_or_wLength = buffer, + timeout = timeout + ) + + def clearHalt(self, endpoint): + r"""Clears any halt status on the specified endpoint. + + Arguments: + endpoint: endpoint number. + """ + cfg = self.dev.get_active_configuration() + intf = util.find_descriptor(cfg, bInterfaceNumber = self.__claimed_interface) + e = util.find_descriptor(intf, bEndpointAddress = endpoint) + control.clear_feature(self.dev, control.ENDPOINT_HALT, e) + + def claimInterface(self, interface): + r"""Claims the interface with the Operating System. + + Arguments: + interface: interface number or an Interface object. + """ + if_num = interface.interfaceNumber \ + if isinstance(interface, Interface) else interface + + util.claim_interface(self.dev, if_num) + self.__claimed_interface = if_num + + def releaseInterface(self): + r"""Release an interface previously claimed with claimInterface.""" + util.release_interface(self.dev, self.__claimed_interface) + self.__claimed_interface = -1 + + def reset(self): + r"""Reset the specified device by sending a RESET + down the port it is connected to.""" + self.dev.reset() + + def resetEndpoint(self, endpoint): + r"""Reset all states for the specified endpoint. + + Arguments: + endpoint: endpoint number. + """ + self.clearHalt(endpoint) + + def setConfiguration(self, configuration): + r"""Set the active configuration of a device. + + Arguments: + configuration: a configuration value or a Configuration object. + """ + self.dev.set_configuration(configuration) + + def setAltInterface(self, alternate): + r"""Sets the active alternate setting of the current interface. + + Arguments: + alternate: an alternate setting number or an Interface object. + """ + self.dev.set_interface_altsetting(self.__claimed_interface, alternate) + + def getString(self, index, length, langid = None): + r"""Retrieve the string descriptor specified by index + and langid from a device. + + Arguments: + index: index of descriptor in the device. + length: number of bytes of the string + langid: Language ID. If it is omittedi, will be + used the first language. + """ + return util.get_string(self.dev, length, index, langid).encode('ascii') + + def getDescriptor(self, desc_type, desc_index, length, endpoint = -1): + r"""Retrieves a descriptor from the device identified by the type + and index of the descriptor. + + Arguments: + desc_type: descriptor type. + desc_index: index of the descriptor. + len: descriptor length. + endpoint: ignored. + """ + return control.get_descriptor(self.dev, length, desc_type, desc_index) + + def detachKernelDriver(self, interface): + r"""Detach a kernel driver from the interface (if one is attached, + we have permission and the operation is supported by the OS) + + Arguments: + interface: interface number or an Interface object. + """ + self.dev.detach_kernel_driver(interface) + +class Device(object): + r"""Device descriptor object""" + def __init__(self, dev): + self.deviceClass = dev.bDeviceClass + self.deviceSubClass = dev.bDeviceSubClass + self.deviceProtocol = dev.bDeviceProtocol + self.deviceVersion = dev.bcdDevice + self.devnum = None + self.filename = '' + self.iManufacturer = dev.iManufacturer + self.iProduct = dev.iProduct + self.iSerialNumber = dev.iSerialNumber + self.idProduct = dev.idProduct + self.idVendor = dev.idVendor + self.maxPacketSize = dev.bMaxPacketSize0 + self.usbVersion = dev.bcdUSB + self.configurations = [Configuration(c) for c in dev] + self.dev = dev + + def open(self): + r"""Open the device for use. + + Return a DeviceHandle object + """ + return DeviceHandle(self.dev) + +class Bus(object): + r"""Bus object.""" + def __init__(self): + self.dirname = '' + self.localtion = 0 + self.devices = [Device(d) for d in core.find(find_all=True)] + +def busses(): + r"""Return a tuple with the usb busses.""" + return (Bus(),) + diff --git a/plugins/wedo_plugin/usb/util.py b/plugins/wedo_plugin/usb/util.py new file mode 100644 index 0000000..1f8cee3 --- /dev/null +++ b/plugins/wedo_plugin/usb/util.py @@ -0,0 +1,260 @@ +# Copyright (C) 2009-2011 Wander Lairson Costa +# +# The following terms apply to all files associated +# with the software unless explicitly disclaimed in individual files. +# +# The authors hereby grant permission to use, copy, modify, distribute, +# and license this software and its documentation for any purpose, provided +# that existing copyright notices are retained in all copies and that this +# notice is included verbatim in any distributions. No written agreement, +# license, or royalty fee is required for any of the authorized uses. +# Modifications to this software may be copyrighted by their authors +# and need not follow the licensing terms described here, provided that +# the new terms are clearly indicated on the first page of each file where +# they apply. +# +# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +# MODIFICATIONS. + +r"""usb.util - Utility functions. + +This module exports: + +endpoint_address - return the endpoint absolute address. +endpoint_direction - return the endpoint transfer direction. +endpoint_type - return the endpoint type +ctrl_direction - return the direction of a control transfer +build_request_type - build a bmRequestType field of a control transfer. +find_descriptor - find an inner descriptor. +claim_interface - explicitly claim an interface. +release_interface - explicitly release an interface. +dispose_resources - release internal resources allocated by the object. +get_string - retrieve a string descriptor from the device. +""" + +__author__ = 'Wander Lairson Costa' + +import operator +import usb._interop as _interop + +# descriptor type +DESC_TYPE_DEVICE = 0x01 +DESC_TYPE_CONFIG = 0x02 +DESC_TYPE_STRING = 0x03 +DESC_TYPE_INTERFACE = 0x04 +DESC_TYPE_ENDPOINT = 0x05 + +# endpoint direction +ENDPOINT_IN = 0x80 +ENDPOINT_OUT = 0x00 + +# endpoint type +ENDPOINT_TYPE_CTRL = 0x00 +ENDPOINT_TYPE_ISO = 0x01 +ENDPOINT_TYPE_BULK = 0x02 +ENDPOINT_TYPE_INTR = 0x03 + +# control request type +CTRL_TYPE_STANDARD = (0 << 5) +CTRL_TYPE_CLASS = (1 << 5) +CTRL_TYPE_VENDOR = (2 << 5) +CTRL_TYPE_RESERVED = (3 << 5) + +# control request recipient +CTRL_RECIPIENT_DEVICE = 0 +CTRL_RECIPIENT_INTERFACE = 1 +CTRL_RECIPIENT_ENDPOINT = 2 +CTRL_RECIPIENT_OTHER = 3 + +# control request direction +CTRL_OUT = 0x00 +CTRL_IN = 0x80 + +_ENDPOINT_ADDR_MASK = 0x0f +_ENDPOINT_DIR_MASK = 0x80 +_ENDPOINT_TRANSFER_TYPE_MASK = 0x03 +_CTRL_DIR_MASK = 0x80 + +def endpoint_address(address): + r"""Return the endpoint absolute address. + + The address parameter is the bEndpointAddress field + of the endpoint descriptor. + """ + return address & _ENDPOINT_ADDR_MASK + +def endpoint_direction(address): + r"""Return the endpoint direction. + + The address parameter is the bEndpointAddress field + of the endpoint descriptor. + The possible return values are ENDPOINT_OUT or ENDPOINT_IN. + """ + return address & _ENDPOINT_DIR_MASK + +def endpoint_type(bmAttributes): + r"""Return the transfer type of the endpoint. + + The bmAttributes parameter is the bmAttributes field + of the endpoint descriptor. + The possible return values are: ENDPOINT_TYPE_CTRL, + ENDPOINT_TYPE_ISO, ENDPOINT_TYPE_BULK or ENDPOINT_TYPE_INTR. + """ + return bmAttributes & _ENDPOINT_TRANSFER_TYPE_MASK + +def ctrl_direction(bmRequestType): + r"""Return the direction of a control request. + + The bmRequestType parameter is the value of the + bmRequestType field of a control transfer. + The possible return values are CTRL_OUT or CTRL_IN. + """ + return bmRequestType & _CTRL_DIR_MASK + +def build_request_type(direction, type, recipient): + r"""Build a bmRequestType field for control requests. + + These is a conventional function to build a bmRequestType + for a control request. + + The direction parameter can be CTRL_OUT or CTRL_IN. + The type parameter can be CTRL_TYPE_STANDARD, CTRL_TYPE_CLASS, + CTRL_TYPE_VENDOR or CTRL_TYPE_RESERVED values. + The recipient can be CTRL_RECIPIENT_DEVICE, CTRL_RECIPIENT_INTERFACE, + CTRL_RECIPIENT_ENDPOINT or CTRL_RECIPIENT_OTHER. + + Return the bmRequestType value. + """ + return recipient | type | direction + +def find_descriptor(desc, find_all=False, custom_match=None, **args): + r"""Find an inner descriptor. + + find_descriptor works in the same way the core.find() function does, + but it acts on general descriptor objects. For example, suppose you + have a Device object called dev and want a Configuration of this + object with its bConfigurationValue equals to 1, the code would + be like so: + + >>> cfg = util.find_descriptor(dev, bConfigurationValue=1) + + You can use any field of the Descriptor as a match criteria, and you + can supply a customized match just like core.find() does. The + find_descriptor function also accepts the find_all parameter to get + a list of descriptor instead of just one. + """ + def desc_iter(k, v): + for d in desc: + if (custom_match is None or custom_match(d)) and \ + _interop._reduce( + lambda a, b: a and b, + map( + operator.eq, + v, + map(lambda i: getattr(d, i), k) + ), + True + ): + yield d + + k, v = args.keys(), args.values() + + if find_all: + return [d for d in desc_iter(k, v)] + else: + try: + return _interop._next(desc_iter(k, v)) + except StopIteration: + return None + +def claim_interface(device, interface): + r"""Explicitly claim an interface. + + PyUSB users normally do not have to worry about interface claiming, + as the library takes care of it automatically. But there are situations + where you need deterministic interface claiming. For these uncommon + cases, you can use claim_interface. + + If the interface is already claimed, either through a previously call + to claim_interface or internally by the device object, nothing happens. + """ + device._ctx.managed_claim_interface(device, interface) + +def release_interface(device, interface): + r"""Explicitly release an interface. + + This function is used to release an interface previously claimed, + either through a call to claim_interface or internally by the + device object. + + Normally, you do not need to worry about claiming policies, as + the device object takes care of it automatically. + """ + device._ctx.managed_release_interface(device, interface) + +def dispose_resources(device): + r"""Release internal resources allocated by the object. + + Sometimes you need to provide deterministic resources + freeing, for example to allow another application to + talk to the device. As Python does not provide deterministic + destruction, this function releases all internal resources + allocated by the device, like device handle and interface + policy. + + After calling this function, you can continue using the device + object normally. If the resources will be necessary again, it + will allocate them automatically. + """ + device._ctx.dispose(device) + +def get_string(dev, length, index, langid = None): + r"""Retrieve a string descriptor from the device. + + dev is the Device object to which the request will be + sent to. + + length is the length of string in number of characters. + + index is the string descriptor index and langid is the Language + ID of the descriptor. If langid is omitted, the string descriptor + of the first Language ID will be returned. + + The return value is the unicode string present in the descriptor. + """ + from usb.control import get_descriptor + if langid is None: + # Asking for the zero'th index is special - it returns a string + # descriptor that contains all the language IDs supported by the device. + # Typically there aren't many - often only one. The language IDs are 16 + # bit numbers, and they start at the third byte in the descriptor. See + # USB 2.0 specification section 9.6.7 for more information. + # + # Note from libusb 1.0 sources (descriptor.c) + buf = get_descriptor( + dev, + 1024, + DESC_TYPE_STRING, + 0 + ) + assert len(buf) >= 4 + langid = buf[2] | (buf[3] << 8) + + buf = get_descriptor( + dev, + length * 2 + 2, # string is utf16 + 2 bytes of the descriptor + DESC_TYPE_STRING, + index, + langid + ) + return buf[2:].tostring().decode('utf-16-le') diff --git a/plugins/wedo_plugin/wedo_plugin.py b/plugins/wedo_plugin/wedo_plugin.py new file mode 100644 index 0000000..c0cbe12 --- /dev/null +++ b/plugins/wedo_plugin/wedo_plugin.py @@ -0,0 +1,304 @@ +#Copyright (c) 2012, Tony Forster, Ian Daniher, Walter Bender +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +from gettext import gettext as _ + +from plugins.plugin import Plugin +from WeDoMore import WeDo, scan_for_devices, UNAVAILABLE + +from TurtleArt.tapalette import make_palette +from TurtleArt.taconstants import XO1, XO15 +from TurtleArt.talogo import primitive_dictionary + +import logging +_logger = logging.getLogger('turtleart-activity WeDo plugin') + + +class Wedo_plugin(Plugin): + + def __init__(self, parent): + ''' Scan for WeDo devices ''' + self.WeDos = [] + device_list = scan_for_devices() + for i, dev in enumerate(device_list): + self.WeDos.append(WeDo(device=dev)) + self.WeDos[-1].number = i + self._parent = parent + if len(self.WeDos) == 0: + self._status = False # no WeDo devices found + self.active_wedo = None + else: + self._status = True + self.active_wedo = 0 + + def setup(self): + ''' Setup palettes ''' + palette = make_palette('WeDo', colors=["#FF6060", "#A06060"], + help_string=_('Palette of WeDo blocks')) + + primitive_dictionary['wedoselect'] = self.wedo_select + palette.add_block('wedoselect', + style='basic-style-1arg', + default = 1, + label=_('WeDo'), + help_string=_('set current WeDo device'), + prim_name = 'wedoselect') + + self._parent.lc.def_prim( + 'wedoselect', 1, + lambda self, n: primitive_dictionary['wedoselect'](n)) + + primitive_dictionary['wedocount'] = self.wedo_count + palette.add_block('wedogetcount', + style='box-style', + label=_('number of WeDos'), + help_string=_('number of WeDo devices'), + prim_name = 'wedocount') + + self._parent.lc.def_prim( + 'wedocount', 0, lambda self: primitive_dictionary['wedocount']()) + + primitive_dictionary['wedotilt'] = self.wedo_gettilt + palette.add_block('tilt', + style='box-style', + label=_('tilt'), + help_string=_('tilt sensor output: (-1 == no tilt,\ + 0 == tilt forward, 3 == tilt back, 1 == tilt left, 2 == tilt right)'), + value_block=True, + prim_name = 'wedotilt') + self._parent.lc.def_prim( + 'wedotilt', 0, lambda self: primitive_dictionary['wedotilt']()) + + primitive_dictionary['wedodistance'] = self.wedo_getdistance + palette.add_block('wedodistance', + style='box-style', + label=_('distance'), + help_string=_('distance sensor output'), + value_block=True, + prim_name = 'wedodistance') + self._parent.lc.def_prim( + 'wedodistance', 0, + lambda self: primitive_dictionary['wedodistance']()) + + primitive_dictionary['wedogetMotorA'] = self.wedo_getmotora + palette.add_block('wedogetMotorA', + style='box-style', + label=_('Motor A'), + help_string=_('returns the current value of Motor A'), + value_block=True, + prim_name = 'wedogetMotorA') + + self._parent.lc.def_prim( + 'wedogetMotorA', 0, + lambda self: primitive_dictionary['wedogetMotorA']()) + + primitive_dictionary['wedogetMotorB'] = self.wedo_getmotorb + palette.add_block('wedogetMotorB', + style='box-style', + label=_('Motor B'), + help_string=_('returns the current value of Motor B'), + value_block=True, + prim_name = 'wedogetMotorB') + self._parent.lc.def_prim( + 'wedogetMotorB', 0, + lambda self: primitive_dictionary['wedogetMotorB']()) + + primitive_dictionary['wedosetMotorA'] = self.wedo_setmotora + palette.add_block('wedosetMotorA', + style = 'basic-style-1arg', + label = _('Motor A'), + default = 30, + prim_name = 'wedosetMotorA', + help_string = _('set the value for Motor A')) + self._parent.lc.def_prim( + 'wedosetMotorA', 1, + lambda self, a: primitive_dictionary['wedosetMotorA'](a)) + + primitive_dictionary['wedosetMotorB'] = self.wedo_setmotorb + palette.add_block('wedosetMotorB', + style = 'basic-style-1arg', + label = _('Motor B'), + default = 30, + prim_name = 'wedosetMotorB', + help_string = _('set the value for Motor B')) + self._parent.lc.def_prim( + 'wedosetMotorB', 1, + lambda self, b: primitive_dictionary['wedosetMotorB'](b)) + + def wedo_select(self, i): + ''' Select current device ''' + if self.wedo_count() == 0: + self.active_wedo = None + self._parent.showlabel( + 'status', _('WeDo is unavailable')) + return + if type(i) == unicode: + i = str(i.encode('ascii', 'replace')) + if type(i) == float or type(i) == str: + i = int(i) + if type(i) != int: + i = 1 + if i < 0: + i = -i + if i < 0 or i > self.wedo_count() - 1: + self._parent.showlabel( + 'status', _('WeDo %d is unavailable; defaulting to 1') % (i)) + i -= 1 # Userspace counts from 1; internally, we count from 0 + if i > self.wedo_count() - 1: + i = 0 + self.active_wedo = i + + def wedo_count(self): + ''' How many devices are available? ''' + n = len(self.WeDos) + for wedo in self.WeDos: + if wedo.dev is None: + n -= 1 + return n + + def wedo_find(self): + ''' Find an available device ''' + for wedo in self.WeDos: + if wedo.dev is not None: + return self.WeDos.index(wedo) + return None + + def wedo_gettilt(self): + if self.active_wedo is None: + self.active_wedo = self.wedo_find() + if self.active_wedo is None: + self._parent.showlabel('status', _('WeDo is unavailable')) + return -1 + tilt = self.WeDos[self.active_wedo].getTilt() + if tilt == UNAVAILABLE: + # Should we look for tilt on another WeDo? + self._parent.showlabel( + 'status', _('%s is unavailable on WeDo %d') % ( + _('tilt'), self.active_wedo + 1)) + return -1 + else: + return tilt + + def wedo_getdistance(self): + if self.active_wedo is None: + self.active_wedo = self.wedo_find() + if self.active_wedo is None: + self._parent.showlabel('status', _('WeDo is unavailable')) + return 0 + distance = self.WeDos[self.active_wedo].getDistance() + if distance == UNAVAILABLE: + # Should we look for distance on another WeDo? + self._parent.showlabel( + 'status', _('%s is unavailable on WeDo %d') % ( + _('distance'), self.active_wedo + 1)) + return 0 + else: + return distance + + def wedo_getmotora(self): + if self.active_wedo is None: + self.active_wedo = self.wedo_find() + if self.active_wedo is None: + self._parent.showlabel('status', _('WeDo is unavailable')) + return 0 + speed = self.WeDos[self.active_wedo].getMotorA() + if speed == UNAVAILABLE: + self._parent.showlabel( + 'status', _('%s is unavailable on WeDo %d') % ( + _('Motor A'), self.active_wedo + 1)) + return 0 + else: + return speed + + def wedo_getmotorb(self): + if self.active_wedo is None: + self.active_wedo = self.wedo_find() + if self.active_wedo is None: + self._parent.showlabel('status', _('WeDo is unavailable')) + return 0 + speed = self.WeDos[self.active_wedo].getMotorB() + if speed == UNAVAILABLE: + self._parent.showlabel( + 'status', _('%s is unavailable on WeDo %d') % ( + _('Motor B'), self.active_wedo + 1)) + return 0 + else: + return speed + + def wedo_setmotora(self, speed): + if self.active_wedo is None: + self.active_wedo = self.wedo_find() + if self.active_wedo is None: + self._parent.showlabel('status', _('WeDo is unavailable')) + return + status = self.WeDos[self.active_wedo].setMotorA(speed) + if status == UNAVAILABLE: + self._parent.showlabel( + 'status', _('%s is unavailable on WeDo %d') % ( + _('Motor A'), self.active_wedo + 1)) + + def wedo_setmotorb(self, speed): + if self.active_wedo is None: + self.active_wedo = self.wedo_find() + if self.active_wedo is None: + self._parent.showlabel('status', _('WeDo is unavailable')) + return + status = self.WeDos[self.active_wedo].setMotorB(speed) + if status == UNAVAILABLE: + self._parent.showlabel( + 'status', _('%s is unavailable on WeDo %d') % ( + _('Motor B'), self.active_wedo + 1)) + + def start(self): + ''' Each time program starts, scan for devices and reset status ''' + for wedo in self.WeDos: + wedo.dev = None + self.active_wedo = None + device_list = scan_for_devices() + if len(device_list) > 0: + self.status = True + if self.active_wedo is None: + self.active_wedo = 0 + else: + self.status = False + for i, dev in enumerate(device_list): + if i < len(self.WeDos): + self.WeDos[i].dev = dev + self.WeDos[i].number = i + status = self.WeDos[i].init_device() # Reinitial device + if status == UNAVAILABLE: + self._parent.showlabel('status', _('WeDo is unavailable')) + else: + self.WeDos.append(WeDo(device=dev)) + self.WeDos[i].number = i + + def stop(self): + if self._status: + for wedo in self.WeDos: + if wedo.dev is not None: + wedo.setMotors(0, 0) + + def goto_background(self): + pass + + def return_to_foreground(self): + pass + + def quit(self): + if self._status: + for wedo in self.WeDos: + if wedo.dev is not None: + wedo.setMotors(0, 0) @@ -2,8 +2,33 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +#, fuzzy msgid "" msgstr "" +"#-#-#-#-# af.po (PACKAGE VERSION) #-#-#-#-#\n" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-11-02 00:32-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Translate Toolkit 1.7.0\n" +"#-#-#-#-# af.po (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# af.po (PACKAGE VERSION) #-#-#-#-#\n" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-11-02 00:32-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Translate Toolkit 1.7.0\n" +"#-#-#-#-# af.po (TURTLEART) #-#-#-#-#\n" "Project-Id-Version: TURTLEART\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-02-24 00:31-0500\n" @@ -18,585 +43,1895 @@ msgstr "" "X-Generator: Pootle 2.0.5\n" #. TRANS: "name" option from activity.info file -msgid "TurtleBlocks" -msgstr "" - #. TRANS: "summary" option from activity.info file #. TRANS: "description" option from activity.info file +msgid "turtleart-extras (master)" +msgstr "" + +#: taextras.py:36 +msgid "Turtle Art Mini" +msgstr "" + +#: taextras.py:40 +msgid "Turtle Confusion" +msgstr "" + +#: taextras.py:41 taextras.py:46 +msgid "Select a challenge" +msgstr "" + +#: taextras.py:45 +msgid "Amazonas Tortuga" +msgstr "" + +#: taextras.py:52 +msgid "Palette of Mexican pesos" +msgstr "" + +#: taextras.py:53 +msgid "Palette of Colombian pesos" +msgstr "" + +#: taextras.py:54 +msgid "Palette of Rwandan francs" +msgstr "" + +#: taextras.py:55 +msgid "Palette of US dollars" +msgstr "" + +#: taextras.py:56 +msgid "Palette of Australian dollars" +msgstr "" + +#: taextras.py:57 +msgid "Palette of Paraguayan Guaranies" +msgstr "" + +#: taextras.py:58 +msgid "Palette of Peruvian Nuevo Soles" +msgstr "" + +#: taextras.py:59 +msgid "Palette of Uruguayan Pesos" +msgstr "" + +#. TRANS: Butia is the Arduino Robot Project from Uruguay +#. (http://www.fing.edu.uy/inco/proyectos/butia/) +#: taextras.py:65 +msgid "TurtleBots" +msgstr "" + +#: taextras.py:66 +msgid "adjust LED intensity between 0 and 255" +msgstr "" + +#: taextras.py:67 +msgid "returns the object gray level as a number between 0 and 1023" +msgstr "" + +#: taextras.py:68 +msgid "returns 1 when the button is press and 0 otherwise" +msgstr "" + +#: taextras.py:69 +msgid "returns the ambient light level as a number between 0 and 1023" +msgstr "" + +#: taextras.py:70 +msgid "returns the ambient temperature as a number between 0 and 255" +msgstr "" + +#: taextras.py:71 msgid "" -"A Logo-inspired turtle that draws colorful pictures with snap-together " -"visual programming blocks" +"returns the distance from the object in front of the sensor as a number " +"between 0 and 255" msgstr "" -#: TurtleArt/tabasics.py:123 -#, fuzzy -msgid "Palette of turtle commands" -msgstr "palet van skilpadbevele" +#: taextras.py:73 +msgid "returns 0 or 1 depending on the sensor inclination" +msgstr "" -#: TurtleArt/tabasics.py:128 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:723 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:734 -msgid "forward" -msgstr "vorentoe" +#: taextras.py:74 +msgid "returns 1 when the sensors detects a magnetic field, 0 otherwise" +msgstr "" -#: TurtleArt/tabasics.py:132 -#, fuzzy -msgid "moves turtle forward" -msgstr "skuif die skilpad vorentoe" +#: taextras.py:75 +msgid "switches from 0 to 1, the frequency depends on the vibration" +msgstr "" -#: TurtleArt/tabasics.py:139 -msgid "back" -msgstr "agtertoe" +#: taextras.py:76 +msgid "returns the value of the resistance" +msgstr "" -#: TurtleArt/tabasics.py:143 -#, fuzzy -msgid "moves turtle backward" -msgstr "skuif die skilpad agtertoe" +#: taextras.py:77 +msgid "LED" +msgstr "" -#: TurtleArt/tabasics.py:151 -msgid "clean" -msgstr "maak skoon" +#: taextras.py:78 +msgid "button" +msgstr "" -#: TurtleArt/tabasics.py:154 -#, fuzzy -msgid "clears the screen and reset the turtle" -msgstr "maak die skerm skoon en herstel die skilpad" +#: taextras.py:79 +msgid "grayscale" +msgstr "" -#: TurtleArt/tabasics.py:162 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:854 -msgid "left" -msgstr "links" +#: taextras.py:80 +msgid "ambient light" +msgstr "" -#: TurtleArt/tabasics.py:166 -#, fuzzy -msgid "turns turtle counterclockwise (angle in degrees)" -msgstr "draai die skilpad anti-kloksgewys (gee die hoek in grade)" +#: taextras.py:81 +msgid "temperature" +msgstr "" -#: TurtleArt/tabasics.py:174 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:878 -msgid "right" -msgstr "regs" +#: taextras.py:82 taextras.py:291 +msgid "distance" +msgstr "" -#: TurtleArt/tabasics.py:178 -#, fuzzy -msgid "turns turtle clockwise (angle in degrees)" -msgstr "draai die skilpad kloksgewys (gee die hoek in grade)" +#: taextras.py:83 taextras.py:288 +msgid "tilt" +msgstr "" -#: TurtleArt/tabasics.py:186 -msgid "arc" -msgstr "boog" +#: taextras.py:84 +msgid "magnetic induction" +msgstr "" -#: TurtleArt/tabasics.py:186 -msgid "angle" -msgstr "hoek" +#: taextras.py:85 +msgid "vibration" +msgstr "" -#: TurtleArt/tabasics.py:186 -msgid "radius" -msgstr "radius" +#: taextras.py:86 plugins/audio_sensors/audio_sensors.py:151 +#: plugins/audio_sensors/audio_sensors.py:165 +#: plugins/audio_sensors/audio_sensors.py:179 +#: plugins/audio_sensors/audio_sensors.py:193 +msgid "resistance" +msgstr "" -#: TurtleArt/tabasics.py:190 -#, fuzzy -msgid "moves turtle along an arc" -msgstr "skuif die skilpad in 'n boog" +#: taextras.py:87 +msgid "Butia Robot" +msgstr "" -#: TurtleArt/tabasics.py:199 TurtleArt/tabasics.py:265 -msgid "set xy" -msgstr "stel xy" +#: taextras.py:88 +msgid "refresh Butia" +msgstr "" -#: TurtleArt/tabasics.py:199 TurtleArt/tabasics.py:265 +#: taextras.py:89 +msgid "refresh the state of the Butia palette and blocks" +msgstr "" + +#. TRANS: This string is shorthand for "battery charge of Butia" +#: taextras.py:91 +msgid "battery charge Butia" +msgstr "" + +#: taextras.py:92 +msgid "returns the battery charge as a number between 0 and 255" +msgstr "" + +#. TRANS: This string is shorthand for "speed of Butia" +#: taextras.py:94 +msgid "speed Butia" +msgstr "" + +#: taextras.py:95 +msgid "set the speed of the Butia motors" +msgstr "" + +#: taextras.py:96 +msgid "the speed must be a value between 0 and 1023" +msgstr "" + +#. TRANS: This string is shorthand for "move Butia forward" +#: taextras.py:98 +msgid "forward Butia" +msgstr "" + +#: taextras.py:99 +msgid "move the Butia robot forward" +msgstr "" + +#: taextras.py:100 +msgid "move the Butia robot forward a predefined distance" +msgstr "" + +#. TRANS: This string is shorthand for "turn Butia left" +#: taextras.py:102 +msgid "left Butia" +msgstr "" + +#: taextras.py:103 +msgid "turn the Butia robot at left" +msgstr "" + +#. TRANS: This string is shorthand for "move Butia backward" +#: taextras.py:105 +msgid "backward Butia" +msgstr "" + +#: taextras.py:106 +msgid "move the Butia robot backward" +msgstr "" + +#: taextras.py:107 +msgid "move the Butia robot backward a predefined distance" +msgstr "" + +#. TRANS: This string is shorthand for "turn Butia right" +#: taextras.py:109 +msgid "right Butia" +msgstr "" + +#: taextras.py:110 +msgid "turn the Butia robot at right" +msgstr "" + +#: taextras.py:111 +msgid "turn Butia" +msgstr "" + +#: taextras.py:112 +msgid "turn the Butia robot x degrees" +msgstr "" + +#: taextras.py:113 +msgid "stop Butia" +msgstr "" + +#: taextras.py:114 +msgid "stop the Butia robot" +msgstr "" + +#: taextras.py:115 +msgid "Butia" +msgstr "" + +#: taextras.py:119 +msgid "Error importing Pygame. This plugin require Pygame 1.9" +msgstr "" + +#: taextras.py:120 +msgid "Error on initialization of the camera" +msgstr "" + +#: taextras.py:121 +msgid "No camera was found" +msgstr "" + +#: taextras.py:122 +msgid "Error stopping camera" +msgstr "" + +#: taextras.py:123 +msgid "Error starting camera" +msgstr "" + +#. TRANS: The "mask" is used to restrict processing to a region in the image +#: taextras.py:125 +msgid "Error in get mask" +msgstr "" + +#: taextras.py:126 +msgid "FollowMe" +msgstr "" + +#: taextras.py:127 +msgid "refresh FollowMe" +msgstr "" + +#: taextras.py:128 +msgid "Search for a connected camera." +msgstr "" + +#. TRANS: the calibration is used to match an RGB color to a target +#: taextras.py:130 +msgid "calibration" +msgstr "" + +#: taextras.py:131 +msgid "store a personalized calibration" +msgstr "" + +#: taextras.py:132 +msgid "return a personalized calibration" +msgstr "" + +#: taextras.py:133 +msgid "follow" +msgstr "" + +#: taextras.py:134 +msgid "follow a color or calibration" +msgstr "" + +#: taextras.py:135 plugins/camera_sensor/camera_sensor.py:80 +#: plugins/camera_sensor/camera_sensor.py:93 +#: plugins/camera_sensor/camera_sensor.py:128 +#: plugins/camera_sensor/camera_sensor.py:141 +#: plugins/light_sensor/light_sensor.py:56 +#: plugins/light_sensor/light_sensor.py:63 +msgid "brightness" +msgstr "" + +#: taextras.py:136 +msgid "set the camera brightness as a value between 0 to 255." +msgstr "" + +#: taextras.py:137 +msgid "minimum pixels" +msgstr "" + +#: taextras.py:138 +msgid "set the minimal number of pixels to follow" +msgstr "" + +#: taextras.py:139 +msgid "threshold" +msgstr "" + +#. TRANS: RGB color space (red, green, blue) +#: taextras.py:141 +msgid "set a threshold for a RGB color" +msgstr "" + +#: taextras.py:142 +msgid "camera mode" +msgstr "" + +#. TRANS: RGB, YUV, and HSV are color spaces +#: taextras.py:144 +msgid "set the color mode of the camera: RGB; YUV or HSV" +msgstr "" + +#: taextras.py:145 +msgid "get brightness" +msgstr "" + +#: taextras.py:146 +msgid "get the brightness of the ambient light" +msgstr "" + +#: taextras.py:147 +msgid "average color" +msgstr "" + +#: taextras.py:148 +msgid "" +"if set to 0 then color averaging is off during calibration; for other values " +"it is on" +msgstr "" + +#: taextras.py:149 +msgid "x position" +msgstr "" + +#: taextras.py:150 +msgid "return x position" +msgstr "" + +#: taextras.py:151 +msgid "y position" +msgstr "" + +#: taextras.py:152 +msgid "return y position" +msgstr "" + +#: taextras.py:153 +msgid "pixels" +msgstr "" + +#: taextras.py:154 +msgid "return the number of pixels of the biggest blob" +msgstr "" + +#. TRANS: RGB color space (red, green, blue) +#: taextras.py:156 +msgid "set the color mode of the camera to RGB" +msgstr "" + +#. TRANS: YUV color space (luminance, chrominance) +#: taextras.py:158 +msgid "set the color mode of the camera to YUV" +msgstr "" + +#. TRANS: HSV color space (hue, saturation, value) +#: taextras.py:160 +msgid "set the color mode of the camera to HSV" +msgstr "" + +#: taextras.py:161 +msgid "empty calibration" +msgstr "" + +#: taextras.py:162 +msgid "error in string conversion" +msgstr "" + +#. TRANS: SumBot is a robot programmed for "Sumo wrestling" +#: taextras.py:167 +msgid "SumBot" +msgstr "" + +#: taextras.py:168 +msgid "speed SumBot" +msgstr "" + +#: taextras.py:169 +msgid "submit the speed to the SumBot" +msgstr "" + +#: taextras.py:170 +msgid "set the default speed for the movement commands" +msgstr "" + +#. TRANS: This string is shorthand for "move SumBot forward" +#: taextras.py:172 +msgid "forward SumBot" +msgstr "" + +#: taextras.py:173 +msgid "move SumBot forward" +msgstr "" + +#. TRANS: This string is shorthand for "move SumBot backward" +#: taextras.py:175 +msgid "backward SumBot" +msgstr "" + +#: taextras.py:176 +msgid "move SumBot backward" +msgstr "" + +#: taextras.py:177 +msgid "stop SumBot" +msgstr "" + +#: taextras.py:178 +msgid "stop the SumBot" +msgstr "" + +#. TRANS: This string is shorthand for "turn SumBot left" +#: taextras.py:180 +msgid "left SumBot" +msgstr "" + +#: taextras.py:181 +msgid "turn left the SumBot" +msgstr "" + +#. TRANS: This string is shorthand for "move SumBot right" +#: taextras.py:183 +msgid "right SumBot" +msgstr "" + +#: taextras.py:184 +msgid "turn right the SumBot" +msgstr "" + +#. TRANS: The angle to the center is the angle SumBot must turn to +#. face the center of the playing field +#: taextras.py:187 +msgid "angle to center" +msgstr "" + +#. TRANS: dohyo is the playing field +#: taextras.py:189 +msgid "get the angle to the center of the dohyo" +msgstr "" + +#. TRANS: The angle to the center is the angle SumBot must turn to +#. face the Enemy (opponent) +#: taextras.py:192 +msgid "angle to Enemy" +msgstr "" + +#: taextras.py:193 +msgid "get the angle to the Enemy" +msgstr "" + +#. TRANS: This string is shorthand for "x coordinate of SumBot" +#: taextras.py:195 +msgid "x coor. SumBot" +msgstr "" + +#: taextras.py:196 +msgid "get the x coordinate of the SumBot" +msgstr "" + +#. TRANS: This string is shorthand for "y coordinate of SumBot" +#: taextras.py:198 +msgid "y coor. SumBot" +msgstr "" + +#: taextras.py:199 +msgid "get the y coordinate of the SumBot" +msgstr "" + +#. TRANS: This string is shorthand for "x coordinate of SumBot's enemy" +#: taextras.py:201 +msgid "x coor. Enemy" +msgstr "" + +#: taextras.py:202 +msgid "get the x coordinate of the Enemy" +msgstr "" + +#. TRANS: This string is shorthand for "y coordinate of SumBot's enemy" +#: taextras.py:204 +msgid "y coor. Enemy" +msgstr "" + +#: taextras.py:205 +msgid "get the y coordinate of the Enemy" +msgstr "" + +#. TRANS: This string is shorthand for "rotation of SumBot" +#: taextras.py:207 +msgid "rotation SumBot" +msgstr "" + +#: taextras.py:208 +msgid "get the rotation of the Sumbot" +msgstr "" + +#. TRANS: This string is shorthand for "rotation of SumBot's enemy" +#: taextras.py:210 +msgid "rotation Enemy" +msgstr "" + +#: taextras.py:211 +msgid "get the rotation of the Enemy" +msgstr "" + +#: taextras.py:212 +msgid "distance to center" +msgstr "" + +#. TRANS: dohyo is the playing field +#: taextras.py:214 +msgid "get the distance to the center of the dohyo" +msgstr "" + +#: taextras.py:215 +msgid "distance to Enemy" +msgstr "" + +#: taextras.py:216 +msgid "get the distance to the Enemy" +msgstr "" + +#: taextras.py:217 +msgid "update information" +msgstr "" + +#: taextras.py:218 +msgid "update information from the server" +msgstr "" + +#. TRANS: Please use similar terms to those used in the Physics Activity +#: taextras.py:223 +msgid "Palette of physics blocks" +msgstr "" + +#: taextras.py:224 +msgid "start polygon" +msgstr "" + +#: taextras.py:225 +msgid "Begin defining a new polygon based on the current Turtle xy position." +msgstr "" + +#: taextras.py:227 +msgid "add point" +msgstr "" + +#: taextras.py:228 +msgid "" +"Add a new point to the current polygon based on the current Turtle xy " +"position." +msgstr "" + +#: taextras.py:230 +msgid "end polygon" +msgstr "" + +#: taextras.py:231 +msgid "Define a new polygon." +msgstr "" + +#: taextras.py:232 +msgid "end filled polygon" +msgstr "" + +#: taextras.py:233 +msgid "Not a simple polygon" +msgstr "" + +#: taextras.py:234 +msgid "Define a new filled polygon." +msgstr "" + +#: taextras.py:235 +msgid "triangle" +msgstr "" + +#. TRANS: base of a triangle +#: taextras.py:237 +msgid "base" +msgstr "" + +#: taextras.py:238 taextras.py:244 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:894 +msgid "height" +msgstr "hoogte" + +#: taextras.py:239 +msgid "Add a triangle object to the project." +msgstr "" + +#: taextras.py:240 +msgid "circle" +msgstr "" + +#: taextras.py:241 +msgid "Add a circle object to the project." +msgstr "" + +#: taextras.py:242 +msgid "rectangle" +msgstr "" + +#: taextras.py:243 plugins/turtle_blocks_extras/turtle_blocks_extras.py:870 +msgid "width" +msgstr "wydte" + +#: taextras.py:245 +msgid "Add a rectangle object to the project." +msgstr "" + +#: taextras.py:246 +msgid "reset" +msgstr "" + +#: taextras.py:247 +msgid "Reset the project; clear the object list." +msgstr "" + +#: taextras.py:248 +msgid "motor" +msgstr "" + +#. TRANS: torque as in engine torque +#: taextras.py:250 +msgid "torque" +msgstr "" + +#: taextras.py:251 +msgid "speed" +msgstr "" + +#: taextras.py:252 +msgid "" +"Motor torque and speed range from 0 (off) to positive numbers; motor is " +"placed on the most recent object created." +msgstr "" + +#: taextras.py:254 taextras.py:417 +msgid "pin" +msgstr "" + +#: taextras.py:255 +msgid "Pin an object down so that it cannot fall." +msgstr "" + +#: taextras.py:256 +msgid "joint" +msgstr "" + +#: taextras.py:257 TurtleArt/tabasics.py:199 TurtleArt/tabasics.py:265 msgid "x" msgstr "x" -#: TurtleArt/tabasics.py:199 TurtleArt/tabasics.py:265 +#: taextras.py:258 TurtleArt/tabasics.py:199 TurtleArt/tabasics.py:265 msgid "y" msgstr "y" -#: TurtleArt/tabasics.py:203 TurtleArt/tabasics.py:269 -#, fuzzy +#: taextras.py:259 msgid "" -"moves turtle to position xcor, ycor; (0, 0) is in the center of the screen." -msgstr "skuif die skilpad na posisie x, y; (0,0) is in die middel van die skem." +"Join two objects together (the most recent object created and the object at " +"point x, y)." +msgstr "" -# -#: TurtleArt/tabasics.py:213 -msgid "set heading" -msgstr "stel rigting" +#: taextras.py:261 +msgid "save as Physics activity" +msgstr "" -#: TurtleArt/tabasics.py:217 -#, fuzzy -msgid "sets the heading of the turtle (0 is towards the top of the screen.)" -msgstr "stel die rigting van die skilpad (0 is na die bokant van die skerm.)" +#: taextras.py:262 +msgid "Save the project to the Journal as a Physics activity." +msgstr "" -#: TurtleArt/tabasics.py:225 TurtleArt/tawindow.py:3862 -#: TurtleArt/tawindow.py:3868 TurtleArtActivity.py:604 -msgid "xcor" -msgstr "x-koord" +#. TRANS: Here, gear means a toothed wheel, as in a clock-works +#: taextras.py:264 +msgid "gear" +msgstr "" -#: TurtleArt/tabasics.py:226 +#: taextras.py:265 +msgid "Add a gear object to the project." +msgstr "" + +#: taextras.py:266 +msgid "density" +msgstr "" + +#: taextras.py:267 msgid "" -"holds current x-coordinate value of the turtle (can be used in place of a " -"number block)" +"Set the density property for objects (density can be any positive number)." msgstr "" -"hou die huidige x-koordinaat van die skilpad (kan gebruik word i.p.v. 'n " -"nommerblok)" -#: TurtleArt/tabasics.py:236 TurtleArt/tawindow.py:3862 -#: TurtleArt/tawindow.py:3868 TurtleArtActivity.py:605 -msgid "ycor" -msgstr "y-koord" +#: taextras.py:269 +msgid "friction" +msgstr "" -#: TurtleArt/tabasics.py:237 +#: taextras.py:270 msgid "" -"holds current y-coordinate value of the turtle (can be used in place of a " -"number block)" +"Set the friction property for objects (value from 0 to 1, where 0 turns " +"friction off and 1 is strong friction)." msgstr "" -"hou die huidige y-koordinaat van die skilpad (kan gebruik word i.p.v. 'n " -"nommerblok)" -#: TurtleArt/tabasics.py:247 TurtleArt/tawindow.py:3863 -#: TurtleArt/tawindow.py:3869 TurtleArtActivity.py:605 -msgid "heading" -msgstr "rigting" +#. TRANS: bounciness is coefficient of restitution +#: taextras.py:273 +msgid "bounciness" +msgstr "" -#: TurtleArt/tabasics.py:248 +#: taextras.py:274 msgid "" -"holds current heading value of the turtle (can be used in place of a number " -"block)" +"Set the bounciness property for objects (a value from 0 to 1, where 0 means " +"no bounce and 1 is very bouncy)." msgstr "" -"hou die huidige rigting van die skilpad (kan gebruik word i.p.v. 'n " -"nommerblok)" -#: TurtleArt/tabasics.py:282 -#, fuzzy -msgid "Palette of pen commands" -msgstr "palet van penbevele" +#. TRANS: dynamic here means moving vs in a fixed position +#: taextras.py:277 +msgid "dynamic" +msgstr "" -#: TurtleArt/tabasics.py:287 TurtleArt/tabasics.py:298 -msgid "fill screen" -msgstr "vul skerm" +#: taextras.py:278 +msgid "" +"If dynamic = 1, the object can move; if dynamic = 0, it is fixed in position." +msgstr "" -#: TurtleArt/tabasics.py:287 TurtleArt/tabasics.py:298 +#. TRANS: WeDo is a robotics product of the LEGO company +#: taextras.py:284 +msgid "Palette of WeDo blocks" +msgstr "" + +#: taextras.py:285 +msgid "WeDo" +msgstr "" + +#: taextras.py:286 +msgid "set current WeDo device" +msgstr "" + +#: taextras.py:287 +msgid "number of WeDo devices" +msgstr "" + +#: taextras.py:289 +msgid "" +"tilt sensor output: (-1 == no tilt, 0 == tilt forward, 3 == tilt back, 1 == " +"tilt left, 2 == tilt right)" +msgstr "" + +#. TRANS: This string is shorthand for "output of the distance sensor" +#: taextras.py:293 +msgid "distance sensor output" +msgstr "" + +#: taextras.py:294 +msgid "Motor A" +msgstr "" + +#: taextras.py:295 +msgid "returns the current value of Motor A" +msgstr "" + +#: taextras.py:296 +msgid "Motor B" +msgstr "" + +#: taextras.py:297 +msgid "returns the current value of Motor B" +msgstr "" + +#: taextras.py:298 +msgid "set the value for Motor A" +msgstr "" + +#: taextras.py:299 +msgid "set the value for Motor B" +msgstr "" + +#: taextras.py:300 +msgid "WeDo is unavailable" +msgstr "" + +#. TRANS: e.g., Wedo 2 is unavailable, defaulting to 1 +#: taextras.py:302 +#, python-format +msgid "WeDo %d is unavailable; defaulting to 1" +msgstr "" + +#. TRANS: %(device)s and %(wedo_number)d are substitution strings; +#. please leave untranslated +#: taextras.py:305 +#, python-format +msgid "%(device)s is unavailable on WeDo %(wedo_number)d" +msgstr "" + +#. TRANS: Lego NXT is a robotics product of the LEGO company +#: taextras.py:311 +msgid "Palette of LEGO NXT blocks of motors" +msgstr "" + +#: taextras.py:312 +msgid "Palette of LEGO NXT blocks of sensors" +msgstr "" + +#. TRANS: touch sensor (implemented as a button) +#: taextras.py:314 +msgid "touch" +msgstr "" + +#. TRANS: distance sensor (implemented using ultrasonics) +#: taextras.py:316 +msgid "ultrasonic" +msgstr "" + +#: taextras.py:317 TurtleArt/tabasics.py:287 TurtleArt/tabasics.py:298 #: TurtleArt/tabasics.py:348 #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1158 msgid "color" msgstr "kleur" -#: TurtleArt/tabasics.py:287 TurtleArt/tabasics.py:299 -#: TurtleArt/tabasics.py:358 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1154 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1159 -msgid "shade" -msgstr "skadu" +#: taextras.py:318 +#, fuzzy +msgid "light" +msgstr "regs" -#: TurtleArt/tabasics.py:291 TurtleArt/tabasics.py:303 -msgid "fills the background with (color, shade)" -msgstr "vul die agtergrond met (kleur, skadu)" +#: taextras.py:319 plugins/audio_sensors/audio_sensors.py:83 +#: plugins/audio_sensors/audio_sensors.py:98 pysamples/grecord.py:205 +msgid "sound" +msgstr "klank" -#: TurtleArt/tabasics.py:299 TurtleArt/tabasics.py:367 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1155 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1160 -msgid "gray" +#: taextras.py:320 +msgid "grey" msgstr "" -#: TurtleArt/tabasics.py:313 -msgid "set color" -msgstr "stel kleur" +#. TRANS: The brick is the NXT controller +#: taextras.py:322 +msgid "Please check the connection with the brick" +msgstr "" -#: TurtleArt/tabasics.py:317 -#, fuzzy -msgid "sets color of the line drawn by the turtle" -msgstr "stel die" +#: taextras.py:323 +#, python-format +msgid "Invalid port '%s'. Port must be: PORT A, B or C" +msgstr "" -#: TurtleArt/tabasics.py:325 -msgid "set shade" -msgstr "stel skadu" +#: taextras.py:324 +#, python-format +msgid "Invalid port '%s'. Port must be: PORT 1, 2, 3 or 4" +msgstr "" -#: TurtleArt/tabasics.py:329 -#, fuzzy -msgid "sets shade of the line drawn by the turtle" -msgstr "stel die skadu van die lyn wat die skilpad teken" +#: taextras.py:325 +msgid "The value of power must be between -127 to 127" +msgstr "" -#: TurtleArt/tabasics.py:337 -msgid "set gray" +#: taextras.py:326 +#, python-format +msgid "The parameter must be a integer, not '%s'" msgstr "" -#: TurtleArt/tabasics.py:340 -#, fuzzy -msgid "sets gray level of the line drawn by the turtle" -msgstr "stel die skadu van die lyn wat die skilpad teken" +#: taextras.py:327 +msgid "An error has occurred: check all connections and try to reconnect" +msgstr "" -#: TurtleArt/tabasics.py:349 -msgid "holds current pen color (can be used in place of a number block)" +#: taextras.py:328 +#, python-format +msgid "NXT found %s bricks" msgstr "" -"hou die huidige kleur van die pen (kan gebruk word i.p.v. 'n nommerblok)" -#: TurtleArt/tabasics.py:359 -msgid "holds current pen shade" +#: taextras.py:329 +msgid "NXT not found" msgstr "" -#: TurtleArt/tabasics.py:368 -#, fuzzy -msgid "holds current gray level (can be used in place of a number block)" -msgstr "hou die huidige skaal (kan gebruik word i.p.v. 'n nommerblok)" +#: taextras.py:330 +#, python-format +msgid "Brick number %s was not found" +msgstr "" -#: TurtleArt/tabasics.py:376 -msgid "pen up" -msgstr "pen op" +#: taextras.py:331 +msgid "refresh NXT" +msgstr "" -#: TurtleArt/tabasics.py:379 -#, fuzzy -msgid "Turtle will not draw when moved." -msgstr "skilpad sal nie teken wanneer hy geskuif word nie." +#: taextras.py:332 +msgid "Search for a connected NXT brick." +msgstr "" -#: TurtleArt/tabasics.py:385 -msgid "pen down" -msgstr "pen af" +#: taextras.py:333 +msgid "NXT" +msgstr "" -#: TurtleArt/tabasics.py:388 -#, fuzzy -msgid "Turtle will draw when moved." -msgstr "skilpad sal teken wanneer hy geskuif word." +#: taextras.py:334 +msgid "set current NXT device" +msgstr "" -#: TurtleArt/tabasics.py:394 -msgid "set pen size" -msgstr "stel pengrootte" +#: taextras.py:335 +msgid "number of NXT devices" +msgstr "" -#: TurtleArt/tabasics.py:398 -#, fuzzy -msgid "sets size of the line drawn by the turtle" -msgstr "stel die grootte van die lyn wat die skilpad teken" +#: taextras.py:336 +msgid "brick name" +msgstr "" -#: TurtleArt/tabasics.py:408 -msgid "start fill" +#: taextras.py:337 +msgid "Get the name of a brick." msgstr "" -#: TurtleArt/tabasics.py:410 -msgid "starts filled polygon (used with end fill block)" +#: taextras.py:338 +msgid "play tone" msgstr "" -#: TurtleArt/tabasics.py:417 -msgid "end fill" +#: taextras.py:339 +msgid "frequency" msgstr "" -#: TurtleArt/tabasics.py:419 -msgid "completes filled polygon (used with start fill block)" +#: taextras.py:340 plugins/turtle_blocks_extras/turtle_blocks_extras.py:445 +msgid "time" msgstr "" -#: TurtleArt/tabasics.py:426 -msgid "pen size" -msgstr "pengrootte" +#: taextras.py:341 +msgid "Play a tone at frequency for time." +msgstr "" -#: TurtleArt/tabasics.py:427 -msgid "holds current pen size (can be used in place of a number block)" -msgstr "hou die huidige pengrootte (kan gebruk word i.p.v. 'n nommerblok)" +#. TRANS: turn is the action +#: taextras.py:343 +msgid "" +"turn motor\n" +"\n" +msgstr "" -#: TurtleArt/tabasics.py:441 -#, fuzzy -msgid "Palette of pen colors" -msgstr "palet van penbevele" +#: taextras.py:344 +msgid "port" +msgstr "" -#: TurtleArt/tabasics.py:443 +#: taextras.py:345 +msgid "power" +msgstr "" + +#. TRANS: rotations is quantity of turns +#: taextras.py:347 +msgid "rotations" +msgstr "" + +#: taextras.py:348 +msgid "turn a motor" +msgstr "" + +#: taextras.py:349 +msgid "" +"synchronize\n" +"\n" +"motors" +msgstr "" + +#: taextras.py:350 +msgid "steering" +msgstr "" + +#: taextras.py:351 +msgid "synchronize two motors connected in PORT B and PORT C" +msgstr "" + +#: taextras.py:352 +msgid "PORT A" +msgstr "" + +#: taextras.py:353 +msgid "PORT A of the brick" +msgstr "" + +#: taextras.py:354 +msgid "PORT B" +msgstr "" + +#: taextras.py:355 +msgid "PORT B of the brick" +msgstr "" + +#: taextras.py:356 +msgid "PORT C" +msgstr "" + +#: taextras.py:357 +msgid "PORT C of the brick" +msgstr "" + +#: taextras.py:358 +msgid "start motor" +msgstr "" + +#: taextras.py:359 +msgid "Run a motor forever." +msgstr "" + +#: taextras.py:360 +msgid "brake motor" +msgstr "" + +#: taextras.py:361 +msgid "Stop a specified motor." +msgstr "" + +#. TRANS: reset is used to reset the counter associated with the motor +#: taextras.py:363 +msgid "reset motor" +msgstr "" + +#: taextras.py:364 +msgid "Reset the motor counter." +msgstr "" + +#: taextras.py:365 +msgid "motor position" +msgstr "" + +#: taextras.py:366 +msgid "Get the motor position." +msgstr "" + +#: taextras.py:367 +msgid "PORT 1" +msgstr "" + +#: taextras.py:368 +msgid "PORT 1 of the brick" +msgstr "" + +#: taextras.py:369 #, fuzzy -msgid "red" +msgid "read" msgstr "rooi" -#: TurtleArt/tabasics.py:444 -#, fuzzy -msgid "orange" -msgstr "oranje" +#: taextras.py:370 +msgid "sensor" +msgstr "" -#: TurtleArt/tabasics.py:446 -#, fuzzy -msgid "yellow" -msgstr "geel" +#: taextras.py:371 +msgid "Read sensor output." +msgstr "" -#: TurtleArt/tabasics.py:448 -msgid "green" +#: taextras.py:372 +msgid "PORT 2" msgstr "" -#: TurtleArt/tabasics.py:449 -msgid "cyan" +#: taextras.py:373 +msgid "PORT 2 of the brick" msgstr "" -#: TurtleArt/tabasics.py:450 -msgid "blue" +#: taextras.py:374 +msgid "light sensor" msgstr "" -#: TurtleArt/tabasics.py:451 -msgid "purple" +#: taextras.py:375 +msgid "grey sensor" msgstr "" -#: TurtleArt/tabasics.py:453 -msgid "white" +#: taextras.py:376 +msgid "PORT 3" msgstr "" -#: TurtleArt/tabasics.py:454 -#, fuzzy -msgid "black" -msgstr "agtertoe" +#: taextras.py:377 +msgid "PORT 3 of the brick" +msgstr "" -#: TurtleArt/tabasics.py:460 -msgid "set text color" -msgstr "stel tekskleur" +#: taextras.py:378 +msgid "touch sensor" +msgstr "" -#: TurtleArt/tabasics.py:463 -#, fuzzy -msgid "sets color of text drawn by the turtle" -msgstr "stel die kleur van die lyn wat die skilpad teken" +#: taextras.py:379 +msgid "distance sensor" +msgstr "" -#: TurtleArt/tabasics.py:471 -msgid "set text size" -msgstr "stel teksgrootte" +#: taextras.py:380 +msgid "PORT 4" +msgstr "" -#: TurtleArt/tabasics.py:474 -#, fuzzy -msgid "sets size of text drawn by the turtle" -msgstr "stel die grootte van die teks wat die skilpad teken" +#: taextras.py:381 +msgid "PORT 4 of the brick" +msgstr "" -#: TurtleArt/tabasics.py:557 -#, fuzzy -msgid "Palette of numeric operators" -msgstr "palet van numeriese bewerkers" +#: taextras.py:382 +msgid "sound sensor" +msgstr "" -#: TurtleArt/tabasics.py:563 -msgid "plus" +#: taextras.py:383 +msgid "color sensor" msgstr "" -#: TurtleArt/tabasics.py:567 +#. TRANS: set light is used to set the light level associated with +#. the color sensor (which can emit light as well as sense it) +#: taextras.py:386 +msgid "set light" +msgstr "" + +#: taextras.py:387 +msgid "Set color sensor light." +msgstr "" + +#. TRANS: the battery level is the charge level of the brick +#: taextras.py:389 +msgid "battery level" +msgstr "" + +#: taextras.py:390 +msgid "Get battery level of the brick" +msgstr "" + +#. TRANS: Arduino plugin to control an Arduino board +#: taextras.py:395 +msgid "HIGH" +msgstr "" + +#: taextras.py:396 +msgid "LOW" +msgstr "" + +#: taextras.py:397 +msgid "INPUT" +msgstr "" + +#: taextras.py:398 +msgid "OUTPUT" +msgstr "" + +#. TRANS: PWM is pulse-width modulation +#: taextras.py:400 +msgid "PWM" +msgstr "" + +#: taextras.py:401 +msgid "SERVO" +msgstr "" + +#: taextras.py:402 +msgid "ERROR: Check the Arduino and the number of port." +msgstr "" + +#: taextras.py:403 +msgid "ERROR: Value must be a number from 0 to 255." +msgstr "" + +#: taextras.py:404 +msgid "ERROR: Value must be either HIGH or LOW." +msgstr "" + +#: taextras.py:405 +msgid "ERROR: The mode must be either INPUT, OUTPUT, PWM or SERVO." +msgstr "" + +#: taextras.py:406 +msgid "refresh Arduino" +msgstr "" + +#: taextras.py:407 +msgid "Search for connected Arduinos." +msgstr "" + +#: taextras.py:408 +msgid "Arduino" +msgstr "" + +#: taextras.py:409 +msgid "set current Arduino board" +msgstr "" + +#: taextras.py:410 +msgid "number of Arduinos" +msgstr "" + +#: taextras.py:411 +msgid "number of Arduino boards" +msgstr "" + +#: taextras.py:412 +msgid "Arduino name" +msgstr "" + +#: taextras.py:413 +msgid "Get the name of an Arduino." +msgstr "" + +#. TRANS: pin mode is used to specify the mode (INPUT, OUTPUT, etc) +#. in which an I/O pin is being used. +#: taextras.py:416 +msgid "pin mode" +msgstr "" + +#: taextras.py:418 #, fuzzy -msgid "adds two alphanumeric inputs" -msgstr "tel twee numeriese insetwaardes bymekaar" +msgid "mode" +msgstr "modulo" -#: TurtleArt/tabasics.py:575 -msgid "minus" +#: taextras.py:419 +msgid "Select the pin function (INPUT, OUTPUT, PWM, SERVO)." msgstr "" -#: TurtleArt/tabasics.py:578 -msgid "subtracts bottom numeric input from top numeric input" -msgstr "trek die onderste numeriese insetwaarde van die boonste een af" +#: taextras.py:420 +msgid "analog write" +msgstr "" -#: TurtleArt/tabasics.py:589 -msgid "multiply" +#: taextras.py:421 TurtleArt/tabasics.py:928 TurtleArt/tawindow.py:4189 +msgid "value" msgstr "" -#: TurtleArt/tabasics.py:592 -msgid "multiplies two numeric inputs" -msgstr "vermenigvuldig twee numeriese insetwaardes" +#: taextras.py:422 +msgid "Write analog value in specified port." +msgstr "" -#: TurtleArt/tabasics.py:601 -msgid "divide" +#: taextras.py:423 +msgid "analog read" msgstr "" -#: TurtleArt/tabasics.py:604 +#: taextras.py:424 msgid "" -"divides top numeric input (numerator) by bottom numeric input (denominator)" +"Read value from analog port. Value may be between 0 and 1023. Use Vref to " +"determine voltage. For USB, volt=((read)*5)/1024) approximately." msgstr "" -"deel die boonste numeriese insetwaarde (teller) deur die onderste een " -"(noemer)" -#: TurtleArt/tabasics.py:614 -msgid "identity" +#: taextras.py:426 +msgid "digital write" msgstr "" -#: TurtleArt/tabasics.py:616 -msgid "identity operator used for extending blocks" -msgstr "identitietsbewerker om blokke uit te brei" +#: taextras.py:427 +msgid "Write digital value to specified port." +msgstr "" -#: TurtleArt/tabasics.py:624 TurtleArt/tabasics.py:625 -msgid "mod" -msgstr "modulo" +#: taextras.py:428 +msgid "digital read" +msgstr "" -#: TurtleArt/tabasics.py:628 -msgid "modular (remainder) operator" -msgstr "modulêre (reswaarde) operateur" +#: taextras.py:429 +msgid "Read value from digital port." +msgstr "" -#: TurtleArt/tabasics.py:635 -msgid "√" +#: taextras.py:430 +msgid "Set HIGH value for digital port." msgstr "" -#: TurtleArt/tabasics.py:636 -msgid "square root" +#: taextras.py:431 +msgid "Configure Arduino port for digital input." msgstr "" -#: TurtleArt/tabasics.py:639 -#, fuzzy -msgid "calculates square root" -msgstr "werk die vierkantswortel uit" +#: taextras.py:432 +msgid "Configure Arduino port to drive a servo." +msgstr "" -#: TurtleArt/tabasics.py:646 -msgid "random" -msgstr "ewekansig" +#: taextras.py:433 +msgid "Set LOW value for digital port." +msgstr "" -#: TurtleArt/tabasics.py:646 -msgid "min" -msgstr "min" +#: taextras.py:434 +msgid "Configure Arduino port for digital output." +msgstr "" -#: TurtleArt/tabasics.py:646 -msgid "max" -msgstr "maks" +#: taextras.py:435 +msgid "Configure Arduino port for PWM (pulse-width modulation)." +msgstr "" -#: TurtleArt/tabasics.py:650 -#, fuzzy -msgid "returns random number between minimum (top) and maximum (bottom) values" +#. TRANS: plugin to control an ExpEyes device +#: taextras.py:440 +msgid "Palette of Expeyes blocks" msgstr "" -"gee 'n ewekansige nommerwaarde tussen minimum- (links) en maksimumwaardes " -"(regs)" -#: TurtleArt/tabasics.py:662 -msgid "number" -msgstr "syfer" +#. TRANS: Programmable voltage output +#: taextras.py:442 +msgid "set PVS" +msgstr "" -#: TurtleArt/tabasics.py:663 -msgid "used as numeric input in mathematic operators" -msgstr "gebruik as numeriese insetwaarde in wiskundige operateurs" +#: taextras.py:443 +msgid "set programmable voltage output" +msgstr "" -#: TurtleArt/tabasics.py:671 -msgid "greater than" +#. TRANS: Square wave 1 voltage output +#: taextras.py:445 +msgid "set SQR1 voltage" msgstr "" -#: TurtleArt/tabasics.py:674 -msgid "logical greater-than operator" -msgstr "logiese groter-as bewerker" +#: taextras.py:446 +msgid "set square wave 1 voltage output" +msgstr "" -#: TurtleArt/tabasics.py:683 -msgid "less than" +#. TRANS: Square wave 2 voltage output +#: taextras.py:448 +msgid "set SQR2 voltage" msgstr "" -#: TurtleArt/tabasics.py:687 -msgid "logical less-than operator" -msgstr "logiese kleiner-as bewerker" +#: taextras.py:449 +msgid "set square wave 2 voltage output" +msgstr "" -#: TurtleArt/tabasics.py:695 -msgid "equal" +#. TRANS: Digital output level +#: taextras.py:451 +msgid "set OD1" msgstr "" -#: TurtleArt/tabasics.py:699 -msgid "logical equal-to operator" -msgstr "logiese gelyk-aan bewerker" +#: taextras.py:452 +msgid "set digital output level (OD1) low (0) or high (1)" +msgstr "" -#: TurtleArt/tabasics.py:705 -msgid "not" -msgstr "NIE" +#. TRANS: Input 1 voltage level +#: taextras.py:454 +msgid "IN1 level" +msgstr "" -#: TurtleArt/tabasics.py:708 -msgid "logical NOT operator" -msgstr "logiese NIE-bewerker" +#: taextras.py:455 +msgid "" +"returns 1 if IN1 voltage level >2.5 volts, 0 if IN1 voltage level <= 2.5 " +"volts" +msgstr "" -#: TurtleArt/tabasics.py:714 TurtleArt/tabasics.py:717 -msgid "and" -msgstr "EN" +#. TRANS: Input 2 voltage level +#: taextras.py:458 +msgid "IN2 level" +msgstr "" -#: TurtleArt/tabasics.py:718 -msgid "logical AND operator" -msgstr "logiese EN-bewerker" +#: taextras.py:459 +msgid "" +"returns 1 if IN2 voltage level >2.5 volts, 0 if IN2 voltage level <= 2.5 " +"volts" +msgstr "" -#: TurtleArt/tabasics.py:725 TurtleArt/tabasics.py:728 -msgid "or" -msgstr "OF" +#. TRANS: Resistive sensor voltage level +#: taextras.py:462 +msgid "SEN level" +msgstr "" -#: TurtleArt/tabasics.py:729 -msgid "logical OR operator" -msgstr "logiese OF-bewerker" +#: taextras.py:463 +msgid "" +"returns 1 if resistive sensor (SEN) voltage level > 2.5 volts, 0 if SEN " +"voltage level <= 2.5 volts" +msgstr "" -#: TurtleArt/tabasics.py:738 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:98 +#: taextras.py:465 +msgid "capture" +msgstr "" + +#: taextras.py:466 +msgid "input" +msgstr "" + +#: taextras.py:467 #, fuzzy -msgid "Palette of flow operators" -msgstr "palet van vloeibewerkers" +msgid "samples" +msgstr "" +"#-#-#-#-# af.po (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# af.po (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# af.po (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# af.po (TURTLEART) #-#-#-#-#\n" +"Voorbeelde" -#: TurtleArt/tabasics.py:743 -msgid "wait" -msgstr "wag" +#: taextras.py:468 +msgid "interval" +msgstr "" -#: TurtleArt/tabasics.py:747 -msgid "pauses program execution a specified number of seconds" +#. TRANS: MS is microseconds +#: taextras.py:470 +msgid "" +"capture multiple samples from input at interval (MS); results pushed to FIFO" msgstr "" -#: TurtleArt/tabasics.py:754 -msgid "forever" -msgstr "vir altyd" +#. TRANS: Analog input 1 voltage level +#: taextras.py:473 +msgid "A1" +msgstr "" -#: TurtleArt/tabasics.py:758 -#, fuzzy -msgid "loops forever" -msgstr "gaan vir altyd in 'n lus in" +#: taextras.py:474 +msgid "read analog input 1 voltage" +msgstr "" -#: TurtleArt/tabasics.py:765 TurtleArt/tabasics.py:769 -msgid "repeat" -msgstr "herhaal" +#. TRANS: Analog input 2 voltage level +#: taextras.py:476 +msgid "A2" +msgstr "" -#: TurtleArt/tabasics.py:770 -#, fuzzy -msgid "loops specified number of times" -msgstr "gaan 'n gespesifiseerde hoeveelheid kere in 'n lus in" +#: taextras.py:477 +msgid "read analog input 2 voltage" +msgstr "" -#: TurtleArt/tabasics.py:776 TurtleArt/tabasics.py:789 -msgid "if" -msgstr "as" +#. TRANS: Read input 1 voltage +#: taextras.py:479 +msgid "IN1" +msgstr "" -#: TurtleArt/tabasics.py:776 TurtleArt/tabasics.py:789 -msgid "then" -msgstr "dan" +#: taextras.py:480 +msgid "read input 1 voltage" +msgstr "" -#: TurtleArt/tabasics.py:779 -msgid "if then" +#. TRANS: Read input 2 voltage +#: taextras.py:482 +msgid "IN2" msgstr "" -#: TurtleArt/tabasics.py:781 -msgid "if-then operator that uses boolean operators from Numbers palette" -msgstr "AS-DAN-bewerker wat boolse bewerkers van die Syferpalet gebruik" +#: taextras.py:483 +msgid "read input 2 voltage" +msgstr "" -#: TurtleArt/tabasics.py:789 -msgid "else" -msgstr "andersins" +#. TRANS: Read analog sensor input voltage +#: taextras.py:485 +msgid "SEN" +msgstr "" -#: TurtleArt/tabasics.py:793 TurtleArt/tabasics.py:801 -msgid "if then else" +#: taextras.py:486 +msgid "read analog sensor input voltage" msgstr "" -#: TurtleArt/tabasics.py:794 TurtleArt/tabasics.py:802 -msgid "if-then-else operator that uses boolean operators from Numbers palette" -msgstr "AS-DAN-ANDERS-bewerker wat boolse bewerkers van die Syferpalet gebruik" +#. TRANS: Read square wave 1 input voltage +#: taextras.py:488 +msgid "SQR1" +msgstr "" -#: TurtleArt/tabasics.py:811 -msgid "horizontal space" +#: taextras.py:489 +msgid "read square wave 1 voltage" msgstr "" +#. TRANS: Read square wave 2 input voltage +#: taextras.py:491 +msgid "SQR2" +msgstr "" + +#: taextras.py:492 +msgid "read square wave 2 voltage" +msgstr "" + +#. TRANS: Read programmable voltage +#: taextras.py:494 +msgid "PVS" +msgstr "" + +#: taextras.py:495 +msgid "read programmable voltage" +msgstr "" + +#: taextras.py:496 +msgid "Expeyes device not found" +msgstr "" + +#: TurtleArt/taconstants.py:209 TurtleArt/taconstants.py:231 +#: TurtleArt/taconstants.py:252 TurtleArt/taconstants.py:294 +#: TurtleArt/taconstants.py:336 TurtleArt/taconstants.py:378 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:963 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:978 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:993 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1008 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1023 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1038 +#, fuzzy +msgid "Title" +msgstr "titel" + +#: TurtleArt/tabasics.py:446 +#, fuzzy +msgid "yellow" +msgstr "geel" + +#: TurtleArt/tabasics.py:781 +msgid "if-then operator that uses boolean operators from Numbers palette" +msgstr "AS-DAN-bewerker wat boolse bewerkers van die Syferpalet gebruik" + #: TurtleArt/tabasics.py:812 #, fuzzy msgid "jogs stack right" msgstr "skuif stapel regs" -#: TurtleArt/tabasics.py:819 -msgid "vertical space" -msgstr "" +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:141 +msgid "Sugar Journal media object" +msgstr "Sugar Joernaal media-objek" + +#: TurtleArt/tabasics.py:919 +msgid "box 2" +msgstr "hokkie 2" + +#: TurtleArt/tabasics.py:909 +msgid "box 1" +msgstr "hokkie 1" + +#: TurtleArtActivity.py:682 TurtleArtActivity.py:892 turtleblocks.py:401 +msgid "Step" +msgstr "Stap" + +#: TurtleArt/tabasics.py:592 +msgid "multiplies two numeric inputs" +msgstr "vermenigvuldig twee numeriese insetwaardes" + +#: TurtleArtActivity.py:280 TurtleArtActivity.py:882 turtleblocks.py:392 +msgid "Hide palette" +msgstr "Versteek palet" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:165 +msgid "Sugar Journal video object" +msgstr "Sugar Joernaal video-objek" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:881 +msgid "xcor of right of screen" +msgstr "x-koordinaat van die regterkant van die skerm" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:457 +#, fuzzy +msgid "Palette of extra options" +msgstr "palet van ekstra opsies" + +#: TurtleArt/tabasics.py:247 TurtleArt/tawindow.py:3863 +#: TurtleArt/tawindow.py:3869 TurtleArtActivity.py:605 +msgid "heading" +msgstr "rigting" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:198 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:211 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:226 +#, fuzzy +msgid "draws text or show media from the Journal" +msgstr "teken teks of wys media van die Joernaal" #: TurtleArt/tabasics.py:820 #, fuzzy msgid "jogs stack down" msgstr "skuif stapel af" +#: TurtleArt/tabasics.py:628 +msgid "modular (remainder) operator" +msgstr "modulêre (reswaarde) operateur" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:949 +#, fuzzy +msgid "bottom y" +msgstr "onderkant" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:624 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:640 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:656 +msgid "runs code found in the tamyblock.py module found in the Journal" +msgstr "" +"voer die kode uit wat in die tamyblock.py module onder die Joernaal gevind " +"word" + +#: TurtleArt/tabasics.py:385 +msgid "pen down" +msgstr "pen af" + +#: TurtleArt/tabasics.py:743 +msgid "wait" +msgstr "wag" + +#: TurtleArt/tabasics.py:928 TurtleArt/tabasics.py:942 +msgid "box" +msgstr "hokkie" + +#: TurtleArt/tabasics.py:876 TurtleArt/tawindow.py:4139 +#, fuzzy +msgid "invokes named action stack" +msgstr "roep die beoemde aksiestapel in" + +#: TurtleArt/tabasics.py:860 TurtleArt/tabasics.py:863 +#: TurtleArt/tabasics.py:871 TurtleArt/tabasics.py:875 +#: TurtleArt/tawindow.py:1292 TurtleArt/tawindow.py:1371 +#: TurtleArt/tawindow.py:1384 TurtleArt/tawindow.py:1854 +#: TurtleArt/tawindow.py:4125 +msgid "action" +msgstr "aksie" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:117 +#, fuzzy +msgid "do-until-True operator that uses boolean operators from Numbers palette" +msgstr "AS-DAN-ANDERS-bewerker wat boolse bewerkers van die Syferpalet gebruik" + +#: TurtleArt/tabasics.py:922 +#, fuzzy +msgid "Variable 2 (numeric value)" +msgstr "veranderlike 2" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:873 +msgid "the canvas width" +msgstr "wydte van die werksoppervlak" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:519 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:529 +#, fuzzy +msgid "empty heap?" +msgstr "maak hoop skoon" + +#: TurtleArt/tabasics.py:948 TurtleArt/tawindow.py:4166 +msgid "named variable (numeric value)" +msgstr "benoemde veranderlike" + +#: TurtleArt/tawindow.py:1000 TurtleArt/tawindow.py:1470 +#, fuzzy +msgid "next" +msgstr "teks" + +#: TurtleArt/tabasics.py:394 +msgid "set pen size" +msgstr "stel pengrootte" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:819 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:981 +msgid "presentation template: select Journal object (no description)" +msgstr "voorleggingstemplaat: Kies 'n Joernaalobjek (sonder beskrywing)" + +#: TurtleArt/tabasics.py:958 +#, fuzzy +msgid "top of Action 1 stack" +msgstr "bokant van aksie 1 stapel" + +#: TurtleArt/tabasics.py:738 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:98 +#, fuzzy +msgid "Palette of flow operators" +msgstr "palet van vloeibewerkers" + +#: TurtleArt/tabasics.py:794 TurtleArt/tabasics.py:802 +msgid "if-then-else operator that uses boolean operators from Numbers palette" +msgstr "AS-DAN-ANDERS-bewerker wat boolse bewerkers van die Syferpalet gebruik" + +# +#: TurtleArt/tabasics.py:213 +msgid "set heading" +msgstr "stel rigting" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:774 +#, fuzzy +msgid "declutters canvas by hiding blocks" +msgstr "maak werksoppervlak skoon deur blokke te versteek" + +#: TurtleArt/tabasics.py:856 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:189 +msgid "string value" +msgstr "stringwaarde" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:175 +msgid "description" +msgstr "beskrywing" + +#: TurtleArt/tabasics.py:471 +msgid "set text size" +msgstr "stel teksgrootte" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:833 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1026 +msgid "presentation template: select four Journal objects" +msgstr "voorleggingstemplaat: Kies vier Joernaalobjekte" + +#: TurtleArt/tabasics.py:340 +#, fuzzy +msgid "sets gray level of the line drawn by the turtle" +msgstr "stel die skadu van die lyn wat die skilpad teken" + #: TurtleArt/tabasics.py:826 msgid "stop action" msgstr "stop aksie" -#: TurtleArt/tabasics.py:829 -msgid "stops current action" +#: TurtleArt/tabasics.py:287 TurtleArt/tabasics.py:299 +#: TurtleArt/tabasics.py:358 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1154 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1159 +msgid "shade" +msgstr "skadu" + +#: TurtleArt/tabasics.py:291 TurtleArt/tabasics.py:303 +msgid "fills the background with (color, shade)" +msgstr "vul die agtergrond met (kleur, skadu)" + +#: TurtleArt/tabasics.py:376 +msgid "pen up" +msgstr "pen op" + +#: TurtleArt/tabasics.py:444 +#, fuzzy +msgid "orange" +msgstr "oranje" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:467 +#, fuzzy +msgid "pushes value onto FILO (first-in last-out heap)" +msgstr "druk die waarde op die EILU (eerste-in-laaste-uit) stapel" + +#: TurtleArt/tabasics.py:776 TurtleArt/tabasics.py:789 +msgid "then" +msgstr "dan" + +#: TurtleArt/tabasics.py:705 +msgid "not" +msgstr "NIE" + +#: TurtleArt/tabasics.py:178 +#, fuzzy +msgid "turns turtle clockwise (angle in degrees)" +msgstr "draai die skilpad kloksgewys (gee die hoek in grade)" + +#: TurtleArt/tabasics.py:368 +#, fuzzy +msgid "holds current gray level (can be used in place of a number block)" +msgstr "hou die huidige skaal (kan gebruik word i.p.v. 'n nommerblok)" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:857 +msgid "xcor of left of screen" +msgstr "x-koordinaat van die linkerkant van die skerm" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:685 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:756 +#, fuzzy +msgid "turtle" +msgstr "Skilpad" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:772 +msgid "hide blocks" +msgstr "versteek blokke" + +#: TurtleArt/tabasics.py:687 +msgid "logical less-than operator" +msgstr "logiese kleiner-as bewerker" + +#: TurtleArt/tabasics.py:883 +msgid "store in box 1" +msgstr "stoor in hokkie 1" + +#: TurtleArt/tabasics.py:896 +msgid "store in box 2" +msgstr "stoor in hokkie 2" + +#: TurtleArt/tabasics.py:226 +msgid "" +"holds current x-coordinate value of the turtle (can be used in place of a " +"number block)" msgstr "" +"hou die huidige x-koordinaat van die skilpad (kan gebruik word i.p.v. 'n " +"nommerblok)" -#: TurtleArt/tabasics.py:838 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:549 +msgid "print" +msgstr "druk" + +#: TurtleArtActivity.py:166 TurtleArtActivity.py:709 TurtleArtActivity.py:823 +#: TurtleArtActivity.py:853 turtleblocks.py:360 +msgid "Save as Logo" +msgstr "Stoor as Logo" + +#: TurtleArt/tabasics.py:317 #, fuzzy -msgid "Palette of variable blocks" -msgstr "palet van veranderlike blokke" +msgid "sets color of the line drawn by the turtle" +msgstr "stel die" -#: TurtleArt/tabasics.py:843 pysamples/grecord.py:213 -msgid "start" -msgstr "begin" +#: TurtleArt/tabasics.py:460 +msgid "set text color" +msgstr "stel tekskleur" + +#: TurtleArt/tabasics.py:662 +msgid "number" +msgstr "syfer" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:124 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:715 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:886 +msgid "top" +msgstr "bokant" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:234 +msgid "set scale" +msgstr "stel skaal" #: TurtleArt/tabasics.py:846 msgid "connects action to toolbar run buttons" msgstr "koppel die aksie aan die die nutsbalk se uitvoerknoppies" +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:897 +msgid "the canvas height" +msgstr "hoogte van die werksoppervlak" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:994 +#, fuzzy +msgid "presentation 2x1" +msgstr "voorlegging" + +#: TurtleArt/tabasics.py:714 TurtleArt/tabasics.py:717 +msgid "and" +msgstr "EN" + +#: TurtleArt/tabasics.py:427 +msgid "holds current pen size (can be used in place of a number block)" +msgstr "hou die huidige pengrootte (kan gebruk word i.p.v. 'n nommerblok)" + +#: TurtleArt/tabasics.py:313 +msgid "set color" +msgstr "stel kleur" + +#: TurtleArt/tabasics.py:646 +msgid "min" +msgstr "min" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:724 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:735 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:746 +#, fuzzy +msgid "loads a block" +msgstr "laai my blok" + +#: TurtleArt/tabasics.py:282 +#, fuzzy +msgid "Palette of pen commands" +msgstr "palet van penbevele" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:480 +#, fuzzy +msgid "shows values in FILO (first-in last-out heap)" +msgstr "druk die waarde op die EILU (eerste-in-laaste-uit) stapel" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:107 +#, fuzzy +msgid "do-while-True operator that uses boolean operators from Numbers palette" +msgstr "AS-DAN-ANDERS-bewerker wat boolse bewerkers van die Syferpalet gebruik" + +#: TurtleArt/tabasics.py:708 +msgid "logical NOT operator" +msgstr "logiese NIE-bewerker" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:865 +msgid "ycor of bottom of screen" +msgstr "y-koordinaat van die onderkant van die skerm" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:826 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:966 +msgid "presentation template: select Journal object (with description)" +msgstr "voorleggingstemplaat: Kies 'n Joernaalobjek (met beskrywing)" + +#: TurtleArt/tabasics.py:557 +#, fuzzy +msgid "Palette of numeric operators" +msgstr "palet van numeriese bewerkers" + +#: TurtleArt/tabasics.py:754 +msgid "forever" +msgstr "vir altyd" + +#: TurtleArt/tabasics.py:329 +#, fuzzy +msgid "sets shade of the line drawn by the turtle" +msgstr "stel die skadu van die lyn wat die skilpad teken" + +#: TurtleArt/tabasics.py:151 +msgid "clean" +msgstr "maak skoon" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:840 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:847 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:996 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1011 +msgid "presentation template: select two Journal objects" +msgstr "voorleggingstemplaat: Kies twee Joernaalobjekte" + +#: TurtleArtActivity.py:611 TurtleArtActivity.py:757 turtleblocks.py:372 +#, fuzzy +msgid "Grow blocks" +msgstr "Wys blokke" + +#: TurtleArtActivity.py:594 TurtleArtActivity.py:748 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:789 +msgid "Fullscreen" +msgstr "Volskerm" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:194 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:222 +msgid "show" +msgstr "wys" + #: TurtleArt/tabasics.py:853 TurtleArt/tabasics.py:854 #: TurtleArt/tabasics.py:855 #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:186 @@ -608,121 +1943,655 @@ msgstr "koppel die aksie aan die die nutsbalk se uitvoerknoppies" msgid "text" msgstr "teks" -#: TurtleArt/tabasics.py:856 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:189 -msgid "string value" -msgstr "stringwaarde" +#: TurtleArt/tabasics.py:646 +msgid "random" +msgstr "ewekansig" -#: TurtleArt/tabasics.py:860 TurtleArt/tabasics.py:863 -#: TurtleArt/tabasics.py:871 TurtleArt/tabasics.py:875 -#: TurtleArt/tawindow.py:1292 TurtleArt/tawindow.py:1371 -#: TurtleArt/tawindow.py:1384 TurtleArt/tawindow.py:1854 -#: TurtleArt/tawindow.py:4125 -msgid "action" -msgstr "aksie" +#: TurtleArt/tabasics.py:674 +msgid "logical greater-than operator" +msgstr "logiese groter-as bewerker" -#: TurtleArt/tabasics.py:865 -msgid "top of nameable action stack" -msgstr "bokant van benoembare aksiestapel" +#: TurtleArt/tabasics.py:166 +#, fuzzy +msgid "turns turtle counterclockwise (angle in degrees)" +msgstr "draai die skilpad anti-kloksgewys (gee die hoek in grade)" -#: TurtleArt/tabasics.py:876 TurtleArt/tawindow.py:4139 +#: TurtleArt/tabasics.py:454 #, fuzzy -msgid "invokes named action stack" -msgstr "roep die beoemde aksiestapel in" +msgid "black" +msgstr "agtertoe" -#: TurtleArt/tabasics.py:883 -msgid "store in box 1" -msgstr "stoor in hokkie 1" +#: TurtleArt/tabasics.py:639 +#, fuzzy +msgid "calculates square root" +msgstr "werk die vierkantswortel uit" + +#: TurtleArt/tabasics.py:237 +msgid "" +"holds current y-coordinate value of the turtle (can be used in place of a " +"number block)" +msgstr "" +"hou die huidige y-koordinaat van die skilpad (kan gebruik word i.p.v. 'n " +"nommerblok)" + +#: pysamples/grecord.py:215 +#, fuzzy +msgid "stop" +msgstr "bokant" + +#: TurtleArt/tabasics.py:225 TurtleArt/tawindow.py:3862 +#: TurtleArt/tawindow.py:3868 TurtleArtActivity.py:604 +msgid "xcor" +msgstr "x-koord" + +#: TurtleArtActivity.py:687 turtleblocks.py:408 util/helpbutton.py:45 +msgid "Help" +msgstr "Hulp" + +#: TurtleArt/tabasics.py:463 +#, fuzzy +msgid "sets color of text drawn by the turtle" +msgstr "stel die kleur van die lyn wat die skilpad teken" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:388 +msgid "keyboard" +msgstr "sleutelbord" + +#: TurtleArt/tabasics.py:186 +msgid "arc" +msgstr "boog" + +#: TurtleArt/tabasics.py:186 +msgid "radius" +msgstr "radius" + +#: TurtleArt/tabasics.py:325 +msgid "set shade" +msgstr "stel skadu" + +#: TurtleArt/tabasics.py:718 +msgid "logical AND operator" +msgstr "logiese EN-bewerker" + +#: TurtleArtActivity.py:681 TurtleArtActivity.py:890 turtleblocks.py:400 +msgid "Run" +msgstr "Voer uit" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:477 +msgid "show heap" +msgstr "wys die hoop" + +#: TurtleArt/tabasics.py:217 +#, fuzzy +msgid "sets the heading of the turtle (0 is towards the top of the screen.)" +msgstr "stel die rigting van die skilpad (0 is na die bokant van die skerm.)" + +#: gnome_plugins/uploader_plugin.py:120 +#, fuzzy +msgid "Title:" +msgstr "Titel:" + +#: TurtleArt/tabasics.py:838 +#, fuzzy +msgid "Palette of variable blocks" +msgstr "palet van veranderlike blokke" + +#: TurtleArt/tabasics.py:663 +msgid "used as numeric input in mathematic operators" +msgstr "gebruik as numeriese insetwaarde in wiskundige operateurs" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1024 +#, fuzzy +msgid "presentation 2x2" +msgstr "voorlegging" + +#: TurtleArt/tabasics.py:912 +#, fuzzy +msgid "Variable 1 (numeric value)" +msgstr "veranderlike 1" + +#: TurtleArt/tabasics.py:567 +#, fuzzy +msgid "adds two alphanumeric inputs" +msgstr "tel twee numeriese insetwaardes bymekaar" + +#: TurtleArt/tabasics.py:789 +msgid "else" +msgstr "andersins" + +#: TurtleArt/tabasics.py:379 +#, fuzzy +msgid "Turtle will not draw when moved." +msgstr "skilpad sal nie teken wanneer hy geskuif word nie." + +#. #-#-#-#-# af.po (PACKAGE VERSION) #-#-#-#-# +#. #-#-#-#-# af.po (TURTLEART) #-#-#-#-# +#. TRANS: pop removes a new item from the program stack +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:504 +msgid "pop" +msgstr "haal af" + +#: TurtleArt/tabasics.py:426 +msgid "pen size" +msgstr "pengrootte" + +#: TurtleArt/tabasics.py:190 +#, fuzzy +msgid "moves turtle along an arc" +msgstr "skuif die skilpad in 'n boog" + +#: TurtleArt/tabasics.py:699 +msgid "logical equal-to operator" +msgstr "logiese gelyk-aan bewerker" + +#: TurtleArt/tabasics.py:441 +#, fuzzy +msgid "Palette of pen colors" +msgstr "palet van penbevele" #: TurtleArt/tabasics.py:888 #, fuzzy msgid "stores numeric value in Variable 1" msgstr "stoor die numeriese waarde in veranderlike 1" -#: TurtleArt/tabasics.py:896 -msgid "store in box 2" -msgstr "stoor in hokkie 2" - #: TurtleArt/tabasics.py:901 #, fuzzy msgid "stores numeric value in Variable 2" msgstr "stoor die numeriese waarde in veranderlike 2" -#: TurtleArt/tabasics.py:909 -msgid "box 1" -msgstr "hokkie 1" +#: TurtleArt/tabasics.py:143 +#, fuzzy +msgid "moves turtle backward" +msgstr "skuif die skilpad agtertoe" -#: TurtleArt/tabasics.py:912 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:889 +msgid "ycor of top of screen" +msgstr "y-koordinaat van die bokant van die skerm" + +#: TurtleArt/talogo.py:384 TurtleArtActivity.py:322 TurtleArtActivity.py:684 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1485 +msgid "Show blocks" +msgstr "Wys blokke" + +#: gnome_plugins/collaboration_plugin.py:304 #, fuzzy -msgid "Variable 1 (numeric value)" -msgstr "veranderlike 1" +msgid "Colors" +msgstr "kleur" -#: TurtleArt/tabasics.py:919 -msgid "box 2" -msgstr "hokkie 2" +#: TurtleArt/tabasics.py:398 +#, fuzzy +msgid "sets size of the line drawn by the turtle" +msgstr "stel die grootte van die lyn wat die skilpad teken" -#: TurtleArt/tabasics.py:922 +#: TurtleArt/tawindow.py:989 TurtleArt/tawindow.py:990 #, fuzzy -msgid "Variable 2 (numeric value)" -msgstr "veranderlike 2" +msgid "orientation" +msgstr "voorlegging" + +#: TurtleArt/tabasics.py:236 TurtleArt/tawindow.py:3862 +#: TurtleArt/tawindow.py:3868 TurtleArtActivity.py:605 +msgid "ycor" +msgstr "y-koord" + +#: TurtleArt/tabasics.py:776 TurtleArt/tabasics.py:789 +msgid "if" +msgstr "as" + +#: TurtleArt/tabasics.py:203 TurtleArt/tabasics.py:269 +#, fuzzy +msgid "" +"moves turtle to position xcor, ycor; (0, 0) is in the center of the screen." +msgstr "" +"skuif die skilpad na posisie x, y; (0,0) is in die middel van die skem." + +#: TurtleArtActivity.py:688 turtleblocks.py:403 +#, fuzzy +msgid "Stop" +msgstr "bokant" + +#: TurtleArt/tabasics.py:964 TurtleArt/tabasics.py:984 +#, fuzzy +msgid "action 2" +msgstr "aksie" + +#: TurtleArt/tabasics.py:955 TurtleArt/tabasics.py:974 +#, fuzzy +msgid "action 1" +msgstr "aksie" + +#: TurtleArtActivity.py:587 TurtleArtActivity.py:731 turtleblocks.py:385 +msgid "Copy" +msgstr "Kopieer" + +#: TurtleArtActivity.py:589 TurtleArtActivity.py:732 turtleblocks.py:386 +msgid "Paste" +msgstr "Plak" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:490 +msgid "empty heap" +msgstr "maak hoop skoon" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:508 +#, fuzzy +msgid "pops value off FILO (first-in last-out heap)" +msgstr "druk die waarde op die EILU (eerste-in-laaste-uit) stapel" + +#: TurtleArtActivity.py:680 TurtleArtActivity.py:888 turtleblocks.py:399 +msgid "Clean" +msgstr "Maak skoon" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:765 +#, fuzzy +msgid "Palette of presentation templates" +msgstr "palet van voorleggingstemplate" + +#: TurtleArt/tabasics.py:186 +msgid "angle" +msgstr "hoek" + +#: TurtleArt/tabasics.py:162 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:854 +msgid "left" +msgstr "links" + +#: TurtleArt/tabasics.py:578 +msgid "subtracts bottom numeric input from top numeric input" +msgstr "trek die onderste numeriese insetwaarde van die boonste een af" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:381 +msgid "query for keyboard input (results stored in keyboard block)" +msgstr "vra vir inset van die sleutelbord (word in sleutelbord-blok gestoor)" + +#: TurtleArt/tabasics.py:154 +#, fuzzy +msgid "clears the screen and reset the turtle" +msgstr "maak die skerm skoon en herstel die skilpad" + +#: TurtleArt/tabasics.py:977 +#, fuzzy +msgid "invokes Action 1 stack" +msgstr "roep aksie 1 stapel in" + +#: TurtleArt/tabasics.py:123 +#, fuzzy +msgid "Palette of turtle commands" +msgstr "palet van skilpadbevele" + +#: TurtleArt/tabasics.py:758 +#, fuzzy +msgid "loops forever" +msgstr "gaan vir altyd in 'n lus in" + +#: TurtleArt/tawindow.py:3868 pysamples/grecord.py:205 +msgid "Turtle Art" +msgstr "Turtle Art" + +#: TurtleArtActivity.py:573 TurtleArtActivity.py:679 +msgid "Project" +msgstr "Projek" + +#: turtleblocks.py:402 +msgid "Debug" +msgstr "Ontfout" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:781 +#, fuzzy +msgid "show blocks" +msgstr "Wys blokke" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:177 +msgid "Sugar Journal description field" +msgstr "Sugar Journal beskrywingsveld" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:266 +msgid "scale" +msgstr "skaal" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:862 +msgid "bottom" +msgstr "onderkant" + +#: gnome_plugins/uploader_plugin.py:130 +msgid "Description:" +msgstr "Beskrywing:" + +#: TurtleArt/tabasics.py:388 +#, fuzzy +msgid "Turtle will draw when moved." +msgstr "skilpad sal teken wanneer hy geskuif word." + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:153 +msgid "Sugar Journal audio object" +msgstr "Sugar Joernaal oudio-objek" + +#: TurtleArt/talogo.py:374 TurtleArtActivity.py:683 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1492 +msgid "Stop turtle" +msgstr "Stop die skilpad" + +#: turtleblocks.py:404 +msgid "Turtle" +msgstr "Skilpad" #: TurtleArt/tabasics.py:928 TurtleArt/tawindow.py:4189 msgid "store in" msgstr "stoor in" -#: TurtleArt/tabasics.py:928 TurtleArt/tabasics.py:942 -msgid "box" -msgstr "hokkie" +#: TurtleArt/talogo.py:388 TurtleArtActivity.py:326 TurtleArtActivity.py:894 +msgid "Hide blocks" +msgstr "Versteek blokke" -#: TurtleArt/tabasics.py:928 TurtleArt/tawindow.py:4189 -msgid "value" +#: TurtleArt/tabasics.py:725 TurtleArt/tabasics.py:728 +msgid "or" +msgstr "OF" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:812 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1041 +#, fuzzy +msgid "presentation template: list of bullets" +msgstr "voorleggingstemplaat: Kollys met sewe kolle" + +#: TurtleArt/tabasics.py:616 +msgid "identity operator used for extending blocks" +msgstr "identitietsbewerker om blokke uit te brei" + +#: TurtleArt/tabasics.py:474 +#, fuzzy +msgid "sets size of text drawn by the turtle" +msgstr "stel die grootte van die teks wat die skilpad teken" + +#: TurtleArt/tabasics.py:248 +msgid "" +"holds current heading value of the turtle (can be used in place of a number " +"block)" msgstr "" +"hou die huidige rigting van die skilpad (kan gebruik word i.p.v. 'n " +"nommerblok)" -#: TurtleArt/tabasics.py:932 TurtleArt/tabasics.py:945 -#: TurtleArt/tawindow.py:1296 TurtleArt/tawindow.py:1409 -#: TurtleArt/tawindow.py:1858 TurtleArt/tawindow.py:4152 -#: TurtleArt/tawindow.py:4180 -msgid "my box" +#: TurtleArt/tabasics.py:650 +#, fuzzy +msgid "returns random number between minimum (top) and maximum (bottom) values" +msgstr "" +"gee 'n ewekansige nommerwaarde tussen minimum- (links) en maksimumwaardes " +"(regs)" + +#: TurtleArt/tabasics.py:349 +msgid "holds current pen color (can be used in place of a number block)" msgstr "" +"hou die huidige kleur van die pen (kan gebruk word i.p.v. 'n nommerblok)" + +#: TurtleArtActivity.py:274 turtleblocks.py:390 +msgid "Show palette" +msgstr "Wys palet" + +#: TurtleArtActivity.py:219 TurtleArtActivity.py:643 TurtleArtActivity.py:685 +#: TurtleArtActivity.py:829 TurtleArtActivity.py:856 +msgid "Save snapshot" +msgstr "Stoor flitsbeeld" + +#: TurtleArt/tabasics.py:843 pysamples/grecord.py:213 +msgid "start" +msgstr "begin" + +#: TurtleArt/tabasics.py:132 +#, fuzzy +msgid "moves turtle forward" +msgstr "skuif die skilpad vorentoe" + +#: TurtleArt/tabasics.py:128 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:723 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:734 +msgid "forward" +msgstr "vorentoe" + +#: TurtleArt/tabasics.py:139 +msgid "back" +msgstr "agtertoe" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:238 +#, fuzzy +msgid "sets the scale of media" +msgstr "stel die skaal van die media" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:964 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:979 +#, fuzzy +msgid "presentation 1x1" +msgstr "voorlegging" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1009 +#, fuzzy +msgid "presentation 1x2" +msgstr "voorlegging" + +#: TurtleArt/tabasics.py:865 +msgid "top of nameable action stack" +msgstr "bokant van benoembare aksiestapel" #: TurtleArt/tabasics.py:933 TurtleArt/tawindow.py:4194 #, fuzzy msgid "stores numeric value in named variable" msgstr "stoor numeriese waarde in benoemde veranderlike" -#: TurtleArt/tabasics.py:948 TurtleArt/tawindow.py:4166 -msgid "named variable (numeric value)" -msgstr "benoemde veranderlike" +#: TurtleArt/tabasics.py:729 +msgid "logical OR operator" +msgstr "logiese OF-bewerker" -#: TurtleArt/tabasics.py:955 TurtleArt/tabasics.py:974 +#: TurtleArt/tabasics.py:770 #, fuzzy -msgid "action 1" -msgstr "aksie" +msgid "loops specified number of times" +msgstr "gaan 'n gespesifiseerde hoeveelheid kere in 'n lus in" -#: TurtleArt/tabasics.py:958 +#: TurtleArt/tabasics.py:987 #, fuzzy -msgid "top of Action 1 stack" -msgstr "bokant van aksie 1 stapel" +msgid "invokes Action 2 stack" +msgstr "roep aksie 2 stapel in" -#: TurtleArt/tabasics.py:964 TurtleArt/tabasics.py:984 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:745 #, fuzzy -msgid "action 2" -msgstr "aksie" +msgid "setxy" +msgstr "stel xy" + +#: TurtleArt/tabasics.py:287 TurtleArt/tabasics.py:298 +msgid "fill screen" +msgstr "vul skerm" + +#: TurtleArt/tabasics.py:199 TurtleArt/tabasics.py:265 +msgid "set xy" +msgstr "stel xy" + +#: TurtleArt/tabasics.py:765 TurtleArt/tabasics.py:769 +msgid "repeat" +msgstr "herhaal" + +#: TurtleArtActivity.py:203 TurtleArtActivity.py:708 TurtleArtActivity.py:820 +#: TurtleArtActivity.py:850 turtleblocks.py:358 +msgid "Save as image" +msgstr "Stoor as prent" + +#: TurtleArtActivity.py:541 TurtleArtActivity.py:577 TurtleArtActivity.py:677 +#: TurtleArtActivity.py:730 turtleblocks.py:387 +msgid "Edit" +msgstr "Redigeer" #: TurtleArt/tabasics.py:967 #, fuzzy msgid "top of Action 2 stack" msgstr "bokant van aksie 2 stapel" -#: TurtleArt/tabasics.py:977 +#: TurtleArt/tabasics.py:604 +msgid "" +"divides top numeric input (numerator) by bottom numeric input (denominator)" +msgstr "" +"deel die boonste numeriese insetwaarde (teller) deur die onderste een " +"(noemer)" + +#: TurtleArt/tabasics.py:646 +msgid "max" +msgstr "maks" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:553 +msgid "prints value in status block at bottom of the screen" +msgstr "" +"vertoon die waarde in die statusblokkie aan die onderkant van die skerm" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:392 #, fuzzy -msgid "invokes Action 1 stack" -msgstr "roep aksie 1 stapel in" +msgid "holds results of query-keyboard block as ASCII" +msgstr "hou die resultaat van die sleutelbord-navraagblok" -#: TurtleArt/tabasics.py:987 +#. #-#-#-#-# af.po (PACKAGE VERSION) #-#-#-#-# +#. #-#-#-#-# af.po (TURTLEART) #-#-#-#-# +#. TRANS: push adds a new item to the program stack +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:464 +msgid "push" +msgstr "druk" + +#. TRANS: "name" option from activity.info file +msgid "TurtleBlocks" +msgstr "" + +#. TRANS: "summary" option from activity.info file +#. TRANS: "description" option from activity.info file +msgid "" +"A Logo-inspired turtle that draws colorful pictures with snap-together " +"visual programming blocks" +msgstr "" + +#: TurtleArt/tabasics.py:174 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:878 +msgid "right" +msgstr "regs" + +#: TurtleArt/tabasics.py:299 TurtleArt/tabasics.py:367 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1155 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1160 +msgid "gray" +msgstr "" + +#: TurtleArt/tabasics.py:337 +msgid "set gray" +msgstr "" + +#: TurtleArt/tabasics.py:359 +msgid "holds current pen shade" +msgstr "" + +#: TurtleArt/tabasics.py:408 +msgid "start fill" +msgstr "" + +#: TurtleArt/tabasics.py:410 +msgid "starts filled polygon (used with end fill block)" +msgstr "" + +#: TurtleArt/tabasics.py:417 +msgid "end fill" +msgstr "" + +#: TurtleArt/tabasics.py:419 +msgid "completes filled polygon (used with start fill block)" +msgstr "" + +#: TurtleArt/tabasics.py:443 #, fuzzy -msgid "invokes Action 2 stack" -msgstr "roep aksie 2 stapel in" +msgid "red" +msgstr "rooi" + +#: TurtleArt/tabasics.py:448 +msgid "green" +msgstr "" + +#: TurtleArt/tabasics.py:449 +msgid "cyan" +msgstr "" + +#: TurtleArt/tabasics.py:450 +msgid "blue" +msgstr "" + +#: TurtleArt/tabasics.py:451 +msgid "purple" +msgstr "" + +#: TurtleArt/tabasics.py:453 +msgid "white" +msgstr "" + +#: TurtleArt/tabasics.py:563 +msgid "plus" +msgstr "" + +#: TurtleArt/tabasics.py:575 +msgid "minus" +msgstr "" + +#: TurtleArt/tabasics.py:589 +msgid "multiply" +msgstr "" + +#: TurtleArt/tabasics.py:601 +msgid "divide" +msgstr "" + +#: TurtleArt/tabasics.py:614 +msgid "identity" +msgstr "" + +#: TurtleArt/tabasics.py:624 TurtleArt/tabasics.py:625 +msgid "mod" +msgstr "modulo" + +#: TurtleArt/tabasics.py:635 +msgid "√" +msgstr "" + +#: TurtleArt/tabasics.py:636 +msgid "square root" +msgstr "" + +#: TurtleArt/tabasics.py:671 +msgid "greater than" +msgstr "" + +#: TurtleArt/tabasics.py:683 +msgid "less than" +msgstr "" + +#: TurtleArt/tabasics.py:695 +msgid "equal" +msgstr "" + +#: TurtleArt/tabasics.py:747 +msgid "pauses program execution a specified number of seconds" +msgstr "" + +#: TurtleArt/tabasics.py:779 +msgid "if then" +msgstr "" + +#: TurtleArt/tabasics.py:793 TurtleArt/tabasics.py:801 +msgid "if then else" +msgstr "" + +#: TurtleArt/tabasics.py:811 +msgid "horizontal space" +msgstr "" + +#: TurtleArt/tabasics.py:819 +msgid "vertical space" +msgstr "" + +#: TurtleArt/tabasics.py:829 +msgid "stops current action" +msgstr "" + +#: TurtleArt/tabasics.py:932 TurtleArt/tabasics.py:945 +#: TurtleArt/tawindow.py:1296 TurtleArt/tawindow.py:1409 +#: TurtleArt/tawindow.py:1858 TurtleArt/tawindow.py:4152 +#: TurtleArt/tawindow.py:4180 +msgid "my box" +msgstr "" #: TurtleArt/tabasics.py:995 msgid "trash" @@ -757,33 +2626,6 @@ msgstr "" msgid "Share selected blocks" msgstr "" -#: TurtleArt/taconstants.py:209 TurtleArt/taconstants.py:231 -#: TurtleArt/taconstants.py:252 TurtleArt/taconstants.py:294 -#: TurtleArt/taconstants.py:336 TurtleArt/taconstants.py:378 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:963 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:978 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:993 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1008 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1023 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1038 -#, fuzzy -msgid "Title" -msgstr "titel" - -#: TurtleArt/talogo.py:374 TurtleArtActivity.py:683 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1492 -msgid "Stop turtle" -msgstr "Stop die skilpad" - -#: TurtleArt/talogo.py:384 TurtleArtActivity.py:322 TurtleArtActivity.py:684 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1485 -msgid "Show blocks" -msgstr "Wys blokke" - -#: TurtleArt/talogo.py:388 TurtleArtActivity.py:326 TurtleArtActivity.py:894 -msgid "Hide blocks" -msgstr "Versteek blokke" - #: TurtleArt/talogo.py:511 msgid "did not output to" msgstr "" @@ -821,16 +2663,6 @@ msgstr "" msgid "click to open" msgstr "" -#: TurtleArt/tawindow.py:989 TurtleArt/tawindow.py:990 -#, fuzzy -msgid "orientation" -msgstr "voorlegging" - -#: TurtleArt/tawindow.py:1000 TurtleArt/tawindow.py:1470 -#, fuzzy -msgid "next" -msgstr "teks" - #: TurtleArt/tawindow.py:1012 TurtleArt/tawindow.py:1013 #: TurtleArt/tawindow.py:1490 msgid "shift" @@ -846,33 +2678,14 @@ msgstr "" msgid "Select blocks to share" msgstr "" -#: TurtleArt/tawindow.py:3868 pysamples/grecord.py:205 -msgid "Turtle Art" -msgstr "Turtle Art" - #: TurtleArt/tawindow.py:3977 msgid "image" msgstr "" -#: TurtleArtActivity.py:166 TurtleArtActivity.py:709 TurtleArtActivity.py:823 -#: TurtleArtActivity.py:853 turtleblocks.py:360 -msgid "Save as Logo" -msgstr "Stoor as Logo" - -#: TurtleArtActivity.py:203 TurtleArtActivity.py:708 TurtleArtActivity.py:820 -#: TurtleArtActivity.py:850 turtleblocks.py:358 -msgid "Save as image" -msgstr "Stoor as prent" - #: TurtleArtActivity.py:211 msgid "snapshot" msgstr "" -#: TurtleArtActivity.py:219 TurtleArtActivity.py:643 TurtleArtActivity.py:685 -#: TurtleArtActivity.py:829 TurtleArtActivity.py:856 -msgid "Save snapshot" -msgstr "Stoor flitsbeeld" - #: TurtleArtActivity.py:260 TurtleArtActivity.py:616 TurtleArtActivity.py:759 #: turtleblocks.py:378 msgid "Turn off hover help" @@ -882,14 +2695,6 @@ msgstr "" msgid "Turn on hover help" msgstr "" -#: TurtleArtActivity.py:274 turtleblocks.py:390 -msgid "Show palette" -msgstr "Wys palet" - -#: TurtleArtActivity.py:280 TurtleArtActivity.py:882 turtleblocks.py:392 -msgid "Hide palette" -msgstr "Versteek palet" - #: TurtleArtActivity.py:447 msgid "Rescale coordinates down" msgstr "" @@ -898,42 +2703,20 @@ msgstr "" msgid "Rescale coordinates up" msgstr "" -#: TurtleArtActivity.py:541 TurtleArtActivity.py:577 TurtleArtActivity.py:677 -#: TurtleArtActivity.py:730 turtleblocks.py:387 -msgid "Edit" -msgstr "Redigeer" - #: TurtleArtActivity.py:546 TurtleArtActivity.py:575 TurtleArtActivity.py:678 #: TurtleArtActivity.py:747 turtleblocks.py:382 msgid "View" msgstr "" -#: TurtleArtActivity.py:573 TurtleArtActivity.py:679 -msgid "Project" -msgstr "Projek" - #: TurtleArtActivity.py:579 TurtleArtActivity.py:676 TurtleArtActivity.py:705 #: TurtleArtActivity.py:707 TurtleArtActivity.py:815 msgid "Save/Load" msgstr "" -#: TurtleArtActivity.py:587 TurtleArtActivity.py:731 turtleblocks.py:385 -msgid "Copy" -msgstr "Kopieer" - -#: TurtleArtActivity.py:589 TurtleArtActivity.py:732 turtleblocks.py:386 -msgid "Paste" -msgstr "Plak" - #: TurtleArtActivity.py:591 msgid "Restore blocks from trash" msgstr "" -#: TurtleArtActivity.py:594 TurtleArtActivity.py:748 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:789 -msgid "Fullscreen" -msgstr "Volskerm" - #: TurtleArtActivity.py:596 TurtleArtActivity.py:749 turtleblocks.py:366 msgid "Cartesian coordinates" msgstr "" @@ -946,11 +2729,6 @@ msgstr "" msgid "Metric coordinates" msgstr "" -#: TurtleArtActivity.py:611 TurtleArtActivity.py:757 turtleblocks.py:372 -#, fuzzy -msgid "Grow blocks" -msgstr "Wys blokke" - #: TurtleArtActivity.py:613 TurtleArtActivity.py:758 turtleblocks.py:374 msgid "Shrink blocks" msgstr "" @@ -960,27 +2738,6 @@ msgstr "" msgid "Load example" msgstr "" -#: TurtleArtActivity.py:680 TurtleArtActivity.py:888 turtleblocks.py:399 -msgid "Clean" -msgstr "Maak skoon" - -#: TurtleArtActivity.py:681 TurtleArtActivity.py:890 turtleblocks.py:400 -msgid "Run" -msgstr "Voer uit" - -#: TurtleArtActivity.py:682 TurtleArtActivity.py:892 turtleblocks.py:401 -msgid "Step" -msgstr "Stap" - -#: TurtleArtActivity.py:687 turtleblocks.py:408 util/helpbutton.py:45 -msgid "Help" -msgstr "Hulp" - -#: TurtleArtActivity.py:688 turtleblocks.py:403 -#, fuzzy -msgid "Stop" -msgstr "bokant" - #: TurtleArtActivity.py:710 TurtleArtActivity.py:836 TurtleArtActivity.py:858 msgid "Load project" msgstr "" @@ -1092,11 +2849,6 @@ msgstr "" msgid "Register" msgstr "" -#: gnome_plugins/collaboration_plugin.py:304 -#, fuzzy -msgid "Colors" -msgstr "kleur" - #: gnome_plugins/fb_plugin.py:82 gnome_plugins/fb_plugin.py:83 #: gnome_plugins/fb_plugin.py:92 gnome_plugins/uploader_plugin.py:63 #: gnome_plugins/uploader_plugin.py:64 gnome_plugins/uploader_plugin.py:73 @@ -1125,15 +2877,6 @@ msgstr "" msgid "Password:" msgstr "" -#: gnome_plugins/uploader_plugin.py:120 -#, fuzzy -msgid "Title:" -msgstr "Titel:" - -#: gnome_plugins/uploader_plugin.py:130 -msgid "Description:" -msgstr "Beskrywing:" - #: gnome_plugins/uploader_plugin.py:140 msgid "Submit to Web" msgstr "" @@ -1168,11 +2911,6 @@ msgstr "" msgid "push acceleration in x, y, z to heap" msgstr "" -#: plugins/audio_sensors/audio_sensors.py:83 -#: plugins/audio_sensors/audio_sensors.py:98 pysamples/grecord.py:205 -msgid "sound" -msgstr "klank" - #: plugins/audio_sensors/audio_sensors.py:84 #: plugins/audio_sensors/audio_sensors.py:99 msgid "raw microphone input signal" @@ -1199,13 +2937,6 @@ msgstr "" msgid "microphone input pitch" msgstr "" -#: plugins/audio_sensors/audio_sensors.py:151 -#: plugins/audio_sensors/audio_sensors.py:165 -#: plugins/audio_sensors/audio_sensors.py:179 -#: plugins/audio_sensors/audio_sensors.py:193 -msgid "resistance" -msgstr "" - #: plugins/audio_sensors/audio_sensors.py:152 #: plugins/audio_sensors/audio_sensors.py:166 #: plugins/audio_sensors/audio_sensors.py:180 @@ -1232,15 +2963,6 @@ msgstr "" msgid "Palette of media objects" msgstr "" -#: plugins/camera_sensor/camera_sensor.py:80 -#: plugins/camera_sensor/camera_sensor.py:93 -#: plugins/camera_sensor/camera_sensor.py:128 -#: plugins/camera_sensor/camera_sensor.py:141 -#: plugins/light_sensor/light_sensor.py:56 -#: plugins/light_sensor/light_sensor.py:63 -msgid "brightness" -msgstr "" - #: plugins/camera_sensor/camera_sensor.py:82 #: plugins/camera_sensor/camera_sensor.py:130 msgid "light level detected by camera" @@ -1277,27 +2999,11 @@ msgstr "" msgid "while" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:107 -#, fuzzy -msgid "do-while-True operator that uses boolean operators from Numbers palette" -msgstr "AS-DAN-ANDERS-bewerker wat boolse bewerkers van die Syferpalet gebruik" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:113 #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:116 msgid "until" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:117 -#, fuzzy -msgid "do-until-True operator that uses boolean operators from Numbers palette" -msgstr "AS-DAN-ANDERS-bewerker wat boolse bewerkers van die Syferpalet gebruik" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:124 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:715 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:886 -msgid "top" -msgstr "bokant" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:126 msgid "top of a collapsible stack" msgstr "" @@ -1306,59 +3012,18 @@ msgstr "" msgid "journal" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:141 -msgid "Sugar Journal media object" -msgstr "Sugar Joernaal media-objek" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:151 msgid "audio" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:153 -msgid "Sugar Journal audio object" -msgstr "Sugar Joernaal oudio-objek" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:163 msgid "video" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:165 -msgid "Sugar Journal video object" -msgstr "Sugar Joernaal video-objek" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:175 -msgid "description" -msgstr "beskrywing" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:177 -msgid "Sugar Journal description field" -msgstr "Sugar Journal beskrywingsveld" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:194 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:222 -msgid "show" -msgstr "wys" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:198 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:211 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:226 -#, fuzzy -msgid "draws text or show media from the Journal" -msgstr "teken teks of wys media van die Joernaal" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:207 msgid "show aligned" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:234 -msgid "set scale" -msgstr "stel skaal" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:238 -#, fuzzy -msgid "sets the scale of media" -msgstr "stel die skaal van die media" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:245 msgid "save picture" msgstr "" @@ -1380,10 +3045,6 @@ msgstr "" msgid "saves turtle graphics as an SVG file in the Sugar Journal" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:266 -msgid "scale" -msgstr "skaal" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:270 msgid "holds current scale value" msgstr "" @@ -1482,19 +3143,6 @@ msgstr "" msgid "query keyboard" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:381 -msgid "query for keyboard input (results stored in keyboard block)" -msgstr "vra vir inset van die sleutelbord (word in sleutelbord-blok gestoor)" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:388 -msgid "keyboard" -msgstr "sleutelbord" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:392 -#, fuzzy -msgid "holds results of query-keyboard block as ASCII" -msgstr "hou die resultaat van die sleutelbord-navraagblok" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:424 msgid "read pixel" msgstr "" @@ -1511,62 +3159,14 @@ msgstr "" msgid "returns the color that the turtle \"sees\"" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:445 -msgid "time" -msgstr "" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:448 msgid "elapsed time (in seconds) since program started" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:457 -#, fuzzy -msgid "Palette of extra options" -msgstr "palet van ekstra opsies" - -#. TRANS: push adds a new item to the program stack -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:464 -msgid "push" -msgstr "druk" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:467 -#, fuzzy -msgid "pushes value onto FILO (first-in last-out heap)" -msgstr "druk die waarde op die EILU (eerste-in-laaste-uit) stapel" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:477 -msgid "show heap" -msgstr "wys die hoop" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:480 -#, fuzzy -msgid "shows values in FILO (first-in last-out heap)" -msgstr "druk die waarde op die EILU (eerste-in-laaste-uit) stapel" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:490 -msgid "empty heap" -msgstr "maak hoop skoon" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:493 msgid "emptys FILO (first-in-last-out heap)" msgstr "" -#. TRANS: pop removes a new item from the program stack -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:504 -msgid "pop" -msgstr "haal af" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:508 -#, fuzzy -msgid "pops value off FILO (first-in last-out heap)" -msgstr "druk die waarde op die EILU (eerste-in-laaste-uit) stapel" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:519 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:529 -#, fuzzy -msgid "empty heap?" -msgstr "maak hoop skoon" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:522 #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:532 msgid "returns True if heap is empty" @@ -1581,14 +3181,6 @@ msgstr "" msgid "places a comment in your code" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:549 -msgid "print" -msgstr "druk" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:553 -msgid "prints value in status block at bottom of the screen" -msgstr "vertoon die waarde in die statusblokkie aan die onderkant van die skerm" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:563 msgid "Python chr operator" msgstr "" @@ -1627,14 +3219,6 @@ msgstr "" msgid "Python block" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:624 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:640 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:656 -msgid "runs code found in the tamyblock.py module found in the Journal" -msgstr "" -"voer die kode uit wat in die tamyblock.py module onder die Joernaal gevind " -"word" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:669 msgid "Cartesian" msgstr "" @@ -1651,12 +3235,6 @@ msgstr "" msgid "displays polar coordinates" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:685 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:756 -#, fuzzy -msgid "turtle" -msgstr "Skilpad" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:689 msgid "chooses which turtle to command" msgstr "" @@ -1681,18 +3259,6 @@ msgstr "" msgid "load" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:724 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:735 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:746 -#, fuzzy -msgid "loads a block" -msgstr "laai my blok" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:745 -#, fuzzy -msgid "setxy" -msgstr "stel xy" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:754 msgid "palette" msgstr "" @@ -1701,25 +3267,6 @@ msgstr "" msgid "selects a palette" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:765 -#, fuzzy -msgid "Palette of presentation templates" -msgstr "palet van voorleggingstemplate" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:772 -msgid "hide blocks" -msgstr "versteek blokke" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:774 -#, fuzzy -msgid "declutters canvas by hiding blocks" -msgstr "maak werksoppervlak skoon deur blokke te versteek" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:781 -#, fuzzy -msgid "show blocks" -msgstr "Wys blokke" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:783 msgid "restores hidden blocks" msgstr "" @@ -1737,70 +3284,6 @@ msgstr "" msgid "presentation bulleted list" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:812 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1041 -#, fuzzy -msgid "presentation template: list of bullets" -msgstr "voorleggingstemplaat: Kollys met sewe kolle" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:819 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:981 -msgid "presentation template: select Journal object (no description)" -msgstr "voorleggingstemplaat: Kies 'n Joernaalobjek (sonder beskrywing)" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:826 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:966 -msgid "presentation template: select Journal object (with description)" -msgstr "voorleggingstemplaat: Kies 'n Joernaalobjek (met beskrywing)" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:833 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1026 -msgid "presentation template: select four Journal objects" -msgstr "voorleggingstemplaat: Kies vier Joernaalobjekte" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:840 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:847 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:996 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1011 -msgid "presentation template: select two Journal objects" -msgstr "voorleggingstemplaat: Kies twee Joernaalobjekte" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:857 -msgid "xcor of left of screen" -msgstr "x-koordinaat van die linkerkant van die skerm" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:862 -msgid "bottom" -msgstr "onderkant" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:865 -msgid "ycor of bottom of screen" -msgstr "y-koordinaat van die onderkant van die skerm" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:870 -msgid "width" -msgstr "wydte" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:873 -msgid "the canvas width" -msgstr "wydte van die werksoppervlak" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:881 -msgid "xcor of right of screen" -msgstr "x-koordinaat van die regterkant van die skerm" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:889 -msgid "ycor of top of screen" -msgstr "y-koordinaat van die bokant van die skerm" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:894 -msgid "height" -msgstr "hoogte" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:897 -msgid "the canvas height" -msgstr "hoogte van die werksoppervlak" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:904 msgid "title x" msgstr "" @@ -1821,32 +3304,6 @@ msgstr "" msgid "right x" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:949 -#, fuzzy -msgid "bottom y" -msgstr "onderkant" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:964 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:979 -#, fuzzy -msgid "presentation 1x1" -msgstr "voorlegging" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:994 -#, fuzzy -msgid "presentation 2x1" -msgstr "voorlegging" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1009 -#, fuzzy -msgid "presentation 1x2" -msgstr "voorlegging" - -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1024 -#, fuzzy -msgid "presentation 2x2" -msgstr "voorlegging" - #: pysamples/brain.py:43 msgid "Please install the Speak Activity and try again." msgstr "" @@ -1874,11 +3331,6 @@ msgstr "" msgid "push destination rgb value to heap" msgstr "" -#: pysamples/grecord.py:215 -#, fuzzy -msgid "stop" -msgstr "bokant" - #: pysamples/grecord.py:217 msgid "play" msgstr "" @@ -1956,14 +3408,6 @@ msgstr "" msgid "Tools" msgstr "" -#: turtleblocks.py:402 -msgid "Debug" -msgstr "Ontfout" - -#: turtleblocks.py:404 -msgid "Turtle" -msgstr "Skilpad" - #: turtleblocks.py:407 msgid "About..." msgstr "" @@ -1976,22 +3420,6 @@ msgstr "" msgid "Save project?" msgstr "" -#, fuzzy -#~ msgid "light" -#~ msgstr "regs" - -#, fuzzy -#~ msgid "read" -#~ msgstr "rooi" - -#, fuzzy -#~ msgid "mode" -#~ msgstr "modulo" - -#, fuzzy -#~ msgid "samples" -#~ msgstr "Voorbeelde" - #~ msgid "Save as HTML" #~ msgstr "Stoor as HTML" @@ -2050,7 +3478,8 @@ msgstr "" #~ "hou die huidige skadu van die pen (kan gebruk word i.p.v. 'n nommerblok)" #~ msgid "" -#~ "a programmable block: add your own math equation in the block, e.g., sin(x)" +#~ "a programmable block: add your own math equation in the block, e.g., sin" +#~ "(x)" #~ msgstr "" #~ "'n programmeerbare blok: voeg jou eie wiskundige vergelyking in die blok, " #~ "bv. sin(x)" @@ -2,8 +2,33 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +#, fuzzy msgid "" msgstr "" +"#-#-#-#-# am.po (PACKAGE VERSION) #-#-#-#-#\n" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-11-02 00:32-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Translate Toolkit 1.7.0\n" +"#-#-#-#-# am.po (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# am.po (PACKAGE VERSION) #-#-#-#-#\n" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-11-02 00:32-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Translate Toolkit 1.7.0\n" +"#-#-#-#-# am.po (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-02-24 00:31-0500\n" @@ -18,6 +43,1604 @@ msgstr "" "X-Generator: Pootle 2.0.1\n" #. TRANS: "name" option from activity.info file +#. TRANS: "summary" option from activity.info file +#. TRANS: "description" option from activity.info file +msgid "turtleart-extras (master)" +msgstr "" + +#: taextras.py:36 +msgid "Turtle Art Mini" +msgstr "" + +#: taextras.py:40 +msgid "Turtle Confusion" +msgstr "" + +#: taextras.py:41 taextras.py:46 +msgid "Select a challenge" +msgstr "" + +#: taextras.py:45 +msgid "Amazonas Tortuga" +msgstr "" + +#: taextras.py:52 +msgid "Palette of Mexican pesos" +msgstr "" + +#: taextras.py:53 +msgid "Palette of Colombian pesos" +msgstr "" + +#: taextras.py:54 +msgid "Palette of Rwandan francs" +msgstr "" + +#: taextras.py:55 +msgid "Palette of US dollars" +msgstr "" + +#: taextras.py:56 +msgid "Palette of Australian dollars" +msgstr "" + +#: taextras.py:57 +msgid "Palette of Paraguayan Guaranies" +msgstr "" + +#: taextras.py:58 +msgid "Palette of Peruvian Nuevo Soles" +msgstr "" + +#: taextras.py:59 +msgid "Palette of Uruguayan Pesos" +msgstr "" + +#. TRANS: Butia is the Arduino Robot Project from Uruguay +#. (http://www.fing.edu.uy/inco/proyectos/butia/) +#: taextras.py:65 +msgid "TurtleBots" +msgstr "" + +#: taextras.py:66 +msgid "adjust LED intensity between 0 and 255" +msgstr "" + +#: taextras.py:67 +msgid "returns the object gray level as a number between 0 and 1023" +msgstr "" + +#: taextras.py:68 +msgid "returns 1 when the button is press and 0 otherwise" +msgstr "" + +#: taextras.py:69 +msgid "returns the ambient light level as a number between 0 and 1023" +msgstr "" + +#: taextras.py:70 +msgid "returns the ambient temperature as a number between 0 and 255" +msgstr "" + +#: taextras.py:71 +msgid "" +"returns the distance from the object in front of the sensor as a number " +"between 0 and 255" +msgstr "" + +#: taextras.py:73 +msgid "returns 0 or 1 depending on the sensor inclination" +msgstr "" + +#: taextras.py:74 +msgid "returns 1 when the sensors detects a magnetic field, 0 otherwise" +msgstr "" + +#: taextras.py:75 +msgid "switches from 0 to 1, the frequency depends on the vibration" +msgstr "" + +#: taextras.py:76 +msgid "returns the value of the resistance" +msgstr "" + +#: taextras.py:77 +msgid "LED" +msgstr "" + +#: taextras.py:78 +msgid "button" +msgstr "" + +#: taextras.py:79 +msgid "grayscale" +msgstr "" + +#: taextras.py:80 +msgid "ambient light" +msgstr "" + +#: taextras.py:81 +msgid "temperature" +msgstr "" + +#: taextras.py:82 taextras.py:291 +msgid "distance" +msgstr "" + +#: taextras.py:83 taextras.py:288 +msgid "tilt" +msgstr "" + +#: taextras.py:84 +msgid "magnetic induction" +msgstr "" + +#: taextras.py:85 +msgid "vibration" +msgstr "" + +#: taextras.py:86 plugins/audio_sensors/audio_sensors.py:151 +#: plugins/audio_sensors/audio_sensors.py:165 +#: plugins/audio_sensors/audio_sensors.py:179 +#: plugins/audio_sensors/audio_sensors.py:193 +msgid "resistance" +msgstr "" + +#: taextras.py:87 +msgid "Butia Robot" +msgstr "" + +#: taextras.py:88 +msgid "refresh Butia" +msgstr "" + +#: taextras.py:89 +msgid "refresh the state of the Butia palette and blocks" +msgstr "" + +#. TRANS: This string is shorthand for "battery charge of Butia" +#: taextras.py:91 +msgid "battery charge Butia" +msgstr "" + +#: taextras.py:92 +msgid "returns the battery charge as a number between 0 and 255" +msgstr "" + +#. TRANS: This string is shorthand for "speed of Butia" +#: taextras.py:94 +msgid "speed Butia" +msgstr "" + +#: taextras.py:95 +msgid "set the speed of the Butia motors" +msgstr "" + +#: taextras.py:96 +msgid "the speed must be a value between 0 and 1023" +msgstr "" + +#. TRANS: This string is shorthand for "move Butia forward" +#: taextras.py:98 +msgid "forward Butia" +msgstr "" + +#: taextras.py:99 +msgid "move the Butia robot forward" +msgstr "" + +#: taextras.py:100 +msgid "move the Butia robot forward a predefined distance" +msgstr "" + +#. TRANS: This string is shorthand for "turn Butia left" +#: taextras.py:102 +msgid "left Butia" +msgstr "" + +#: taextras.py:103 +msgid "turn the Butia robot at left" +msgstr "" + +#. TRANS: This string is shorthand for "move Butia backward" +#: taextras.py:105 +msgid "backward Butia" +msgstr "" + +#: taextras.py:106 +msgid "move the Butia robot backward" +msgstr "" + +#: taextras.py:107 +msgid "move the Butia robot backward a predefined distance" +msgstr "" + +#. TRANS: This string is shorthand for "turn Butia right" +#: taextras.py:109 +msgid "right Butia" +msgstr "" + +#: taextras.py:110 +msgid "turn the Butia robot at right" +msgstr "" + +#: taextras.py:111 +msgid "turn Butia" +msgstr "" + +#: taextras.py:112 +msgid "turn the Butia robot x degrees" +msgstr "" + +#: taextras.py:113 +msgid "stop Butia" +msgstr "" + +#: taextras.py:114 +msgid "stop the Butia robot" +msgstr "" + +#: taextras.py:115 +msgid "Butia" +msgstr "" + +#: taextras.py:119 +msgid "Error importing Pygame. This plugin require Pygame 1.9" +msgstr "" + +#: taextras.py:120 +msgid "Error on initialization of the camera" +msgstr "" + +#: taextras.py:121 +msgid "No camera was found" +msgstr "" + +#: taextras.py:122 +msgid "Error stopping camera" +msgstr "" + +#: taextras.py:123 +msgid "Error starting camera" +msgstr "" + +#. TRANS: The "mask" is used to restrict processing to a region in the image +#: taextras.py:125 +msgid "Error in get mask" +msgstr "" + +#: taextras.py:126 +msgid "FollowMe" +msgstr "" + +#: taextras.py:127 +msgid "refresh FollowMe" +msgstr "" + +#: taextras.py:128 +msgid "Search for a connected camera." +msgstr "" + +#. TRANS: the calibration is used to match an RGB color to a target +#: taextras.py:130 +msgid "calibration" +msgstr "" + +#: taextras.py:131 +msgid "store a personalized calibration" +msgstr "" + +#: taextras.py:132 +msgid "return a personalized calibration" +msgstr "" + +#: taextras.py:133 +msgid "follow" +msgstr "" + +#: taextras.py:134 +msgid "follow a color or calibration" +msgstr "" + +#: taextras.py:135 plugins/camera_sensor/camera_sensor.py:80 +#: plugins/camera_sensor/camera_sensor.py:93 +#: plugins/camera_sensor/camera_sensor.py:128 +#: plugins/camera_sensor/camera_sensor.py:141 +#: plugins/light_sensor/light_sensor.py:56 +#: plugins/light_sensor/light_sensor.py:63 +msgid "brightness" +msgstr "" + +#: taextras.py:136 +msgid "set the camera brightness as a value between 0 to 255." +msgstr "" + +#: taextras.py:137 +msgid "minimum pixels" +msgstr "" + +#: taextras.py:138 +msgid "set the minimal number of pixels to follow" +msgstr "" + +#: taextras.py:139 +msgid "threshold" +msgstr "" + +#. TRANS: RGB color space (red, green, blue) +#: taextras.py:141 +msgid "set a threshold for a RGB color" +msgstr "" + +#: taextras.py:142 +msgid "camera mode" +msgstr "" + +#. TRANS: RGB, YUV, and HSV are color spaces +#: taextras.py:144 +msgid "set the color mode of the camera: RGB; YUV or HSV" +msgstr "" + +#: taextras.py:145 +msgid "get brightness" +msgstr "" + +#: taextras.py:146 +msgid "get the brightness of the ambient light" +msgstr "" + +#: taextras.py:147 +msgid "average color" +msgstr "" + +#: taextras.py:148 +msgid "" +"if set to 0 then color averaging is off during calibration; for other values " +"it is on" +msgstr "" + +#: taextras.py:149 +msgid "x position" +msgstr "" + +#: taextras.py:150 +msgid "return x position" +msgstr "" + +#: taextras.py:151 +msgid "y position" +msgstr "" + +#: taextras.py:152 +msgid "return y position" +msgstr "" + +#: taextras.py:153 +msgid "pixels" +msgstr "" + +#: taextras.py:154 +msgid "return the number of pixels of the biggest blob" +msgstr "" + +#. TRANS: RGB color space (red, green, blue) +#: taextras.py:156 +msgid "set the color mode of the camera to RGB" +msgstr "" + +#. TRANS: YUV color space (luminance, chrominance) +#: taextras.py:158 +msgid "set the color mode of the camera to YUV" +msgstr "" + +#. TRANS: HSV color space (hue, saturation, value) +#: taextras.py:160 +msgid "set the color mode of the camera to HSV" +msgstr "" + +#: taextras.py:161 +msgid "empty calibration" +msgstr "" + +#: taextras.py:162 +msgid "error in string conversion" +msgstr "" + +#. TRANS: SumBot is a robot programmed for "Sumo wrestling" +#: taextras.py:167 +msgid "SumBot" +msgstr "" + +#: taextras.py:168 +msgid "speed SumBot" +msgstr "" + +#: taextras.py:169 +msgid "submit the speed to the SumBot" +msgstr "" + +#: taextras.py:170 +msgid "set the default speed for the movement commands" +msgstr "" + +#. TRANS: This string is shorthand for "move SumBot forward" +#: taextras.py:172 +msgid "forward SumBot" +msgstr "" + +#: taextras.py:173 +msgid "move SumBot forward" +msgstr "" + +#. TRANS: This string is shorthand for "move SumBot backward" +#: taextras.py:175 +msgid "backward SumBot" +msgstr "" + +#: taextras.py:176 +msgid "move SumBot backward" +msgstr "" + +#: taextras.py:177 +msgid "stop SumBot" +msgstr "" + +#: taextras.py:178 +msgid "stop the SumBot" +msgstr "" + +#. TRANS: This string is shorthand for "turn SumBot left" +#: taextras.py:180 +msgid "left SumBot" +msgstr "" + +#: taextras.py:181 +msgid "turn left the SumBot" +msgstr "" + +#. TRANS: This string is shorthand for "move SumBot right" +#: taextras.py:183 +msgid "right SumBot" +msgstr "" + +#: taextras.py:184 +msgid "turn right the SumBot" +msgstr "" + +#. TRANS: The angle to the center is the angle SumBot must turn to +#. face the center of the playing field +#: taextras.py:187 +msgid "angle to center" +msgstr "" + +#. TRANS: dohyo is the playing field +#: taextras.py:189 +msgid "get the angle to the center of the dohyo" +msgstr "" + +#. TRANS: The angle to the center is the angle SumBot must turn to +#. face the Enemy (opponent) +#: taextras.py:192 +msgid "angle to Enemy" +msgstr "" + +#: taextras.py:193 +msgid "get the angle to the Enemy" +msgstr "" + +#. TRANS: This string is shorthand for "x coordinate of SumBot" +#: taextras.py:195 +msgid "x coor. SumBot" +msgstr "" + +#: taextras.py:196 +msgid "get the x coordinate of the SumBot" +msgstr "" + +#. TRANS: This string is shorthand for "y coordinate of SumBot" +#: taextras.py:198 +msgid "y coor. SumBot" +msgstr "" + +#: taextras.py:199 +msgid "get the y coordinate of the SumBot" +msgstr "" + +#. TRANS: This string is shorthand for "x coordinate of SumBot's enemy" +#: taextras.py:201 +msgid "x coor. Enemy" +msgstr "" + +#: taextras.py:202 +msgid "get the x coordinate of the Enemy" +msgstr "" + +#. TRANS: This string is shorthand for "y coordinate of SumBot's enemy" +#: taextras.py:204 +msgid "y coor. Enemy" +msgstr "" + +#: taextras.py:205 +msgid "get the y coordinate of the Enemy" +msgstr "" + +#. TRANS: This string is shorthand for "rotation of SumBot" +#: taextras.py:207 +msgid "rotation SumBot" +msgstr "" + +#: taextras.py:208 +msgid "get the rotation of the Sumbot" +msgstr "" + +#. TRANS: This string is shorthand for "rotation of SumBot's enemy" +#: taextras.py:210 +msgid "rotation Enemy" +msgstr "" + +#: taextras.py:211 +msgid "get the rotation of the Enemy" +msgstr "" + +#: taextras.py:212 +msgid "distance to center" +msgstr "" + +#. TRANS: dohyo is the playing field +#: taextras.py:214 +msgid "get the distance to the center of the dohyo" +msgstr "" + +#: taextras.py:215 +msgid "distance to Enemy" +msgstr "" + +#: taextras.py:216 +msgid "get the distance to the Enemy" +msgstr "" + +#: taextras.py:217 +msgid "update information" +msgstr "" + +#: taextras.py:218 +msgid "update information from the server" +msgstr "" + +#. TRANS: Please use similar terms to those used in the Physics Activity +#: taextras.py:223 +msgid "Palette of physics blocks" +msgstr "" + +#: taextras.py:224 +msgid "start polygon" +msgstr "" + +#: taextras.py:225 +msgid "Begin defining a new polygon based on the current Turtle xy position." +msgstr "" + +#: taextras.py:227 +msgid "add point" +msgstr "" + +#: taextras.py:228 +msgid "" +"Add a new point to the current polygon based on the current Turtle xy " +"position." +msgstr "" + +#: taextras.py:230 +msgid "end polygon" +msgstr "" + +#: taextras.py:231 +msgid "Define a new polygon." +msgstr "" + +#: taextras.py:232 +msgid "end filled polygon" +msgstr "" + +#: taextras.py:233 +msgid "Not a simple polygon" +msgstr "" + +#: taextras.py:234 +msgid "Define a new filled polygon." +msgstr "" + +#: taextras.py:235 +msgid "triangle" +msgstr "" + +#. TRANS: base of a triangle +#: taextras.py:237 +msgid "base" +msgstr "" + +#: taextras.py:238 taextras.py:244 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:894 +msgid "height" +msgstr "" + +#: taextras.py:239 +msgid "Add a triangle object to the project." +msgstr "" + +#: taextras.py:240 +msgid "circle" +msgstr "" + +#: taextras.py:241 +msgid "Add a circle object to the project." +msgstr "" + +#: taextras.py:242 +msgid "rectangle" +msgstr "" + +#: taextras.py:243 plugins/turtle_blocks_extras/turtle_blocks_extras.py:870 +msgid "width" +msgstr "" + +#: taextras.py:245 +msgid "Add a rectangle object to the project." +msgstr "" + +#: taextras.py:246 +msgid "reset" +msgstr "" + +#: taextras.py:247 +msgid "Reset the project; clear the object list." +msgstr "" + +#: taextras.py:248 +msgid "motor" +msgstr "" + +#. TRANS: torque as in engine torque +#: taextras.py:250 +msgid "torque" +msgstr "" + +#: taextras.py:251 +msgid "speed" +msgstr "" + +#: taextras.py:252 +msgid "" +"Motor torque and speed range from 0 (off) to positive numbers; motor is " +"placed on the most recent object created." +msgstr "" + +#: taextras.py:254 taextras.py:417 +msgid "pin" +msgstr "" + +#: taextras.py:255 +msgid "Pin an object down so that it cannot fall." +msgstr "" + +#: taextras.py:256 +msgid "joint" +msgstr "" + +#: taextras.py:257 TurtleArt/tabasics.py:199 TurtleArt/tabasics.py:265 +msgid "x" +msgstr "" + +#: taextras.py:258 TurtleArt/tabasics.py:199 TurtleArt/tabasics.py:265 +msgid "y" +msgstr "" + +#: taextras.py:259 +msgid "" +"Join two objects together (the most recent object created and the object at " +"point x, y)." +msgstr "" + +#: taextras.py:261 +msgid "save as Physics activity" +msgstr "" + +#: taextras.py:262 +msgid "Save the project to the Journal as a Physics activity." +msgstr "" + +#. TRANS: Here, gear means a toothed wheel, as in a clock-works +#: taextras.py:264 +msgid "gear" +msgstr "" + +#: taextras.py:265 +msgid "Add a gear object to the project." +msgstr "" + +#: taextras.py:266 +msgid "density" +msgstr "" + +#: taextras.py:267 +msgid "" +"Set the density property for objects (density can be any positive number)." +msgstr "" + +#: taextras.py:269 +msgid "friction" +msgstr "" + +#: taextras.py:270 +msgid "" +"Set the friction property for objects (value from 0 to 1, where 0 turns " +"friction off and 1 is strong friction)." +msgstr "" + +#. TRANS: bounciness is coefficient of restitution +#: taextras.py:273 +msgid "bounciness" +msgstr "" + +#: taextras.py:274 +msgid "" +"Set the bounciness property for objects (a value from 0 to 1, where 0 means " +"no bounce and 1 is very bouncy)." +msgstr "" + +#. TRANS: dynamic here means moving vs in a fixed position +#: taextras.py:277 +msgid "dynamic" +msgstr "" + +#: taextras.py:278 +msgid "" +"If dynamic = 1, the object can move; if dynamic = 0, it is fixed in position." +msgstr "" + +#. TRANS: WeDo is a robotics product of the LEGO company +#: taextras.py:284 +msgid "Palette of WeDo blocks" +msgstr "" + +#: taextras.py:285 +msgid "WeDo" +msgstr "" + +#: taextras.py:286 +msgid "set current WeDo device" +msgstr "" + +#: taextras.py:287 +msgid "number of WeDo devices" +msgstr "" + +#: taextras.py:289 +msgid "" +"tilt sensor output: (-1 == no tilt, 0 == tilt forward, 3 == tilt back, 1 == " +"tilt left, 2 == tilt right)" +msgstr "" + +#. TRANS: This string is shorthand for "output of the distance sensor" +#: taextras.py:293 +msgid "distance sensor output" +msgstr "" + +#: taextras.py:294 +msgid "Motor A" +msgstr "" + +#: taextras.py:295 +msgid "returns the current value of Motor A" +msgstr "" + +#: taextras.py:296 +msgid "Motor B" +msgstr "" + +#: taextras.py:297 +msgid "returns the current value of Motor B" +msgstr "" + +#: taextras.py:298 +msgid "set the value for Motor A" +msgstr "" + +#: taextras.py:299 +msgid "set the value for Motor B" +msgstr "" + +#: taextras.py:300 +msgid "WeDo is unavailable" +msgstr "" + +#. TRANS: e.g., Wedo 2 is unavailable, defaulting to 1 +#: taextras.py:302 +#, python-format +msgid "WeDo %d is unavailable; defaulting to 1" +msgstr "" + +#. TRANS: %(device)s and %(wedo_number)d are substitution strings; +#. please leave untranslated +#: taextras.py:305 +#, python-format +msgid "%(device)s is unavailable on WeDo %(wedo_number)d" +msgstr "" + +#. TRANS: Lego NXT is a robotics product of the LEGO company +#: taextras.py:311 +msgid "Palette of LEGO NXT blocks of motors" +msgstr "" + +#: taextras.py:312 +msgid "Palette of LEGO NXT blocks of sensors" +msgstr "" + +#. TRANS: touch sensor (implemented as a button) +#: taextras.py:314 +msgid "touch" +msgstr "" + +#. TRANS: distance sensor (implemented using ultrasonics) +#: taextras.py:316 +msgid "ultrasonic" +msgstr "" + +#: taextras.py:317 TurtleArt/tabasics.py:287 TurtleArt/tabasics.py:298 +#: TurtleArt/tabasics.py:348 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1158 +msgid "color" +msgstr "ቀለም" + +#: taextras.py:318 +#, fuzzy +msgid "light" +msgstr "ቀኝ" + +#: taextras.py:319 plugins/audio_sensors/audio_sensors.py:83 +#: plugins/audio_sensors/audio_sensors.py:98 pysamples/grecord.py:205 +msgid "sound" +msgstr "" + +#: taextras.py:320 +msgid "grey" +msgstr "" + +#. TRANS: The brick is the NXT controller +#: taextras.py:322 +msgid "Please check the connection with the brick" +msgstr "" + +#: taextras.py:323 +#, python-format +msgid "Invalid port '%s'. Port must be: PORT A, B or C" +msgstr "" + +#: taextras.py:324 +#, python-format +msgid "Invalid port '%s'. Port must be: PORT 1, 2, 3 or 4" +msgstr "" + +#: taextras.py:325 +msgid "The value of power must be between -127 to 127" +msgstr "" + +#: taextras.py:326 +#, python-format +msgid "The parameter must be a integer, not '%s'" +msgstr "" + +#: taextras.py:327 +msgid "An error has occurred: check all connections and try to reconnect" +msgstr "" + +#: taextras.py:328 +#, python-format +msgid "NXT found %s bricks" +msgstr "" + +#: taextras.py:329 +msgid "NXT not found" +msgstr "" + +#: taextras.py:330 +#, python-format +msgid "Brick number %s was not found" +msgstr "" + +#: taextras.py:331 +msgid "refresh NXT" +msgstr "" + +#: taextras.py:332 +msgid "Search for a connected NXT brick." +msgstr "" + +#: taextras.py:333 +msgid "NXT" +msgstr "" + +#: taextras.py:334 +msgid "set current NXT device" +msgstr "" + +#: taextras.py:335 +msgid "number of NXT devices" +msgstr "" + +#: taextras.py:336 +msgid "brick name" +msgstr "" + +#: taextras.py:337 +msgid "Get the name of a brick." +msgstr "" + +#: taextras.py:338 +msgid "play tone" +msgstr "" + +#: taextras.py:339 +msgid "frequency" +msgstr "" + +#: taextras.py:340 plugins/turtle_blocks_extras/turtle_blocks_extras.py:445 +msgid "time" +msgstr "" + +#: taextras.py:341 +msgid "Play a tone at frequency for time." +msgstr "" + +#. TRANS: turn is the action +#: taextras.py:343 +msgid "" +"turn motor\n" +"\n" +msgstr "" + +#: taextras.py:344 +msgid "port" +msgstr "" + +#: taextras.py:345 +msgid "power" +msgstr "" + +#. TRANS: rotations is quantity of turns +#: taextras.py:347 +msgid "rotations" +msgstr "" + +#: taextras.py:348 +msgid "turn a motor" +msgstr "" + +#: taextras.py:349 +msgid "" +"synchronize\n" +"\n" +"motors" +msgstr "" + +#: taextras.py:350 +msgid "steering" +msgstr "" + +#: taextras.py:351 +msgid "synchronize two motors connected in PORT B and PORT C" +msgstr "" + +#: taextras.py:352 +msgid "PORT A" +msgstr "" + +#: taextras.py:353 +msgid "PORT A of the brick" +msgstr "" + +#: taextras.py:354 +msgid "PORT B" +msgstr "" + +#: taextras.py:355 +msgid "PORT B of the brick" +msgstr "" + +#: taextras.py:356 +msgid "PORT C" +msgstr "" + +#: taextras.py:357 +msgid "PORT C of the brick" +msgstr "" + +#: taextras.py:358 +msgid "start motor" +msgstr "" + +#: taextras.py:359 +msgid "Run a motor forever." +msgstr "" + +#: taextras.py:360 +msgid "brake motor" +msgstr "" + +#: taextras.py:361 +msgid "Stop a specified motor." +msgstr "" + +#. TRANS: reset is used to reset the counter associated with the motor +#: taextras.py:363 +msgid "reset motor" +msgstr "" + +#: taextras.py:364 +msgid "Reset the motor counter." +msgstr "" + +#: taextras.py:365 +msgid "motor position" +msgstr "" + +#: taextras.py:366 +msgid "Get the motor position." +msgstr "" + +#: taextras.py:367 +msgid "PORT 1" +msgstr "" + +#: taextras.py:368 +msgid "PORT 1 of the brick" +msgstr "" + +#: taextras.py:369 +msgid "read" +msgstr "" + +#: taextras.py:370 +msgid "sensor" +msgstr "" + +#: taextras.py:371 +msgid "Read sensor output." +msgstr "" + +#: taextras.py:372 +msgid "PORT 2" +msgstr "" + +#: taextras.py:373 +msgid "PORT 2 of the brick" +msgstr "" + +#: taextras.py:374 +msgid "light sensor" +msgstr "" + +#: taextras.py:375 +msgid "grey sensor" +msgstr "" + +#: taextras.py:376 +msgid "PORT 3" +msgstr "" + +#: taextras.py:377 +msgid "PORT 3 of the brick" +msgstr "" + +#: taextras.py:378 +msgid "touch sensor" +msgstr "" + +#: taextras.py:379 +msgid "distance sensor" +msgstr "" + +#: taextras.py:380 +msgid "PORT 4" +msgstr "" + +#: taextras.py:381 +msgid "PORT 4 of the brick" +msgstr "" + +#: taextras.py:382 +msgid "sound sensor" +msgstr "" + +#: taextras.py:383 +msgid "color sensor" +msgstr "" + +#. TRANS: set light is used to set the light level associated with +#. the color sensor (which can emit light as well as sense it) +#: taextras.py:386 +msgid "set light" +msgstr "" + +#: taextras.py:387 +msgid "Set color sensor light." +msgstr "" + +#. TRANS: the battery level is the charge level of the brick +#: taextras.py:389 +msgid "battery level" +msgstr "" + +#: taextras.py:390 +msgid "Get battery level of the brick" +msgstr "" + +#. TRANS: Arduino plugin to control an Arduino board +#: taextras.py:395 +msgid "HIGH" +msgstr "" + +#: taextras.py:396 +msgid "LOW" +msgstr "" + +#: taextras.py:397 +msgid "INPUT" +msgstr "" + +#: taextras.py:398 +msgid "OUTPUT" +msgstr "" + +#. TRANS: PWM is pulse-width modulation +#: taextras.py:400 +msgid "PWM" +msgstr "" + +#: taextras.py:401 +msgid "SERVO" +msgstr "" + +#: taextras.py:402 +msgid "ERROR: Check the Arduino and the number of port." +msgstr "" + +#: taextras.py:403 +msgid "ERROR: Value must be a number from 0 to 255." +msgstr "" + +#: taextras.py:404 +msgid "ERROR: Value must be either HIGH or LOW." +msgstr "" + +#: taextras.py:405 +msgid "ERROR: The mode must be either INPUT, OUTPUT, PWM or SERVO." +msgstr "" + +#: taextras.py:406 +msgid "refresh Arduino" +msgstr "" + +#: taextras.py:407 +msgid "Search for connected Arduinos." +msgstr "" + +#: taextras.py:408 +msgid "Arduino" +msgstr "" + +#: taextras.py:409 +msgid "set current Arduino board" +msgstr "" + +#: taextras.py:410 +msgid "number of Arduinos" +msgstr "" + +#: taextras.py:411 +msgid "number of Arduino boards" +msgstr "" + +#: taextras.py:412 +msgid "Arduino name" +msgstr "" + +#: taextras.py:413 +msgid "Get the name of an Arduino." +msgstr "" + +#. TRANS: pin mode is used to specify the mode (INPUT, OUTPUT, etc) +#. in which an I/O pin is being used. +#: taextras.py:416 +msgid "pin mode" +msgstr "" + +#: taextras.py:418 +msgid "mode" +msgstr "" + +#: taextras.py:419 +msgid "Select the pin function (INPUT, OUTPUT, PWM, SERVO)." +msgstr "" + +#: taextras.py:420 +msgid "analog write" +msgstr "" + +#: taextras.py:421 TurtleArt/tabasics.py:928 TurtleArt/tawindow.py:4189 +msgid "value" +msgstr "" + +#: taextras.py:422 +msgid "Write analog value in specified port." +msgstr "" + +#: taextras.py:423 +msgid "analog read" +msgstr "" + +#: taextras.py:424 +msgid "" +"Read value from analog port. Value may be between 0 and 1023. Use Vref to " +"determine voltage. For USB, volt=((read)*5)/1024) approximately." +msgstr "" + +#: taextras.py:426 +msgid "digital write" +msgstr "" + +#: taextras.py:427 +msgid "Write digital value to specified port." +msgstr "" + +#: taextras.py:428 +msgid "digital read" +msgstr "" + +#: taextras.py:429 +msgid "Read value from digital port." +msgstr "" + +#: taextras.py:430 +msgid "Set HIGH value for digital port." +msgstr "" + +#: taextras.py:431 +msgid "Configure Arduino port for digital input." +msgstr "" + +#: taextras.py:432 +msgid "Configure Arduino port to drive a servo." +msgstr "" + +#: taextras.py:433 +msgid "Set LOW value for digital port." +msgstr "" + +#: taextras.py:434 +msgid "Configure Arduino port for digital output." +msgstr "" + +#: taextras.py:435 +msgid "Configure Arduino port for PWM (pulse-width modulation)." +msgstr "" + +#. TRANS: plugin to control an ExpEyes device +#: taextras.py:440 +msgid "Palette of Expeyes blocks" +msgstr "" + +#. TRANS: Programmable voltage output +#: taextras.py:442 +msgid "set PVS" +msgstr "" + +#: taextras.py:443 +msgid "set programmable voltage output" +msgstr "" + +#. TRANS: Square wave 1 voltage output +#: taextras.py:445 +msgid "set SQR1 voltage" +msgstr "" + +#: taextras.py:446 +msgid "set square wave 1 voltage output" +msgstr "" + +#. TRANS: Square wave 2 voltage output +#: taextras.py:448 +msgid "set SQR2 voltage" +msgstr "" + +#: taextras.py:449 +msgid "set square wave 2 voltage output" +msgstr "" + +#. TRANS: Digital output level +#: taextras.py:451 +msgid "set OD1" +msgstr "" + +#: taextras.py:452 +msgid "set digital output level (OD1) low (0) or high (1)" +msgstr "" + +#. TRANS: Input 1 voltage level +#: taextras.py:454 +msgid "IN1 level" +msgstr "" + +#: taextras.py:455 +msgid "" +"returns 1 if IN1 voltage level >2.5 volts, 0 if IN1 voltage level <= 2.5 " +"volts" +msgstr "" + +#. TRANS: Input 2 voltage level +#: taextras.py:458 +msgid "IN2 level" +msgstr "" + +#: taextras.py:459 +msgid "" +"returns 1 if IN2 voltage level >2.5 volts, 0 if IN2 voltage level <= 2.5 " +"volts" +msgstr "" + +#. TRANS: Resistive sensor voltage level +#: taextras.py:462 +msgid "SEN level" +msgstr "" + +#: taextras.py:463 +msgid "" +"returns 1 if resistive sensor (SEN) voltage level > 2.5 volts, 0 if SEN " +"voltage level <= 2.5 volts" +msgstr "" + +#: taextras.py:465 +msgid "capture" +msgstr "" + +#: taextras.py:466 +msgid "input" +msgstr "" + +#: taextras.py:467 +msgid "samples" +msgstr "" + +#: taextras.py:468 +msgid "interval" +msgstr "" + +#. TRANS: MS is microseconds +#: taextras.py:470 +msgid "" +"capture multiple samples from input at interval (MS); results pushed to FIFO" +msgstr "" + +#. TRANS: Analog input 1 voltage level +#: taextras.py:473 +msgid "A1" +msgstr "" + +#: taextras.py:474 +msgid "read analog input 1 voltage" +msgstr "" + +#. TRANS: Analog input 2 voltage level +#: taextras.py:476 +msgid "A2" +msgstr "" + +#: taextras.py:477 +msgid "read analog input 2 voltage" +msgstr "" + +#. TRANS: Read input 1 voltage +#: taextras.py:479 +msgid "IN1" +msgstr "" + +#: taextras.py:480 +msgid "read input 1 voltage" +msgstr "" + +#. TRANS: Read input 2 voltage +#: taextras.py:482 +msgid "IN2" +msgstr "" + +#: taextras.py:483 +msgid "read input 2 voltage" +msgstr "" + +#. TRANS: Read analog sensor input voltage +#: taextras.py:485 +msgid "SEN" +msgstr "" + +#: taextras.py:486 +msgid "read analog sensor input voltage" +msgstr "" + +#. TRANS: Read square wave 1 input voltage +#: taextras.py:488 +msgid "SQR1" +msgstr "" + +#: taextras.py:489 +msgid "read square wave 1 voltage" +msgstr "" + +#. TRANS: Read square wave 2 input voltage +#: taextras.py:491 +msgid "SQR2" +msgstr "" + +#: taextras.py:492 +msgid "read square wave 2 voltage" +msgstr "" + +#. TRANS: Read programmable voltage +#: taextras.py:494 +msgid "PVS" +msgstr "" + +#: taextras.py:495 +msgid "read programmable voltage" +msgstr "" + +#: taextras.py:496 +msgid "Expeyes device not found" +msgstr "" + +#: TurtleArt/taconstants.py:209 TurtleArt/taconstants.py:231 +#: TurtleArt/taconstants.py:252 TurtleArt/taconstants.py:294 +#: TurtleArt/taconstants.py:336 TurtleArt/taconstants.py:378 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:963 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:978 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:993 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1008 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1023 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1038 +msgid "Title" +msgstr " አርእስት" + +#: TurtleArtActivity.py:682 TurtleArtActivity.py:892 turtleblocks.py:401 +msgid "Step" +msgstr "እርምጃ" + +#: TurtleArt/tawindow.py:1000 TurtleArt/tawindow.py:1470 +msgid "next" +msgstr "ቀጥል" + +#: gnome_plugins/uploader_plugin.py:109 +msgid "Password:" +msgstr "ሚስጢራዊ ቃል፦" + +#: plugins/audio_sensors/audio_sensors.py:119 +#: plugins/audio_sensors/audio_sensors.py:127 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:316 +msgid "pitch" +msgstr "አጣጣል" + +#: TurtleArt/tabasics.py:705 +msgid "not" +msgstr "እንጂ" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:549 +msgid "print" +msgstr "አትም" + +#: TurtleArt/tabasics.py:662 +msgid "number" +msgstr "ቁጥር" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:124 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:715 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:886 +msgid "top" +msgstr "ላይኛ" + +#: gnome_plugins/uploader_plugin.py:144 +msgid "Cancel" +msgstr "ተወው ሻር" + +#: TurtleArtActivity.py:594 TurtleArtActivity.py:748 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:789 +msgid "Fullscreen" +msgstr "ሙሉ እስክሪን" + +#: TurtleArt/tabasics.py:853 TurtleArt/tabasics.py:854 +#: TurtleArt/tabasics.py:855 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:186 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:187 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:188 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:195 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:208 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:223 +msgid "text" +msgstr "ጽሑፍ" + +#: TurtleArt/tabasics.py:454 +#, fuzzy +msgid "black" +msgstr "ኋላ" + +#: pysamples/grecord.py:215 +#, fuzzy +msgid "stop" +msgstr "ላይኛ" + +#: gnome_plugins/uploader_plugin.py:120 +msgid "Title:" +msgstr " አርእስት፦" + +#: gnome_plugins/collaboration_plugin.py:304 +#, fuzzy +msgid "Colors" +msgstr "ቀለም" + +#: turtleblocks.py:355 +msgid "Open" +msgstr "ክፈት" + +#: TurtleArtActivity.py:688 turtleblocks.py:403 +msgid "Stop" +msgstr "ቁም ቁሚ አቁም አቁሚ" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:151 +msgid "audio" +msgstr "ድምፅ" + +#: turtleblocks.py:396 +msgid "Tools" +msgstr "መሣሪያዎች" + +#: TurtleArt/tabasics.py:162 +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:854 +msgid "left" +msgstr "ግራ" + +#: gnome_plugins/collaboration_plugin.py:300 +#, fuzzy +msgid "Password" +msgstr "ሚስጢራዊ ቃል፦" + +#: turtleblocks.py:362 +msgid "Quit" +msgstr "ውጣ" + +#: turtleblocks.py:354 +msgid "New" +msgstr "አዲስ" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:266 +msgid "scale" +msgstr "ሚዛን" + +#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:140 +msgid "journal" +msgstr "መጽሔት" + +#: TurtleArt/tabasics.py:843 pysamples/grecord.py:213 +msgid "start" +msgstr "ጀምር" + +#: TurtleArt/tabasics.py:139 +msgid "back" +msgstr "ኋላ" + +#: TurtleArt/tabasics.py:287 TurtleArt/tabasics.py:298 +#, fuzzy +msgid "fill screen" +msgstr "ሙሉ እስክሪን" + +#. TRANS: "name" option from activity.info file msgid "TurtleBlocks" msgstr "" @@ -42,10 +1665,6 @@ msgstr "" msgid "moves turtle forward" msgstr "" -#: TurtleArt/tabasics.py:139 -msgid "back" -msgstr "ኋላ" - #: TurtleArt/tabasics.py:143 msgid "moves turtle backward" msgstr "" @@ -58,11 +1677,6 @@ msgstr "" msgid "clears the screen and reset the turtle" msgstr "" -#: TurtleArt/tabasics.py:162 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:854 -msgid "left" -msgstr "ግራ" - #: TurtleArt/tabasics.py:166 msgid "turns turtle counterclockwise (angle in degrees)" msgstr "" @@ -96,14 +1710,6 @@ msgstr "" msgid "set xy" msgstr "" -#: TurtleArt/tabasics.py:199 TurtleArt/tabasics.py:265 -msgid "x" -msgstr "" - -#: TurtleArt/tabasics.py:199 TurtleArt/tabasics.py:265 -msgid "y" -msgstr "" - #: TurtleArt/tabasics.py:203 TurtleArt/tabasics.py:269 msgid "" "moves turtle to position xcor, ycor; (0, 0) is in the center of the screen." @@ -154,17 +1760,6 @@ msgstr "" msgid "Palette of pen commands" msgstr "" -#: TurtleArt/tabasics.py:287 TurtleArt/tabasics.py:298 -#, fuzzy -msgid "fill screen" -msgstr "ሙሉ እስክሪን" - -#: TurtleArt/tabasics.py:287 TurtleArt/tabasics.py:298 -#: TurtleArt/tabasics.py:348 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1158 -msgid "color" -msgstr "ቀለም" - #: TurtleArt/tabasics.py:287 TurtleArt/tabasics.py:299 #: TurtleArt/tabasics.py:358 #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1154 @@ -302,11 +1897,6 @@ msgstr "" msgid "white" msgstr "" -#: TurtleArt/tabasics.py:454 -#, fuzzy -msgid "black" -msgstr "ኋላ" - #: TurtleArt/tabasics.py:460 msgid "set text color" msgstr "" @@ -404,10 +1994,6 @@ msgstr "" msgid "returns random number between minimum (top) and maximum (bottom) values" msgstr "" -#: TurtleArt/tabasics.py:662 -msgid "number" -msgstr "ቁጥር" - #: TurtleArt/tabasics.py:663 msgid "used as numeric input in mathematic operators" msgstr "" @@ -436,10 +2022,6 @@ msgstr "" msgid "logical equal-to operator" msgstr "" -#: TurtleArt/tabasics.py:705 -msgid "not" -msgstr "እንጂ" - #: TurtleArt/tabasics.py:708 msgid "logical NOT operator" msgstr "" @@ -545,25 +2127,10 @@ msgstr "" msgid "Palette of variable blocks" msgstr "" -#: TurtleArt/tabasics.py:843 pysamples/grecord.py:213 -msgid "start" -msgstr "ጀምር" - #: TurtleArt/tabasics.py:846 msgid "connects action to toolbar run buttons" msgstr "" -#: TurtleArt/tabasics.py:853 TurtleArt/tabasics.py:854 -#: TurtleArt/tabasics.py:855 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:186 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:187 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:188 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:195 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:208 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:223 -msgid "text" -msgstr "ጽሑፍ" - #: TurtleArt/tabasics.py:856 #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:189 msgid "string value" @@ -625,10 +2192,6 @@ msgstr "" msgid "box" msgstr "" -#: TurtleArt/tabasics.py:928 TurtleArt/tawindow.py:4189 -msgid "value" -msgstr "" - #: TurtleArt/tabasics.py:932 TurtleArt/tabasics.py:945 #: TurtleArt/tawindow.py:1296 TurtleArt/tawindow.py:1409 #: TurtleArt/tawindow.py:1858 TurtleArt/tawindow.py:4152 @@ -701,18 +2264,6 @@ msgstr "" msgid "Share selected blocks" msgstr "" -#: TurtleArt/taconstants.py:209 TurtleArt/taconstants.py:231 -#: TurtleArt/taconstants.py:252 TurtleArt/taconstants.py:294 -#: TurtleArt/taconstants.py:336 TurtleArt/taconstants.py:378 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:963 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:978 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:993 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1008 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1023 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1038 -msgid "Title" -msgstr " አርእስት" - #: TurtleArt/talogo.py:374 TurtleArtActivity.py:683 #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:1492 msgid "Stop turtle" @@ -768,10 +2319,6 @@ msgstr "" msgid "orientation" msgstr "" -#: TurtleArt/tawindow.py:1000 TurtleArt/tawindow.py:1470 -msgid "next" -msgstr "ቀጥል" - #: TurtleArt/tawindow.py:1012 TurtleArt/tawindow.py:1013 #: TurtleArt/tawindow.py:1490 msgid "shift" @@ -870,11 +2417,6 @@ msgstr "" msgid "Restore blocks from trash" msgstr "" -#: TurtleArtActivity.py:594 TurtleArtActivity.py:748 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:789 -msgid "Fullscreen" -msgstr "ሙሉ እስክሪን" - #: TurtleArtActivity.py:596 TurtleArtActivity.py:749 turtleblocks.py:366 msgid "Cartesian coordinates" msgstr "" @@ -908,18 +2450,10 @@ msgstr "" msgid "Run" msgstr "" -#: TurtleArtActivity.py:682 TurtleArtActivity.py:892 turtleblocks.py:401 -msgid "Step" -msgstr "እርምጃ" - #: TurtleArtActivity.py:687 turtleblocks.py:408 util/helpbutton.py:45 msgid "Help" msgstr "" -#: TurtleArtActivity.py:688 turtleblocks.py:403 -msgid "Stop" -msgstr "ቁም ቁሚ አቁም አቁሚ" - #: TurtleArtActivity.py:710 TurtleArtActivity.py:836 TurtleArtActivity.py:858 msgid "Load project" msgstr "" @@ -1023,20 +2557,10 @@ msgstr "" msgid "Port" msgstr "" -#: gnome_plugins/collaboration_plugin.py:300 -#, fuzzy -msgid "Password" -msgstr "ሚስጢራዊ ቃል፦" - #: gnome_plugins/collaboration_plugin.py:302 msgid "Register" msgstr "" -#: gnome_plugins/collaboration_plugin.py:304 -#, fuzzy -msgid "Colors" -msgstr "ቀለም" - #: gnome_plugins/fb_plugin.py:82 gnome_plugins/fb_plugin.py:83 #: gnome_plugins/fb_plugin.py:92 gnome_plugins/uploader_plugin.py:63 #: gnome_plugins/uploader_plugin.py:64 gnome_plugins/uploader_plugin.py:73 @@ -1061,14 +2585,6 @@ msgstr "" msgid "Username:" msgstr "" -#: gnome_plugins/uploader_plugin.py:109 -msgid "Password:" -msgstr "ሚስጢራዊ ቃል፦" - -#: gnome_plugins/uploader_plugin.py:120 -msgid "Title:" -msgstr " አርእስት፦" - #: gnome_plugins/uploader_plugin.py:130 msgid "Description:" msgstr "" @@ -1077,10 +2593,6 @@ msgstr "" msgid "Submit to Web" msgstr "" -#: gnome_plugins/uploader_plugin.py:144 -msgid "Cancel" -msgstr "ተወው ሻር" - #: gnome_plugins/uploader_plugin.py:166 msgid "Login failed" msgstr "" @@ -1107,11 +2619,6 @@ msgstr "" msgid "push acceleration in x, y, z to heap" msgstr "" -#: plugins/audio_sensors/audio_sensors.py:83 -#: plugins/audio_sensors/audio_sensors.py:98 pysamples/grecord.py:205 -msgid "sound" -msgstr "" - #: plugins/audio_sensors/audio_sensors.py:84 #: plugins/audio_sensors/audio_sensors.py:99 msgid "raw microphone input signal" @@ -1127,24 +2634,11 @@ msgstr "" msgid "microphone input volume" msgstr "" -#: plugins/audio_sensors/audio_sensors.py:119 -#: plugins/audio_sensors/audio_sensors.py:127 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:316 -msgid "pitch" -msgstr "አጣጣል" - #: plugins/audio_sensors/audio_sensors.py:120 #: plugins/audio_sensors/audio_sensors.py:128 msgid "microphone input pitch" msgstr "" -#: plugins/audio_sensors/audio_sensors.py:151 -#: plugins/audio_sensors/audio_sensors.py:165 -#: plugins/audio_sensors/audio_sensors.py:179 -#: plugins/audio_sensors/audio_sensors.py:193 -msgid "resistance" -msgstr "" - #: plugins/audio_sensors/audio_sensors.py:152 #: plugins/audio_sensors/audio_sensors.py:166 #: plugins/audio_sensors/audio_sensors.py:180 @@ -1171,15 +2665,6 @@ msgstr "" msgid "Palette of media objects" msgstr "" -#: plugins/camera_sensor/camera_sensor.py:80 -#: plugins/camera_sensor/camera_sensor.py:93 -#: plugins/camera_sensor/camera_sensor.py:128 -#: plugins/camera_sensor/camera_sensor.py:141 -#: plugins/light_sensor/light_sensor.py:56 -#: plugins/light_sensor/light_sensor.py:63 -msgid "brightness" -msgstr "" - #: plugins/camera_sensor/camera_sensor.py:82 #: plugins/camera_sensor/camera_sensor.py:130 msgid "light level detected by camera" @@ -1229,28 +2714,14 @@ msgstr "" msgid "do-until-True operator that uses boolean operators from Numbers palette" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:124 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:715 -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:886 -msgid "top" -msgstr "ላይኛ" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:126 msgid "top of a collapsible stack" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:140 -msgid "journal" -msgstr "መጽሔት" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:141 msgid "Sugar Journal media object" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:151 -msgid "audio" -msgstr "ድምፅ" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:153 msgid "Sugar Journal audio object" msgstr "" @@ -1315,10 +2786,6 @@ msgstr "" msgid "saves turtle graphics as an SVG file in the Sugar Journal" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:266 -msgid "scale" -msgstr "ሚዛን" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:270 msgid "holds current scale value" msgstr "" @@ -1445,10 +2912,6 @@ msgstr "" msgid "returns the color that the turtle \"sees\"" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:445 -msgid "time" -msgstr "" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:448 msgid "elapsed time (in seconds) since program started" msgstr "" @@ -1510,10 +2973,6 @@ msgstr "" msgid "places a comment in your code" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:549 -msgid "print" -msgstr "አትም" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:553 msgid "prints value in status block at bottom of the screen" msgstr "" @@ -1697,10 +3156,6 @@ msgstr "" msgid "ycor of bottom of screen" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:870 -msgid "width" -msgstr "" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:873 msgid "the canvas width" msgstr "" @@ -1713,10 +3168,6 @@ msgstr "" msgid "ycor of top of screen" msgstr "" -#: plugins/turtle_blocks_extras/turtle_blocks_extras.py:894 -msgid "height" -msgstr "" - #: plugins/turtle_blocks_extras/turtle_blocks_extras.py:897 msgid "the canvas height" msgstr "" @@ -1789,11 +3240,6 @@ msgstr "" msgid "push destination rgb value to heap" msgstr "" -#: pysamples/grecord.py:215 -#, fuzzy -msgid "stop" -msgstr "ላይኛ" - #: pysamples/grecord.py:217 msgid "play" msgstr "" @@ -1831,14 +3277,6 @@ msgstr "" msgid "Configuration directory not writable: %s" msgstr "" -#: turtleblocks.py:354 -msgid "New" -msgstr "አዲስ" - -#: turtleblocks.py:355 -msgid "Open" -msgstr "ክፈት" - #: turtleblocks.py:356 msgid "Save" msgstr "" @@ -1847,10 +3285,6 @@ msgstr "" msgid "Save as" msgstr "" -#: turtleblocks.py:362 -msgid "Quit" -msgstr "ውጣ" - #: turtleblocks.py:363 msgid "File" msgstr "" @@ -1867,10 +3301,6 @@ msgstr "" msgid "Show/hide blocks" msgstr "" -#: turtleblocks.py:396 -msgid "Tools" -msgstr "መሣሪያዎች" - #: turtleblocks.py:402 msgid "Debug" msgstr "" @@ -1891,10 +3321,6 @@ msgstr "" msgid "Save project?" msgstr "" -#, fuzzy -#~ msgid "light" -#~ msgstr "ቀኝ" - #~ msgid "full screen" #~ msgstr "ሙሉ እስክሪን" @@ -2,8 +2,33 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +#, fuzzy msgid "" msgstr "" +"#-#-#-#-# ar.po (PACKAGE VERSION) #-#-#-#-#\n" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-11-02 00:32-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Translate Toolkit 1.7.0\n" +"#-#-#-#-# ar.po (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# ar.po (PACKAGE VERSION) #-#-#-#-#\n" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-11-02 00:32-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Translate Toolkit 1.7.0\n" +"#-#-#-#-# ar.po (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-02-24 00:31-0500\n" @@ -19,6 +44,1675 @@ msgstr "" "X-Generator: Pootle 2.0.3\n" #. TRANS: "name" option from activity.info file +#. TRANS: "summary" option from activity.info file +#. TRANS: "description" option from activity.info file +msgid "turtleart-extras (master)" +msgstr "" + +#: taextras.py:36 +msgid "Turtle Art Mini" +msgstr "" + +#: taextras.py:40 +msgid "Turtle Confusion" +msgstr "" + +#: taextras.py:41 taextras.py:46 +msgid "Select a challenge" +msgstr "" + +#: taextras.py:45 +msgid "Amazonas Tortuga" +msgstr "" + +#: taextras.py:52 +msgid "Palette of Mexican pesos" +msgstr "" + +#: taextras.py:53 +msgid "Palette of Colombian pesos" +msgstr "" + +#: taextras.py:54 +msgid "Palette of Rwandan francs" +msgstr "" + +#: taextras.py:55 +msgid "Palette of US dollars" +msgstr "" + +#: taextras.py:56 +msgid "Palette of Australian dollars" +msgstr "" + +#: taextras.py:57 +msgid "Palette of Paraguayan Guaranies" +msgstr "" + +#: taextras.py:58 +msgid "Palette of Peruvian Nuevo Soles" +msgstr "" + +#: taextras.py:59 +msgid "Palette of Uruguayan Pesos" +msgstr "" + +#. TRANS: Butia is the Arduino Robot Project from Uruguay +#. (http://www.fing.edu.uy/inco/proyectos/butia/) +#: taextras.py:65 +msgid "TurtleBots" +msgstr "" + +#: taextras.py:66 +msgid "adjust LED intensity between 0 and 255" +msgstr "" + +#: taextras.py:67 +msgid "returns the object gray level as a number between 0 and 1023" +msgstr "" + +#: taextras.py:68 +msgid "returns 1 when the button is press and 0 otherwise" +msgstr "" + +#: taextras.py:69 +msgid "returns the ambient light level as a number between 0 and 1023" +msgstr "" + +#: taextras.py:70 +msgid "returns the ambient temperature as a number between 0 and 255" +msgstr "" + +#: taextras.py:71 +msgid "" +"returns the distance from the object in front of the sensor as a number " +"between 0 and 255" +msgstr "" + +#: taextras.py:73 +msgid "returns 0 or 1 depending on the sensor inclination" +msgstr "" + +#: taextras.py:74 +msgid "returns 1 when the sensors detects a magnetic field, 0 otherwise" +msgstr "" + +#: taextras.py:75 +msgid "switches from 0 to 1, the frequency depends on the vibration" +msgstr "" + +#: taextras.py:76 +msgid "returns the value of the resistance" +msgstr "" + +#: taextras.py:77 +msgid "LED" +msgstr "" + +#: taextras.py:78 +msgid "button" +msgstr "" + +#: taextras.py:79 +msgid "grayscale" +msgstr "" + +#: taextras.py:80 +msgid "ambient light" +msgstr "" + +#: taextras.py:81 +msgid "temperature" +msgstr "" + +#: taextras.py:82 taextras.py:291 +msgid "distance" +msgstr "" + +#: taextras.py:83 taextras.py:288 +msgid "tilt" +msgstr "" + +#: taextras.py:84 +msgid "magnetic induction" +msgstr "" + +#: taextras.py:85 +msgid "vibration" +msgstr "" + +#: taextras.py:86 plugins/audio_sensors/audio_sensors.py:151 +#: plugins/audio_sensors/audio_sensors.py:165 +#: plugins/audio_sensors/audio_sensors.py:179 +#: plugins/audio_sensors/audio_sensors.py:193 +msgid "resistance" +msgstr "" + +#: taextras.py:87 +msgid "Butia Robot" +msgstr "" + +#: taextras.py:88 +msgid "refresh Butia" +msgstr "" + +#: taextras.py:89 +msgid "refresh the state of the Butia palette and blocks" +msgstr "" + +#. TRANS: This string is shorthand for "battery charge of Butia" +#: taextras.py:91 +msgid "battery charge Butia" +msgstr "" + +#: taextras.py:92 +msgid "returns the battery charge as a number between 0 and 255" +msgstr "" + +#. TRANS: This string is shorthand for "speed of Butia" +#: taextras.py:94 +msgid "speed Butia" +msgstr "" + +#: taextras.py:95 +msgid "set the speed of the Butia motors" +msgstr "" + +#: taextras.py:96 +msgid "the speed must be a value between 0 and 1023" +msgstr "" + +#. TRANS: This string is shorthand for "move Butia forward" +#: taextras.py:98 +msgid "forward Butia" +msgstr "" + +#: taextras.py:99 +msgid "move the Butia robot forward" +msgstr "" + +#: taextras.py:100 +msgid "move the Butia robot forward a predefined distance" +msgstr "" + +#. TRANS: This string is shorthand for "turn Butia left" +#: taextras.py:102 +msgid "left Butia" +msgstr "" + +#: taextras.py:103 +msgid "turn the Butia robot at left" +msgstr "" + +#. TRANS: This string is shorthand for "move Butia backward" +#: taextras.py:105 +msgid "backward Butia" +msgstr "" + +#: taextras.py:106 +msgid "move the Butia robot backward" +msgstr "" + +#: taextras.py:107 +msgid "move the Butia robot backward a predefined distance" +msgstr "" + +#. TRANS: This string is shorthand for "turn Butia right" +#: taextras.py:109 +msgid "right Butia" +msgstr "" + +#: taextras.py:110 +msgid "turn the Butia robot at right" +msgstr "" + +#: taextras.py:111 +msgid "turn Butia" +msgstr "" + +#: taextras.py:112 +msgid "turn the Butia robot x degrees" +msgstr "" + +#: taextras.py:113 +msgid "stop Butia" +msgstr "" + +#: taextras.py:114 +msgid "stop the Butia robot" +msgstr "" + +#: taextras.py:115 +msgid "Butia" +msgstr "" + +#: taextras.py:119 +msgid "Error importing Pygame. This plugin require Pygame 1.9" +msgstr "" + +#: taextras.py:120 +msgid "Error on initialization of the camera" +msgstr "" + +#: taextras.py:121 +msgid "No camera was found" +msgstr "" + +#: taextras.py:122 +msgid "Error stopping camera" +msgstr "" + +#: taextras.py:123 +msgid "Error starting camera" +msgstr "" + +#. TRANS: The "mask" is used to restrict processing to a region in the image +#: taextras.py:125 +msgid "Error in get mask" +msgstr "" + +#: taextras.py:126 +msgid "FollowMe" +msgstr "" + +#: taextras.py:127 +msgid "refresh FollowMe" +msgstr "" + +#: taextras.py:128 +msgid "Search for a connected camera." +msgstr "" + +#. TRANS: the calibration is used to match an RGB color to a target +#: taextras.py:130 +msgid "calibration" +msgstr "" + +#: taextras.py:131 +msgid "store a personalized calibration" +msgstr "" + +#: taextras.py:132 +msgid "return a personalized calibration" +msgstr "" + +#: taextras.py:133 +msgid "follow" +msgstr "" + +#: taextras.py:134 +msgid "follow a color or calibration" +msgstr "" + +#: taextras.py:135 plugins/camera_sensor/camera_sensor.py:80 +#: plugins/camera_sensor/camera_sensor.py:93 +#: plugins/camera_sensor/camera_sensor.py:128 +#: plugins/camera_sensor/camera_sensor.py:141 +#: plugins/light_sensor/light_sensor.py:56 +#: plugins/light_sensor/light_sensor.py:63 +msgid "brightness" +msgstr "" + +#: taextras.py:136 +msgid "set the camera brightness as a value between 0 to 255." +msgstr "" + +#: taextras.py:137 +msgid "minimum pixels" +msgstr "" + +#: taextras.py:138 +msgid "set the minimal number of pixels to follow" +msgstr "" + +#: taextras.py:139 +msgid "threshold" +msgstr "" + +#. TRANS: RGB color space (red, green, blue) +#: taextras.py:141 +msgid "set a threshold for a RGB color" +msgstr "" + +#: taextras.py:142 +msgid "camera mode" +msgstr "" + +#. TRANS: RGB, YUV, and HSV are color spaces +#: taextras.py:144 +msgid "set the color mode of the camera: RGB; YUV or HSV" +msgstr "" + +#: taextras.py:145 +msgid "get brightness" +msgstr "" + +#: taextras.py:146 +msgid "get the brightness of the ambient light" +msgstr "" + +#: taextras.py:147 +msgid "average color" +msgstr "" + +#: taextras.py:148 +msgid "" +"if set to 0 then color averaging is off during calibration; for other values " +"it is on" +msgstr "" + +#: taextras.py:149 +msgid "x position" +msgstr "" + +#: taextras.py:150 +msgid "return x position" +msgstr "" + +#: taextras.py:151 +msgid "y position" +msgstr "" + +#: taextras.py:152 +msgid "return y position" +msgstr "" + +#: taextras.py:153 +msgid "pixels" +msgstr "" + +#: taextras.py:154 +msgid "return the number of pixels of the biggest b |